Mam małą sieć lokalną, która łączy się w niewoli Wi-Fi, i używam jej ssh
w OS X z -oServerAliveInterval=240
PuTTY 0.62 w Windows 7 Professional do nawiązywania połączeń z moim Linode, Hetzner i innymi serwerami.
Za pomocą PuTTY wybieram Connection
→ Sending of null packets to keep session active
do 240. Enable TCP keepalives (SO_KEEPALIVE option)
Domyślnie jest wyłączone.
Kiedy mój internet jest chwilowo wyłączony przez około minutę (trzeba ponownie uwierzytelnić na portalu dostępowym), PuTTY prawie zawsze traci wszystkie otwarte sesje ssh, które mam, a zwłaszcza te, w których była jakakolwiek aktywność, ale OpenSSH na OS X nigdy nie traci żadnych sesji, dopóki mój Internet jest ponownie włączony w ciągu około minuty lub dwóch, nawet jeśli faktycznie próbuję wpisać coś w ssh i nie widzę odpowiedzi przez całe 60 sekund, dopóki moje połączenie nie zostanie ponownie aktywne. (Więc wiem na pewno, że stany NAT są zawsze zachowywane).
Czy mogę powstrzymać system Windows / PuTTY przed zapobiegawczym odrzucaniem dobrych połączeń?
Wydaje mi się, że SO_KEEPALIVE lub niektóre z nich są domyślnie włączone w systemie Windows, a limit czasu na wykrywanie nieaktualnych połączeń jest zdecydowanie za mały. Chciałbym zwiększyć go do wartości przekraczającej kilka sekund, podobnie jak system OS X jest odporny na te krótkie tymczasowe przerwy, o ile przerwa wynosi tylko kilkaset sekund i jest mniejsza niż wartość -oServerAliveInterval
(razy ServerAliveCountMax
).
mosh
jest lepszą alternatywą.)Odpowiedzi:
http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-timeout
Wygląda na to, że
TcpMaxDataRetransmissions
(REG_DWORD) bezpośrednio na to wpływa. Wartość można dodać zaHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters
pomocąregedit.exe
(domyślnie brakuje klucza, więc najpierw musisz go dodać, aby go zmienić). Po rozbrojeniu - 5. Dodaj go, ustaw przynajmniej naf
(15) i uruchom ponownie.Domyślna wartość 5 wydaje się dość nieodpowiednia do utrzymywania połączeń podczas krótkich i tymczasowych awarii sieci; upłynie limit czasu w ciągu kilku sekund. Dodałem ten
TcpMaxDataRetransmissions
klucz do rejestru i ustawiłem jego wartość naf
(15), ponownie uruchomiłem maszynę i po zrobieniusysctl net.inet.ip.forwarding=0
na routerze tuż przed wpisaniem znaku w PuTTY, otrzymałem echo znaku po włączeniu przekazywania dalej na moim routerze po odczekaniu 5 minut (przetestowałem go, aby ustalić, że wartość 0x0000000c (12) powoduje zerwanie połączenia dokładnie 7 minut po pierwszej próbie wysłania pakietu podczas awarii). Przed ponownym uruchomieniem PuTTY natychmiast przekroczył limit połączenia w ciągu kilku sekund. Pamiętaj, że wymagane było ponowne uruchomienie komputera - przynajmniej w systemie Windows 7 Professional,sama zmiana rejestru nie ma wpływu ani na istniejące, ani na nowe połączenia ! W systemie Windows nic się nie zmienia!Podczas gdy na nią, może również dodawać i zestaw
KeepAliveInterval
do60000
dziesiętnych (60 sek) z domyślnego wyłączonym wartości1000
(1 sek), ale to nie powinno mieć żadnego wpływu w moim przypadku określonego jak wyżej, ponieważ utrzymywanie aktywności TCP nie zostały włączone.źródło