0%

TCP只握手两次可以吗

一般来讲,三次握手,四次挥手,那么我能不能少握一次呢?

常规三次握手流程中,客户端要向服务器发送两次数据包,服务器要返回一次数据包才能完成握手并连接

假定我处在一个很差的网络环境下,我与服务器之间传输的时间均需要100ms,即RTT 200ms,假设不丢包。

那么在常规的三次握手时,服务器在第300ms收到ACK确认报文后,才能进入ESTABLISHED连接态。在服务器进入ESTABLISHED状态后,发送的数据包中包含的应用层数据才能被正确接收,在网络环境差的情况下,而如果发生丢包,体感的延迟会更加明显。

为了能够更快地建立连接,有了TCP快速打开机制(TCP Fast Open,以下简称TFO),这个机制需要服务器与客户端都支持这个功能的时候才能成功生效。假定客户端和服务器都支持TFO,那么流程会变成如下。

TFO —— TCP Fast Open

TFO初次连接

TFO初次连接与常规的三次握手过程相同,但是会多带一个字段

sequenceDiagram;
participant a as 客户端
participant b as 服务器

a->>b: SYN=x, CookieOpt=NIL
activate b
b->>b: 生成具备时效性的Cookie c
deactivate b
b->>a: SYN=y, ACK=x+1, CookieOpt=c
a->>b: ACK=y+1

TFO后续连接

在Cookie在有效期内的时候,后续与服务器建立连接的流程变成如下

sequenceDiagram;
participant a as 客户端
participant b as 服务器

a->>b: SYN=x, CookieOpt=c, DATA
b->>a: SYN=y, ACK=x+len(DATA)+1, DATA_B
a->>b: ACK=y+1
a->>b: ACK=y+len(DATA_B)+1

更加形象的两种方式对比如图

可以看到,在初次请求的过程时,TFO表现与传统的三次握手一样。但在后续的连接过程中,因为有Cookie的接入,在SYN阶段的应用层载荷也能被传递给应用,应用也能做出返回,如图中,TFO方式的HTTP Response相比传统方式快了一个RTT时间,在刚刚假定的理想情况下,TFO方式能够领先200ms返回 HTTP response。