传输层

三次握手

image.png

三次握手是TCP连接的建立过程。在握手之前,主动打开连接的客户端结束CLOSE阶段,被动打开的服务器也结束CLOSE阶段,并进入LISTEN阶段。随后进入三次握手阶段:

  1. 首先客户端向服务器发送一个SYN包,并等待服务器确认,其中:
    • 标志位为SYN,表示请求建立连接。
    • 序号为Seq = x (x 一般为1)
    • 随后客户端进入SYN-SENT阶段
  2. 服务器接收到客户端发来的SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文,其中:
    • 标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接。
    • 序号为Seq = y
    • 确认号为ACK = x + 1, 表示收到客户端的序号Seq并将其值加1 作为自己确认号Ack的值,随后服务器端进入SYN-RECV阶段。
  3. 客户端接收到发送的SYN+ACK包后,明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段。并返回最后一段报文。其中:
    • 标志位为ACK,表示确认收到服务器端同意连接的信号
    • 序号为Seq = x + 1,表示收到服务器端的确认号ACK,并将其作为自己的序号值
    • 确认号为ACK = y + 1,表示收到服务器端序号Seq, 并将其值加1作为自己的确认号ACK的值
    • 随后客户端进入到ESTABLISHED

当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束SYN-RECV阶段,进入ESTABLISHED阶段,从而完成三次握手。

四次挥手

image-20210704172933433

四次挥手即TCP连接的释放,这里假设客户端主动释放连接。在挥手之前主动释放连接的客户端结束ESTABLISHED阶段,随后开始四次挥手:

  1. 首先客户端向服务器发送一段TCP报文表明其想要释放TCP连接,其中:
    • 标记位为FIN,表示请求释放连接;
    • 序号为Seq = u;
    • 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段,并且停止向服务器端发送通信数据。
  2. 服务器接收到客户端请求断开连接的FIN报文后,结束ESTABLISHED阶段,进入CLOSE-WAIT阶段并返回一段TCP报文,其中:
    • 标记位为ACK,表示接收到客户端释放连接的请求;
    • 序号为Seq = v;
    • 确认号为ACK = u + 1,表示是收到客户端报文的基础上,将其序号值加1作为本段报文确认号ACK的值
    • 随后服务器开始准备释放服务器端到客户端方向上的连接

客户端收到服务器发送过来的TCP报文后,确认服务器已经收到了客户端连接释放的请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段

  1. 服务器端在发送ACK确认报文后,服务器端会将遗留的待传数据传送给客户端,待传输完成后经过CLOSE-WAIT阶段,便做好了释放服务器端到客户端的连接准备,再向客户端发出一段TCP报文,其中:

    • 标记位为FIN和ACK,表示已经准备好释放连接了。
    • 序号为Seq = w;
    • 确认号ACK = u + 1,表示是在收到客户端报文的基础上,将其序号 Seq 的值加 1 作为本段报文确认号 Ack 的值。

    随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止向客户端发送数据。

  2. 客户端收到从服务器发来的 TCP 报文,确认了服务器已经做好释放连接的准备,于是结束 FIN-WAIT-2 阶段,进入 TIME-WAIT 阶段,并向服务器发送一段报文,其中:

    • 标记位为ACK,表示接收到服务器准备好释放连接的信号
    • 序号为Seq = u + 1,表示是在收到服务器报文的基础上,将其确认号ACK值作为本段序号的值
    • 确认号为ACK = w + 1,表示已经收到服务器报文的基础上,将其序号Seq的值作为本段报文确认号的值。

    随后客户端开始在TIME-WAIT阶段等待2MSL。服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器到客户端方向上的连接。客户端等待完 2 MSL 之后,结束 TIME-WAIT 阶段,进入 CLOSED 阶段,由此完成「四次挥手」。