《TCP/IP详解 卷2:实现》 —2.11 小结
2.11 小结
在本书几乎所有的函数中我们都会遇到mbuf。它们的主要用途是在进程和网络接口之间传递用户数据时存放用户数据,但mbuf还用于保存其他各种数据:源地址和目标地址、插口选项等等。
根据M_PKTHDR和M_EXT标志是否被设置,这里有4种类型的mbuf:
无分组首部,mbuf本身带有0~108字节数据;
有分组首部,mbuf本身带有0~100字节数据;
无分组首部,数据在簇(外部缓存)中;
有分组首部,数据在簇(外部缓存)中。
我们查看了几个mbuf宏和函数的源代码,但不是所有的mbuf例程源代码。图2-19和图2-20提供了我们在本书中遇到的所有mbuf例程的函数原型和说明。
查看了我们要遇到的两个函数的操作:m_devget,很多网络设备驱动程序调用它来存储一个收到的帧;m_pullup,所有输入例程调用它把协议首部连续放置在一个mbuf中。
由一个mbuf指向的簇(外部缓存)能通过m_copy被共享。例如,用于TCP输出,因为要传输的数据的副本要被发送端保存,直到数据被对方确认。比起进行物理复制来说,通过引用计数,共享簇提高了性能。
习题
2.1 在图2-9中定义了M_COPYFLAGS。为什么不复制标志M_EXT?
2.2 在2.6节中,我们列出了m_pullup会失败的两个原因。实际上有三个原因。查看这个函数的源代码(附录B),并发现另外一个原因。
2.3 为避免宏dtom遇到我们在2.6节中所讨论的问题,当数据在簇中时,为什么不仅仅给每个簇加一个指向mbuf的回指指针?
2.4 既然一个mbuf簇的大小是2的幂(典型的是1024或2048),簇内的空间不能用于引用计数。查看Net/3的源代码(附录B),并确定这些引用计数存储在什么地方。
2.5 在图2-5中,我们注意到两个计数器m_drops和m_wait现在没有实现。修改mbuf例程增加这些计数器。
- 点赞
- 收藏
- 关注作者
评论(0)