《TCP/IP详解 卷2:实现》 —2.6.5 TCP重组避免调用m_pullup
【摘要】 本节书摘来自华章计算机《TCP/IP详解 卷2:实现》一书中第2章,第2.6.5节,作者是[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens),陆雪莹 蒋慧 等译 谢希仁 校。
2.6.5 TCP重组避免调用m_pullup
重组TCP报文段使用一种不同的技术而不是调用m_pullup。这是因为m_pullup开销较大:分配存储器并且数据从一个簇复制到一个mbuf中。TCP试图尽可能地避免数据的复制。
卷1的第19章提到大约有一半的TCP数据是批量数据(通常每个报文段有512字节或更多字节的数据),并且另一半是交互式数据(这里面有大约90%的报文段包含不到10字节的数据)。因此,当TCP从IP接收报文段时,它们通常是如图2-14左边所示的格式(一个小量的交互数据,存储在mbuf本身)或图2-16所示的格式(批量数据,存储在一个簇中)。当TCP报文段失序到达时,它们被TCP存储到一个双向链表中。如IP分片一样,在IP首部的字段用于存放链表的指针,既然这些字段在TCP接收了IP数据报后不再需要,这完全可行。但当IP首部存放在一个簇中时,要将一个链表指针转换成一个相应的mbuf指针,这时会引起同样的问题(图2-17)。
为解决这个问题,在27.9节中我们会看到TCP把mbuf指针存放在TCP首部中的一些未用的字段中,提供一个从簇指回mbuf的指针来避免对每个失序的报文段调用m_pullup。如果IP首部包含在mbuf的数据区(图2-18),则这个回指指针是无用的,因为宏dtom对这个链表指针会正常工作。但如果IP首部包含在一个簇中,这个回指指针将被使用。当我们在讨论27.9节的tcp_reass时,会研究实现这种技术的源代码。
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)