Основы c вопросы протокола TCP - что происходит с send () и recv () - PullRequest
0 голосов
/ 27 марта 2020

У меня есть несколько базовых c вопросов по протоколу TCP

Ситуация : Machine_A вызывает send (sockfd) для отправки данных в Machine_B. вызов send () завершен успешно.

Вопрос : Когда вызов send () возвращается, это означает, что данные уже достигли Machine_B? Или он только что был принят операционной системой

Ситуация : Machine_A вызывает send (sockfd) для отправки данных в Machine_B. Но application_B на Machine_B недостаточно быстро считывает данные из сокета. Application_A пишет 10MB / s, но Application_B просто читает 1KB / se c.

Вопрос :

  1. Когда выполняется send () вызов успешен на Machine_A в этом случае?

  2. Успешно ли происходит момент, когда данные передаются в OS_A на Machine_A, или он ожидает подтверждения от OS_B?

  3. Требуется ли OS_B для Application_B получать пакеты перед тем, как оно будет подтверждено OS_A?

1 Ответ

1 голос
/ 27 марта 2020

send заботится только о том, чтобы поместить данные в локальный буфер сокетов, то есть он не будет ждать подтверждения от компьютера получателя или даже ждать, пока данные не будут обработаны приложением получателя (что даже позже). Если вам нужна такая информация, вам потребуется подтверждение на уровне приложения. Более того, в то время как ACK получает отправку по TCP, он все равно не получит отправку по другим протоколам, таким как UDP.

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

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