Yep. TIME_WAIT ist dafür gedacht, dass noch im Netz herumstreunende
Pakete, die eigentlich für den alten Serverprozess bestimmt waren,
sauber „verenden“ können, statt dem neuen Server zugestellt zu werden.
Hier der entsprechende Code-Ausschnitt aus sshd.c:
1 | /* Create socket for listening. */
|
2 | listen_sock = socket(ai->ai_family, ai->ai_socktype,
|
3 | ai->ai_protocol);
|
4 | if (listen_sock < 0) {
|
5 | /* kernel may not support ipv6 */
|
6 | verbose("socket: %.100s", strerror(errno));
|
7 | continue;
|
8 | }
|
9 | if (set_nonblock(listen_sock) == -1) {
|
10 | close(listen_sock);
|
11 | continue;
|
12 | }
|
13 | /*
|
14 | * Set socket options.
|
15 | * Allow local port reuse in TIME_WAIT.
|
16 | */
|
17 | if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR,
|
18 | &on, sizeof(on)) == -1)
|
19 | error("setsockopt SO_REUSEADDR: %s", strerror(errno));
|
20 |
|
21 | /* Only communicate in IPv6 over AF_INET6 sockets. */
|
22 | if (ai->ai_family == AF_INET6)
|
23 | sock_set_v6only(listen_sock);
|
24 |
|
25 | debug("Bind to port %s on %s.", strport, ntop);
|