От 20 апреля 2015 г., 10:16:50 в fido7.ru.linux.chainik ты писал: SEL>>>> Если память меня не подводит TIME-WAIT - это для SEL>>>> того, кто соединение закрывает (кто сокет SEL>>>> закрывает или сам безвременно умирает). EP>>> Строго наоборот -- RFC761, page 21
Прошу прощения, сразу не отметил, что следует читать не RFC 761, а RFC 793, в деле TIME-WAIT они немного отличаются.
SEL>> По моему, ты плохо прочитал: SEL>> TIME-WAIT - represents waiting for enough time to pass SEL>> to be sure the remote TCP received the acknowledgment SEL>> of its connection termination request. SEL>> Или поясни, как ты это понимаешь. EP> Двумя страницами ниже (page 22 реально короткий) есть EP> flow-chart. Из него следует, что в состояние TIME-WAIT переход EP> из состояния FIN-WAIT-2 и только из этого состояния.
Строго говоря, если мне не изменяет память, это была ошибка в RFC 761, которую исправили в действующем RFC 793, т.е. в TIME-WAIT попадают, как из FIN-WAIT-2, так из CLOSING.
EP> Далее: EP> FIN-WAIT-2 - represents waiting for a connection termination EP> request from the remote TCP. EP> Теперь, сокет привязан к дескриптору, дескриптор к процессу. EP> Положим процесс умер, и, действительно, ядро может доделать всю EP> FIN-вакханалию. По идее, должен быть зомби. Иначе, получается EP> что должен быть порт в состоянии отличном от CLOSED для EP> которого нет процесса, пусть даже зомби.
Всё правильно (с точностью до ошибки в RFC 761), только зачем процессу становится зомби? (Впрочем, во времена оные на каких-то системах вроде бы так бывало, у меня есть какие-то смутные, смутные воспоминания). Состояние TIME_WAIT - чисто "защитное" состояние протокола TCP, завершение которого практически никак не влияет на процесс (хотя смотри ниже, если подходить математически строго, то каждое TCP соединение должно закрываться 2MSL секунд).
Как легко видеть в предыдущих экспериментах с netcat на Linux и FreeBSD таки появляется порт в состоянии TIME_WAIT, для которого нет процесса.
Впрочем, точно так же происходит, и на Windows 8.1: C:\Program Files>nc -l 8901 mmmm (здесь Ctrl-C) C:\Program Files>netstat -an | grep 8901