кто первым устанавливает флаг tcp FIN в соединении клиент-сервер - PullRequest
3 голосов
/ 13 января 2011

Кто должен сначала установить флаг TCP FIN. Сервер, когда закончена отправка данных, или Клиент, когда получил полные данные?

привет

Ответы [ 3 ]

12 голосов
/ 13 января 2011

FIN отправляется, когда приложение на этой стороне запрашивает закрытие соединения. Этого не должно происходить сразу же после получения FIN с другой стороны, либо одна сторона может отправить FIN, а затем другая сторона отправить еще несколько данных перед отправкой своих FIN.

Как только TCP-соединение установлено, оно становится полностью симметричным - ни одна из сторон не различима как «сервер» или «клиент». Это означает, что любая из сторон может отправить первый FIN. Поскольку хост не может отправлять больше данных по соединению после отправки FIN, обычно сторона, которая сначала знает, что у него больше нет данных для отправки, делает это.

Существует хорошая практическая причина для разработки сетевого протокола таким образом, чтобы клиент был тем, кто первым закрывает соединение - «первое приближение» заканчивается в состоянии TIME_WAIT, что удваивает максимальное время жизни сегмента, а это несколько минут. Это занимает небольшое количество ресурсов в течение этих минут - но если это произойдет на стороне сервера, где сервер обрабатывает много сотен соединений в секунду, эти сокеты TIME_WAIT будут быстро складываться. Лучше распределить это бремя по клиентам.

1 голос
/ 13 января 2011

Поиск в Google для "TCP State Diagram". Вот хорошая ссылка для начинающих: http://www.jxos.org/Projects/TCP/tcpstate.html

1 голос
/ 13 января 2011

Это зависит от протокола прикладного уровня. - от http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm.

TCP-соединение обычно прекращение с использованием специальной процедуры где каждая сторона независимо закрывается его конец ссылки. Это нормально начинается с одного из приложений обрабатывает сигнализацию на своем уровне TCP что сеанс больше не нужен. Это устройство отправляет сообщение FIN сказать другому устройству, что оно хочет завершить соединение, которое признал. Когда отвечающий устройство готово, оно тоже отправляет FIN это признано; после ожидания период времени для ACK, чтобы быть получено, сессия закрыта.

На практике это должен обычно быть клиентом, но нет причины, почему это так.

...