FIN против RST в TCP-соединениях

Насколько я понимаю, есть 2 способа закрыть TCP-соединение:

отправить FIN флаготправить флаг RST

RST вызывает немедленное прекращение соединения, а в FIN вы получаете подтверждение.

Правильно ли я понимаю это, и есть ли другие различия между ними? Можно ли использовать эти 2 флага вместе?

Ответы на вопрос(3)

Решение Вопроса

«Я закончил говорить с тобой, но я все равно буду слушать все, что ты скажешь, пока ты не скажешь, что все готово».

RST говорит: «Разговора нет. Я ничего не скажу и не буду слушать то, что вы говорите».

RST полезен, если у вас длительное TCP-соединение с небольшим трафиком. Если один из компьютеров перезапускается, он забывает о соединении, а другой компьютер получает RST, как только отправляет другой пакет.

ваш процесс закрыть сокет

ОС выполняет очистку ресурса, когда ваш процесс завершает работу без закрытия сокета.

Если ваш процесс вызывает close (), FIN будет по умолчанию отправляться со стороны закрытия (примечание: вы можете установить опцию сокета SO_LINGER, чтобы он отправлял RST вместо FIN)

Если ваш процесс завершит работу без закрытия сокета, ядро закроет соединение tcp и выполнит очистку вашего процесса. FIN или RST могут быть отправлены. Если в вашей очереди приема есть данные, будет отправлено RST. В противном случае FIN будет отправлен.

Вы можете перебрать tcp_close () в tcp.c для получения более подробной информации (я использую kernel-2.6.32-573.7.1 из ветви redhat)

но на самом деле не цитирую, против меня:

Соединение TCP может завершаться двумя способами: (1) обычная последовательность закрытия TCP с использованием рукопожатия FIN и (2) «прерывание», при котором один или несколько сегментов RST отправляются и состояние соединения немедленно отбрасывается.

Невозможно использовать оба одновременно. Концепция даже не имеет смысла.

С помощью хитрости, которую я не буду здесь описывать, можно закрыть TCP-соединение с RST вместо FIN, но это глупая идея, поэтому я не документирую ее. С одной стороны, все ожидающие данные в полете теряются.

 user20742112 окт. 2013 г., 11:36
@ downvoter Пожалуйста, объясните мне вашу проблему с этим ответом.
 bchurchill26 авг. 2015 г., 22:00
«Невозможно использовать оба одновременно». Это техническиявляется возможно. Просто, как вы говорите, «концепция даже не имеет смысла». (Я не был тем, кто отрицал, хотя).
 Dave02 сент. 2015 г., 06:40
RST не обязательно указывает на состояние ошибки. Это может просто означать, что отправитель RST больше не хочет получать от вас известие и не обязательно обрабатывает любые данные, все еще находящиеся в буфере для соединения. Установка двух флагов вместе является избыточной для одной половины соединения, но не запрещена. При определенных обстоятельствах RST не так уж и необычно приходить вскоре после FIN.
 user20742120 февр. 2016 г., 18:06
@Dave RST отбрасывает все буферизованные данные для соединения, которое само перестает существовать. Отправитель не имеет возможности обрабатывать или не обрабатывать его. «В то же время» - это не то же самое, что «вскоре после».
 Dave04 мар. 2016 г., 19:03
@EJP - RST служит нескольким целям в RFC 793 и 1122. Одна из них, как вы описали, - указать, что «такого соединения нет» еще или больше.

Ваш ответ на вопрос