Что происходит с сокетом TCP при изменении IP-адреса? - PullRequest
0 голосов
/ 23 февраля 2020

Есть ли какая-либо ошибка в сокете при записи в него после изменения IP-адреса?

В моем я использую TCP-сокет, как для чтения / записи (не пассивный), так и для протокола TCP или приложения. жив.

Для проверки этого случая я использую socat для подключения к простому эхо-серверу в моей локальной сети. Соединение в порядке, пока я не изменю IP-адрес клиента на моем маршрутизаторе и не перезапущу сетевой интерфейс. На этом этапе я могу писать в сокет без каких-либо ошибок, несмотря на то, что IP-адрес клиента был изменен, но сообщения больше не доставляются. Я жду несколько минут и меняю IP обратно. Все «спрятанные» сообщения, которые не удалось отправить, отправляются.

Насколько я понимаю, при изменении IP-адреса клиента TCP-соединение больше не существует. Почему нет ошибок при записи в сокет при смене IP? Указывает ли это c на Linux стек TCP или задается TCP / IP?

1 Ответ

1 голос
/ 23 февраля 2020

Соединение TCP определяется IP-адресом источника, портом источника, IP-адресом назначения и портом назначения. Изменение IP-адреса клиента на вашем маршрутизаторе не приводит к немедленному прекращению соединения на вашем клиенте и сервере; однако, если вы оставите маршрутизатор в этом состоянии достаточно долго, соединение со временем перестанет существовать после определенного количества попыток и истечения времени ожидания. Точное количество определяется с помощью настраиваемых параметров ядра как на вашем клиенте, так и на вашем эхо-сервере. Вы можете проверить эти параметры с помощью sysctl -a | grep tcp

. После изменения IP-адреса клиента на маршрутизаторе клиент по-прежнему может отправлять пакеты на сервер, а сервер также может получать эти пакеты. , но попытка сервера ответить / подтвердить ответ клиенту не может быть перенаправлена ​​обратно клиенту. Это приводит к попыткам до определенного предела на клиенте (поэтому вы не видели ошибок на стороне клиента). После того, как вы вернули IP-адрес клиента на своем маршрутизаторе, сервер снова сможет обмениваться данными с клиентом, поскольку теперь маршрутизатор может правильно направить пакет сервера клиенту.

Это не повторяется укажите c в стек Linux TCP. rf c 2988 определяет стандартный алгоритм, который отправители должны использовать для вычисления и управления таймером повторной передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...