Порядковые номера в UDP
Мне был задан интересный вопрос, касающийся дейтаграмм и того, как они фрагментированы, а именно, что используется для повторной сборки исходной дейтаграммы.
- Я знаю, что идентификационный номер в каждом фрагменте будет одинаковым, чтобы показать, что все они принадлежат одной большой дейтаграмме.
- Я знаю, что FragFlag, установленный в 1, означает, что на пути больше фрагментов, однако фрагмент с FragFlag, равным 0, означает, что это последний фрагмент.
Есть еще одна вещь, которую я пропускаю, и я предполагаю, что порядковые номера также должны использоваться, чтобы фрагменты знали, в каком порядке они должны быть возвращены. Однако, если это правда, это меня смущает, потому что дейтаграммы используют UDP, который предполагается быть ненадежным и может в конечном итоге потерять пакеты в пути или отправить их в неправильном порядке.
Напротив, TCP должен быть надежным, и лучший способ гарантировать, что пакеты отправляются в правильном порядке. Здесь все по-другому, потому что мы имеем дело с дейтаграммами, а не с пакетами? Или просто были созданы порядковые номера, чтобы сделать UDP более "надежным".
Спасибо за любую помощь.
2 ответа
Однако, если это правда, меня это немного смущает, потому что дейтаграммы используют UDP, который предположительно ненадежен и может в конечном итоге потерять пакеты при передаче или отправить их в неправильном порядке.
Почему это сбивает с толку? Если все фрагменты поступают, датаграмма повторно собирается (на уровне IP) и доставляется приложению. Если они этого не сделают, невезение.
Важным отличием здесь является то, что TCP определяет управление потоком между отправителем и получателем, поэтому обе стороны всегда знают, каково состояние связи, например, успешное / неуспешное / текущее /... . UDP является более низкоуровневым: отправитель просто передает некоторые данные, и ему все равно, получены они или нет (конечно, вы можете реализовать в ПО какой-то протокол более высокого уровня, используя UDP).