client简称为c, server简称为s. seq指sequence number, ack指Ack number.
建立连接过程中:
c到s的SYN包,seq=0, ack=0
s到c的SYN ACK包, seq=0, ack=1 (即ack为上个SYN包的seq+1)
c到s的ACK包, seq=1, ack=1 (即ack为上个SYN ACK包的seq+1)
发送数据中:
c->s发送包为PSH ACK包, seq为1,next seq=23, ack=1 (因为该包数据长度为22,所以是在基础序列号1的基础上加22,得到23)
回应包为ACK包, seq=1, ack=23(即此ack为上一个包指明的next seq)
c->发送包为PSH ACK包, seq为23,next seq=69, ack=1 (该包数据长度为46,23+46=69)
回应包为ACK包, seq=1, ack=69(即此ack为上一个包指明的next seq)
s->c发送包为PSH ACK包, seq为1,next seq=6, ack=69 (该包数据长度为5,1+5=6)
回应包为ACK包, seq=, ack=(即此ack为上一个包指明的next seq) (由于程序中server没有等client回应就提前结束,所以没有ack包)
释放连接过程中:
s->c FIN ACK包, seq=6, ack=69
c->s ACK包, seq=69, ack=7 (即ack为上个SYN包的seq+1)
c->s FIN ACK包, seq=69, ack=7
s->c ACK包, seq=7, ack=70 (即ack为上个SYN包的seq+1)
目前存在问题:
SYN包中的序列号为0, 但是在抓包中对应的二进制数是 60 2f 30 02, 不知道是如何翻译过来的?有谁知道请回复哦,谢谢
另外TCP的校验和计算请参考文章“UDP协议”中的算法。