каково поведение TCP recv при изменении IP-адреса клиентского компьютера? - PullRequest
1 голос
/ 30 ноября 2011

Влияет ли изменение IP-адреса клиентского компьютера или любое другое изменение на вызов recv() на клиентском компьютере?

На стороне сервера никаких изменений не сделано.

На стороне клиента TCP recv() будет иметь тайм-аут [120 секунд]. Почему это так?

Если IP-адрес клиента изменяется после создания сокета, истекает ли recv() тайм-аут?

ОС: клиент и сервер и Solaris

Пожалуйста, дайте мне знать об этом подробнее.

Я думаю, что тайм-аут recv на стороне клиента из-за изменения IP, но не уверен.

Я хочу знать, доступно ли какое-либо сообщение в журнале или какие-либо другие способы выяснить, почему истекло время ожидания после 120 секунд?

Ответы [ 5 ]

2 голосов
/ 30 ноября 2011

Соединение идентифицируется двумя конечными точками, а конечная точка в TCP / IP представляет собой комбинацию IP-адреса и номера порта. Если один из четырех (два ip-адреса и два порта) изменяется, то соединение больше не является действительным. Другими словами, если на клиентской машине изменился ip-адрес, старый сокет в вашей программе все еще считает, что это старый ip-адрес, и сервер также будет иметь старый ip-адрес.

В вашей программе закройте старое соединение при ошибке (любая ошибка на самом деле) и переподключитесь к серверу.

1 голос
/ 01 декабря 2011

Там нет ничего, чтобы сказать вам, почему происходит тайм-аут, только то, что тайм-аут произошел. Вам необходимо получить доступ к соединению, путем чтения или записи, чтобы определить состояние соединения. Если IP-адрес изменяется, старое соединение теперь недопустимо, и recv() должен сообщать об ошибке, а не по таймауту.

1 голос
/ 30 ноября 2011

Когда вы меняете IP-адрес клиента, IP-пакеты с сервера больше не доставляются клиенту: в конце концов, они для другого адреса.Поскольку никакие пакеты не получены, и все пакеты, отправленные с нового адреса, не принадлежат какому-либо соединению и отбрасываются, TCP-соединение со временем истекает или прерывается из-за пакета RST.

Единственный вариант - восстановить соединениеневозможно уведомить одноранговый узел TCP об изменении адреса.

1 голос
/ 30 ноября 2011

В TCP соединение идентифицируется кортежем (адрес источника, порт источника, адрес назначения, порт назначения). Если IP-адрес одного из устройств изменяется так, как удаляется старое, соединение не может быть сохранено.

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

(Возможно, в IPv6 новый адрес добавляется без удаления другого; возможно, и в IPv4 я не уверен в этом.)

В UDP, если адрес изменяется и отправитель не знает об этом, сообщение, очевидно, не может быть отправлено.

0 голосов
/ 30 ноября 2011

Трудно сказать. Это зависит от того, что происходит на машине, чей IP-адрес изменился. Если он продолжает распознавать входящие данные в соединении как действительное входящее соединение, как определено 5-ю кортежем {tcp, локальный IP, локальный порт, удаленный IP, удаленный порт}, вам повезло, иначе нет.

...