Ответ 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.
Надеюсь, что это поможет, и вы можете понять, почему ваш вопрос немного запутан для большинства из нас.