2016-06-10 12 views
0

В какой момент передачи сообщения от клиента к хосту (или наоборот) является сообщение, фактически нарезанное пакетами?Когда именно создаются сетевые пакеты?

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

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

Может кто-нибудь подтвердить мое понимание?

ответ

3

Приложение на основе TCP имеет сообщение для отправки. То, что сообщение зависит от приложения - это может быть просто небольшой запрос или целый файл. Он передает сообщение транспортному слою (TCP), который переводит сообщение в сегменты и передает их один за другим на сетевой уровень (Интернет-протокол). Сетевой уровень добавляет заголовок к каждому пакету и передает его на канальный уровень (Ethernet), который обрабатывает кадрами.

Так, в принципе, мы имеем:

  • сообщения на уровне приложений;
  • сегменты на транспортном уровне;
  • пакеты на сетевом уровне; и
  • рамы на уровне ссылки.

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

+1

Использование термина _message_ с потоковым протоколом легко смутит новичков. _message_ слишком часто неправильно воспринимается как _datagram_ из связанных протоколов (например, UDP). С потоковыми протоколами вы - на уровне приложения - отправляете (последовательности) байтов. Тем не менее, вы можете пометить каждую прохождение такой последовательности байтов на нижнем уровне (обычно API операционной системы) _message_ в терминологии вашего объяснения. – rpy

+0

Какой термин вы используете для единицы информации, переданной из приложения на транспортный уровень? Мне нравится * сообщение *, и я считаю, что этот термин является стандартным, но я вполне согласен изменить свое мнение, если у вас есть лучший термин. – jch

+0

Я не уверен, какой был бы хороший термин. Я бы пошел с _message_, но добавил бы, что этот прикладной уровень может отправлять произвольные последовательности байтов в уровень API, и эти вызовы будут формировать _messages_ в общем смысле. Вы могли бы также добавить некоторое замечание, поясняющее, что с помощью TCP a_message_ также можно было бы объединить с более ранними или более поздними сообщениями, прежде чем их рубили в сегменты. Таким образом, сообщение не является естественной границей для дальнейшего формирования сегментов (и пакетов). – rpy

1

Данные нарезают, и инкапсулируются сегментов на транспортном уровне (UDP, TCP). Сегменты инкапсулированы пакеты сетевым слоем (IPv4, IPv6 и т. Д.). Пакеты инкапсулируются кадрами на уровне канала передачи данных (ethernet и т. Д.).