Интересует именно
почему есть такое ограничение, как оно технически обосновывается. Про "сырые" сокеты и мультиплексирование мне известно.
Как я понимаю, порты в принципе придуманы, чтобы разделить службы, соединения и т. п. на одном узле. Ограничение "один порт — один узел" выглядит в этом свете логичным. Но при этом есть
SO_REUSEADDR, позволяющая нескольким сокетам привязываться к одной и той же паре (адрес, порт). А вот возможности привязать один сокет к нескольким портам нет, хотя, казалось бы, это шанс сэкономить системный вызов (мультиплексор) и ресурсы (дополнительные сокеты), упрощение программирования, способ сделать какое-никакое резервирование.
RFC 768 (UDP) такого ограничения не накладывает. RFC 4960 (SCTP) требует использовать одинаковый порт для всех адресов на одном конце ассоциации (п. 1.2), хотя непонятно, зачем это нужно. Понятно, почему TCP требует одного порта — по определению своего соединения:
[Port] concatenated with the network and host addresses from the internet communication layer, this forms a socket. A pair of sockets uniquely identifies each connection.
UDP интересует больше всего.
Попытка чтения исходников Linux:
подтвердила, что сокеты хранятся в хэш-таблице по ключу, вычисляемому от порта либо адреса и порта, но все равно непонятно, что мешало бы в такую таблицу добавить несколько записей об одном сокете, чтобы из него вычитывать пакеты, направленные на разные порты;
показала, что есть конкретная проверка, запрещающая это делать, и вряд ли она там просто так.
Подскажите, пожалуйста, какую реальную причину я упускаю.