图28-4 (续)
4. 把I P和T C P 首部及选项放入第一个m b u f
2 3 0 - 2 3 6 如果首部长度大于 2 0,说明存在T C P 选项。必要时调用 m _ p u l l u p ,把标准I P 首
部、标准T C P 首部的所有T C P 选项放入簇中的第一个 m b u f 中。因为3部分数据最大只能为 8 0字
节( 2 0 + 2 0 + 4 0 ) ,因此,必定能够放入第一个存储数据分组首部的 m b u f 中。
此处能够造成m _ p u l l u p 失败的惟一原因是I P数据分组的字节数小于 2 0 加上T C P
首部长度,而且已通过T C P检验和的验证,我们认为 m _ p u l l u p 不可能失败。但有一
点,图2 8 - 2 中调用的 m _ p u l l u p ,将共享计数器 t c p s _ r c v s h o r t ,因此,查看
t c p s _ r c v s h o r t 并不能说明哪一个调用失败。不管怎样,从图 2 4 - 5可知,即使收到
九百万个T C P 报文段之后,这个计数器仍旧为 0。
5. 快速处理时间戳选项
2 3 7 - 2 5 5 o p t l e n等于首部中T C P选项的长度,o p t p是指向第一个选项字节的指针。如果
下列3个条件均为真,说明只存在时间戳选项,而且格式正确:
1) TCP选项长度等于 1 2 (T C P O L E N _ T S T A M P _ A P P A );或 T C P 选项长度大于 1 2,但
o p t p [ 1 2 ] 等于选项结束字节。
2) 选项的头4个字节等于0 x 0 1 0 1 0 8 0 a(T C P O P T _ T S T A M P _ H D R,在2 6 . 6 节曾讨论过)。
3) SYN标志未置位(说明连接已建立,如果报文段中出现时间戳选项,意味着连接双方都
同意使用这一选项)。
如果上述条件全部满足,则 t s _ p r e s e n t 置为1;从接收报文段首部获取两个时间戳值,
分别赋给t s _ v a l 和t s _ e c r;o p t p置为空,因为所有选项已处理完毕。这种辨认时间戳的
方法可以避免调用通用选项处理函数 t c p _ d o o p t i o n s ,从而使后者能够专门处理只出现在
S Y N 报文段中的各种选项( M S S 和窗口大小选项)。如果连接双方同意使用时间戳,那么在建立
的连接上交换的几乎所有报文段中都可能带有时间戳选项,因此,必须加快其处理速度。
图2 8 - 5给出了函数下一部分的代码,寻找报文段的 Internet PCB。
6. 保存输入标志,把字段转换为主机字节序
2 5 7 - 2 6 4 接收报文段中的标志( S Y N 、F I N等)被保存在本地变量t i f l a g s中,因为函数在
处理过程中会多次引用这些标志。 T C P首部的两个16 bit字段和两个32 bit序号被转换回主机字
第28章 T C P 的输入计计741
评论0