1.1 TCP概述
TCP是网络层次模型中传输层的一种协议,另外一种是UDP。不同于UDP的是,TCP是一种面向连接安全可靠的传输协议,TCP建立连接和打电话很类似,由一方发起通话请求,另一方接受通话请求。在TCP中是主动发起连接的客户端和被动接受的服务端。
1.2 TCP建立连接的三次握手
第一次握手:客户端通过connect()函数向服务端发送一个SYN的同步请求。
第二次握手:服务端收到客户端的SYN请求后,通过accept()函数将SYN和ACK发送给客户端,告诉对方同意连接并且做好连接的准备了。
第三次握手:客户端收到服务端的SYN和ACK后,将ACK返回给服务器,告诉对方做好通信的准备了。
自此三次握手结束,双方建立连接进行通信。
1.3 TCP断开连接的四次挥手
第一次挥手:客户端主动发起断开连接,发送一个FIN给服务端,告诉对方没有数据发送了
第二次挥手:服务端收到客户端的FIN后,将一个ACK发送给客户端,告诉对方收到了FIN报文,并准备断开连接
第三次挥手:服务端将FIN发送给客户端,告诉对方没有数据发送了
第四次挥手:客户端收到服务端发的FIN后,将ACK返回给服务端,告诉服务器收到FIN报文,同意断开。
自此四次挥手结束,双方断开连接停止通信。
1.4 为什么断开要四次挥手
四次挥手是为了确定双方都没有数据要进行传输了,避免因为网络延迟导致数据包丢失,而双方已经早早断开连接了。
1.5为什么客户端要等待2MSL
因为要客户端要确保服务端能收到最后发送的一个ACK报文。设想一下,如若客户端发送完ACK后不进行2MSL等待而直接走人的话,最后一个人ACK丢失了,服务端收不到这个ACK就不能正常的关闭。正因为客户端有了2MSL等待这个机制,就算ACK丢了,服务端没有收到也会再次发送一个FIN+ACK的报文给客户端,客户端再次把ACK发送给服务端,服务端收到ACK进行关闭,客户端经过2MSL等待没有再次收到服务端的FIN+ACK的报文也将进行关闭。