TCP Fast Open
Contents
折腾 TCP 的同时看到了 TCP Fast Open 这个有趣的参数,它是对 TCP 的优化,无需等待 3 次握手,应用程序就可以通过 TCP 发送数据。
正常 TCP 建立连接过程:
1 | Client Server |
当前 TCP 实现的问题是,只有在连接发起方收到来自对等 TCP 的 ACK(确认)段后,才能在连接上交换数据。也就是说,只有在三次握手的第三步(发起方发送的 ACK 报文段)中,数据才能从客户端发送到服务器。因此,在对等点之间交换数据之前,就会损失一个完整的往返时间 (round trip time) 。这种丢失的 RTT 是短网络对话延迟的重要组成部分。TCP Fast Open 就是为了解决这个问题。
消除 RTT
1 | Client Server |
上图所示步骤如下:
-
客户端 TCP 发送 SYN,其中包含 TFO cookie(指定为 TCP 选项)和来自客户端应用程序的数据。
-
服务器 TCP 通过基于新 SYN 的源 IP 地址重复加密过程来验证 TFO cookie。如果 cookie 被证明是有效的,那么服务器 TCP 就可以确信这个 SYN 来自它声称来自的地址。这意味着服务器 TCP 可以立即将应用程序数据传递给服务器应用程序。
-
从这里开始,TCP 会话正常进行:服务器 TCP 向客户端发送 SYN-ACK 段,然后客户端 TCP 进行确认,从而完成三向握手。服务器 TCP 还可以在收到客户端的 ACK 之前 向客户端 TCP 发送响应数据段。
这是一个使用 tcpdump
查看使用了 TCP_FAST_OPEN
选项的抓包记录:
1 | 1. IP 127.0.0.1.51902 > 127.0.0.1.8000: Flags [S], seq 3550480872:3550480878, win 33280, options [mss 65495,sackOK,TS val 1437621030 ecr 0,nop,wscale 7,tfo cookie ce80700cf8e6113c,nop,nop], length 6 |
可以看到 3
这个数据段在 4
这个 ACK 数据包之前。并且 options 中有一个 cookie
字段。
1 | import socket |
1 | import socket |
sendto
需要提供 ip, 因为是 connectionless.
具体参考:
Author: xun
Link: http://blog.fooo.in/2024/08/14/network/tcp-fast-open/
License:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。