首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道是否sendto()与TCP快速开放实际上使用快速开放?

如何知道是否sendto()与TCP快速开放实际上使用快速开放?
EN

Stack Overflow用户
提问于 2014-10-07 20:19:04
回答 1查看 3K关注 0票数 6

我在Linux 3.15机器上编写了一个TCP客户端,它能够使用TCP快速打开:

代码语言:javascript
复制
        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,我可以检查tcpdump选项的发送,并且它确实绕过了3路握手(用Google的服务器进行测试)。

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

如何确定我的连接是否使用TCP快速打开?

EN

回答 1

Stack Overflow用户

发布于 2014-10-08 02:33:34

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

您可以间接地注意到没有使用快速打开的某些情况,以及肯定使用了快速打开的某些情况。

您确信没有使用“快速打开”的情况是,在成功的sendto()连接之后,TCPFastOpenActive计数器的值没有在/proc/net/netstat中增加:

代码语言:javascript
复制
+   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:

对于非阻塞套接字,如果cookie可用,则返回排队的字节数(并在SYN-数据包中传输)。如果cookie不可用,它将发送带有快速打开cookie请求选项的无数据SYN数据包,并返回像connect()这样的-EINPROGRESS。

对于其余的情况,即您没有cookie,但是您能够连接并且TCPFastOpenActive是递增的,您不能说是使用了快速打开(TCPFastOpenActive增量是由您的快速打开引起的)还是如果没有使用快速打开(TCPFastOpenActive增量不是由您的快速打开引起的)。

3.6#head-ac78950a7b57d92d5835642926f0e147c680b99c

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

output.c?id=783237e8daf13481ee234997cbbbb823872ac388

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26244536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档