/etc/init.d/networking restart
Pozwól mi rozwinąć. Protokół kontroli transmisji (TCP) został zaprojektowany jako dwukierunkowy, uporządkowany i niezawodny protokół transmisji danych między dwoma punktami końcowymi (programami). W tym kontekście termin niezawodny oznacza, że prześle pakiety ponownie, jeśli zgubi się w środku. TCP gwarantuje niezawodność, wysyłając z powrotem pakiety potwierdzenia (ACK) dla jednego lub szeregu pakietów otrzymanych od partnera.
To samo dotyczy sygnałów sterujących, takich jak żądanie / odpowiedź o zakończenie. RFC 793 definiuje stan CZAS OCZEKIWANIA w następujący sposób:
CZAS OCZEKIWANIA - oznacza oczekiwanie na wystarczającą ilość czasu, aby upewnić się, że zdalny TCP otrzymał potwierdzenie żądania zakończenia połączenia.
Zobacz następujący diagram stanu TCP:
TCP jest dwukierunkowym protokołem komunikacyjnym, więc po ustanowieniu połączenia nie ma różnicy między klientem a serwerem. Ponadto każdy z nich może wywoływać rezygnacje, a obydwaj uczestnicy muszą zgodzić się na zamknięcie, aby całkowicie zamknąć ustanowione połączenie TCP.
Zadzwońmy do pierwszego, który wywołuje wyjścia jako aktywny bliżej, a drugi do pasywnego bliżej. Kiedy aktywny bliżej wysyła FIN, stan przechodzi do FIN-WAIT-1. Następnie otrzymuje potwierdzenie dla wysłanego FIN, a stan przechodzi do FIN-WAIT-2. Gdy otrzyma FIN również z pasywnego bliższego, aktywny bliższy wysyła potwierdzenie do FIN, a stan przechodzi do CZASU OCZEKIWANIA. W przypadku, gdy pasywne zbliżenie nie otrzymało potwierdzenia do drugiego FIN, retransmituje pakiet FIN.
RFC 793 ustawia TIME-OUT na dwukrotność maksymalnego czasu życia segmentu lub 2MSL. Od czasu MSL maksymalny czas, w którym pakiet może wędrować po Internecie, jest ustawiony na 2 minuty, 2MSL to 4 minuty. Ponieważ nie ma ACK dla ACK, aktywne zamknięcie nie może zrobić nic innego, jak tylko czekać 4 minuty, jeśli poprawnie przestrzega protokołu TCP / IP, na wypadek, gdyby pasywny nadawca nie otrzymał ACK do jego FIN (teoretycznie) .
W rzeczywistości brakujące pakiety są prawdopodobnie rzadkie i bardzo rzadkie, jeśli wszystko dzieje się w sieci LAN lub na jednym komputerze.
Aby odpowiedzieć dosłownie na pytanie, jak przymusowo zamknąć gniazdo w TIME_WAIT ?, nadal będę trzymać się mojej oryginalnej odpowiedzi:
/etc/init.d/networking restart
Praktycznie rzecz biorąc, zaprogramowałbym go tak, aby ignorował stan CZAS OCZEKIWANIA za pomocą opcji SO_REUSEADDR, jak wspomniano w WMR. Co dokładnie robi SO_REUSEADDR?
Ta opcja gniazda informuje jądro, że nawet jeśli ten port jest zajęty (w
stanie TIME_WAIT), idź dalej i użyj go ponownie. Jeśli jest zajęty, ale z innym stanem, nadal pojawia się błąd już używanego adresu. Jest to przydatne, jeśli serwer został zamknięty, a następnie ponownie uruchomiony od razu, gdy gniazda są nadal aktywne na jego porcie. Należy pamiętać, że jeśli pojawią się jakieś nieoczekiwane dane, mogą one mylić serwer, ale chociaż jest to możliwe, nie jest prawdopodobne.
TIME_WAIT
na serwerze” , po prostu pomiń pierwsze trzy odpowiedzi, które unikają pytania, zamiast na nie odpowiadać.