Приложение-отправитель TCP хочет отправить данные, чтобы он записывал в сокет с системным вызовом write(), а затем write() возвращал. Теперь сокет для NIC происходит за кулисами с помощью ядра и отличных драйверов в зависимости от того, сколько данных может быть отправлено на основе проводки, поддерживающей свойства tcp connection (окно перегрузки и все).Как долго и где данные остаются в tcp-сокете
Теперь, эти данные сидят в сокете, пока успешное уведомление о получении (TCP ACK) не возвращается от клиента?
Я хочу знать, как долго и где данные сохраняются, чтобы их можно было отправить снова в случае потери пакета tcp.
Thanks Remy. Я подтвердил в исходном коде, что мы сохраняем данные в буфере сокета до тех пор, пока не получим ack, и только после этого мы выпустим данные acked. И я понимаю tcp-семантику «надежной» доставки. Я знаю, что ядро позаботится о данных. Я просто хотел понять, как это сделать. Часть I была заинтересована в том, чтобы знать, что асинхронный характер приложения записывается в сокет и уходит, а сокет записывается на провод. Так, например, если бы я хотел знать, когда именно конкретный кусок данных попал в приемник, я не могу сейчас с точки зрения приложения. Приложение записывается в сокет и уходит. Потеря может привести к повторной передаче. – hari
Опять же, вам не нужно обрабатывать повторные передачи вручную в TCP. Ваш код не должен пытаться отслеживать эту информацию. Как только данные будут в ядре, предположим, что он будет отправлен и продолжен. Единственный способ обнаружить низкоуровневые TCP-файлы - это обнюхать сетевой адаптер напрямую, например, с помощью библиотеки pcap. На уровне приложения единственный способ узнать, достигли ли данные получателя, - приемник отправляет подтверждение на уровне протокола, которое ваше приложение должно будет читать из сокета и обрабатывать по мере необходимости. –