Отправка нескольких TCP-пакетов в IP-пакет

Можно ли отправить несколько пакетов TCP или UDP на один пакет IP? Есть ли какие-либо спецификации в протоколе, которые не позволяют это.

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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