(面试常见问题)TCP的握手和挥手过程

TCP握手挥手

TCP 三次握手

(面试常见问题)TCP的握手和挥手过程

  • 首先服务器处于LISTEN(监听)状态,客户端向服务器发送请求,其中SYN=1,初始化一个seq为x
  • 服务器接收连接请求报文后,如果同意建立连接,则向A发送连接确认报文,SYN=1,ACK=1,seq=y,ack=x+1
  • A接收到B发出的连接确认报文后还需要向B发送确认报文。ACK=1,seq=x+1,ack=y+1
  • B收到A的确认后,连接建立

三次握手的原因

  • 防止失效的连接请求到达服务器。
  • 避免因延迟造成的服务器资源浪费。如果没有第三次握手,服务器的确认连接请求延迟或者超时,客户端会重新发送请求连接,但是服务器已经为客户端打开一个连接,会造成服务器为一个客户端打开多个连接的现象。如果有第三次握手,客户端不对延迟的或者超时的确认连接发送确认(第三次握手),服务器就不会创建连接。知道完整的三次握手完成。

TCP 的四次挥手

(面试常见问题)TCP的握手和挥手过程

  • A发送挥手报文,FIN=1, 初始化一个seq=u
  • B接收到挥手报文后进入CLOSE-WAIT状态,通知应用进程。并向A发出确认。此时TCP处于半连接状态,即B能向A发送数据而A不能向B发送数据。ACK=1,seq=v,ack=u+1
  • 当B不再需要连接时,向A发送第三次挥手报文,FIN=1,ACK=1,ack=u+1
  • A接收到第三次挥手报文后向B发送确认,并且等待2MSL的时间再关闭。
  • B接收到确认后直接关闭连接。

四次挥手的原因

  • Close wait
    • 等待服务器将未完成传输的数据传完。
  • time-wait
    • 设置2MSL的等待区间是以防服务器没有接收到连接确认重发,但是客户端已经释放连接不再发送确认导致服务器无法释放连接。
    • 让本次连接产生的所有报文在网络中消失,使得新的连接不会出现旧连接的报文。