关于传输层中的TCP协议,我们在之前的博客中对其报文格式、三次握手、四次挥手、流量控制、数据传输等机制进行了具体说明,接下来在前面所学的基础上,我们再来讲讲TCP中三次握手和四次挥手各阶段所处的状态机以及为什么要使用三次握手和四次挥手?最后再来补充TCP的拥塞控制。
TCP三次握手和四次挥手过程中的状态机
三次握手
三次握手详细过程如下:
- 在未进行三次握手时,客户端和服务端都处于closed状态,当客户端主动发起连接时,服务端被动打开,进入listen状态。客户端发送SYN置位,seq=x的包,表示想和服务端建立连接,称为第一次握手,随即客户端接入SYN_SENT状态;
- 服务端收到包后,立即回复SYN、ACK置位,seq=y,ack=x+1的包,表示同意和客户端建立连接,并且自己也想和客户端建立连接,称为第二次握手,随即进入SYN_RCVD状态;
- 客户端收到包后,发送ACK置位,seq=x+1,ack=y+1的包,表示同意和服务端建立连接,称为第三次握手,随即进入established状态;
- 服务端收到包后,也进入established状态,TCP连接成功建立。
三次握手中的哪一次握手可以开始传输数据?
第三次握手,表示客户端和服务器都建立了连接,客户端可以携带要传输的数据。
四次挥手
四次挥手详细过程如下:
- 当客户端数据传输完毕后,主动发送FIN置位,seq=u的包,表示想和服务端断开连接,称为第一次挥手,随即客户端接入FIN WAIT1状态;
- 服务端收到包后,回应一个ACK置位,seq=v,ack=u+1的包,表示同意和客户端断开连接,称为第二次挥手,随即服务端接入CLOSE WAIT状态;
- 客户端收到包后,进入FIN WAIT2状态;
- 等待服务端的数据传输完毕后,服务端主动发送FIN、ACK置位,seq=w,ack=u+1的包,表示想和客户端断开连接,称为第三次挥手,随即服务端进入LAST ACK状态;
- 客户端收到包后,回应一个ACK置位,seq=u+1,ack=w+1的包,表示同意和服务端断开连接,称为第四次挥手,随即进入TIME WAIT状态;
- 服务端收到包后,进入closed状态;
- 等待TIME WAIT时间结束后,客户端也进入closed状态,TCP连接成功断开。
为什么客户端要等待TIME WAIT时间?
为了确保同意断开连接的响应能安全发送到服务端,避免造成服务端收不到响应而无法关闭连接。
图片来源:TCP三次握手与四次挥手详解_三次握手和四次挥手-CSDN博客
使用三次握手和四次挥手的原因
三次握手
为什么TCP建立连接要使用三次握手,而不是两次握手、四次握手?
为了避免历史连接、避免服务器资源浪费、同时也为了初始化序列号。
- 避免历史连接:在IP网络中传输的数据是不安全的、无序的,当客户端发送的第一个连接请求由于网络延迟导致比第二个连接请求晚到服务端时,服务端对两个连接请求都进行了回应,如果此时采用两次握手的话,客户端无法判断出服务端回应的是哪一个请求,就造成了历史连接。如果采用三次握手的话,客户端就能够判断出服务端是对哪一个请求进行回应,就可以避免历史连接。
- 避免服务器资源浪费:如果TCP连接采用的是两次握手,当客户端的连接请求在网络中阻塞,客户端没有接收到确认报文,就会重新发送连接请求 ,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的确认信号,所以每收到一个 SYN 就只能先主动建立一个连接,那么服务器在收到请求后就会建立多个冗余的无效链接,造成资源浪费。若是采用三次握手,就不会产生这种情况。
- 初始化序列号:序列号在 TCP 连接中有着非常重要的作用,当客户端发送携带序列号的连接请求的时候,需要服务端回应确认报文,表示客户端的请求报文已被服务端成功接收,那当服务端发送携带序列号的连接请求给客户端时,依然也要得到客户端的回应,这样一来一回,确保双方的初始序列号能被可靠的同步,以上这种情况就需要进行三次握手。
四次挥手
为什么TCP连接断开需要使用四次挥手,而不是两次挥手、三次挥手?
因为TCP连接建立的是双向的连接,既有客户端到服务端的连接,也有服务端到客户端的连接,而一个方向的连接断开就需要请求和应答两个报文,所以TCP断开连接就需要四个报文,即四次挥手。
拥塞控制
TCP有了流量控制之后为什么还需要拥塞控制?
因为流量控制的作用是为了解决发送方和接收方速度不一致而导致数据丢失的问题,即两个端点的问题,而拥塞控制是为了解决太多的数据注入到网络中而导致网络崩溃的问题,即两个端点中间链路的问题。
流量控制方式:由接收端采用滑动窗口的形式,告知发送方允许/停止发包解决TCP丢包问题。
拥塞控制方式:由发送方采用拥塞窗口的形式去判断网络状态,从而采取不同算法执行TCP动态发包解决网络整体质量问题。
拥塞控制的四种算法:
- 慢开始
- 拥塞避免
- 超时重传
- 快重传和快恢复
具体原理请参考:TCP流量控制和拥塞控制详解!图解分,两分钟搞定TCP知识点!-CSDN博客