TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,旨在解决在不可靠的互联网上如何确保端到端的可靠数据传输问题。
TCP的特点:
-
面向连接:在数据传输之前,客户端和服务器必须建立连接。这种连接是持久的,直到双方通信结束才会释放。
-
可靠的:TCP通过序列号、确认应答和重传机制来保证数据传输的可靠性。每个数据包都有序号,接收方收到数据后会发送确认应答,发送方如果未收到确认应答或者超时,将会重传数据包,直到对方确认接收。
TCP三次握手:
为了确保客户端和服务器端之间的连接能够正常建立,TCP使用三次握手过程:
-
第一次握手(SYN):客户端向服务器发送一个特殊的数据包,包含了SYN标志位和初始序列号,用于初始化TCP连接。
-
第二次握手(SYN-ACK):服务器收到客户端的SYN后,返回确认应答。该应答中包含了对客户端SYN的确认,同时也包含了服务器的SYN,以及服务器的初始序列号。
-
第三次握手(ACK):客户端收到服务器的确认应答后,再次向服务器发送确认。这次确认中,客户端确认了服务器的SYN,同时也确认了自己发送的SYN。
这三次握手过程确保了双方的发送和接收能力正常,可以安全地开始数据传输。
为什么要进行第三次握手?
主要原因:防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
当客户端向服务器发送的连接请求由于网络问题未能及时到达服务器,这种情况下,客户端会认为连接请求已经失效,并尝试重新发送请求以建立连接。一旦新的连接建立并数据传输完成后,即使之前滞留的请求报文在网络畅通后到达服务器,此时服务器应当忽略该报文,因为该请求已被认为失效。如果服务器错误地处理了这个滞留的请求报文,误以为客户端再次发送了新的连接请求,并进行了两次握手建立连接,此时客户端并不会发送确认,因为客户端已经不再处于请求连接的状态。由于缺乏客户端的确认,服务器会意识到客户端并没有真正请求建立连接,从而避免建立不必要的连接,避免浪费网络资源和引发不必要的通信错误。
TCP四次挥手:
当数据传输结束后,客户端和服务器需要安全地关闭连接,使用四次挥手过程:
-
第一次挥手(FIN):客户端发送一个FIN标志位的数据包,表示数据传输已完成,请求关闭连接。
-
第二次挥手(ACK):服务器收到客户端的FIN后,发送一个确认应答ACK,表示已收到关闭请求。
-
第三次挥手(FIN):服务器发送一个FIN标志位的数据包,告知客户端服务器也准备关闭连接。
-
第四次挥手(ACK):客户端收到服务器的FIN后,发送一个确认应答ACK,确认接收到关闭请求。此时,连接进入TIME-WAIT状态,等待可能存在的延迟数据包到达,最后关闭连接。
为什么客户端在TIME-WAIT状态要等待2MSL?
客户端在TIME-WAIT状态等待一段时间(2MSL),客户端需要等待2MSL的主要原因是确保第一个ACK报文能够到达服务器。这是因为这个ACK报文有可能在传输过程中丢失。2MSL是指报文在网络中存在的最长时间,超过这个时间后报文会被丢弃。这个等待时间的目的是防止新的连接中出现旧连接的请求报文。
总结:
TCP的这些特性和过程保证了在不可靠的网络环境中,数据能够可靠地传输和关闭连接,是互联网上广泛使用的传输协议之一。