отправка нескольких TCP-пакетов в IP-пакет - PullRequest
10 голосов
/ 08 февраля 2010

можно ли отправлять несколько пакетов tcp или udp в один пакет ip? Существуют ли какие-либо спецификации в протоколе, которые не допускают этого.

если это разрешено протоколом, но, как правило, не выполняется реализациями tcp / udp, не могли бы вы указать на соответствующую часть в исходном коде linux, подтверждающую это.

Существуют ли какие-либо реализации tcp / udp в некоторых ОС, которые отправляют несколько пакетов в одном IP-пакете. (если это разрешено).

Ответы [ 6 ]

9 голосов
/ 08 февраля 2010

Это невозможно .

Заголовок сегмента TCP не описывает его длину. Длина полезной нагрузки TCP определяется длиной IP-пакета (-ов) за вычетом длины заголовков IP и TCP. Таким образом, только один сегмент TCP на IP-пакет.

И наоборот, один сегмент TCP может быть фрагментирован по нескольким IP-пакетам посредством IP-фрагментации.

2 голосов
/ 08 февраля 2010

TCP является публичной спецификацией, почему бы просто не прочитать ее?

RFC4164 - это документ с дорожной картой, RFC793 - это сам TCP, а RFC1122 содержит некоторые ошибки и показывает, как он сочетается с остальными (IPv4 ) вселенная.

Но вкратце, поскольку заголовок TCP (раздел 3.1 RFC793) не имеет поля длины, данные TCP простираются от конца заполнения заголовка до конца пакета IP. Негде положить в пакет другой сегмент данных.

2 голосов
/ 08 февраля 2010

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

РЕДАКТИРОВАТЬ - я не знал, что TCP не 'у него нет собственного поля заголовка, поэтому невозможно было бы сделать это без написания собственного эквивалента TCP, содержащего эту информацию.SCTP все еще может быть полезен, поэтому я оставлю эту ссылку.

2 голосов
/ 08 февраля 2010

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

2 голосов
/ 08 февраля 2010

Tcp не отправляет пакеты: это непрерывный поток. Вы отправляете сообщения.
UDP, основанный на пакетах, будет отправлять только один пакет за раз.

Сам протокол этого не позволяет. Это не сломается, это просто не произойдет.

Предложение об использовании туннелирования является действительным, но также и предупреждение.

1 голос
/ 08 февраля 2010

Вы не можете упаковать несколько пакетов TCP в один пакет IP - это ограничение спецификации, как упомянуто выше. TCP является ближайшим API, который ориентирован на приложения. Или вы хотите запрограммировать отправку сырых IP-сообщений? Просто скажите нам, какую проблему вы хотите решить. Подумайте о том, как вы организуете доставку сообщений из одного приложения в другое, или упомяните, что вы хотите подключиться к стеку TCP / IP. Что я могу вам предложить:

  1. Рассмотрите возможность упаковки всего, что вам нравится, в пакет UDP. Я не уверен, насколько легко инициировать маршрутизацию "распакованных" пакетов TCP на удаленной стороне.
  2. Попробуйте использовать PPTP или аналогичный протокол туннелирования.
...