Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Запрос требует ответа. В нем поле порта отправителя следует... 28.04.07 12:31 Число просмотров: 2019
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 28.04.07 12:36 Количество правок: 1
|
> Цитирую http://ru.wikipedia.org/wiki/UDP > "Заголовок UDP содержит 4 поля, 2 из которых > («порт отправителя» и «контрольная сумма») > опциональны". > > Такой пакет не будет обрублен ни одним маршрутизатором, и > он успешно дойдёт до хоста в инете, потому что он > соответствует стандарту. Но вот как его натить ОБРАТНО? -))
Запрос требует ответа. В нем поле порта отправителя следует заполнить.
Ответ не требует ответа. В нем поле порта отправителя лучше не заполнять.
Все пакеты корректны и будут проходить.
Если в запросе не будет заполнен порт отправителя, велик шанс не дождаться ответа.
Если в ответе, как и в других пакетах, на которые не требуется отвечать будет заполнено поле порта отправителя, то это будет на некоторое время замусоривать таблицу НАТа.
> Даже если вы сформируете "правильный" пакет, который > говорит "порт отправителя такой-то", и сервер вам > "правильно" ответит на этот порт (что не обязан, в принципе > делать, это всё на усмотрение программиста на "той" > стороне), это не отменяет вашей программе слушать сокет на > "правильном" порту, иначе кому его доставлять операционной > системе, получившей такой пакет? Другое дело, что один и > тот же UDP порт могут слушать НЕСКОЛЬКО сокетов разных > программ, и ось будет исправно копировать датаграммы в > каждый сокет, что невозможно при TCP, там только один > слушатель порта. > Далее. Предположим вы формируете "правильные" пакеты. Каким > вы выберите порт отправителя? Каким его выбрать такой же > программе, но на другой машине во внутренней сети и как им > работать одновременно c одним и тем же сервером в > интернете? Выбрать случайный порт? Тогда существует > вероятность 1/65535, что они выберут один порт, и нат будет > в прострации, как перенаправлять пакеты "обратно". Это > достаточно серьёзная вероятность в компьютинге, NAT не > будет это делать, если его создатели не разпиздяи -)
На все вопросы и сразу.
Чтобы на все запросы из-за НАТа приходили ответы нужно: чтобы ответы слушались на каждом хосте на разных портах. Выбрать свободный порт не сложно, поскольку табличка прослушивающихся портов есть.
Порты могут совпадать с портами другого хоста, поскольку НАТ все равно однозначно сможет идентифицировать кому перенаправить ответ. В данном случае уже по адресу.
Допустим одновременно посылаются запросы с двух занатовских хостов. С хоста Х0 порта 10000, с хоста Х0 порта 10001, с хоста Х1 порта 10000, с хоста Х1 порта 10002.
Сам НАТ отправляет из со своих свободных портов 20000, 20001, 20002, 20003, при этом запоминает, что входящие пакет на эти порты нужно будет прокинуть по табличке:
20000 на Х0:10000
20001 на Х0:10001
20002 на Х1:10000
20003 на Х1:10002
Если бы на эти пакеты не требовалось бы ответа, то сооветствующие поля были бы пустые и в табличку НАТинья записи бы не вносились. То есть если послал запрос без заполнения опционального поля, то до сервака запрос дойдет, сервак (не зная того пришел запрос из-за НАТа или нет) ответит на него, но НАТ не перешлет его внутрь НАТа, поскольку не запомнил кому. Ну и естественно правило отвечающего сервака, такого как ДНС: отправлять ответы на те порты, с которых приходили запросы.
Если же пришел ответ с заполненым опциональным полем, то тоже ничего страшного, это поле игнорируется.
Если посылался пакет, на который не должно прийти ответа, но у которого был прописан порт отправителя, то тоже ничего страшного, ну повисит это запись в таблице некоторое время.
|
|
|