Отправка данных последовательно на два разных IP-адреса с помощью socket.socket: это стандартное поведение, когда NAT сохраняет один и тот же порт? - PullRequest
0 голосов
/ 05 декабря 2018

Со своего домашнего компьютера за стандартным домашним маршрутизатором / NAT я открываю один socket и отправляю данные на два разных сервера (с разными общедоступными IP-адресами):

import socket, time
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for addr in ['203.0.113.2', '198.51.100.77']:
    soc.sendto(b'', (addr, 4000))
    data, _ = soc.recvfrom(6)
    print(data)
    time.sleep(2)

На первомсервер прослушивает порт 4000, я замечаю, что 4000 был преобразован NAT в порт 57358.

На втором сервере, слушающем порт 4000, я заметил, что 4000 также был преобразован в порт 57358 .

Это стандартное документированное поведение, когда

  • при открытии сокета
  • отправка данных на первый сервер,
  • преобразование NAT-маршрутизаторапорт 4000 - 57358

, затем при отправке данных на другой IP-адрес с таким же сокетом NAT преобразует порт 4000 в тот же порт ? (57358 в моем примере)

или это просто удача?


Примечание: я проверял это как с компьютера, подключенного к домашнему маршрутизатору ISP, так и с компьютера, подключенногона мой телефон, модем через WiFi, в обоих случаяхЯ получаю такое же поведение.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Реализация NAPT зависит от поставщика устройства NAPT.Одно устройство может делать это таким образом, а другое - иначе.

0 голосов
/ 05 декабря 2018

По-видимому, существуют различные методы перевода , такие как Symmetric NAT:

enter image description here,

full-cone NAT, postNAT с ограниченным конусом и т. д., и каждый из них может вести к разному поведению (?).

...