连接的三次握手:
1握、client向server发送连接请求,发送的报文是:syn=1,seq number=生成的随机数x 。 这时client的状态是SYN_SEND
2握、server从syn=1知道client要进行连接。 然后向客户端回复信息,即ack number=x+1(x是client向server发送的seq number),syn=1,ack=1,seq=随机数y ,同时在server中为client分配系统资源。 这时server的状态是SYN_RECV
3握、client收到请求后检查ack number是否正常。(即是不是等于seq number+),同时检查ack是否为1. 如果都正确 ,client会再向server 发送ack number=y+1,ack=1。 server收到后确认seq与ack ,正确则连接建立成功。 并分配client资源。 最后client与server的状态皆是ESTABLISHED
中断的四次挥手:
中断的发起端可以是client,也可以是server
假设是client发起中断请求
1、client向server发送FIN报文, 告知server我要中断连接。 这时client的状态是FIN_WART_1
2、server收到FIN后,如果没有数据发送完毕,那么向client发送ACK。 代表我收到你的中断申请,但是我还有数据发送给你。 这时client状态为FIN_WAIT_2。 server的状态为CLOSE_WAIT
3、当server已经没有数据往client发送时,这时代表可以中断连接了,那么向client发送FIN,意思是说,OK啦,我这边数据已经给你都发送完毕了,已经准备好中断边接了。 这时server的状态是LAST_ACK
4、client接收到server的FIN后,向server回复ack,这时状态变为TIME_WAIT。 并不会马上关闭连接。 而是在30秒(这个是可配置的)后关闭连接(原因是server是收到ack后才会关闭连接,但是可能因为网络的原因server收到ack出现了延迟,所以就等30秒后再关闭client的连接)
5、server收到ack后,关闭连接。状态变为CLOSED。
6、过30秒(可配置)后,client关闭连接。 状态变为CLOSED。
有时间时,应该自己再补一张流程。 这样记忆起来就更加清晰了。
参考: