Warum Linux 'time_wait' Port wiederverwenden?

7

Wie ich weiß, kann der TCP-Port in 'time_wait' nicht verwendet werden. In meinem Experiment verwendet der Server jedoch den Port 'time_wait'? Warum?

Geben Sie zunächst auf dem Clientcomputer den Befehl ein ehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range. Die maximale Anzahl von TCP-Ports beträgt also 2.

Servercode

while (1) {
    int len = sizeof(struct sockaddr);
    fd = accept(sfd, &remote, &len);

    read(fd, buf, sizeof(buf));
    close(fd);
}

Client-Code

    for (i = 0; i < 3; i++)
    {
        sleep(1);
        pid_t pid = fork();
        if (pid == 0)
        {
            handler();
            exit(0);
        }
    }

 void handler()
 {
      * ............. */

      res = connect(sfd, result->ai_addr, result->ai_addrlen);
      if (res == -1) {
        perror("error");
        exit(1);
      }

      printf("connect\n");
 }

Show

[root@livecd ~]# ./client 
connect
[root@livecd ~]# connect
connect

Es sind bis zu 3 Verbindungen. Ich denke, höchstens 2 Verbindungen. Warum ? Server hat 2 Timewait-Verbindungen.

[root@livecd ~]# netstat -anp | grep TIME
tcp  192.168.88.131:2016   192.168.88.132:40000  TIME_WAIT                  
tcp  192.168.88.131:2016   192.168.88.132:40001  TIME_WAIT                              

Umgebung

Linux livecd.centos 2.6.32-642.el6.i686 #1 SMP Tue May 10 16:13:51 UTC 2016

Serverkonfiguration

[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle 
0
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse 
0

Client-Konfiguration

[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
40000   40001

Wichtig Ich versuche auch Ubuntu Server 14.04, habe aber das gleiche Ergebnis erzielt.

Pengcheng
quelle
2
Dies ist möglicherweise besser für Unix- und Linux SE- Sites geeignet, da Sie anscheinend eine Live-CD verwenden, die nicht wie ein Produktionssystem klingt.
Zagrimsan
Ich versuche auch Ubuntu Server 14.04, habe aber immer noch das gleiche Ergebnis.
Pengcheng

Antworten:

6

Der Status "Wartezeit" verhindert, dass alte Pakete einer vorherigen Verbindung in eine neue Verbindung aufgenommen werden. Es lässt effektiv genug Zeit, damit alte Pakete im Netzwerk "sterben" können.

Ein Socket im Timewait-Status kann jedoch eine neue Verbindung akzeptieren, solange die anfängliche Sequenznummer auf dem SYN höher ist als die letzte auf dem Socket angezeigte Sequenznummer.

Mark Riddell
quelle
Entschuldigung, ich kann Ihre Meinung nicht verstehen. Die Sequenznummer ist sehr groß und nimmt mit der Zeit zu. In den meisten Fällen ist die Sequenznummer von SYN also größer als die letzte Sequenznummer. Wenn jedoch die letzte Sequenznummer maximal ist, ist die Sequenz des neuen SYN kleiner als die letzte Sequenznummer. Die letzte Fin- Seq-Nummer kann nicht im Schiebefenster der neuen Verbindung angezeigt werden, da die Seq-Nummer viel Zeit benötigt, um das Maximum zu erreichen. Ich bin sicher, dass die Zeit viel größer als 2MSL ist. Wenn Sie Recht haben, warum brauchen wir time_wait, um ein altes Paket zu "sterben"?
Pengcheng
TIME-WAIT ist erforderlich, um sicherzustellen, dass alte doppelte Pakete von einer vorherigen Verbindung nicht in eine neue Verbindung aufgenommen werden, wenn die Sequenznummer für doppelte Pakete zufällig in das Fenster der neuen Verbindung fällt.
Mark Riddell