отправка нескольких tcp-пакетов в ip-пакете

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

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

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


person Rohit Banga    schedule 08.02.2010    source источник


Ответы (6)


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

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

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

person Will    schedule 08.02.2010
comment
вот откуда у меня эта идея! - person Rohit Banga; 08.02.2010
comment
хотел уточнить, указано ли это в протоколе. - person Rohit Banga; 08.02.2010
comment
В TCP они называются сегментами, а не пакетами. - person caf; 09.02.2010
comment
@caf изменился, но 50/50 если так понятнее - person Will; 09.02.2010
comment
А как насчет UDP, ведь в его заголовке есть поле длины? Если у разрешенного получателя нет проблем с обнаружением отдельных пакетов, не так ли? - person Dhanaraj Durairaj; 29.07.2014
comment
TCP-сегмент может быть фрагментирован на несколько IP-пакетов. Это нежелательно, потому что, если даже один из пакетов отбрасывается, необходимо повторно передать весь сегмент, это правильно? - person Siddhartha; 30.11.2017


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

Сам протокол этого не позволяет. Он не сломается, этого просто не будет.

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

person IAbstract    schedule 08.02.2010
comment
но в конечном итоге сегмент tcp отправляется путем извлечения данных из потока байтов. - person Rohit Banga; 08.02.2010
comment
вы основываете свой ответ на реализации или протокол не позволяет этого. что-то сломается, если у нас есть реализация, которая отправляет более одного сегмента tcp внутри ip-пакета. - person Rohit Banga; 08.02.2010

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

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

person Paolo    schedule 08.02.2010

TCP — общедоступная спецификация, почему бы просто не прочитать ее?

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

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

person Andrew McGregor    schedule 08.02.2010

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

  1. Подумайте о том, чтобы упаковать все, что вам нравится, в пакет UDP. Я не уверен, насколько легко инициировать маршрутизацию «распакованных» пакетов TCP на удаленной стороне.
  2. Рассмотрите возможность использования PPTP или аналогичного протокола туннелирования.
person dma_k    schedule 08.02.2010
comment
этот вопрос возник, потому что я заметил, что в заголовке TCP не было поля длины сегмента TCP. вот почему я хотел подтвердить. большое спасибо! - person Rohit Banga; 08.02.2010
comment
А как насчет UDP, ведь в его заголовке есть поле длины? Если у разрешенного получателя нет проблем с обнаружением отдельных пакетов, не так ли? - person Dhanaraj Durairaj; 29.07.2014
comment
@RohitBanga: В этом отношении заголовок TCP действительно не имеет поля length с размером данных. Он основан на базовом транспортном протоколе, который (AFAIK) всегда есть. Таким образом, нет необходимости добавлять еще одно избыточное значение. - person dma_k; 26.08.2014
comment
@DhanarajDurairaj: Да, UDP имеет длину, проверьте википедию. Однако TCP и UDP служат разным целям: их нельзя смешивать. Это две ветви поверх IP: TCP для последовательной потоковой передачи данных, UDP для обмена короткими сообщениями, где порядок не имеет большого значения. - person dma_k; 26.08.2014