三次握手和四次挥手

之前在从地址栏输入URL到页面加载完成,发生了什么?一文中提到了 三次握手四次挥手 ,本文将具体展开。

TCP连接

  • 三次握手
  • 四次挥手
图形解析

话不多说,直接上图
三次握手和四次挥手

符号解释
  • SYN:表示发起一个新的连接;(标志位)
  • Seq序号:用来标识从TCP源端向目的端发送的字节流,发送方发送数据时对此进行过标记;
  • ACK:确认序号有效,ACK = Seq + 1;(标志位)
  • FIN:表示释放一个连接;(标志位)

三次握手

  • 第一次握手
    客户端(Client)发送SYN = 1, 随机产生Seq = X,将数据包发送给服务器(Server),并进入SYN_SEND状态,等待服务器确认;
  • 第二次握手
    服务器接收到数据包后,由SYN = 1知道客户端请求建立连接,服务器将SYN和ACK都置为1,ack = X + 1,随机产生Seq = Y,将数据包放给客户端以确认连接请求,服务器进入SYN_RCVD状态;
  • 第三次握手
    客户端收到确认后,检查ACK = 1?ack = X + 1?如果是,则将ACK置为1,ack = Y + 1, Seq = X + 1,并将数据包发送给服务器。服务器接收到数据包后,确认ACK = 1?ack = Y + 1?如果是,则连接建立成功,客户端和服务器端都进入ESTABLISHED状态,也即完成了三次握手。

四次挥手

(由于TCP连接是全双工的,需要对每个方向单独进行关闭,也即需要客户端和服务器端分别发送FIN来关闭连接。首先进行关闭的一方将执行主动关闭,另一方将执行被动关闭。客户端和服务器端都可以是主动关闭的那一方)。

  • 第一次挥手
    客户端发送FIN = 1(为了简便,图中其余标志位和符号在这里省略,和三次握手的原理是一样的),用来关闭客户端到服务器端的数据传达,客户端进入FIN-WAIT-1状态;
  • 第二次挥手
    服务器接收到数据包后,由FIN = 1知道客户端请求断开连接,将ACK置为1,ack = X + 1,服务器端进入CLOSE-WAIT状态(注意:这里服务器但还是可以正常发送数据,只是客户端不再发送数据);客户端收到确认后,检查ACK和ack,如果正确,则进入FIN-WAIT-2状态;
  • 第三次挥手
    服务器端发送FIN = 1,用来关闭服务器端到客户端的数据传送,进入LAST-ACK状态;
  • 第四次挥手
    客户端接收到数据包后,进入TIME-WAIT状态,然后发送数据包(ACK = 1,ack = Z + 1)给服务器,服务器进入CLOSED状态,即完成四次挥手。
您的支持将鼓励我继续创作!