Подтвердить что ты не робот

Что такое сокет, физически?

Я всегда предпочитаю фиксический смысл концепции программирования своему логическому смыслу. Итак, вот этот вопрос.

Когда я просматриваю парадигму программирования сокетов, я заметил, что функции bind(), connect() выполняются точно так же, как настройка сокета, созданного функцией socket(). Поэтому я предполагаю, что функция socket() выполняет только создание структуры данных (и, возможно, структуры данных в пространстве ядра), чтобы удерживать детали о сквозных настройках связи между клиента и сервера. И bind(), connect() просто заполните эту структуру данных.

Я не знаком с реализацией API сокетов, поэтому я надеюсь, что кто-то может решить мою проблему.

4b9b3361

Ответ 1

Это сильно зависит от платформы. Точка API так, что вам НЕ нужно знать эти детали.

Если вы действительно заинтересованы в изучении этого (что вам не нужно просто для программирования приложений и системных приложений), вы можете загрузить исходный архив ядра Linux из kernel.org и изучить реализацию Linux TCP/IP, сеть /ipv 4

Чтобы добавить некоторую ясность,

Для передачи данных по сети мы обычно придерживаемся стандартов, определенных Международной организацией по стандартизации. У них есть стандарт под названием OSI или Open Systems Interconnection, модель.

Эта модель определяет 7 уровней абстракции для приложений для перемещения данных по сети. Я расскажу только о первых 4, так как они являются подходящими для вашего вопроса.

Физический уровень:

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

Как он вписывается в систему:

Надеемся, что для этого уровня требуется очень небольшая поддержка программного обеспечения. Независимо от того, какое программирование здесь сделано, скорее всего, будет сделано на модуле, а не в ядре или приложении.

Уровень канала передачи данных:

Это первый уровень, который, возможно, включает в себя какое-то программирование. Этот уровень определяет протоколы линейного уровня, которые работают на физических ссылках. Ethernet - один протокол. Реле кадра - другое. Token Ring - другое. На каждом конце ссылки должен работать тот же протокол передачи данных. Этот уровень объединяет совместимый стандарт физического уровня, чтобы дать возможность фактически передавать данные с одного узла на другой. Во многих отношениях это можно рассматривать скорее как дополнение к физическому слою, чем его собственный уровень, а потому, что здесь определены протоколы уровня канала, что не является большой аналогией. Этот уровень дает физические адреса узлам в сети.

Как он вписывается в систему:

Вам нужно будет написать драйвер, чтобы поговорить с интерфейсным модулем, который запускает эти протоколы передачи данных. В зависимости от модуля и системы модуль может иметь все, что ему нужно для работы, или ему может понадобиться помощь на системном уровне. В идеале вы просто создаете набор интерфейсов кода (возможно, реализуемых как структуры, содержащие указатели на функции для соответствующей обработки ввода-вывода.. Я действительно не знаю), а когда вы устанавливаете новый физический модуль, драйверу нужно только реализовать эти интерфейсы кода, и теперь ваш физический модуль можно использовать.

Сетевой уровень

Это уровень, который обеспечивает возможность перемещения данных между сетями (в случае TCP/IP). На этом уровне определен протокол Интернета. Этот уровень предоставляет логические адреса узлам, чтобы их можно было сгруппировать в сети. Зная, какая сеть (также называемая подсетью, определяемая программно с использованием маски подсети), включен хост, мы запускаем алгоритмы, которые правильно перемещают данные из одной сети в другую. Если один хост находится в сети A в Китае, а один хост находится в сети B в Австралии, алгоритмы на этом уровне отвечают за предоставление пути, который связывает эти сети и, следовательно, эти хосты.

Важная вещь в программировании для этого слоя заключается в том, что вы должны просто "подключить" любой уровень канала передачи данных для передачи. Это означает, что после создания кода в вашей системе для передачи через Ethernet, Token Ring, 3G или Frame Relay вы должны использовать все их без сетевого уровня, чтобы знать, какую технологию передачи данных он использует. Логика перемещения данных между сетями не должна зависеть от фактической физической связи, на которой она работает.

Этот слой помещает ваши данные в пакеты, а пакеты - это то, что маршрутизируется через Интернет.

Как он вписывается в систему:

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

Транспортный уровень:

Этот слой определяет сегментирование данных (потому что, если вы просто отправили гигантские кусочки данных сразу, вряд ли что-нибудь будет в порядке). Этот уровень также определяет TCP, который обеспечивает дрожание рук, контрольные суммы, упорядочение пакетов, размеры данных переменных данных и гарантированную надежность. TCP дает вам возможность создавать несколько логических каналов связи по одной и той же физической ссылке. Он отличает одну оболочку от ссылки из другого разговора по той же ссылке. UDP также определяется на этом уровне и может считаться чрезвычайно легким TCP. UDP почти ничего не обеспечивал при использовании TCP, но все же обеспечивает мультиплексирование физического канала.

Если ваш транспортный уровень написан хорошо, ваши приложения не нужны (с точки зрения архитектуры кода), чтобы беспокоиться о том, использует ли транспортный уровень TCP или UDP (просто упомянув эти два b/c, наиболее популярный на IP). В то время как вы можете выбрать тот или иной, исходя из потребностей в производительности или надежности времени (и на практике приложения часто делают предположение о том, какой из них выполняется), ваше приложение не нуждается в точном знании того, какой из них работает.

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

Как он вписывается в систему:

Очень похож на сетевой уровень, за исключением того, что он обеспечивает разную функциональность, чем сетевой уровень. Кроме того, эти интерфейсы используются больше в пользовательском пространстве, чем интерфейсы сетевого уровня. Это слой, который фактически определяет сокеты, которые вы используете в сетях TCP/IP.


Надеюсь, что это поможет, и вы можете понять, почему ваш вопрос немного запутан для большинства из нас.

Ответ 2

Вы знакомы с моделью OSI? bind() определяет локальный IP-адрес и порт (уровень 4) для использования, поэтому, когда пакет физически отправляется, он указывает, что IP-адрес как отправитель, и connect() указывает удаленный IP-адрес и порт для физического размещения в эти пакеты.

В стороне, много программирования - это чистая "логика" и на самом деле не имеет "физического" значения, если только "физическое" на самом деле не означает "детали реализации", которое будет варьироваться от платформы к платформе. Если вы действительно спрашиваете о физической реализации, означающей, что "значение" преобразуется в электрические сигналы, вы, вероятно, будете более счастливы, чем компьютерный инженер, чем программист.

Ответ 3

Стоимость моего 2 центов:

Сокет в основном совместим с исходным IP-адресом, исходным портом, целевым IP-адресом и портом назначения. (Физически это действительно не что-то, это концепция, основанная на программном обеспечении). Таким образом, операционная система может определить, какое приложение (через его номер порта) должно получать пакеты или отправляет пакеты.

Сетевой стек (модель TCP/IP или OSI) реализуется по-разному в зависимости от вашей ОС. Если вы хотите узнать больше о том, как передаются и обрабатываются пакеты, вы изучаете модель OSI или стек TCP/IP. Это скажет вам, что происходит с информацией, поскольку оно оставляет ваше приложение отправленным по сети.

ОС имеет дело с обработкой пакетов, поэтому, если вы программист, как уже говорилось, вас обычно не интересуют эти детали.

Если вам интересно и хотите знать, как и я, я предлагаю вам начать и читать.:)