三次挥手:
1.客户端主动向服务器发送SYN=1,seq = x(确认号4字节)
2. 服务器发送SYN=1,seq = y (确认号),ACK = 1,ack= x+1;
回复四个信息,以确认收到请求。
3.客户端再次发送请求 ACK = 1,ack= x+1
其中有一个经典的问题:为什么需要等待客户端回复第三次消息呢?
原因是:服务器无法判断接收到的请求是否在网络滞留,需要客户端在发送一次请求,以防浪费资源。
四次挥手:
1.客户端发送报文段 FIN
2.服务器收到后回应报文段 ack = m+1,表示同意断开连接。发送剩下的数据。
3.然后发送 FIN 码,等待回应。
4.客户端收到FIN 码后,发送ACK 码,等待2个最长报文时间后关闭连接。
5.服务器收到最后的ACK码后关闭连接。
其中有两个经典的问题:为什么客户端最后还要等待2MSL?
因为:防止服务器因网络原因没有收到最后的ACK码,所以等待2MSL,或许服务器没有收到最后的ACK码,重新再发FIN码。
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
因为:服务器的ACK码和FIN码是分开发送的,期间还有数据传输的。