Примеры объединения сегментов получения
В этом разделе показан алгоритм объединения с использованием примеров сегментов, которые принимаются по порядку и обрабатываются в одном отложенном вызове процедуры (DPC).
На этой странице используются X и X' для маркировки последовательных сегментов. Все остальные поля сегментов и единой объединенной единицы (SCU) описаны в разделе Правила объединения сегментов TCP/IP.
Пример 1. Сегменты данных
Описание сегмента
Обрабатываются 10 последовательных сегментов, принадлежащих одному и тому же TCP-соединению. Для каждого из них выполняются все следующие условия:
X'. SEQ == X.NXT
X'SEQ > X.SEQ
X'. ACK == X.ACK
Ни один из этих сегментов не создает исключение.
Результат
Один SCU формируется из 10 сегментов. Это обозначается как один NET_BUFFER в одном NET_BUFFER_LIST.
Пример 2. Сегменты данных, за которыми следует исключение, а затем сегменты данных
Описание сегмента
Обрабатываются 5 последовательных сегментов, принадлежащих одному и тому же TCP-подключению. Для каждого из них выполняются все следующие условия:
X'. SEQ == X.NXT
X'SEQ > X.SEQ
X'. ACK == X.ACK
Ни один из этих сегментов не создает исключение. 6-й сегмент является дублирующимся сегментом ACK с параметром TCP SACK и создает исключение на основе правила номер 3 в разделе Правила объединения сегментов TCP/IP.
Примечание В этом случае правило исключения для обработки параметра TCP имеет приоритет и, таким образом, переопределяет правило объединения.
Обрабатываются 2 последовательных сегмента, принадлежащих одному и тому же TCP-соединению. Для каждого из них выполняются все следующие условия:
X'. SEQ == X.NXT
X'SEQ > X.SEQ
X'. ACK == X.ACK
Ни один из этих сегментов не создает исключение.
Результат
Один SCU формируется из первых 5 сегментов. 6-й сегмент не формирует SCU.
7-й и 8-й сегменты образуют SCU вместе.
Цепочка NET_BUFFER_LIST обозначается тремя NET_BUFFER_LIST структурами, каждая из которых имеет один NET_BUFFER. Порядок полученных сегментов сохраняется.
Пример 3. Сегменты данных, за которыми следуют обновления нескольких окон
Описание сегмента
Обрабатываются 5 последовательных сегментов, принадлежащих одному и тому же TCP-подключению. Для каждого из них выполняются все следующие условия:
X'. SEQ == X.NXT
X'SEQ > X.SEQ
X'. ACK == X.ACK
Ни один из этих сегментов не создает исключение. 6-й сегмент — это чистое ACK, которое представляет собой обновление окна с помощью SEG. WND = 65535, как показано на следующей блок-схеме.
7-й сегмент — это чистая ACK, которая представляет собой обновление окна с помощью SEG. WND = 131070, как показано на той же блок-схеме.
Результат
Один SCU формируется из 7 сегментов. Это обозначается как один NET_BUFFER в одном NET_BUFFER_LIST.
The SCU. WND = 131070, и контрольная сумма обновляется на основе этого значения.
Пример 4. Пакеты ACL с piggyback, смешанные с сегментами данных
Описание сегмента
Обрабатываются 3 последовательных сегмента, принадлежащих одному и тому же TCP-соединению. Для каждого из них выполняются все следующие условия:
X'. SEQ == X.NXT
X'SEQ > X.SEQ
X'. ACK == X.ACK
Ни один из этих сегментов не создает исключение. Обрабатываются 2 последовательных сегмента, принадлежащих одному и тому же TCP-соединению. Для каждого из них выполняются все следующие условия:
X'. SEQ == X.NXT
X'SEQ > X.SEQ
X'. ACK == X.ACK
Ни один из этих сегментов не создает исключение.
Результат
Один SCU формируется из 5 сегментов. Это обозначается как один NET_BUFFER в одном NET_BUFFER_LIST. The SCU. Для параметра ACK задано последнее значение SEG.ACK.