LINUX.ORG.RU

История изменений

Исправление dsl, (текущая версия) :

речь идет про то, что пакет UDP будет разбит например на 3 IP пакета по 1000 байт, которые на другом конце могут быть получены как первый, третий, второй

Именно так. TCP/IP стек на принимающем узле вообще не должен передавать фрагменты одной UDP датаграммы на уровень выше, т.е. на сетевом уровне стек должен будет принять все фрагменты IP пакета прежде чем извлечь из них данные и собрать в одну UDP датаграмму и передать на транспортный уровень. Иными словами, если Вы отправили массив в 3000 байт, то либо получите на принимающей стороне один пакет в 3000 байт, либо не дождётесь пакета вовсе.

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

Если интересно понять как фрагменты собираются на сетевом уровне, то RFC 791 и особенно раздел 2.3 Function Description, подраздел Fragmentation. В кратце, используются 4 поля в IP заголовке: Identification, Fragment Offset, Total Length и More Fragments флаг.

EDIT: Не туда ответил, извиняюсь. Хотел самому автору.

Исправление dsl, :

речь идет про то, что пакет UDP будет разбит например на 3 IP пакета по 1000 байт, которые на другом конце могут быть получены как первый, третий, второй

Именно так. TCP/IP стек на принимающем узле вообще не должен передавать фрагменты одной UDP датаграммы на уровень выше, т.е. на сетевом уровне стек должен будет принять все фрагменты IP пакета прежде чем извлечь из них данные и собрать в одну UDP датаграмму и передать на транспортный уровень. Иными словами, если Вы отправили массив в 3000 байт, то либо получите на принимающей стороне один пакет в 3000 байт, либо не дождётесь пакета вовсе.

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

Если интересно понять как фрагменты собираются на сетевом уровне, то RFC 791 и особенно раздел 2.3 Function Description, подраздел Fragmentation. В кратце, используются 4 поля в IP заголовке: Identification, Fragment Offset, Total Length и More Fragments флаг.

Исходная версия dsl, :

речь идет про то, что пакет UDP будет разбит например на 3 IP пакета по 1000 байт, которые на другом конце могут быть получены как первый, третий, второй

Именно так. TCP/IP стек на принимающем узле вообще не должен передавать фрагменты одной UDP датаграммы на уровень выше, т.е. на сетевом уровне стэк должен будет принять все фрагменты IP пакета прежде чем извлечь из них данные и собрать в одну UDP датаграмму и передать на транспортный уровень. Иными словами, если Вы отправили массив в 3000 байт, то либо получите на принимающей стороне один пакет в 3000 байт, либо не дождётесь пакета вовсе.

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

Если интересно понять как фрагменты собираются на сетевом уровне, то RFC 791 и особенно раздел 2.3 Function Description, подраздел Fragmentation. В кратце, используются 4 поля в IP заголовке: Identification, Fragment Offset, Total Length и More Fragments флаг.