tcp协议
tcp协议属于传输层协议,是面向连接的协议,于是就会产生三次握手的概念
三次握手
三次握手是客户端与服务端建立的三次连接,目的是确保通信双方都有接受与发送信息的能力
三次握手过程
第一次握手
客户端向服务端发起SYN=1和序列号seq=x(SYN报文)
第二次握手
服务端接收到数据,向客户端发送SYN=1,ACK=1,ack=x+1,seq=y(SYN响应)
第三次握手
客户端收到 SYN 报文之后,会发送一个 ACK 报文,ACK=1,ack=y+1,seq=x+1
于是三次握手完成,建立tcp连接
第一次握手确定客户端有发送能力
第二次握手确保服务端有接受信息能力,发送能力
第三次握手确保客户端有接受能力,于是就确保了通信双方的接受和发送能力
四次挥手
第一次挥手
客户端向服务端发送FIN报文,指定序列号seq=u
第二次挥手
服务端收到 FIN 之后,会发送 ACK 报文ACK=1,ack=u+1,seq=v
第三次挥手
如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号FIN=1,ACK=1,ack=u+1,seq=w
第四次挥手
客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,ACK=1,ack=w+1,seq=u+1
为什么要进行四次挥手
当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手