2011-11-30 8 views
1

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

На стороне сервера изменений не производится.

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

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

ОС: клиент и сервер оба Солярис

Пожалуйста, дайте мне knwo более подробную информацию об этом.

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

Я хочу знать, есть ли доступ к любому доступному журналу или любым другим способам поиска, почему recv timeout afetr 120 секунд?

ответ

2

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

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

+0

Спасибо за ваш ответ, я хочу знать, есть ли доступное сообщение журнала или какие-либо другие способы найти, почему recv timeout afetr 120 секунд? OS-Solaris – Syedsma

+0

@Syedsma Единственный способ - это ошибка, возвращаемая 'recv'. Я сомневаюсь, что любая ОС будет регистрировать такие события, которые могут быть частыми. Что касается причины, это связано с тем, что четыре параметра (ip-адрес и порт сервера, а также ip-адрес и порт клиента), которые определяют соединение, уже недействительны. –

1

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

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

(В IPv6, вполне возможно, что новый адрес добавляется wothout удаления другого,., Может быть, и в IPv4, я не уверен, что Abuot)

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

+0

Спасибо за ваш ответ, я хочу знать, есть ли доступное сообщение журнала или какие-либо другие способы найти, почему recv timeout afetr 120 секунд? OS-Solaris – Syedsma

+0

@Syedsma Ну, это только потому, что они отделены друг от друга из-за изменения адреса. Ничего не происходит, поэтому связь в конечном итоге закончится. – glglgl

0

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

+0

Спасибо за ваш ответ, я хочу знать, есть ли доступное сообщение журнала или любые другие способы найти, почему recv timeout afetr 120 секунд? OS-Solaris – Syedsma

1

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

Ваш единственный вариант - восстановить соединение, нет способа оповестить TCP peer об изменении адреса.

+0

Спасибо за ваш ответ, я хочу знать, есть ли доступное сообщение журнала или любые другие способы найти, почему recv timeout afetr 120 секунд? OS-Solaris – Syedsma

1

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