Я пытаюсь понять, как операционные системы обычно осуществляют повторную сборку сетевых запросов. Из моего лучшего понимания верно следующее:
HTTP-запрос делается на прикладном уровне с использованием некоторой библиотеки HTTP. Эта HTTP-библиотека действительно является оболочкой для некоторой реализации сокетов ОС.
"Передающий" сокет создается с использованием назначения и источника HTTP-запроса.
"Принимающий" сокет создается с использованием IP-адреса устройства и рандомизированного (свободного) порта.
HTTP-сообщение "отправляется" с использованием "передающего" файлового дескриптора сокета.
Метод "send" сокета отправляет сообщение реализации TCP операционной системы.
Реализация TCP сегментирует сообщение HTTP, добавляя порт назначения (предоставленный при создании экземпляра сокета) и порт источника. (Я предполагаю, что это каким-то образом передается в зависимости от реализации.) После того, как HTTP-сообщение было сегментировано и к нему добавлены заголовки TCP, сегменты TCP затем передаются в реализацию IP ОС.
Сегменты TCP снабжены заголовками IP. IP-адрес назначения был предоставлен при создании экземпляра сокета. (Опять же, я предполагаю, что исходный IP-адрес передается в зависимости от реализации.)
Затем IP-пакеты упаковываются в заголовки Ethernet, отправляются на маршрутизатор, отправляются на сервер, сервер обрабатывает запрос и отправляет ответ.
Здесь мое понимание нарушается в отношении того, что именно происходит в процессе сборки.
Как ответ возвращается в приемный буфер "принимающего" сокета, чаще после того, как IP-пакет возвращается на устройство?
Очевидно, что заголовки сбрасываются, но какие шаги предпринимаются, чтобы вернуть его конкретно в приемный буфер "принимающего" сокета, а затем из сокета обратно в приложение?
PS Я надеюсь на более подробную техническую реализацию, чем просто "IP повторно собирает его" или "TCP повторно собирает его" и передает его на следующий уровень. Я надеюсь понять, как именно это происходит, а не только теоретически (хотя я понимаю, что это зависит от ОС).
Редактировать:
Чтобы внести ясность в предмет, я хотел бы отметить мои ссылки на сокет и любой метод сокета, относящийся к ОС Linux.