《TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》 —3.4 服务器收到过时的重复SYN
3.4 服务器收到过时的重复SYN
如果服务器收到了一个看似过时的CC值该怎么办呢?我们让客户发出一个CC值为1的SYN报文段,这个值小于服务器刚刚从该客户收到的CC值(2,见图3-3)。事实上,这种情况也是可能发生的,比如:CC值等于1的这个报文段属于客户和服务器之间此前某个连接,它在网络上耽搁了一段时间,但还没有超过其报文段最大生存时间(发出后MSL秒),最终到达了服务器。
一个连接是由一对插口定义的,即包含客户端IP地址和端口号及服务器端IP地址和端口号的四元组。连接的新实例称为该连接的“替身”。
从图3-5我们可以看出,服务器收到一个CC值为1的SYN报文段后强迫执行三次握手操作,因为它无法判断该报文段是过时重复的还是新的。
由于激活了三次握手(这一点我们可以从服务器仅仅确认了客户的SYN而没有确认客户的数据来判断),服务器的TCP协议在握手过程完全结束以后才会把300字节的数据提交给服务器进程。
本例中,第1个报文段就是一个过时的重复报文段(客户的TCP此时并不在等待对这个报文段中SYN的响应),于是当第2个报文段中服务器发出的SYN/ACK到达时,客户端TCP协议的响应是要求重新建立连接(RST,第3个报文段)。这样做也是理所应当的。服务器的TCP协议收到这个RST后就扔掉那300字节的数据,而且accept函数也不返回到服务器进程。
图3-5 T/TCP服务器收到过时的重复SYN报文段
第1个报文段是由一个特殊的测试程序生成的。我们无法让客户的T/TCP协议自己生成这样的报文段,而只能让它以过时的重复报文段出现。作者曾试着把内核的tcp_ccgen变量值改为1,但是,正如我们将在图12-3中看到的,当内核的tcp_ccgen小于它最近一次发给对端的CC值时,TCP协议自动地发送一个CCnew选项而不是发送一个CC选项。
图3-6所示的就是这对客户-服务器之间的下一次,也是常规的一次T/TCP事务。正如我们所预期的,这是一个包含3个报文段的交换过程。
图3-6 常规的T/TCP客户-服务器事务
服务器希望这个客户发来的CC值大于2,因此收到CC值为3的SYN后TAO测试成功。
- 点赞
- 收藏
- 关注作者
评论(0)