я читаю этот статья, в которой рассказывается о мультиплексировании на транспортном уровне модели OSI. Кажется, я не могу понять, что значит «мультиплексирование» на этом уровне? Поскольку мультиплексирование - это сигнальный процесс, и на транспортном уровне мы не имеем дела непосредственно с сигналами.
Может ли кто-нибудь дать мне объяснение мультиплексирования, используемого в вышеупомянутой статье?
В упомянутой статье «мультиплексирование» используется для описания того, как несколько приложений на одном хосте могут совместно использовать сетевой интерфейс, и при этом драйвер / ядро маршрутизируют пакеты к правильному приложению. Ответ заключается в том, что места назначения пакетов указываются не только IP-адресом, но и номером порта.
Каждый отправленный пакет имеет порт как часть адреса отправителя. Когда ваше приложение указывает «любой порт», это просто позволяет ОС назначать тот, который не используется. Когда удаленный хост отправляет ответ, он указывает не только адрес, но и порт, что позволяет вашей ОС определять, в какую очередь сокетов следует поместить входящий пакет. Даже если у вас есть два приложения на одном хосте, отправляющие пакеты на один и тот же удаленный хост, номера локальных портов будут разными.
Итак, первое, что следует отметить, это то, что они говорят о портах как об «адресах уровня 4» и о мультиплексировании нескольких потоков приложений на один порт и демультиплексировании нескольких отдельных передач на стороне получателя.
Как и следовало ожидать, это работает только с некоторыми оговорками в зависимости от уникальности адресации портов / L4.
Таким образом, сокет UDP, связанный в неисключительном режиме, может иметь несколько приложений, которые все отправляют с одного и того же адреса / порта L4. Я не помню ничего в BSD API на стороне приемника, чтобы фильтровать дейтаграммы на основе исходного порта, но я могу ошибаться - если нет, вам придется вручную демультиплексировать его на более высоком уровне уровень, чем стек, чем L4, о чем в статье идет речь.
С TCP сокет сервера (bind ()) может быть объединен с accept (), чтобы разрешить несколько одновременных подключений к одному и тому же месту назначения (порту) L4, но они должны иметь разные клиентские (исходные) порты. Я также не знаю какой-либо реализации API сокетов BSD, которая позволила бы нескольким клиентским TCP-сокетам связываться с одним и тем же локальным портом, потому что TCP-сервер (получатель) может только демультиплексировать поток из-за различных исходных портов.
Другими словами, мультиплексирование / демультиплексирование на L4 с UDP или TCP работает только в 50% ваших случаев, и никогда в обоих направлениях одновременно.