2016-01-13 6 views
1

Приложение-отправитель TCP хочет отправить данные, чтобы он записывал в сокет с системным вызовом write(), а затем write() возвращал. Теперь сокет для NIC происходит за кулисами с помощью ядра и отличных драйверов в зависимости от того, сколько данных может быть отправлено на основе проводки, поддерживающей свойства tcp connection (окно перегрузки и все).Как долго и где данные остаются в tcp-сокете

Теперь, эти данные сидят в сокете, пока успешное уведомление о получении (TCP ACK) не возвращается от клиента?

Я хочу знать, как долго и где данные сохраняются, чтобы их можно было отправить снова в случае потери пакета tcp.

ответ

1

TCP - надежный транспорт. Он автоматически обрабатывает повторные передачи. Если потеря данных происходит, соединение считается сломанным/потерянным, и ваш код начнет принимать коды ошибок при последующих операциях сокета, пока вы не закроете сокет. Вам не нужно беспокоиться о ретрансляции данных вручную с помощью TCP (только с UDP). Когда данные находятся в ядре, он обрабатывает остальное для вас. И да, данные находятся в ядре до тех пор, пока он не выполнит ACK, повторную передачу по мере необходимости до тех пор, пока сокет не выйдет изнутри.

+0

Thanks Remy. Я подтвердил в исходном коде, что мы сохраняем данные в буфере сокета до тех пор, пока не получим ack, и только после этого мы выпустим данные acked. И я понимаю tcp-семантику «надежной» доставки. Я знаю, что ядро ​​позаботится о данных. Я просто хотел понять, как это сделать. Часть I была заинтересована в том, чтобы знать, что асинхронный характер приложения записывается в сокет и уходит, а сокет записывается на провод. Так, например, если бы я хотел знать, когда именно конкретный кусок данных попал в приемник, я не могу сейчас с точки зрения приложения. Приложение записывается в сокет и уходит. Потеря может привести к повторной передаче. – hari

+0

Опять же, вам не нужно обрабатывать повторные передачи вручную в TCP. Ваш код не должен пытаться отслеживать эту информацию. Как только данные будут в ядре, предположим, что он будет отправлен и продолжен. Единственный способ обнаружить низкоуровневые TCP-файлы - это обнюхать сетевой адаптер напрямую, например, с помощью библиотеки pcap. На уровне приложения единственный способ узнать, достигли ли данные получателя, - приемник отправляет подтверждение на уровне протокола, которое ваше приложение должно будет читать из сокета и обрабатывать по мере необходимости. –

Смежные вопросы