1

Я читаю раздел TCP PUSH в Руководстве по TCP/IP, и у меня есть вопрос по этому пункту:

Важно понимать, что функция push только вызывает немедленную доставку данных. Это не меняет того факта, что TCP не предоставляет границ между элементами данных. Может показаться, что приложение может отправить одну запись данных и затем «протолкнуть» ее получателю; затем отправьте вторую запись и «нажмите», и так далее. Однако приложение не может предположить, что, поскольку оно устанавливает бит PSH для каждого фрагмента данных, которое оно передает TCP, каждый фрагмент данных будет находиться в одном сегменте. Возможно, что первый «push» может содержать данные, переданные ранее TCP, которые еще не были переданы, и также возможно, что две «вытолкнутые» таким образом записи могут в любом случае оказаться в одном и том же сегменте.

У меня вопрос к последнему предложению с курсивом, как данные могут быть переданы в TCP раньше, с установленным флагом PSH, но не передаваться? Разве с установленным флагом PSH сразу не сбрасываются буферы?

2 ответа2

2

Важно понимать, что TCP - это потоковый протокол, а разделение на сегменты - это только деталь реализации, и это только потому, что некоторые протоколы более низкого уровня основаны на пакетах.

Установка флага PSH является только указанием принимающей стороне, что он должен сбросить свой буфер в приложение. Из-за асинхронного характера стека TCP/IP к тому времени, когда приложение уведомляется об ожидающих данных, возможно, уже были получены несколько других, более новых пакетов, и все вместе будет отправлено приложению. TCP это поток.

Кроме того, имейте в виду, что нет гарантии того, что разделение на сегменты TCP будет сохранено и в сети. Это правда, что обычно это сохраняется, но есть прокси, брандмауэры с глубокими проверками и т.д., Которые на самом деле могут склеить несколько небольших сегментов в один больший и т.д.

1

Существуют ситуации, когда TCP не разрешается отправлять какие-либо свежие данные и сначала ожидать ACK.

В общем случае флаг PUSH заставляет TCP на приемнике доставлять содержимое буфера в приложение. Это не заставляет TCP отправителя отправлять что-либо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .