gpt4 book ai didi

c - 如何知道带有 TCP Fast Open 的 sendto() 是否真的使用了 Fast Open?

转载 作者:IT王子 更新时间:2023-10-29 00:49:30 28 4
gpt4 key购买 nike

我在 Linux 3.15 机器上写了一个 TCP 客户端,它能够使用 TCP Fast Open:

        status = sendto(sd, (const void *) data, data_len, MSG_FASTOPEN,
(const struct sockaddr *) hostref->ai_addr,
sizeof(struct sockaddr_in));
if (status < 0) {
fprintf(stderr, "sendto: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
fprintf(stdout, "TFO connection successful to %s\n",
text_of(hostref->ai_addr));

使用 tcpdump,我可以检查 TCP Fast Open 选项的发送,它确实绕过了 3 次握手(使用 Google 的服务器测试)。

但是,对于接受 TCP 快速打开的服务器,sendto 仍然成功,并显示消息“TFO 连接成功”。显然,如果服务器不支持 TCP 快速打开(再次使用 tcpdump 检查),Linux 内核代码会回退到常规 TCP。

如何确定我的连接是否使用了 TCP Fast Open?

最佳答案

通过查看在 linux 内核中添加 TCP 快速打开的补丁集,您会注意到它没有添加任何使用快速打开的外部指示。

您可以间接注意到某些未使用快速打开的情况和某些肯定使用快速打开的情况。

您确定未使用快速打开的情况是在成功的 sendto() 连接后 TCPFastOpenActive 计数器的值未在/proc/net/netstat 中递增:

+   if (tcp_transmit_skb(sk, syn_data, 0, sk->sk_allocation) == 0) {
+ NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPFASTOPENACTIVE);
+ goto done;
+ }

您确定使用了快速打开的情况是当您有一个非阻塞套接字时,您已经有一个快速打开的 cookie 并且 sendto() 不返回 EINPROGRESS:

For non-blocking socket, it returns the number of bytes queued (and transmitted in the SYN-data packet) if cookie is available. If cookie is not available, it transmits a data-less SYN packet with Fast Open cookie request option and returns -EINPROGRESS like connect().

对于剩下的情况,就是你没有cookie,但是你可以连接,并且TCPFastOpenActive增加了,你不能说是否使用了快速打开(TCPFastOpenActive增加是由你的快速打开引起的)或者如果未使用快速打开(TCPFastOpenActive 增量不是由您的快速打开引起的)。

http://kernelnewbies.org/Linux_3.6#head-ac78950a7b57d92d5835642926f0e147c680b99c

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=cf60af03ca4e71134206809ea892e49b92a88896

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/diff/net/ipv4/tcp_output.c?id=783237e8daf13481ee234997cbbbb823872ac388

关于c - 如何知道带有 TCP Fast Open 的 sendto() 是否真的使用了 Fast Open?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26244536/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com