TCP 协议位于 TCP/IP 协议簇四层网络模型中的传输层,其上为应用层,其下为网络层。主要负责对应用层提供处于网络连接中的两个计算机之间的可靠数据传输。
TCP三次握手时序图:
对于三次握手的报文有3个关键性的标志:
- Sequence number,序列号,32bit,用来跟踪改短发送的数据量。
- Acknownledgment number,确认码,回复给对方确认用的数值,数值。
- Flags,标志位,12bit。有9个标志:
Reserved
、Nonce
、Congestion Window Reduced
、ECN-Echo
、Urgent
、Acknownledgment
、Push
、Reset
、Syn
、Fin
。除了Reserved
占3bit外,其他都占1bit。在握手过程中我们着重关注Acknownledgment
(确认)、Syn
(申请建立连接)这两个标志。
面试过程中曾因为前两个的叫法记不清而回答地比较尴尬⊙﹏⊙
详细流程如下:
1.客户端向服务器端发送一个 SYN
来创建一个主动打开,并把这段连接的序列号设定为随机数 A(下方的序列号为0,实质为Wireshark展示的相对序列号,非真实序列号,下同)。
标志位 SYN
,表示请求建立一个连接; 按 TCP 规定,该请求不能携带数据; 发送报文后,客户端进入 SYN_SENT
状态。
2.服务器端对客户端回送一个 SYN/ACK
。ACK
的确认码的值为 A+1
,SYN/ACK
包本身又有一个随机序号 B。
标志位 ACK
,表示确认,同时也有 SYN
表示服务端也请求建立一个连接; 发送报文后,客户端进入 SYN—RECV
状态。
3.最后,客户端再发送一个 ACK
给服务端。当服务端收到这个 ACK
的时候,就完成了三次握手,并进入了连接创建状态。此时包序号被设定为收到的确认号 A+1
,而响应则为 B+1
。
客户端和服务端都进入 ESTABLISHED
状态。
为什么客户端在第三步还要发送一个 ACK
报文?
由于网络环境不可控,如果已经失效的连接请求又传到了服务端,服务端又会建立连接状态,这样会白白浪费服务端资源。