/etc/init.d/networking restart
Дозвольте мені детальніше. Протокол управління передачею (TCP) призначений для двостороннього, упорядкованого та надійного протоколу передачі даних між двома кінцевими точками (програмами). У цьому контексті термін надійний означає, що він повторно передасть пакети, якщо він загубиться посередині. TCP гарантує надійність, відсилаючи назад пакети підтвердження (ACK) назад для одного або діапазону пакетів, отриманих від однорангових.
Це стосується і керуючих сигналів, таких як запит на припинення / відповідь. RFC 793 визначає стан TIME-WAIT таким чином:
TIME-WAIT - являє собою очікування достатнього часу, щоб пройти впевненість, що віддалений TCP отримав підтвердження свого запиту на припинення з'єднання.
Дивіться таку схему стану TCP:
TCP - це протокол двостороннього зв’язку, тому при встановленні з'єднання між клієнтом і сервером немає різниці. Також кожен може зателефонувати, і обидва колеги повинні домовитись про закриття, щоб повністю закрити встановлене TCP-з'єднання.
Давайте зателефонуємо першому, щоб викликати quit як активний ближче, а другий підглядає пасивний ближче. Коли активний ближче посилає FIN, стан переходить до FIN-WAIT-1. Потім він отримує ACK для відправленого FIN і стан переходить до FIN-WAIT-2. Як тільки він отримує FIN також від пасивного ближчого, активний ближче посилає ACK до FIN і стан переходить до ЧАСУ-ЗАЧЕКАЙТЕ. Якщо пасивний ближчий не отримав ACK до другого FIN, він повторно передасть пакет FIN.
RFC 793 встановлює TIME-OUT вдвічі більше, ніж максимальний термін служби сегмента, або 2MSL. Оскільки MSL, максимальний час, коли пакет може бродити по Інтернету, встановлюється на 2 хвилини, 2MSL - 4 хвилини. Оскільки ACK немає до ACK, активний ближній не може нічого, крім чекати 4 хвилини, якщо він правильно дотримується протокол TCP / IP, на випадок, якщо пасивний відправник не отримав ACK до своєї FIN (теоретично) .
Насправді відсутні пакети, мабуть, рідкісні, і дуже рідкісні, якщо все відбувається в межах локальної мережі або в межах однієї машини.
Щоб відповісти на запитання дослівно: Як насильно закрити розетку в TIME_WAIT ?, я все одно дотримуватимусь своєї початкової відповіді:
/etc/init.d/networking restart
Практично кажучи, я би запрограмував це, щоб він ігнорував стан TIME-WAIT, використовуючи параметр SO_REUSEADDR, як згадується WMR. Що саме робить SO_REUSEADDR?
Цей параметр сокета повідомляє ядро, що навіть якщо цей порт зайнятий (у
стані TIME_WAIT), продовжуйте його і будь-коли повторно використовуйте. Якщо він зайнятий, але з іншим станом, ви все одно отримаєте адресу, яка вже використовується помилкою. Це корисно, якщо ваш сервер був закритий, а потім перезапущений відразу, поки сокети все ще активні на його порту. Ви повинні знати, що якщо надійдуть якісь несподівані дані, вони можуть заплутати ваш сервер, але, хоча це можливо, це малоймовірно.
TIME_WAIT
на сервері" , просто пропустіть перші три відповіді, які уникають питання, а не відповіді на нього.