Поддерживать семантику ESTABLISHED и TIME_WAIT

1586
Justin Wood

Когда я использую следующую команду

netstat -ant | grep :9111 | awk '' | sort | uniq -c | sort -n 

Я получаю следующее

 1 LAST_ACK 1 LISTEN 2 SYN_RECV 7 FIN_WAIT1 51 ESTABLISHED 71 FIN_WAIT2 8779 TIME_WAIT 

Я полагаю, что понимаю, TIME_WAITчто я закрыл соединение в своем приложении, и он ожидает некоторый период времени, чтобы убедиться, что клиент успешно закрыл соединение. Пожалуйста, поправьте меня, если я ошибаюсь.

Мой вопрос заключается в том, чтобы поддерживать запросы. Подавляющее большинство трафика, который я ожидаю увидеть, должно быть поддержано.

  1. Когда будет введено соединение с поддержкой TIME_WAITактивности?
  2. Можно ли для kép живой связи, чтобы перейти от TIME_WAITк ESTABLISHED? Если да, каковы условия?
3

1 ответ на вопрос

4
artistoex

Independently of the keep alive mechanism beeing enabled or disabled on either side: A connection will never go from TIME_WAIT to ESTABLISHED. TIME_WAIT is the state of a socket pair from a recently closed connection which is temporarily out of use.

A connection enters the TIME_WAIT state after the local end has successfully initiated connection tear down ("active CLOSE") and received the signal from the remote end that it too wants to close the connection. The OS then holds on to the socket pair, waiting for two MSLs before it releases it for another, fresh, connection. This ensures no segment from the old connection will interfere with any newly created connection which just happens to reuse the socket pair of the old connection.

Does this really work? Why does it suffice that only the socket pair of the actively closing end enters TIME_WAIT? Because socket pair reuse on one end implies socket pair reuse on the other end. What if the actively closing end happens to crash and rebeoot within two MSLs? Then it will enter the quiet time, during which it is not creating any connection at all.

TCP state machine