Что такое сокет, физически? - PullRequest
19 голосов
/ 14 февраля 2011

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

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

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

Ответы [ 3 ]

18 голосов
/ 14 февраля 2011

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

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

Чтобы добавить ясности,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

4 голосов
/ 14 февраля 2011

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

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

2 голосов
/ 22 февраля 2011

Мои 2 цента стоят:

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

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

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

Если вам любопытно и вы хотите знать точно так же, как я, советую вам начать и читать. :)

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