Говорить как документы, которые вы читаете, удобно, но не совсем точно.
Сокеты - это общий сетевой 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: порт, легко замаскировать реальность и считать это «сокетом»."и похоже, что книга, которую вы читаете, попала в это использование.