首页 TCP三次握手
文章
取消

TCP三次握手

TCP 协议位于 TCP/IP 协议簇四层网络模型中的传输层,其上为应用层,其下为网络层。主要负责对应用层提供处于网络连接中的两个计算机之间的可靠数据传输。

TCP三次握手时序图:

TCP三次握手

对于三次握手的报文有3个关键性的标志:

  • Sequence number,序列号,32bit,用来跟踪改短发送的数据量。
  • Acknownledgment number,确认码,回复给对方确认用的数值,数值。
  • Flags,标志位,12bit。有9个标志:ReservedNonceCongestion Window ReducedECN-EchoUrgentAcknownledgmentPushResetSynFin。除了 Reserved 占3bit外,其他都占1bit。在握手过程中我们着重关注 Acknownledgment(确认)、Syn(申请建立连接)这两个标志。

面试过程中曾因为前两个的叫法记不清而回答地比较尴尬⊙﹏⊙

详细流程如下:

1.客户端向服务器端发送一个 SYN 来创建一个主动打开,并把这段连接的序列号设定为随机数 A(下方的序列号为0,实质为Wireshark展示的相对序列号,非真实序列号,下同)。

客户端想服务端发送SYN

标志位 SYN,表示请求建立一个连接; 按 TCP 规定,该请求不能携带数据; 发送报文后,客户端进入 SYN_SENT 状态。

2.服务器端对客户端回送一个 SYN/ACKACK 的确认码的值为 A+1SYN/ACK 包本身又有一个随机序号 B。

服务端回复客户端SYN/ACk

标志位 ACK,表示确认,同时也有 SYN 表示服务端也请求建立一个连接; 发送报文后,客户端进入 SYN—RECV 状态。

3.最后,客户端再发送一个 ACK 给服务端。当服务端收到这个 ACK 的时候,就完成了三次握手,并进入了连接创建状态。此时包序号被设定为收到的确认号 A+1,而响应则为 B+1

客户端回复服务端ACK

客户端和服务端都进入 ESTABLISHED 状态。

为什么客户端在第三步还要发送一个 ACK 报文?

由于网络环境不可控,如果已经失效的连接请求又传到了服务端,服务端又会建立连接状态,这样会白白浪费服务端资源。

本文由作者按照 CC BY 4.0 进行授权