Например, если бы я должен был создать сокет и привязать его к порту, выбранному Windows (т.е. передать новый IPEndPoint (IPAddress.Any, 0)), а затем отправить два пакета на разные хосты, будет ли исходный портдва пакета будут одинаковыми?
Допустим, на локальном компьютере ПК вы привязаны к определенному порту (или даже к порту 0 - так что операционная система выбирает порт для вас).Все пакеты, выходящие из ПК, будут иметь один и тот же порт источника.Гарантировано.
Но NAT - может сделать что-то совсем другое.NAT определенно преобразует IP-адрес во внешний IP-адрес, который был ему назначен.И «исходный порт» будет подвергнут «отображению».
Большинство, но не все с хорошим поведением NAT попытаются сделать следующее.Это не включает настройку поведения через правила переадресации портов, которые пользователь может настроить вручную или через UPNP.
Некоторые NAT пытаются «сопоставить» исходный порт внутреннего хоста сто же значение порта при повторной передаче UDP или установлении TCP-соединения.Это не всегда возможно, если другой хост за тем же NAT уже использует этот порт.В этом случае выбирается другой порт.
Для исходящих соединений TCP сопоставление портов будет происходить, когда исходящий пакет SYN покидает NAT.Сопоставление портов источника будет оставаться согласованным в течение всего времени жизни соединения TCP.
Если хост, находящийся за NAT, отправляет последовательные UDP-пакеты на один и тот же удаленный IP: пара портов 1023 * внутри заданного внутреннего, хорошо ведущий себя NAT будет поддерживать то же самое сопоставление портов.Таким образом, порт источника остается тем же.
И большинство хорошо управляемых NAT поддерживают одинаковое сопоставление портов источника независимо от IP-адреса назначения или порта назначения.То есть, если ПК за NAT отправляет пакеты UDP с локального порта 3000 на два разных адреса IP: порта, NAT будет транслировать исходный порт одинаково.Это называется «независимым от адреса отображением» и является важной характеристикой при настройке P2P-соединений с другими хостами, которые могут находиться за NAT.
Если да, что такое «порт NAT»рандомизация "?Я слышал, что это заставляет NAT выбирать новый порт для каждого хоста, на который вы отправляете данные ... это так?
Есть NAT, которые не так хорошо себя ведут.Основная ошибка, которую они имеют, заключается в следующем:
Когда NAT поддерживает отображение, зависящее от адреса и порта (симметричное NAT).Именно здесь NAT выбирает случайный исходный порт для каждой уникальной пары IP: порт, с которой связывается хост за NAT.Таким образом, для двух хостов (оба за разными симметричными NAT) становится очень трудно общаться друг с другом без ретрансляции.Мне говорят, что большинство мобильных устройств, осуществляющих связь через 3G, демонстрируют такое поведение.
Некоторые не очень хорошо ведущие себя NAT будут даже перехватывать данные пакетов, ища протоколы, которые могут содержать внутренние IP-адреса, и затем пытаться«исправить» пакет так, чтобы внутренний IP-адрес, передаваемый в данных пакета, теперь был внешним IP-адресом.Это устраняет проблемы для устаревших протоколов, таких как FTP.Но для других приложений это может создать больше проблем.
Существует набор технологий для прохождения NAT.Пожалуйста, прочитайте STUN , TURN и ICE .