2014-10-07 58 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