UDP + фрагментация
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 13:19
Оценка: 3 (1)
Привет !

Клиент шлет серверу большой UDP-пакет — около 10000 байт.
Если напринимающей стороне пакет не собирается полностью, что получит читатель ?
Или не получит вообще ничего ?

Сам протокол, построенный на UDP, простой.
Клиент серверу шлет пинг и ждет ответа
Сервер отвечает на пинг
По получении ответа на пинг клиент шлет запрос о получении данных.
Сервер отсылает данные, затребованные клиентом.


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

Заранее благодарен
Re: UDP + фрагментация
От: NavuhodonosoR Россия  
Дата: 27.01.03 13:31
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

O>Клиент шлет серверу большой UDP-пакет — около 10000 байт.

Я "сильно неуверен", что клиенту это удастся:

MSDN: send() The send function is used to write outgoing data on a connected socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying provider, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.

Где-то фигурировала цифра 1440 байт, но точных источников не скажу.

Остальное поскипано
Re[2]: UDP + фрагментация
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 13:34
Оценка:
Здравствуйте, NavuhodonosoR, Вы писали:

O>>Клиент шлет серверу большой UDP-пакет — около 10000 байт.

NR>Я "сильно неуверен", что клиенту это удастся:
NR>

MSDN: send() The send function is used to write outgoing data on a connected socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying provider, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.

NR>Где-то фигурировала цифра 1440 байт, но точных источников не скажу.

Вообще сам UDP позволяет отправить до 65К данных. У меня в локальной сети все работает.
Только проверить потери не могу
Re: UDP + фрагментация
От: J.J.OK  
Дата: 27.01.03 13:35
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

O>Привет !


O>Клиент шлет серверу большой UDP-пакет — около 10000 байт.


не пакет а _блок_данных_ — разве у тебя есть средства для того чтобы программно рулить всеми параметрами UDP?

O>Если напринимающей стороне пакет не собирается полностью, что получит читатель ?

O>Или не получит вообще ничего ?

read у клиента будет читать все долетевшие до него UDP пакетики подряд
при этом нет НИКАКОЙ ганантии что долетят все или что долетит то что было отправлено


[ ... ]

O>Нужно ли вводить дополнительные данные в пакет (размер, контрольная сумма), на тот случай, если пакет придет неполным(фрагмент потерялся) ?


безусловно да

O> ... или таковой ситуации не будет ?


в незагруженной локалке такая ситуация маловероятна — в любом другом случае — весьма и весьма.
Удачи
Чем безопаснеe — тем неудобнее ;-)
Re: UDP + фрагментация
От: Сергей Зизев Украина  
Дата: 27.01.03 13:43
Оценка: 21 (1)
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

O>Привет !


O>Клиент шлет серверу большой UDP-пакет — около 10000 байт.

O>Если напринимающей стороне пакет не собирается полностью, что получит читатель ?
O>Или не получит вообще ничего ?
Скорее всего не получит его вообще, т.к. это уровень на много ниже, чем читатель пакетов
К сожаления IP работает так, что если пакет не может собраться из франгментов, то требуется
повторение всего пакета заново, никто отдельных фрагмент повторить не может.

O>Сам протокол, построенный на UDP, простой.

O>Клиент серверу шлет пинг и ждет ответа
O>Сервер отвечает на пинг
O>По получении ответа на пинг клиент шлет запрос о получении данных.
O>Сервер отсылает данные, затребованные клиентом.

O>

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

O>Заранее благодарен
Re[2]: UDP + фрагментация
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 13:46
Оценка:
Здравствуйте, J.J.OK, Вы писали:

JJO>не пакет а _блок_данных_ — разве у тебя есть средства для того чтобы программно рулить всеми параметрами UDP?


Ну да. Блок данных.

O>>Если напринимающей стороне пакет не собирается полностью, что получит читатель ?

O>>Или не получит вообще ничего ?

JJO>read у клиента будет читать все долетевшие до него UDP пакетики подряд

JJO>при этом нет НИКАКОЙ ганантии что долетят все или что долетит то что было отправлено

Меня интересует, что получит читатель. Если из десятка фрагментов дойдет один, что вернет recvfrom ?
Re[2]: То, что надо. Спасибо !
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 13:47
Оценка:
Re[2]: UDP + фрагментация
От: Сергей Зизев Украина  
Дата: 27.01.03 13:59
Оценка: 6 (2)
Здравствуйте, NavuhodonosoR, Вы писали:

NR>Здравствуйте, old->*Plutonia_Experiment(), Вы писали:


NR>Где-то фигурировала цифра 1440 байт, но точных источников не скажу.

Если быть точнее, то это число 1492 (октета) и это только для Ethernet, в других сетях это число может быть другим.
Кроме того, шлюзы обязаны обрабатывать дейтаграммы до 576 октетов.

NR>Остальное поскипано
Re[3]: UDP + фрагментация
От: Сергей Зизев Украина  
Дата: 27.01.03 14:14
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:


O>Вообще сам UDP позволяет отправить до 65К данных. У меня в локальной сети все работает.

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

O>Только проверить потери не могу

Если ты работаешь через DirectPlay, то с ним идет шейпер dp8simui.exe, с помощью него ты может "замедлить сеть", т.е. он будет херить пакеты. Если ты работаешь напрямую с сокетами, то я не уверен, что директовский шейпер сработает, надо проверять.
Re[2]: UDP + фрагментация
От: J.J.OK  
Дата: 27.01.03 14:16
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

СЗ>Здравствуйте, old->*Plutonia_Experiment(), Вы писали:


O>>Привет !


O>>Клиент шлет серверу большой UDP-пакет — около 10000 байт.

O>>Если напринимающей стороне пакет не собирается полностью, что получит читатель ?
O>>Или не получит вообще ничего ?
СЗ>Скорее всего не получит его вообще, т.к. это уровень на много ниже, чем читатель пакетов
СЗ>К сожаления IP работает так, что если пакет не может собраться из франгментов, то требуется
СЗ>повторение всего пакета заново, никто отдельных фрагмент повторить не может.

! Уважаемый, вы не тОчны — поясню:
есть _блок_данных_ пользователя
есть IP-пакет(ы)
есть MTU — Maximum Transfer Unit — определяемый физическим уровнем

так вот, если данные пользователя превышают MTU то IP побъет _блок_данных_ на несколько пакетов и гарантирует целостность заголовков IP-пакетов — определяющих адреса и проч.
Однако! IP НЕ гарантирует целостность данных!
Точно также как UDP не дает средств убедиться в том что дошли все пакеты.
Больше того, поскольку UDP это conectionless протокол, то и порядок доставки пакетов — тоже не гарантирован!

[...]

итого см. мой предыдущий пост.
Чем безопаснеe — тем неудобнее ;-)
Re[3]: UDP + фрагментация
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 14:30
Оценка:
Здравствуйте, J.J.OK, Вы писали:

O>>>Клиент шлет серверу большой UDP-пакет — около 10000 байт.

O>>>Если напринимающей стороне пакет не собирается полностью, что получит читатель ?
O>>>Или не получит вообще ничего ?
СЗ>>Скорее всего не получит его вообще, т.к. это уровень на много ниже, чем читатель пакетов
СЗ>>К сожаления IP работает так, что если пакет не может собраться из франгментов, то требуется
СЗ>>повторение всего пакета заново, никто отдельных фрагмент повторить не может.

JJO>! Уважаемый, вы не тОчны — поясню:

JJO>есть _блок_данных_ пользователя
JJO>есть IP-пакет(ы)
JJO>есть MTU — Maximum Transfer Unit — определяемый физическим уровнем

JJO>так вот, если данные пользователя превышают MTU то IP побъет _блок_данных_ на несколько пакетов и гарантирует целостность заголовков IP-пакетов — определяющих адреса и проч.

JJO>Однако! IP НЕ гарантирует целостность данных!

Мне не нужны гарантии целостности. Мне нужна гарантия, что я смогу узнать об ошибке каким либо образом. Просто писать парсер особый я не собираюсь

JJO>Точно также как UDP не дает средств убедиться в том что дошли все пакеты.

JJO>Больше того, поскольку UDP это conectionless протокол, то и порядок доставки пакетов — тоже не гарантирован!

Ну и что ? Если IP фрагментирует, то он же и дефргагментирует.
Re: UDP + фрагментация
От: J.J.OK  
Дата: 27.01.03 14:33
Оценка:
[...]

O'Reilly TCP/IP Network Administration.


Chapter 1: Overview of TCP/IP: 1.6 Transport layer : 1.6.1 User Datagram Protocol
...
UDP is an unreliable, connectionless datagram protocol. As noted previously, "unreliable"
 merely means that there are no techniques in the protocol for verifying that the data 
reached the other end of the network correctly.




итого read и все его порождения на клиенте просто прочитают все IP-шные пакеты которые долетят.
и никаких гарантий — ни целостности, ни порядка
Чем безопаснеe — тем неудобнее ;-)
Re[2]: UDP + фрагментация
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 14:41
Оценка:
Здравствуйте, J.J.OK, Вы писали:

JJO>

JJO>
JJO>Chapter 1: Overview of TCP/IP: 1.6 Transport layer : 1.6.1 User Datagram Protocol
JJO>...
JJO>UDP is an unreliable, connectionless datagram protocol. As noted previously, "unreliable"
JJO> merely means that there are no techniques in the protocol for verifying that the data 
JJO>reached the other end of the network correctly. 
JJO>


Это значит, что сидя на одном конце, ты не знаешь, что произойдет на другом.

JJO>итого read и все его порождения на клиенте просто прочитают все IP-шные пакеты которые долетят.

JJO>и никаких гарантий — ни целостности, ни порядка

Меня интресует один блок данных, который передается чз конечное количество фрагментов.
Все. Вопрос решен.
IP управляет фрагментацией. Ему абсолютно побоку, какой верхний протокол.
Дефрагментирует он же.
Так что если IP не может собрать все, как было, то и UDP ничего не получит, и TCP и тд.


А recvfrom читает не фрагменты (это IP пакеты), а целый блок данных -UDP. Так что если данные дошли нормально, все прочитается.
Re[4]: UDP + фрагментация
От: J.J.OK  
Дата: 27.01.03 14:44
Оценка:
[...]

O>Мне не нужны гарантии целостности. Мне нужна гарантия, что я смогу узнать об ошибке каким либо образом. Просто писать парсер особый я не собираюсь


JJO>>Точно также как UDP не дает средств убедиться в том что дошли все пакеты.

JJO>>Больше того, поскольку UDP это conectionless протокол, то и порядок доставки пакетов — тоже не гарантирован!

O>Ну и что ? Если IP фрагментирует, то он же и дефргагментирует.


повторяю. с точки зрения IP "недолет" или любые другие проблемы с доставкой пакетов — кроме ошибок маршрутизации или ошибок пришедших с физического уровня — НЕ являются ошибками — IP ни про что другое НЕ ЗНАЕТ.

IP "дефрагментирует" в соответствии с протоколом транспортного уровня — для UDP это означает ... см. уже сказанное в нитке.

похоже без парсера тебе не обойтись — либо перезжай на TCP
Удачи.
Чем безопаснеe — тем неудобнее ;-)
Re[5]: UDP + фрагментация
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 15:04
Оценка:
Здравствуйте, J.J.OK, Вы писали:
JJO>>>Точно также как UDP не дает средств убедиться в том что дошли все пакеты.
JJO>>>Больше того, поскольку UDP это conectionless протокол, то и порядок доставки пакетов — тоже не гарантирован!

O>>Ну и что ? Если IP фрагментирует, то он же и дефргагментирует.


JJO>повторяю. с точки зрения IP "недолет" или любые другие проблемы с доставкой пакетов — кроме ошибок маршрутизации или ошибок пришедших с физического уровня — НЕ являются ошибками — IP ни про что другое НЕ ЗНАЕТ.


JJO>IP "дефрагментирует" в соответствии с протоколом транспортного уровня — для UDP это означает ... см. уже сказанное в нитке.


Фрагментируется сообщение именно на IP уровне. Половинки и кусочки IP не пропускает.
Поэтому нельзя гарантировать достоверную доставку.
TCP использует механизм квитирования. Он сам перепосылет IP-пакеты до тех пор, пока не получит ответ или таймаут.
UDP ничего не перепосылает.
Это делаем сами, естественно. Вопрос не в том.

Я забыл про фрагментацию средствами IP.
Если данные фрагментированы, то более высокому протоколу от IP придет полностью дефрагментированный блок.
При дефрагментации используется количество фрагментов и номер фрагмента.

Так что можно гарантировать ( или правильную дефрагментацию или невозмжность такового). Что мне и надо.

А таймауты я буду делать сам.

Вобщем дело не UDP. А в IP



JJO>) похоже без парсера тебе не обойтись — либо перезжай на TCP

А на TCP как это делается ?
Re[6]: UDP + фрагментация
От: J.J.OK  
Дата: 27.01.03 15:24
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:
[...]

JJO>>) похоже без парсера тебе не обойтись — либо перезжай на TCP

O>А на TCP как это делается ?


# man tcp
---------------
NAME
     tcp - Internet Transmission Control Protocol

SYNOPSIS
     #include <sys/types.h>
     #include <sys/socket.h>
     #include <netinet/in.h>

     int
     socket(AF_INET, SOCK_STREAM, 0)

DESCRIPTION
     The TCP protocol provides reliable, flow-controlled, two-way transmission
     of data.  .........


либо MSDN смотри
Чем безопаснеe — тем неудобнее ;-)
Re[7]: UDP + фрагментация
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.01.03 15:27
Оценка:
Здравствуйте, J.J.OK, Вы писали:

JJO>либо MSDN смотри


Как с сокетами рубаться я знаю. Мне интересен подпротокол фрагментации и реальная имплементация(те как на самом деле все используется).
Re[8]: UDP + фрагментация
От: J.J.OK  
Дата: 27.01.03 15:34
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

O>Здравствуйте, J.J.OK, Вы писали:


JJO>>либо MSDN смотри


O>Как с сокетами рубаться я знаю. Мне интересен подпротокол фрагментации и реальная имплементация(те как на самом деле все используется).


в таком случае см. описание протокола RFC 793, Transmission Control Protocol
google + rfc — а там в rfc-index-e посмотри — может есть более свежие RFC-шки на TCP
Чем безопаснеe — тем неудобнее ;-)
Re[3]: UDP + фрагментация
От: Сергей Зизев Украина  
Дата: 27.01.03 15:52
Оценка: 24 (2)
Здравствуйте, J.J.OK, Вы писали:

JJO>! Уважаемый, вы не тОчны — поясню:

JJO>есть _блок_данных_ пользователя
JJO>есть IP-пакет(ы)
JJO>есть MTU — Maximum Transfer Unit — определяемый физическим уровнем

JJO>так вот, если данные пользователя превышают MTU то IP побъет _блок_данных_ на несколько пакетов и гарантирует целостность заголовков IP-пакетов — определяющих адреса и проч.

JJO>Однако! IP НЕ гарантирует целостность данных!
Я и не говорил, что IP гарантирует целостность данных.
Я говорил лишь, что чексумма в UDP будет проверена ядром системы до того, как пакет упадет в стек.
Если чексумма не верная, то получатель ничего не получит,
Если пакет не удается собрать из фрагментов, то получатель тоже ничего не получит.

Чексумму в UDP пакете ставить не обязательно (в TCP обязательно), однако я думаю, что все на сегодня имеющееся системы выставляют в UDP пакете чексумму(это лего можно посмотреть сниффером). Если поле чексумма в пакете не 0, то принимающая сторона обязана проверить чексумму пакета и если она не верна, то пакет уничтожается и ни какая ошибка не генерируется.

Только что заглянул очередной раз в исходники ядра Linux (2.2.19), там все пучком, чуксумма проверяется у UDP пакетов.

JJO>Точно также как UDP не дает средств убедиться в том что дошли все пакеты.

Так и есть.
JJO>Больше того, поскольку UDP это conectionless протокол, то и порядок доставки пакетов — тоже не гарантирован!
К тому же я добавлю, что UDP использует IP для пеpедачи сообщения и естественно обеспечивает ту же самую негарантированную доставку пакетов, что и IP. UDP не использует подтвеpждения пpихода сообщений, не упоpядочивает сообщения. Поэтому, UDP сообщения могут быть потеpяны, pазмножены или пpиходить не по поpядку

JJO>[...]


JJO>итого см. мой предыдущий пост.
Re[2]: UDP + фрагментация
От: Сергей Зизев Украина  
Дата: 27.01.03 15:58
Оценка: 21 (1)
Здравствуйте, J.J.OK, Вы писали:

JJO>[...]


JJO>O'Reilly TCP/IP Network Administration.


JJO>

JJO>
JJO>Chapter 1: Overview of TCP/IP: 1.6 Transport layer : 1.6.1 User Datagram Protocol
JJO>...
JJO>UDP is an unreliable, connectionless datagram protocol. As noted previously, "unreliable"
JJO> merely means that there are no techniques in the protocol for verifying that the data 
JJO>reached the other end of the network correctly. 
JJO>

Мой низкий поклон господину O'Reilly. Однако его цитата говорит лишь, о том, что отправитель UDP пакета
не сможет узнать дошел он до получателя или нет, чексумма самого UDP пакета здесь не причем.

JJO>


JJO>итого read и все его порождения на клиенте просто прочитают все IP-шные пакеты которые долетят.

JJO>и никаких гарантий — ни целостности, ни порядка
Порядок, да никто не гарантирует. Все надстройки над UDP аля DirectPlay сами "собирают" этот порядок.
Однако я очень сомневаюсь в том, что функции типа read (я думаю автор имел ввиду recv()) что-то вообще получат, в том случае, если пакет не собрался из фрагментов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.