networking пакет - Что вызывает отправку флага сброса TCP / IP(RST)?




флаги ack (6)

«Маршрутизатор» может делать что угодно - особенно NAT, что может включать в себя любое количество ошибок, связанных с трафиком ...

Одна из причин, по которой устройство отправит RST, - это ответ на получение пакета для закрытого сокета.

Трудно дать твердый, но общий ответ, потому что все возможные извращения были посещены на TCP с момента его создания, и всевозможные люди могут вставлять RST в попытке блокировать трафик. (Например, некоторые «национальные брандмауэры» работают, например.)

Я пытаюсь понять, почему TCP / IP-соединение моего приложения продолжает икать каждые 10 минут (точно, в течение 1-2 секунд). Я побежал Wireshark и обнаружил, что после 10 минут бездействия другой конец отправляет пакет с установленным флагом сброса (RST). Поиск Google сообщает мне: «флаг RESET означает, что приемник запутался и поэтому хочет прервать соединение», но это немного меньше деталей, которые мне нужны. Что может быть причиной этого? И возможно ли, что какой-то маршрутизатор на этом пути отвечает за это или это всегда будет происходить с другой конечной точки?

Изменить: есть маршрутизатор (в частности, Linksys WRT-54G), расположенный между моим компьютером и другой конечной точкой - есть ли что-нибудь, что я должен искать в настройках маршрутизатора?


Некоторые брандмауэры делают это, если соединение простаивает в течение x минут. Некоторые интернет-провайдеры устанавливают свои маршрутизаторы для этого по разным причинам.

В этот день и возраст вам нужно будет изящно обрабатывать (восстанавливать при необходимости) это условие.


Я только что потратил довольно много времени на устранение этой проблемы. Ни одно из предлагаемых решений не работало. Оказалось, что наш системный администратор по ошибке назначил один и тот же статический IP-адрес двум несвязанным серверам, принадлежащим к разным группам, но сидящим в одной сети. Конечные результаты периодически прерывались соединениями vnc, браузер, который нужно было обновлять несколько раз, чтобы получить веб-страницу, и другие странные вещи.


Запустите пакетный сниффер (например, Wireshark) также на одноранговом узле, чтобы узнать, является ли он партнером, который отправляет RST или кого-то посередине.


RST отправляется стороной, выполняющей активное закрытие, потому что это сторона, которая отправляет последний ACK. Поэтому, если он получает FIN со стороны, выполняющей пассивное закрытие в неправильном состоянии, он отправляет RST-пакет, который указывает другую сторону, что произошла ошибка.


Вы не можете сделать это в стандартном C ++.

Я публикую это, потому что это единственный правильный ответ. Ваш вопрос задает вопрос, как это сделать на C ++. Ну, вы не можете сделать это на C ++. Вы можете сделать это в Windows, POSIX, Linux, Android, но все они являются решениями, специфичными для ОС, а не частью стандартного языка.

Стандартный C ++ не имеет сетевого уровня .

Я предполагаю, что у вас есть это неправильное предположение, что C ++ Standard определяет ту же область функций, что и другие языковые стандарты Java. Хотя Java может иметь встроенную сеть (и даже графическую оболочку) в собственной стандартной библиотеке языка, C ++ этого не делает.

Хотя существуют сторонние API и библиотеки, которые могут использоваться программой на C ++, это никоим образом не означает, что вы можете сделать это на C ++.

Вот пример, чтобы прояснить, что я имею в виду. Вы можете открыть файл на C ++, поскольку он имеет класс fstream как часть стандартной библиотеки. Это не то же самое, что использовать CreateFile() , которая является функцией, специфичной для Windows, и доступна только для WINAPI.





networking tcp