Рис. 57.2.
• CWR: от англ. congestion window reduced — «сужение окна перегрузки».
• ECE: от англ. explicit congestion notification echo — «отклик явного уведомления о перегрузке». Флаги CWR и ECE являются частью алгоритма ECN (англ. explicit congestion notification — «явное уведомление о перегрузке»), который применяется в TCP/IP. Это относительно новая технология; ее описание можно найти в документе RFC 3168 и книге [Floyd, 1994]. Алгоритм ECN реализован в Linux начиная с версии 2.4; включить его можно, задав ненулевое значение в файле /proc/sys/net/ipv4/tcp_ecn (доступном только в Linux).
• URG: от англ. urgent pointer — «указатель важности». Если его установить, то он будет содержать корректную информацию.
• ACK: от англ. acknowledgement number — «номер подтверждения». Если его установить, то поле с номером подтверждения будет содержать корректную информацию (то есть этот сегмент сможет подтверждать получение данных, посланных ранее удаленным сокетом).
• PSH: от англ. push — «толкать». «Проталкивает» все полученные данные к принимающему процессу. Этот флаг описан в RFC 993 и [Stevens, 1994].
• RST: от англ. reset — «сбрасывать». Сбрасывает соединение. Используется для обработки различных ошибок.
• SYN: от англ. synchronize — «синхронизировать». Синхронизирует порядковые номера. Сегменты с этим флагом передаются во время установки соединения, чтобы оба сокета могли указать начальные порядковые номера, которые будут применяться для передачи данных в обоих направлениях.
• FIN: от англ. finish — «завершать». Используется отправителем для уведомления о завершении передачи данных.
Сегменту можно установить сразу несколько контролирующих битов (или ни одного), благодаря чему он может иметь разные назначения. Например, позже мы увидим, что во время установки TCP-соединения сокеты обмениваются сегментами с битами SYN и ACK.
В протоколе TCP контрольная сумма охватывает не только заголовок и данные, но и 12 дополнительных байтов, которые обычно называют псевдозаголовком. Он состоит из следующих элементов: исходного и конечного IP-адресов (по четыре байта каждый); двух байтов, обозначающих размер TCP-сегмента (это вычисляемое значение, но оно не входит ни в IP-, ни в TCP-заголовок); одного байта со значением 6, которое является уникальным номером протокола TCP в рамках стека TCP/IP; одного сдвигающего байта, содержащего 0 (чтобы длина псевдозаголовка была кратна 16 битам). Применение псевдозаголовка при вычислении контрольной суммы позволяет получателю перепроверять тот факт, что входящий сегмент дошел туда, куда нужно (то есть IP-клиент не принял по ошибке датаграмму, направленную другому сетевому узлу, или TCP-пакет, который должен был перейти на более высокий уровень). Вычисление контрольных сумм в пакетных заголовках протокола UDP выполняется похожим образом и по аналогичным причинам. Больше подробностей о псевдозаголовках можно найти в книге [Stevens, 1994].
57.6.2. Порядковые номера и подтверждения в протоколе TCP
Каждому байту, переданному по TCP-соединению, протокол TCP назначает логический порядковый номер (каждый из двух потоков в соединении имеет отдельную нумерацию). После передачи сегмента его полю с