TCP-сокет против Linux-сокета TCP - PullRequest
0 голосов
/ 16 февраля 2019

Linux API и протокол TCP имеют концепцию, называемую «сокетом».Являются ли они одной и той же концепцией, и реализует ли в Linux-сокете TCP концепцию TCP-сокетов?

  1. Отношение между соединениями и сокетами:

    Я слышал, что два соединения могутне разделяют TCP-сокет Linux , и это правда?

    Компьютерные сети Tenebaum (5ed 2011, раздел 6.5.2 Модель обслуживания TCP, p553) гласят:

    Сокет может использоваться для нескольких соединений одновременно.Другими словами, два или более соединений могут завершаться в одном и том же сокете.Соединения идентифицируются с помощью идентификаторов сокетов на обоих концах.

    Поскольку в цитате говорится, что два соединения могут совместно использовать «сокет», использует ли книга концепцию «сокетов», отличную от Linux-сокета TCP?Используется ли в книге концепция сокетов TCP ?

  2. Связь между процессами и сокетами:

    Я также слышал, что два процесса могут совместно использовать TCP-сокет Linux .Но если два процесса могут совместно использовать сокет, разве процессы не могут создавать свои собственные соединения в сокете по желанию, поэтому в одном и том же сокете TCP Linux есть два соединения?Это противоречие с 1, где два соединения не могут совместно использовать сокет Linux TCP?

Могут ли два процесса совместно использовать сокет TCP ?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Говорить как документы, которые вы читаете, удобно, но не совсем точно.

Сокеты - это общий сетевой API.Их единственное отношение к TCP - вы можете настроить сокеты, чтобы использовать его.Вы также можете установить сокеты для связи по любому другому сетевому протоколу, поддерживаемому ОС;кроме того, вам не обязательно использовать сокеты, многие ОС по-прежнему предлагают другие сетевые API-интерфейсы, некоторые с существенными преимуществами ниши.

Проблема, с которой вы сталкиваетесь, заключается в том, что нетехнический язык дает вам представление о том, каквсе соединено, но затенено детали реализации, вы не можете детально рассуждать по характеристикам и аналогиям в терминах непрофессионала.

Так что игнорируйте концепцию сокетов, которую вы сформировали.Читайте реальные документы, а не учебники.Напишите код, чтобы увидеть, работает ли он так, как вы думаете.Вы узнаете, что теперь у вас есть понимание «сокета» для непрофессионала, скрывающее различия между сокетами, которые вы создаете с помощью socket(), теми, которые вы получаете из accept(), теми, которые вы можете найти в файловой системе Unix,и т. д.

Даже «соединение» является некоторым упрощением даже для TCP.

Чтобы дать вам представление о том, насколько глубоко заходит кроличья нора, так же как и «совместное использование» - вы можете отправлять fd через некоторые виды сокетов, а сокеты - это fd, после fork() два процесса совместно используютПространство имен fd, и вы можете dup() fd's ...

Полностью настроенное сетевое соединение TCP - это пара {host1: port1, host2: port2} с некоторым отслеженным состояниемна обоих концах и пакеты, отправляемые между этими сторонами, которые обновляют состояние в соответствии с протоколом TCP, т.е. правилами.Вы можете bind() сокет к локальному TCP-адресу и connect() через этот сокет к удаленным (или локальным) адресам один за другим, так что в этом смысле соединения могут совместно использовать сокет - но если вы работаете с сервером,Соединения accept() ed получают свой собственный выделенный сокет, именно так вы определяете, откуда поступают данные, read().

Одно из распространенных противоречий между парой хост-порт: порт, к которому может быть привязан сокети сама розетка.Вы получаете один сокет ОС, который прослушивает новые соединения, и один на каждое соединение по протоколу на основе соединений, например, TCP, но все они могут использовать один и тот же порт host: порт, легко замаскировать реальность и считать это «сокетом»."и похоже, что книга, которую вы читаете, попала в это использование.

0 голосов
/ 16 февраля 2019

Книга ссылается на более абстрактную концепцию сокета, который не привязан к конкретной ОС или даже к сетевому / транспортному протоколу.В книге сокет - это просто уникальная конечная точка соединения.Таким образом, соединение - это пара (S1, S2) сокетов, и эта пара должна быть уникальной в некотором неопределенном контексте.Пример, специфичный для TCP, использующего мое соединение прямо сейчас, будет иметь абстрактный сокет, состоящий из IP-адреса интерфейса и номера порта TCP.Существует много-много соединений между пользователями stackoverflow, такими как я, и абстрактным сокетом [443, 151.101.193.69], но только одно соединение с моей машины [27165, 192.168.1.231] с [443, 151.101.193.69], который является фальшивым примером использования немаршрутизируемого IP-адреса, чтобы защитить мою конфиденциальность.

Если мы получим еще более конкретную информацию и предположим, что на стековом потоке и на моем компьютере работает linux, мы можем говорить об этомсокет, определенный man 2 socket, и API Linux, который его использует.Здесь сокет может быть создан в режиме прослушивания, и это обычно называется server .Этот сокет может быть разделен (разделен в смысле общей памяти или состояния) между несколькими процессами.Однако когда одноранговый узел подключается к этому прослушивающему сокету, создается новый сокет (в результате вызова accept(). Исходный прослушивающий сокет может снова использоваться для accept() другого соединения. Я полагаю, что если несколько процессов заблокированы насистемный вызов accept(), тогда точно один из них разблокируется и возвращается с вновь созданным подключенным сокетом.

Дайте мне знать, если здесь чего-то не хватает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...