« Отговор #5 -: Mar 25, 2015, 00:59 »
Не виждам смисъла от заниманието, ама все пак таймаутите се контролират през procfs и има много вариации на темата според сценария. TCP стека е доста комплексно нещо. Понеже ме мързи да ровя документация, а и не мисля да се ровя вместо теб, ще направя нещо много по-полезно, мисля да ти обясня в общият случай как се случват нещата, за да няма разочарования.
Първо, има два варианта, при които една TCP връзка би "увиснала" в ESTABLISHED състояние - когато отсрещната страна се отсвири или когато отстрещната страна не се е отсвирила, но няма трафик, т.е връзката е установена, но е idle. Първият случай е много лесен за разрешаване - директно, има си procfs врътка, контролираща колко време трябва да мине преди връзката да се затвори ако няма никаква активност. Този таймаут по дефолт е доста висок, в рамките на няколко часа в честия случай, макар че това варира от дистрибуция до дистрибуция.
По-проблемен е случая обаче в който някой сокет е "маркиран" чрез setsockopt() да е keepalive сокет. В този случай, след изтичане на таймаута, връзката не се затваря, вместо това периодично се засилват празни TCP пакети и се чака ACK отсреща. Ако след няколко опита няма потвърждения, връзката се затваря. Колко да се чака и колко опита да се правят е също въпрос на procfs врътки, чиито имена не знам наизуст. При това положение, ако отсрещната страна се е отсвирила, връзката все пак ще се затвори. Обаче има и следващ вариант - отсрещната страна не се е отсвирила, но нарочно държи връзката idle, защото няма какво да прати или не иска да праща нищо, но въпреки това отговаря на keepalive пакетите (което може да е напълно вероятен евентуален DoS сценарий в някакъв специфичен случай). Което апропо обикновено също е и случая със ssh клиенти или сървъри с конфигурирани брутално високи таймаути. Е тогава нещата много загрубяват - в добрия случай софтуерът е така любезен да ти предостави възможност да конфигурираш таймаутите (sshd поне го прави). В случая в който не го прави, може би варианта остава ползването на някое шашаво iptables разширение, което може да match-ва трафик по timestamp-и в conntrack таблицата, не може да няма такова. Ако това ти се вижда странно, разбери че TCP стека в линукс ядрото не може да влиза в ролята на полицай, има си съвсем легитимни случаи където някоя TCP връзка да може да е idle с дни наред и щом като потребителския софтуер го е изискал, тогава да си чупи главата.
Та не знам точно какъв е твоя случай и кое точно виждаш като проблем. За мен лично това ограничение от 20 установени TCP връзки ми се вижда малко странно.