вторник, 20 сентября 2011 г.

Как NAT разруливает ping

Долго сидел и втыкал, как NAT разруливает Echo Request - Echo Reply. С TCP все понятно: там для идентификации сессии есть порты. Но Ping ведь про TCP ничего не знает. Он реализован через ICMP, в котором нет портов! И как же тогда?

Все оказалось намного тупее, чем я предполагал. Echo Request (type = 8) и Echo Reply (type = 0) относятся к такому типу ICMP-сообщений, в которых есть специальные поле Identifier (или Query Id). Называются они ICMP Query Messages. Ну так вот, при отправке ответа на Echo Request хост проставляет этот Query Id тем же самым значением. Соответственно, NAT маршрутизатор, когда такое сообщение получает, смотрит в таблицу трансляции, видит, что такой идентификатор в ней есть, и понимает, куда передать пакет :)