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