步骤2:TCP知识的补遗
在讲解TCP窗口的知识之前,关于TCP数据包还有几个知识点是需要补充讲解一下的。这里我们打开实验文件Lab9-1.pcap:
Alt text
在之前的课程中我曾经讲过,TCP提供有序的数据传输,因此每个数据段都要标上一个序列号,也就是Seq的值。这样当接收方收到乱序的数据包时,就可以根据这个序列号进行重新排序了。这里我们并不需要知道Seq的起始值是怎么计算的,但是必须要理解这个值的增长方式。如上图所示,1号数据包Seq的值为4131969696,这个数据包的长度,也就是Len的值为1448,那么2号数据包的Seq的值就应当是4131969696+1448=4131971144,与2号数据包的Seq值是吻合的。可见,Seq的值是依据上一个数据包的Seq值加上长度得来的。这个Seq值是由这两个数据包的发送方,也就是10.32.106.159维护的。
由于TCP是双向的,一个连接中的双方都可以是数据的发送方,所以双方各自都会维护一个Seq值,上图中的1、2、4、5号数据包有自己的Seq值,而3号和6号数据包的Seq值则是由10.32.106.62维护的。3号数据包Seq的值为735349110,Len的值为0,所以6号数据包的Seq值依旧是735349110。
这里需要注意的是,比如1号数据包的Len的值为1448,但是这个长度是不包括TCP头的长度的。而3号和6号数据包的Len的值尽管为0,但其实这里面是包含有TCP头的。TCP头部包含有丰富的信息,因此大家千万不要误以为Len的值是0就没有意义,其实Len是0的情况还是很常见的。
然后我们回过头再看一下2号数据包。这里它发送了“Seq=4131971144,Len=1448”的数据包