Отправка данных последовательно на два разных IP-адреса с помощью socket.socket: это стандартное поведение, когда NAT сохраняет один и тот же порт?
Со своего домашнего компьютера за стандартным домашним роутером / 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, так и с компьютера, подключенного к моему телефону, через Wi-Fi, в обоих случаях я получаю одинаковое поведение.
2 ответа
Реализация NAPT зависит от поставщика устройства NAPT. Одно устройство может сделать это таким образом, а другое - по-другому.
Кажется, существуют различные методы перевода, такие как Symmetric NAT:
NAT с полным конусом, NAT с ограниченным конусом и т. д., и каждый из них может привести к разным поведениям (?).