Serguei E. Leontiev
2014-02-02 16:19:56 UTC
Всем привет,
Интересно, почему принято ограничено реализовывать SO_REUSEADDR?
По тексту стандарта, вроде как не подразумевается, что кроме сравнения
локальных адресов, что-то ещё учитывается.
The SO_REUSEADDR option indicates that the rules used in validating
addresses supplied in a bind() should allow reuse of local addresses.
Operation of this option is protocol-specific. The default value for
SO_REUSEADDR is off; that is, reuse of local addresses is not permitted.
Тем не менее, общепринято накладывать дополнительные ограничения такие, как
состояние TIME_WAIT для полностью идентичных пар адрес/порт (и/или запрет
перехода в сотояние TIME_WAIT), но при неполной идентичности этого
ограничения нет. Соответственно, при необходимости "истинного" повторного
использования адресов и/или необходимости полного игнорирования таймаутов в
процессе создания или удаления соединений приходится выходить за рамки
стандарта.
Конечно TIME_WAIT самое длительное состояние, но есть ещё ряд других
"коротких" состояний: полуоткрытые соединения, FIW_WAIT-ы, которые могут
мешать выполнить bind() сразу после повторного создания сокета. В чём
проблема у разработчиков реализаций TCP? Почему они усложняют жизнь
пользователям?
P.S.
SO_REUSEADDR - изначальное зло для TCP, он может вызывать проблемы. Hо
почему его недостаточно?
Интересно, почему принято ограничено реализовывать SO_REUSEADDR?
По тексту стандарта, вроде как не подразумевается, что кроме сравнения
локальных адресов, что-то ещё учитывается.
The SO_REUSEADDR option indicates that the rules used in validating
addresses supplied in a bind() should allow reuse of local addresses.
Operation of this option is protocol-specific. The default value for
SO_REUSEADDR is off; that is, reuse of local addresses is not permitted.
Тем не менее, общепринято накладывать дополнительные ограничения такие, как
состояние TIME_WAIT для полностью идентичных пар адрес/порт (и/или запрет
перехода в сотояние TIME_WAIT), но при неполной идентичности этого
ограничения нет. Соответственно, при необходимости "истинного" повторного
использования адресов и/или необходимости полного игнорирования таймаутов в
процессе создания или удаления соединений приходится выходить за рамки
стандарта.
Конечно TIME_WAIT самое длительное состояние, но есть ещё ряд других
"коротких" состояний: полуоткрытые соединения, FIW_WAIT-ы, которые могут
мешать выполнить bind() сразу после повторного создания сокета. В чём
проблема у разработчиков реализаций TCP? Почему они усложняют жизнь
пользователям?
P.S.
SO_REUSEADDR - изначальное зло для TCP, он может вызывать проблемы. Hо
почему его недостаточно?
--
Успехов, Сергей Леонтьев, <http://www.cryptopro.ru> (NewsTap)
Успехов, Сергей Леонтьев, <http://www.cryptopro.ru> (NewsTap)