Стек TCP / IP является частью вашего ядра . В результате вы вызываете вспомогательный метод, который подготавливает « ловушку ядра ». Это особый вид исключения, который переводит ЦП в режим с большими привилегиями («режим ядра»). Внутри ловушки ядро проверяет параметры исключения. Одним из них является номер вызываемой функции.
Когда вызывается функция, она копирует данные в буфер ядра и подготавливает все для обработки данных. Затем он возвращается из ловушки, ЦП восстанавливает регистры, и его исходный режим и выполнение вашего кода возобновляются.
Некоторое ядро thread получит копию данных и использует сетевой драйвер для ее отправки, выполнит всю обработку ошибок и т. Д.
Итак, да, после копирования необходимых данных ваш код возобновляется, и фактическая передача данных происходит параллельно.
Обратите внимание, что это для пакетов TCP. Протокол TCP выполняет всю обработку ошибок и квитирование за вас, поэтому вы можете предоставить ему все данные, и он будет знать, что делать. Если есть проблема с соединением, вы заметите это только через некоторое время, так как протокол TCP может самостоятельно справиться с короткими перебоями в работе сети. Это означает, что вы уже «отправили» некоторые данные, прежде чем получите ошибку. Это означает, что вы получите код ошибки для первого пакета только после N-го вызова send()
или при попытке закрыть соединение (close()
будет зависать, пока получатель не подтвердит все пакеты).
Протокол UDP не буферизуется. Когда звонок возвращается, пакет в пути. Но это «огонь и забудь», так что вы знаете только, что водитель положил его на провод. Если вы хотите узнать, прибыло ли оно куда-нибудь, вы должны сами найти способ достичь этого. Обычный подход заключается в том, чтобы получатель отправлял обратно ack-пакет подтверждения (который также может быть потерян).