Рейтинг:1

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

флаг cn

Любая потеря данных обнаруживается и автоматически корректируется, поэтому TCP также называют надежным протоколом.

Другими словами,

транспортный уровень отвечает за безошибочную сквозную доставку данных от исходного хоста к целевому хосту.

TCP это гарантировано быть надежный передача действительно. Возникает вопрос, так ли избыточный (или же бесполезный, извините за мой плохой английский), чтобы ответить на полученные сообщения (которые передаются по TCP) на прикладной уровень сообщить отправителю, что сообщения были успешно получены?

флаг ru
Предположим, что HTTP-клиент отправил запрос POST на сервер, будет ли клиент доволен, если сервер не отправит ответ?
John avatar
флаг cn
@Chitholian Действительно не очень хороший пример.
Рейтинг:9
флаг se

Это не лишнее. TCP заботится только о доставке между двумя системами, а не между двумя приложениями. ACK отправляется после успешного получения данных. Затем полезная нагрузка пакетов помещается в буфер сокета приложения на стороне получателя. Таким образом, ACK отправляется до того, как приложение прочитает полезную нагрузку (из буфера сокета) и особенно до того, как оно обработает полезную нагрузку, например, внесет изменения в базу данных на основе обработанной полезной нагрузки.

Таким образом, клиент может знать, что приложения успешно обработали полезную нагрузку, только если он получает какое-то подтверждение на уровне приложения.Это не обязательно должно быть явным подтверждением — может быть достаточно просто отправить ответ. Детали зависят от семантики прикладного протокола.

John avatar
флаг cn
Я полностью понимаю и согласен с тем, что «ACK отправляется после успешного получения данных». Но почему вы подразумеваете под «поместить в буфер сокета приложений»."? Насколько я знаю, ACK могут **не** быть известны приложениям **действительно**ï¼
Steffen Ullrich avatar
флаг se
@John: TCP обычно обрабатывается ядром ОС. Со стороны приложения есть сокет, где возможно чтение и запись. Если данные получены ядром, они помещаются в буфер памяти, связанный с буфером — буфер чтения. Последующее чтение из приложения просто извлечет данные из этого буфера чтения. В случае блокирующего чтения (т. е. приложения, ожидающего данных) данные будут помещены в буфер чтения ядром, а затем заблокированное приложение будет разбужено, чтобы оно могло прочитать данные из буфера.
John avatar
флаг cn
Я понимаю. Вы имеете в виду, что данные **кроме** ACK помещаются в буфер, который позже будет прочитан приложением. Благодарим Вас за разъяснения.
Steffen Ullrich avatar
флаг se
@John: Да, я не считал ACK *данными*. Это просто транспортная информация. Теперь я сделал это более ясным, говоря о * полезной нагрузке *.
John avatar
флаг cn
Я вижу, большое спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.