Оригинален въпрос
Свързвам се към node.js TCP сървър (на localhost) с telnet и се опитвам да проуча сонди за поддържане на активност.
Като първи тест бих искал да се свържа със сървъра с telnet и да прекратя telnet сесията по начин, който не изпраща FIN пакет. (Оставяйки сървъра да мисли, че TCP сокетът все още е „здрав“.) За съжаление не мога да намеря умен начин да тествам това.
- Когато изляза от telnet от подканата за telnet, събитието
end
на сокета се задейства във възела. Очевидно е получил FIN пакет. - Когато
kill
процесът на telnet, той също чисто прекъсва връзката с FIN пакет, преди процесът да умре.
Знаете ли за начин да излезете от telnet, без да изпращате FIN пакет (за предпочитане да не включва мрежов кабел, който е прекъснат / създаващ физическа грешка в мрежата.)
Подобрен въпрос
Искам да симулирам мрежова повреда, като използвам само localhost / loopback (без всъщност да изключвам интерфейси / мрежови кабели). Искам да отворя TCP връзка между клиент и сървър, и двата на localhost. Тогава искам клиентът да умре, без да уведоми сървъра, че го няма. (Т.е. без изпращане на FIN пакет.) Това може да се случи в реална мрежа, ако рутерът се повреди например.
Благодарение на коментарите по-долу научих, че ядрото ще събира всички отворени портове/сокети, притежавани от процес, когато процесът умре (или бъде принудително убит), като моя telnet
по-горе, и ще ги затвори за процеса, като изпрати FIN пакет. Така че трябва да подмами ядрото да не затвори съществуваща връзка.
И така, как мога да създам клиентски процес, да го поддържам жив, но да го оставя да се държи като напълно мъртва TCP връзка?
Спойлери
- (Отговор 1 по-долу: Използвайте необработен сокет (scapy), оставете го да игнорира всички пакети, изпратени от сървъра след първоначалната връзка и някои тестови данни. (След определено време, например.))
- (Отговор 2, Идея от колега: конфигурирайте
iptables
за прекъсване на трафика между клиент и сървър. Действително правилоiptables
в коментар по-долу.)