Подтвердить что ты не робот

Когда сетевой пакет TCP будет фрагментирован на уровне приложения?

Когда пакет TCP будет фрагментирован на уровне приложения? Когда TCP-пакет отправляется из приложения, получатель на прикладном уровне когда-либо получает пакет в двух или более пакетах? Если да, то какие условия вызывают разделение пакета. Похоже, что пакет не будет фрагментироваться до тех пор, пока он не достигнет предела Ethernet (на сетевом уровне) 1500 байт. Но эта фрагментация будет прозрачной для получателя на уровне приложения, так как сетевой уровень будет собирать фрагменты перед отправкой пакета на следующий уровень, правильно?

4b9b3361

Ответ 1

Он будет разбит, когда он попадет на сетевое устройство с более низким MTU, чем размер пакетов. Большинство Ethernet-устройств - 1500, но часто может быть меньше, 1492, если этот ethernet переходит через PPPoE (DSL) из-за дополнительной информации о маршрутизации, даже ниже, если добавлен второй уровень, например, общий доступ к подключению Интернета Windows. И dialup обычно 576!

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

В качестве примера, если вы отправили два "пакета" (дважды вызовите функцию отправки), принимающая программа может получать только "пакет" (приемный стек TCP может объединить их вместе). Если вы применяете протокол типа сообщения по протоколу TCP, вы должны включить заголовок в начале каждого сообщения (или какой-либо другой mechansim заголовка/нижнего колонтитула), чтобы принимающая сторона могла разделить поток TCP на отдельные сообщения, либо когда сообщение принимается в двух частях или когда несколько сообщений принимаются как фрагмент.

Ответ 2

Фрагментация должна быть прозрачной для приложения TCP. Имейте в виду, что TCP является потоковым протоколом: вы получаете поток данных, а не пакеты! Если вы создаете приложение на основе идеи полных пакетов данных, тогда у вас будут проблемы, если вы не добавите слой абстракции для сборки целых пакетов из потока, а затем передайте пакеты до приложения.

Ответ 3

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

RFC 793, раздел 1.5:

"TCP может передавать непрерывный поток октетов в каждом между его пользователями упаковка некоторого количества октетов в сегменты для передачи через интернет-системы."

Ключевые слова непрерывный поток октетов (байты).

RFC 793, раздел 2.8:

"Нет необходимых отношений между функциями push и сегментом границы. Данные в любом конкретном сегмент может быть результатом одного SEND, полностью или частично, или несколько вызовов SEND.

Весь раздел раздела 2.8 имеет значение.

Ответ 4

На уровне приложения существует множество причин, по которым все 1500 байтов могут не отображаться в одном чтении. Различные факторы во внутренней операционной системе и стек TCP могут привести к тому, что приложение получит несколько байтов в одном запросе на чтение, а некоторые в следующем. Да, стек TCP должен повторно собрать пакет перед его отправкой, но это не значит, что ваше приложение будет получать все за один снимок (это будет сделано в одном чтении, но это НЕ ГАРАНТИРОВАНО получить его в одном чтении).

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

Ответ 5

Если пакет превышает максимальный MTU сетевого устройства, он будет разбит на несколько пакетов. (Обратите внимание, что для большинства устройств установлено 1500 байтов, но это не является необходимостью.)

Реконструкция пакета должна быть полностью прозрачной для приложений.

Ответ 6

Различные сегменты сети могут иметь разные значения MTU. В этом случае может произойти фрагментация. Для получения дополнительной информации см. Максимальный размер сегмента TCP

Эта (де) фрагментация происходит на уровне TCP. На прикладном уровне пакетов больше нет. TCP представляет собой непрерывный поток данных для приложения.

Ответ 7

A "прикладной уровень" TCP-пакета (ну, сегмент действительно, TCP на своем собственном слое не знает из пакетов) никогда не фрагментирован, так как его не существует. Уровень приложения - это то место, где вы видите данные как поток байтов, которые надежно и упорядочены.

Если вы думаете об этом иначе, вы, вероятно, приближаетесь к чему-то не так. Однако это не означает, что над этим, скажем, последовательностью сообщений, передаваемых по этому надежному потоковому потоку, может быть не один слой.

Ответ 8

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

Ответ 9

Правильно - наиболее информативным способом увидеть это можно с помощью Wireshark, бесценного инструмента. Потратьте время, чтобы понять это - несколько раз меня спасло и дает хорошую проверку реальности

Ответ 10

Если 3000 байтовый пакет входит в сеть Ethernet с размером MTU по умолчанию 1500 (для ethernet), он будет фрагментирован на два пакета по 1500 байт. Это единственный раз, о котором я могу думать.

Wireshark - ваш лучший выбор для проверки этого. Я использую его какое-то время и полностью впечатлен.