以下为个人看法: 先把TCP协议的序列号搞清楚: 1、开始C端随机生成初始sequence,发到S,flag为syn 2、S端回应C端,也随机生成初始sequence,ack=sequence(C)+1,表示收到C端的连接请求,flag为syn+ack 3 、C端回应S端,ack=sequence(S)+1,表示收到S端的连接回应,flag为ack 至此三次握手建立,此后双方的序列号变化为: 4、刚开始任一方(不分C或S)的sequence=sequence(握手时)+1 至于next sequence是wireshark自己加上去的,其值为 n sequence=此次发送包的sequence+TCP层以上负载的数据长度 也就是下次发包时该方将会使用的sequence值 5、同理任一方的ack=收到的对方的sequence+其TCP层以上负载的数据长度,也就是期待对方下一次发包所使用的sequence值 对于你的问题,因为第8帧不是确认第7帧的,是确认7帧前一帧的。所以没确认7帧中的3字节的数据,9帧中2方又向1方发送了18字节数据,因此在10帧 中1方ack连同上两次数据一同确认了,这应该和TCP选项的SACK有关。 对于TCP序列号的详细分析请参见本论坛laura电子书的相关内容。以上属个人看法,欢迎高手指证! |
|