2014-10-07 2 views
5

Ich schreibe ein TCP-Client auf einem Rechner Linux 3.15, die die Verwendung von TCP Schnell Öffnen ist in der Lage:Wie kann ich wissen, ob sendto() mit TCP Fast Open tatsächlich Fast Open verwendet?

 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)); 

Mit tcpdump, kann ich das Senden der TCP Fast Open Option überprüfen und, dass sie die 3 nicht umgehen -Way Handshake (getestet mit Googles Servern).

mit Servern jedoch die tut nicht TCP akzeptieren schnell offen, SENDTO noch erfolgreich ist, und die Meldung „TFO Verbindung erfolgreich“ angezeigt wird. Offenbar fällt der Linux-Kernel-Code auf reguläres TCP zurück, wenn der Server TCP Fast Open nicht unterstützt (wieder mit tcpdump geprüft).

Wie finde ich heraus, ob meine Verbindung TCP Fast Open verwendet oder nicht?

+0

Wenn Sie wirklich wollen, können Sie Raw Sockets Ihr TCP-Verbindung zu öffnen, verwenden können. – dari

+1

Der Punkt von sendto() ist, * die Daten * zu senden. Wenn Sie möchten, dass es provisorisch ist, wenn Sie die Verbindung schnell öffnen, müssen Sie Ihre eigenen rollen. Aber warum? –

+0

Warum kümmert es dich? Wenn die Nachricht zu beiden Arten von Servern durchkommt, ist Ihre Arbeit sicher beendet? – EJP

Antwort

5

Wenn Sie sich den Patch-Satz anschauen, der im Linux-Kernel TCP Fast Open hinzugefügt hat, bemerken Sie, dass keine externe Anzeige hinzugefügt wurde, dass Fast Open verwendet wurde.

Sie können indirekt bestimmte Fälle feststellen, in denen nicht schnell geöffnet wurde und bestimmte Fälle, in denen schnell geöffnet wurde, wurden definitiv verwendet.

Der Fall, dass Sie sicher sind, schnell geöffnet wurde nicht verwendet, wenn der Wert des TCPFastOpenActive Zähler nicht in/proc/net/netstat nach einer erfolgreichen sendto() Verbindung erhöht wurde:

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

Der Fall dass Sie sicher schnell geöffnet sind wurde verwendet, wenn Sie eine nicht-blockierenden Socket haben, haben Sie bereits einen schnellen offenen Cookie und sendto() haben nicht EINPROGRESS zurück:

Für nicht-blockierenden Socket, gibt er die Nummer Bytes in der Warteschlange (und im SYN-Datenpaket übertragen), wenn coo Kie ist verfügbar. Wenn das Cookie nicht verfügbar ist, sendet es ein datenloses SYN-Paket mit der Option Schnellanforderung Cookie-Anforderung und gibt -EINPROGRESS wie connect() zurück.

Für den verbleibenden Fall, das heißt, Sie haben nicht ein Plätzchen, aber sie waren in der Lage zu verbinden und TCPFastOpenActive erhöht wurde, kann man nicht, wenn schnell geöffnet wurde verwendet, sagen kann (TCPFastOpenActive Zuwachs von Ihrem verursacht wurde Fast Open) oder wenn Fast Open nicht verwendet wurde (TCPFastOpenActive Increment wurde nicht von Ihrem Fast Open verursacht).

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

Dies alles geht davon aus, dass niemand sonst es zur gleichen Zeit macht. Wenn dies der Fall ist, sind alle Wetten aus: Die Erhöhung könnte auf einen anderen Prozess zurückzuführen sein. – EJP

+1

Lesen Sie noch einmal. "Sie können nicht sagen, ob Fast Open verwendet wurde (TCPFastOpenActive Increment wurde von Ihrem Fast Open verursacht) oder wenn Fast Open nicht verwendet wurde (TCPFastOpenActive Increment wurde nicht von Ihrem Fast Open verursacht)." – hdante