TCP三次握手

为什么TCP采用三次握手建立连接?四次挥手断开连接?

1.tcp三次握手建立连接过程

tcp建立连接流程

  • 首先TCP客户端发送带有SYN标志的数据包到服务端,并进入SYN-SENT状态
  • 服务端收到客户端发送的数据包后会返回带有SYN/ACK标志的数据包,并进入SYN-RCVD状态
  • 客户端收到服务端发送的带SYN/ACK的数据包后,返回一个普通的ACK数据包,此时客户端进入established状态。服务端收到ACK数据包后进入EStablished状态,此时TCP连接建立完成。

为什么是三次握手而不是两次握手?

通俗的说是为了确定连接双方都有发送/接收数据包的能力。
严谨的说法为:防止已失效的请求报文又传送到了服务端,建立多余的无效连接。假设采用两次握手建立连接,如下: 两握手建立连接存在问题

考虑这样一种情况,当客户端向服务端发起连接请求时,因为网络拥塞导致该SYN报文停留网络中并未到达服务器端,一段时间后客户端触发超时重发,此时根据网络情况选择了另一条路由,请求顺利到达服务端,服务端也发送SYN/ACK数据包到客户端,连接建立后成功传输数据后断开连接,此时之前停留在网络的请求到达服务端,服务端就会再次与客户端建立连接,但这个连接是无效的,就会浪费服务器的资源。

2.tcp四次挥手断开连接过程

tcp四次挥手断开连接过程

  • 1.TCP客户端发送释放连接请求报文(FIN)并进入终止等待1状态
  • 2.TCP服务端发送TCP普通请求确认报文(ACK),进入关闭等待状(此时若服务端还要数据要发送可继续发送数据)
  • 3.服务端数据传输完毕,发送一个连接释放请求报文(FIN/ACK),并进入最后确认状态
  • 4.客户端收到这个FIN,发送普通ACK确认报文段,并进入TIME-WAIT时间等待状态,服务端收到后关闭连接

为什么客户端要进入时间TIME-WAIT状态而不是直接关闭连接?

  • 处于时间等待(TIME-WAIT)状态后要经过2MSL时长,可以确保TCP服务器进程能够收到最后一个TCP确认报文段而进入关闭(CLOSED)状态。(如果服务器因为网络问题没有收到客户端的ACK,就会超时重发)
  • TCP客户进程在发送完最后一个ACK后,再经过2MSL后,就可以使本次持续时间内所产生的所有报文段都从网络中消失。就可以使下一个新的TCP连接中不会出现旧连接中的报文段。

因此四次就可以确保客户端和服务端的数据能够完成传输。

end

评论