tcp 三次握手、四次挥手
先用模拟器进行实验
一、网络拓扑
一个重要的总结:在三次握手和四个挥手过程中,虽然这个时候载荷为0,但是会对上一个包进行确认,ack为上一个包的syn+1,但是在实际业务发送过程中,如果载荷为0,那么他的确认直接为syn的序列号。(还不够准确)
二、抓包如下,我们进行逐包分析
三次握手的过程
第一个包:SYN包,由于抓包工具的优化,这里序列号显示的为相对序列号,也显示真实序列号,可以看到第一个SYN包的syn标志位置位,syn序列号位6509、ack序列号为0
第二个包:SYN\ACK包,这里可以看到syn序列号为6589(这是对端回复的第一个包),ack为上一个包syn序列号+1=6510。同时syn\ack标志位置位。
第三个包:ack包,三次握手的最后一个包,所以只有ACK置位了,当然之后的每个包都会ack置位,这里syn序列号为6510(可以理解为,上一个包回复ack序列号来请求到这个包),ack序列号为上一个包的syn序列号+1=6590 。
数据交互过程
请求数据过程:这里是在ack发送完之后,紧接着又发送的一个包,所以可以看到syn、ack序列号与前一个包保持一致,这里带了一个载荷,也就是数据长度(159bytes),这里扩展先(IP包头固定为20byte、TCP包头固定为20byte、UDP包头固定为8byte),所以在ip包头中可以看到载荷长度为199byte。所以在tcp回复过程中希望下一个包是要159+6510序列号的。
回复数据的包过程:和请求的类似,他会回复syn6590,ack回复6669的序列号,同时他也携带了307byte的载荷。
ack确认回复的过程:这里是客户端给服务端确认收到了回复,所以会发送ack ,syn序列号就是6669,ack就是6897。
四次挥手阶段
FIN\ACK包:和上一个包一样syn6669、ack6897
ack:要确认上一个包,所以ack 为syn+1=6670,syn 6897。
FIN\ACK:与上一个包一同发出,所以syn、ack序列号一致。
ACK:对上一个包的确认所以ack会是上一个包syn+1,syn是上一个包的ack