我在Linux 3.15机器上编写了一个TCP客户端,它能够使用TCP快速打开:
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快速打开?
发布于 2014-10-08 02:33:34
通过查看在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:
对于非阻塞套接字,如果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
https://stackoverflow.com/questions/26244536
复制相似问题