2014-10-07 54 views
5

我编写Linux 3.15的机器,它是能够使用TCP快速打开一个TCP客户端:如何知道sendto()与TCP Fast Open实际使用Fast Fast?

 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快速打开选项的发送和它并绕过3通过握手(经过Google服务器测试)。

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

如何找出我的连接是否使用TCP Fast Open?

+0

如果你真的想,你可以使用原始套接字来打开你的TCP连接。 – dari 2014-10-07 20:29:56

+1

sendto()的要点是*发送数据*。如果你想在成功快速开通连接时成为临时的,那么你必须自己推出。但为什么呢? – 2014-10-07 20:34:22

+0

你为什么在意?如果消息传递给两种服务器,那么你的工作是否完成? – EJP 2014-10-08 00:03:33

回答

5

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

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

,你就一定没有使用快开的情况是,当TCPFastOpenActive计数器的值在/ proc /网/ netstat的一个成功的sendto()后,连接没有增加:

+ 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:

对于非阻塞插座,它返回数排队的字节(并且在SYN数据分组中传送 )如果coo kie可用。如果Cookie 不可用,它将使用快速打开 cookie请求选项传输无数据SYN数据包,并返回-EINPROGRESS(如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

+0

这一切都假定没有人在同一时间做它。如果是,则所有投注均为关闭:增量可能是由于另一个过程造成的。 – EJP 2014-10-08 03:31:27

+1

再次阅读。 “你不能说如果使用快速打开(TCPFastOpenActive增量是由快速打开导致的),或者快速打开未使用(TCPFastOpenActive增量不是由于快速打开导致的)。” – hdante 2014-10-08 10:48:46