Transmission Control Protocol ( TCP ) — один из основных протоколов набора протоколов Интернета . Он возник в первоначальной сетевой реализации, в которой он дополнял протокол Интернета (IP). Поэтому весь набор обычно называют TCP/IP . TCP обеспечивает надежную , упорядоченную и проверенную на наличие ошибок доставку потока октетов (байтов ) между приложениями, работающими на хостах, взаимодействующих через сеть IP. Основные интернет-приложения, такие как Всемирная паутина , электронная почта, удаленное администрирование и передача файлов , полагаются на TCP, который является частью транспортного уровня набора TCP/IP. SSL/TLS часто работает поверх TCP.
TCP ориентирован на соединение , что означает, что отправителю и получателю сначала необходимо установить соединение на основе согласованных параметров; они делают это с помощью процедуры трехстороннего рукопожатия. [1] Сервер должен прослушивать (пассивно открыто) запросы на соединение от клиентов, прежде чем соединение будет установлено. Трехстороннее рукопожатие (активно открыто), повторная передача и обнаружение ошибок повышают надежность, но увеличивают задержку . Приложения, которым не требуется надежная служба потока данных , могут вместо этого использовать протокол пользовательских датаграмм (UDP), который предоставляет службу датаграмм без установления соединения , которая отдает приоритет времени над надежностью. TCP использует предотвращение перегрузки сети . Однако в TCP есть уязвимости, включая отказ в обслуживании , перехват соединения , TCP-вето и атаку сброса .
В мае 1974 года Винт Серф и Боб Кан описали межсетевой протокол для совместного использования ресурсов с использованием коммутации пакетов между сетевыми узлами. [2] Авторы работали с Жераром Ле Ланном над включением концепций из французского проекта CYCLADES в новую сеть. [3] Спецификация полученного протокола, RFC 675 ( Спецификация программы управления передачей данных в Интернете ) , была написана Винт Серфом, Йогеном Далалом и Карлом Саншайном и опубликована в декабре 1974 года. [4] Она содержит первое засвидетельствованное использование термина «интернет» как сокращения для «internetwork» . [ требуется ссылка ]
Программа управления передачей включала в себя как ориентированные на соединение связи, так и службы датаграмм между хостами. В версии 4 монолитная программа управления передачей была разделена на модульную архитектуру, состоящую из протокола управления передачей и протокола Интернета . [5] [6] Это привело к созданию сетевой модели, которая стала неофициально известна как TCP/IP , хотя формально ее по-разному называли моделью архитектуры Интернета Министерства обороны ( сокращенно моделью DoD ) или моделью DARPA . [7] [8] [9] Позже она стала частью и синонимом набора протоколов Интернета .
В следующих документах Internet Experiment Note (IEN) описывается эволюция TCP в современную версию: [10]
TCP был стандартизирован в январе 1980 года как RFC 761.
В 2004 году Винт Серф и Боб Кан получили премию Тьюринга за основополагающую работу по TCP/IP. [11] [12]
Протокол управления передачей предоставляет коммуникационную службу на промежуточном уровне между прикладной программой и Интернет-протоколом. Он обеспечивает соединение хост-хост на транспортном уровне модели Интернета . Приложению не нужно знать конкретные механизмы отправки данных по ссылке на другой хост, такие как требуемая фрагментация IP для размещения максимального блока передачи среды передачи. На транспортном уровне TCP обрабатывает все детали квитирования и передачи и представляет абстракцию сетевого соединения с приложением, как правило, через сетевой интерфейс сокета .
На нижних уровнях стека протоколов из-за перегрузки сети , балансировки нагрузки трафика или непредсказуемого поведения сети пакеты IP могут теряться , дублироваться или доставляться не по порядку . TCP обнаруживает эти проблемы, запрашивает повторную передачу потерянных данных, переупорядочивает не по порядку данные и даже помогает минимизировать перегрузку сети, чтобы уменьшить возникновение других проблем. Если данные по-прежнему остаются недоставленными, источник уведомляется об этой ошибке. После того как получатель TCP повторно собрал последовательность первоначально переданных октетов, он передает их принимающему приложению. Таким образом, TCP абстрагирует коммуникацию приложения от базовых сетевых деталей.
TCP широко используется многими интернет-приложениями, включая Всемирную паутину (WWW), электронную почту, протокол передачи файлов , Secure Shell , одноранговый обмен файлами и потоковое мультимедиа .
TCP оптимизирован для точной доставки, а не для своевременной доставки, и может вызывать относительно большие задержки (порядка секунд) при ожидании сообщений, не соответствующих порядку, или повторной передачи потерянных сообщений. Поэтому он не особенно подходит для приложений реального времени, таких как передача голоса по IP . Для таких приложений обычно рекомендуются такие протоколы, как Real-time Transport Protocol (RTP), работающие поверх User Datagram Protocol (UDP). [13]
TCP — это надежная служба доставки потока байтов , которая гарантирует, что все полученные байты будут идентичны и будут в том же порядке, что и отправленные. Поскольку передача пакетов многими сетями ненадежна, TCP достигает этого, используя технику, известную как положительное подтверждение с повторной передачей . Это требует, чтобы получатель ответил сообщением подтверждения , когда он получает данные. Отправитель ведет учет каждого отправленного им пакета и поддерживает таймер с момента отправки пакета. Отправитель повторно передает пакет, если таймер истекает до получения подтверждения. Таймер необходим на случай, если пакет будет потерян или поврежден. [13]
В то время как IP обрабатывает фактическую доставку данных, TCP отслеживает сегменты — отдельные единицы передачи данных, на которые делится сообщение для эффективной маршрутизации по сети. Например, когда HTML-файл отправляется с веб-сервера, программный уровень TCP этого сервера делит файл на сегменты и пересылает их по отдельности на интернет-уровень в сетевом стеке . Программное обеспечение интернет-уровня инкапсулирует каждый сегмент TCP в IP-пакет, добавляя заголовок, который включает (помимо других данных) IP-адрес назначения . Когда клиентская программа на компьютере назначения получает их, программное обеспечение TCP на транспортном уровне повторно собирает сегменты и обеспечивает их правильный порядок и отсутствие ошибок при потоковой передаче содержимого файла в принимающее приложение.
Протокол управления передачей принимает данные из потока данных, делит их на части и добавляет заголовок TCP, создавая сегмент TCP. Затем сегмент TCP инкапсулируется в датаграмму Интернет-протокола (IP) и обменивается с одноранговыми узлами. [14]
Термин пакет TCP используется как в неформальном, так и в формальном использовании, тогда как в более точной терминологии сегмент относится к блоку данных протокола TCP (PDU), дейтаграмма [15] — к IP PDU, а кадр — к PDU канального уровня :
Процессы передают данные, вызывая TCP и передавая буферы данных в качестве аргументов. TCP упаковывает данные из этих буферов в сегменты и вызывает интернет-модуль [например, IP] для передачи каждого сегмента в TCP назначения. [16]
Сегмент TCP состоит из заголовка сегмента и раздела данных . Заголовок сегмента содержит 10 обязательных полей и необязательное поле расширения ( Параметры , розовый фон в таблице). Раздел данных следует за заголовком и представляет собой полезные данные, передаваемые для приложения. [17] Длина раздела данных не указывается в заголовке сегмента; ее можно вычислить, вычитая объединенную длину заголовка сегмента и заголовка IP из общей длины датаграммы IP, указанной в заголовке IP. [ необходима цитата ]
[SYN]
. Option-Kind и стандартные длины указаны как (Option-Kind, Option-Length).Операции протокола TCP можно разделить на три фазы. Установление соединения — это многоэтапный процесс рукопожатия, который устанавливает соединение перед входом в фазу передачи данных . После завершения передачи данных завершение соединения закрывает соединение и освобождает все выделенные ресурсы.
TCP-соединение управляется операционной системой через ресурс, представляющий локальную конечную точку для коммуникаций, сокет Интернета . В течение жизненного цикла TCP-соединения локальная конечная точка претерпевает ряд изменений состояния : [31]
Прежде чем клиент попытается подключиться к серверу, сервер должен сначала привязаться к порту и прослушать его, чтобы открыть его для подключений: это называется пассивным открытием. После того, как пассивное открытие установлено, клиент может установить соединение, инициировав активное открытие с помощью трехстороннего (или 3-шагового) рукопожатия:
Шаги 1 и 2 устанавливают и подтверждают порядковый номер для одного направления (от клиента к серверу). Шаги 2 и 3 устанавливают и подтверждают порядковый номер для другого направления (от сервера к клиенту). После завершения этих шагов и клиент, и сервер получили подтверждения, и установлена полнодуплексная связь.
Фаза завершения соединения использует четырехстороннее рукопожатие, при этом каждая сторона соединения завершает соединение независимо. Когда конечная точка хочет остановить свою половину соединения, она передает пакет FIN, который другая сторона подтверждает с помощью ACK. Таким образом, типичное завершение соединения требует пары сегментов FIN и ACK от каждой конечной точки TCP. После того, как сторона, отправившая первый FIN, ответила последним ACK, она ждет тайм-аута, прежде чем окончательно закрыть соединение, в течение которого локальный порт недоступен для новых подключений; это состояние позволяет клиенту TCP повторно отправить окончательное подтверждение на сервер в случае, если ACK будет потерян при передаче. Длительность времени зависит от реализации, но некоторые общие значения составляют 30 секунд, 1 минуту и 2 минуты. После тайм-аута клиент переходит в состояние CLOSED, и локальный порт становится доступным для новых подключений. [32]
Также возможно завершить соединение с помощью трехстороннего рукопожатия, когда хост A отправляет FIN, а хост B отвечает FIN и ACK (объединяя два шага в один), а хост A отвечает ACK. [33]
Некоторые операционные системы, такие как Linux и HP-UX , [ требуется ссылка ] реализуют полудуплексную последовательность закрытия. Если хост активно закрывает соединение, при этом все еще имея непрочитанные входящие данные, хост посылает сигнал RST (теряя все полученные данные) вместо FIN. Это гарантирует, что приложение TCP знает о потере данных. [34]
Соединение может находиться в полуоткрытом состоянии, в этом случае одна сторона завершила соединение, а другая — нет. Сторона, которая завершила соединение, больше не может отправлять данные в соединение, но другая сторона может. Завершающая сторона должна продолжать считывать данные, пока другая сторона также не завершит соединение. [ необходима цитата ]
Большинство реализаций выделяют запись в таблице, которая сопоставляет сеанс с запущенным процессом операционной системы. Поскольку пакеты TCP не включают идентификатор сеанса, обе конечные точки идентифицируют сеанс, используя адрес и порт клиента. Всякий раз, когда пакет получен, реализация TCP должна выполнить поиск в этой таблице, чтобы найти процесс назначения. Каждая запись в таблице известна как блок управления передачей или TCB. Она содержит информацию о конечных точках (IP и порт), статусе соединения, текущие данные о пакетах, которыми обмениваются, и буферы для отправки и получения данных.
Количество сеансов на стороне сервера ограничено только памятью и может расти по мере поступления новых подключений, но клиент должен выделить эфемерный порт перед отправкой первого SYN на сервер. Этот порт остается выделенным в течение всего разговора и эффективно ограничивает количество исходящих подключений с каждого из IP-адресов клиента. Если приложение не может должным образом закрыть ненужные подключения, клиент может исчерпать ресурсы и стать неспособным устанавливать новые TCP-подключения, даже из других приложений.
Обе конечные точки также должны выделить место для неподтвержденных пакетов и полученных (но непрочитанных) данных.
Протокол управления передачей отличается несколькими ключевыми особенностями по сравнению с протоколом пользовательских датаграмм :
TCP использует порядковый номер для идентификации каждого байта данных. Порядковый номер определяет порядок байтов, отправленных с каждого компьютера, так что данные могут быть восстановлены по порядку, независимо от любой неупорядоченной доставки , которая может произойти. Порядковый номер первого байта выбирается передатчиком для первого пакета, который помечается как SYN. Этот номер может быть произвольным и должен быть, по сути, непредсказуемым для защиты от атак предсказания последовательности TCP .
Подтверждения (ACK) отправляются получателем данных с порядковым номером, чтобы сообщить отправителю, что данные были получены в указанном байте. ACK не означают, что данные были доставлены приложению, они просто означают, что теперь ответственность за доставку данных лежит на получателе.
Надежность достигается за счет обнаружения отправителем потерянных данных и их повторной передачи. TCP использует два основных метода для определения потери. Тайм-аут повторной передачи (RTO) и дублирующие кумулятивные подтверждения (DupAcks).
Когда сегмент TCP передается повторно, он сохраняет тот же порядковый номер, что и при первоначальной попытке доставки. Это смешение доставки и логического порядка данных означает, что при получении подтверждения после повторной передачи отправитель не может определить, подтверждается ли первоначальная передача или повторная передача, так называемая неоднозначность повторной передачи . [35] TCP усложняется из-за неоднозначности повторной передачи. [36]
Если один сегмент (например, сегмент номер 100) в потоке потерян, то получатель не может подтвердить пакеты выше этого номера сегмента (100), потому что он использует кумулятивные ACK. Поэтому получатель снова подтверждает пакет 99 при получении другого пакета данных. Это дублированное подтверждение используется как сигнал потери пакета. То есть, если отправитель получает три дублированных подтверждения, он повторно передает последний неподтвержденный пакет. Пороговое значение три используется, потому что сеть может переупорядочивать сегменты, вызывая дублированные подтверждения. Было продемонстрировано, что этот порог позволяет избежать ложных повторных передач из-за переупорядочивания. [37] Некоторые реализации TCP используют выборочные подтверждения (SACK) для предоставления явной обратной связи о полученных сегментах. Это значительно улучшает способность TCP повторно передавать правильные сегменты.
Неопределенность повторной передачи может привести к ложным быстрым повторным передачам и предотвращению перегрузки, если происходит переупорядочение за пределами порога дублирования подтверждения. [38] За последние два десятилетия в Интернете наблюдалось больше переупорядочения пакетов [39], что привело к тому, что реализации TCP, такие как в ядре Linux, приняли эвристические методы для масштабирования порога дублирования подтверждения. [40] В последнее время были предприняты попытки полностью отказаться от быстрых повторных передач на основе dupack и заменить их на основанные на таймере. [41] (Не путать с классическим RTO, обсуждаемым ниже). Алгоритм обнаружения потерь на основе времени, называемый Recent Acknowledgment (RACK) [42], был принят в качестве алгоритма по умолчанию в Linux и Windows. [43]
Когда отправитель передает сегмент, он инициализирует таймер с консервативной оценкой времени прибытия подтверждения. Сегмент передается повторно, если таймер истекает, с новым порогом тайм-аута, вдвое превышающим предыдущее значение, что приводит к экспоненциальному поведению отсрочки. Обычно начальное значение таймера равно , где — гранулярность часов. [44] Это защищает от чрезмерного трафика передачи из-за неисправных или вредоносных субъектов, таких как злоумышленники, использующие атаку типа « человек посередине» .
Точные оценки RTT важны для восстановления после потерь, так как они позволяют отправителю предположить, что неподтвержденный пакет потерян по истечении достаточного времени (т. е. определения времени RTO). [45] Неопределенность повторной передачи может привести к тому, что оценка RTT отправителем будет неточной. [45] В среде с переменными RTT могут возникнуть ложные тайм-ауты: [46] если RTT недооценено, то RTO срабатывает и запускает ненужную повторную передачу и медленный старт. После ложной повторной передачи, когда приходят подтверждения для исходных передач, отправитель может поверить, что они подтверждают повторную передачу, и сделать ошибочный вывод, что сегменты, отправленные между исходной передачей и повторной передачей, были потеряны, что приводит к дальнейшим ненужным повторным передачам в той степени, в которой канал действительно становится перегруженным; [47] [48] выборочное подтверждение может уменьшить этот эффект. [49] RFC 6298 указывает, что реализации не должны использовать повторно переданные сегменты при оценке RTT. [50] Алгоритм Карна гарантирует, что в конечном итоге будет получена хорошая оценка RTT, ожидая, пока не будет однозначного подтверждения, прежде чем корректировать RTO. [51] Однако после ложных повторных передач может пройти значительное время, прежде чем такое однозначное подтверждение поступит, что в промежутке снижает производительность. [52] Временные метки TCP также решают проблему неоднозначности повторной передачи при установке RTO, [50] хотя они не обязательно улучшают оценку RTT. [53]
Порядковые номера позволяют получателям отбрасывать дубликаты пакетов и правильно упорядочивать пакеты, идущие не по порядку. Подтверждения позволяют отправителям определять, когда повторно передавать потерянные пакеты.
Для обеспечения корректности включено поле контрольной суммы; см. § Вычисление контрольной суммы для получения подробной информации. Контрольная сумма TCP является слабой проверкой по современным стандартам и обычно сочетается с проверкой целостности CRC на уровне 2 , ниже как TCP, так и IP, например, используемой в PPP или кадре Ethernet . Однако появление ошибок в пакетах между защищенными CRC переходами является обычным явлением, и 16-битная контрольная сумма TCP обнаруживает большинство из них. [54]
TCP использует протокол управления потоком данных «от конца к концу», чтобы избежать слишком быстрой отправки данных отправителем для того, чтобы получатель TCP мог их получить и обработать надежно. Наличие механизма управления потоком данных имеет важное значение в среде, где взаимодействуют машины с различными сетевыми скоростями. Например, если ПК отправляет данные на смартфон, который медленно обрабатывает полученные данные, смартфон должен иметь возможность регулировать поток данных, чтобы не быть перегруженным. [13]
TCP использует протокол управления потоком со скользящим окном . В каждом сегменте TCP получатель указывает в поле окна приема объем дополнительно полученных данных (в байтах), которые он готов буферизировать для соединения. Отправляющий хост может отправить только этот объем данных, прежде чем он должен будет дождаться подтверждения и получить обновление окна от принимающего хоста.
Когда получатель объявляет размер окна 0, отправитель прекращает отправку данных и запускает свой постоянный таймер . Постоянный таймер используется для защиты TCP от ситуации взаимоблокировки , которая может возникнуть, если последующее обновление размера окна от получателя будет потеряно, и отправитель не сможет отправить больше данных, пока не получит новое обновление размера окна от получателя. Когда постоянный таймер истекает, отправитель TCP пытается восстановиться, отправив небольшой пакет, чтобы получатель ответил отправкой другого подтверждения, содержащего новый размер окна.
Если получатель обрабатывает входящие данные небольшими порциями, он может неоднократно объявлять небольшое окно приема. Это называется синдромом глупого окна , поскольку неэффективно отправлять только несколько байтов данных в сегменте TCP, учитывая относительно большие накладные расходы заголовка TCP.
Последний основной аспект TCP — контроль перегрузки . TCP использует ряд механизмов для достижения высокой производительности и избежания перегрузки , тупиковой ситуации, когда производительность сети сильно ухудшается. Эти механизмы контролируют скорость поступления данных в сеть, удерживая поток данных ниже скорости, которая может вызвать коллапс. Они также обеспечивают приблизительно максимально-минимальное справедливое распределение между потоками.
Подтверждения для отправленных данных или отсутствие подтверждений используются отправителями для вывода сетевых условий между отправителем и получателем TCP. В сочетании с таймерами отправители и получатели TCP могут изменять поведение потока данных. Это более широко известно как контроль перегрузки или предотвращение перегрузки.
Современные реализации TCP содержат четыре взаимосвязанных алгоритма: медленный старт , предотвращение перегрузки , быстрая повторная передача и быстрое восстановление . [55]
Кроме того, отправители используют тайм-аут повторной передачи (RTO), который основан на расчетном времени кругового пути (RTT) между отправителем и получателем, а также на дисперсии этого времени кругового пути. [56] Существуют тонкости в оценке RTT. Например, отправители должны быть осторожны при расчете образцов RTT для повторно переданных пакетов; обычно они используют алгоритм Карна или временные метки TCP. [26] Эти отдельные образцы RTT затем усредняются по времени для создания сглаженного времени кругового пути (SRTT) с использованием алгоритма Якобсона. Это значение SRTT используется в качестве оценки времени кругового пути.
Улучшение TCP для надежной обработки потерь, минимизации ошибок, управления перегрузками и ускорения в высокоскоростных средах — это текущие области исследований и разработки стандартов. В результате существует ряд вариаций алгоритмов предотвращения перегрузки TCP .
Максимальный размер сегмента (MSS) — это наибольший объем данных, указанный в байтах, который TCP готов получить в одном сегменте. Для лучшей производительности MSS должен быть установлен достаточно малым, чтобы избежать фрагментации IP , которая может привести к потере пакетов и избыточным повторным передачам. Для достижения этого MSS обычно объявляется каждой стороной с помощью параметра MSS при установке TCP-соединения. Значение параметра выводится из максимального размера единицы передачи (MTU) канального уровня сетей, к которым напрямую подключены отправитель и получатель. Отправители TCP могут использовать обнаружение MTU пути , чтобы вывести минимальный MTU вдоль сетевого пути между отправителем и получателем, и использовать это для динамической настройки MSS, чтобы избежать фрагментации IP в сети.
Объявление MSS также можно назвать согласованием MSS , но, строго говоря, MSS не согласовывается . Для двух направлений потока данных в TCP-соединении разрешены два совершенно независимых значения MSS, [57] [16], поэтому нет необходимости согласовывать общую конфигурацию MSS для двунаправленного соединения.
Использование исключительно схемы кумулятивного подтверждения, используемой исходным TCP, может привести к неэффективности при потере пакетов. Например, предположим, что байты с порядковым номером от 1000 до 10 999 отправляются в 10 различных сегментах TCP одинакового размера, а второй сегмент (порядковые номера от 2000 до 2999) теряется во время передачи. В чистом кумулятивном протоколе подтверждения получатель может отправить только кумулятивное значение ACK 2000 (порядковый номер, следующий сразу за последним порядковым номером полученных данных) и не может сказать, что он успешно получил байты от 3000 до 10 999. Таким образом, отправителю, возможно, придется повторно отправить все данные, начиная с порядкового номера 2000.
Чтобы решить эту проблему, TCP использует опцию выборочного подтверждения (SACK) , определенную в 1996 году в RFC 2018, которая позволяет получателю подтверждать прерывистые блоки пакетов, которые были получены правильно, в дополнение к порядковому номеру, следующему сразу за последним порядковым номером последнего непрерывного байта, полученного последовательно, как в базовом подтверждении TCP. Подтверждение может включать в себя несколько блоков SACK , где каждый блок SACK передается левым краем блока (первый порядковый номер блока) и правым краем блока (порядковый номер, следующий сразу за последним порядковым номером блока), причем блок представляет собой непрерывный диапазон, который получатель принял правильно. В приведенном выше примере получатель отправляет сегмент ACK с кумулятивным значением ACK 2000 и заголовок опции SACK с порядковыми номерами 3000 и 11000. Соответственно, отправитель повторно передаст только второй сегмент с порядковыми номерами от 2000 до 2999.
Отправитель TCP может интерпретировать доставку сегмента, доставленного не по порядку, как потерянный сегмент. Если он это сделает, отправитель TCP повторно передаст сегмент, предшествующий пакету, доставленному не по порядку, и замедлит скорость доставки данных для этого соединения. Опция дублирования SACK, расширение опции SACK, которая была определена в мае 2000 года в RFC 2883, решает эту проблему. Как только получатель TCP обнаруживает второй дубликат пакета, он отправляет D-ACK, чтобы указать, что сегменты не были потеряны, что позволяет отправителю TCP восстановить более высокую скорость передачи.
Опция SACK не является обязательной и вступает в действие только в том случае, если обе стороны ее поддерживают. Это согласовывается при установлении соединения. SACK использует опцию заголовка TCP (подробнее см. в § Структура сегмента TCP). Использование SACK стало широко распространенным — все популярные стеки TCP поддерживают его. Избирательное подтверждение также используется в протоколе передачи управления потоком (SCTP).
Выборочные подтверждения могут быть «отменены», когда получатель в одностороннем порядке отбрасывает выборочно подтвержденные данные. RFC 2018 не одобряет такое поведение, но не запрещает получателям возможность отказаться, если, например, у них закончилось буферное пространство. [58] Возможность отказа приводит к сложности реализации как для отправителей, так и для получателей, а также налагает затраты памяти на отправителя. [59]
Для более эффективного использования сетей с высокой пропускной способностью можно использовать больший размер окна TCP. 16-битное поле размера окна TCP управляет потоком данных, и его значение ограничено 65 535 байтами. Поскольку поле размера не может быть расширено сверх этого предела, используется коэффициент масштабирования. Параметр масштабирования окна TCP , как определено в RFC 1323, является параметром, используемым для увеличения максимального размера окна до 1 гигабайта. Масштабирование до этих больших размеров окна необходимо для настройки TCP .
Опция масштабирования окна используется только во время трехстороннего рукопожатия TCP. Значение масштабирования окна представляет собой количество бит для сдвига влево 16-битного поля размера окна при его интерпретации. Значение масштабирования окна может быть установлено от 0 (без сдвига) до 14 для каждого направления независимо. Обе стороны должны отправить опцию в своих сегментах SYN, чтобы включить масштабирование окна в любом направлении.
Некоторые маршрутизаторы и пакетные брандмауэры переписывают коэффициент масштабирования окна во время передачи. Это заставляет отправляющую и принимающую стороны предполагать разные размеры окна TCP. Результатом является нестабильный трафик, который может быть очень медленным. Проблема видна на некоторых сайтах за неисправным маршрутизатором. [60]
Временные метки TCP, определенные в RFC 1323 в 1992 году, могут помочь TCP определить, в каком порядке были отправлены пакеты. Временные метки TCP обычно не синхронизированы с системными часами и начинаются с некоторого случайного значения. Многие операционные системы будут увеличивать временную метку за каждую прошедшую миллисекунду; однако в RFC указано только, что такты должны быть пропорциональными.
Существует два поля временной метки:
Временные метки TCP используются в алгоритме, известном как Защита от перевернутого последовательного номера ( PAWS) . PAWS используется, когда окно приема пересекает границу перевернутого последовательного номера. В случае, когда пакет потенциально был передан повторно, он отвечает на вопрос: «Находится ли этот порядковый номер в первых 4 ГБ или во вторых?» И временная метка используется для разрыва связи.
Кроме того, алгоритм обнаружения Eifel использует временные метки TCP для определения того, происходят ли повторные передачи из-за потери пакетов или просто из-за нарушения порядка. [61]
Временные метки TCP включены по умолчанию в Linux [62] и отключены по умолчанию в Windows Server 2008, 2012 и 2016. [63]
Последние статистические данные показывают, что уровень внедрения временных меток TCP застопорился на уровне ~40% из-за прекращения поддержки Windows Server с Windows Server 2008. [64]
Можно прервать или отменить поток в очереди вместо того, чтобы ждать завершения потока. Это делается путем указания данных как срочных . Это помечает передачу как внеполосные данные (OOB) и сообщает принимающей программе о необходимости немедленной обработки. После завершения TCP информирует приложение и возобновляет очередь потока. Примером является использование TCP для сеанса удаленного входа, когда пользователь может отправить последовательность клавиш, которая прерывает или прерывает удаленно запущенную программу, не дожидаясь, пока программа завершит свою текущую передачу. [13]
Срочный указатель изменяет только обработку на удаленном хосте и не ускоряет обработку в самой сети. Эта возможность реализована по-разному или плохо на разных системах или может не поддерживаться. Там, где она доступна, разумно предположить, что будут надежно обрабатываться только отдельные байты данных OOB. [ 65] [66] Поскольку эта функция используется нечасто, она не была хорошо протестирована на некоторых платформах и была связана с уязвимостями , например , WinNuke .
Обычно TCP ждет 200 мс для отправки полного пакета данных ( алгоритм Нейгла пытается сгруппировать небольшие сообщения в один пакет). Это ожидание создает небольшие, но потенциально серьезные задержки, если повторяется постоянно во время передачи файла. Например, типичный блок отправки будет 4 КБ, типичный MSS - 1460, поэтому 2 пакета отправляются по Ethernet 10 Мбит/с, занимая ~1,2 мс каждый, за которыми следует третий, несущий оставшиеся 1176 после паузы в 197 мс, поскольку TCP ждет заполнения буфера. В случае telnet каждое нажатие клавиши пользователем отражается сервером обратно, прежде чем пользователь сможет увидеть его на экране. Эта задержка может стать очень раздражающей.
Настройка параметра сокетаTCP_NODELAY
переопределяет задержку отправки по умолчанию в 200 мс. Прикладные программы используют этот параметр сокета для принудительной отправки вывода после записи символа или строки символов.
RFC [ which? ] определяет PSH
push-бит как «сообщение принимающему стеку TCP для немедленной отправки этих данных принимающему приложению». [13] Не существует способа указать или контролировать его в пользовательском пространстве с помощью сокетов Беркли ; он контролируется только стеком протоколов . [67]
TCP может быть атакован различными способами. Результаты тщательной оценки безопасности TCP, а также возможные меры по смягчению выявленных проблем были опубликованы в 2009 году [68] и рассматривались в IETF до 2012 года. [69] Известные уязвимости включают отказ в обслуживании, перехват соединения, вето TCP и атаку сброса TCP .
Используя поддельный IP-адрес и многократно отправляя специально собранные пакеты SYN, за которыми следует множество пакетов ACK, злоумышленники могут заставить сервер потреблять большие объемы ресурсов, отслеживая фиктивные соединения. Это известно как атака SYN-флуда . Предлагаемые решения этой проблемы включают файлы cookie SYN и криптографические головоломки, хотя файлы cookie SYN имеют свой собственный набор уязвимостей. [70] Sockstress — это похожая атака, которую можно смягчить с помощью управления системными ресурсами. [71] Продвинутая атака DoS, включающая эксплуатацию таймера TCP persist, была проанализирована в Phrack No. 66. [72] Другие варианты — это PUSH- и ACK-флуды . [73]
Злоумышленник, способный подслушивать сеанс TCP и перенаправлять пакеты, может перехватить TCP-соединение. Для этого злоумышленник узнает порядковый номер из текущего сообщения и подделывает ложный сегмент, который выглядит как следующий сегмент в потоке. Простой перехват может привести к тому, что один пакет будет ошибочно принят на одном конце. Когда принимающий хост подтверждает ложный сегмент, синхронизация теряется. [74] Перехват может сочетаться с подменой ARP или другими атаками маршрутизации, которые позволяют злоумышленнику получить постоянный контроль над TCP-соединением.
Выдавать себя за другой IP-адрес было несложно до RFC 1948, когда начальный порядковый номер можно было легко угадать. Более ранние реализации позволяли злоумышленнику вслепую отправлять последовательность пакетов, которые получатель считал бы исходящими с другого IP-адреса, без необходимости перехвата связи через ARP или маршрутные атаки: достаточно убедиться, что законный хост выдаваемого IP-адреса отключен, или привести его в это состояние с помощью атак типа «отказ в обслуживании» . Вот почему начальный порядковый номер теперь выбирается случайным образом.
Злоумышленник, который может подслушать и предсказать размер следующего отправляемого пакета, может заставить получателя принять вредоносную полезную нагрузку, не нарушая существующее соединение. Злоумышленник внедряет вредоносный пакет с порядковым номером и размером полезной нагрузки следующего ожидаемого пакета. Когда законный пакет в конечном итоге получен, обнаруживается, что он имеет тот же порядковый номер и длину, что и уже полученный пакет, и молча отбрасывается как обычный дубликат пакета — законный пакет блокируется вредоносным пакетом. В отличие от перехвата соединения, соединение никогда не десинхронизируется, и связь продолжается в обычном режиме после того, как вредоносная полезная нагрузка принята. TCP-вето дает злоумышленнику меньший контроль над связью, но делает атаку особенно устойчивой к обнаружению. Единственным доказательством для получателя того, что что-то не так, является один дубликат пакета, обычное явление в IP-сети. Отправитель заблокированного пакета никогда не видит никаких доказательств атаки. [75]
TCP-соединение идентифицируется четверкой из исходного адреса, исходного порта , адреса назначения и порта назначения. [d] [76] [77] Номера портов используются для идентификации различных служб и для разрешения множественных соединений между хостами. [14] TCP использует 16-битные номера портов, предоставляя 65 536 возможных значений для каждого исходного и конечного портов. [17] Зависимость идентификатора соединения от адресов означает, что TCP-соединения привязаны к одному сетевому пути; TCP не может использовать другие маршруты, доступные многосетевым хостам , и соединения разрываются, если адрес конечной точки изменяется. [78]
Номера портов подразделяются на три основные категории: общеизвестные, зарегистрированные и динамические или частные. Общеизвестные порты назначаются организацией Internet Assigned Numbers Authority (IANA) и обычно используются процессами системного уровня. Общеизвестные приложения, работающие как серверы и пассивно прослушивающие соединения, обычно используют эти порты. Вот некоторые примеры: FTP (20 и 21), SSH (22), TELNET (23), SMTP (25), HTTP через SSL/TLS (443) и HTTP (80). [e] Зарегистрированные порты обычно используются приложениями конечного пользователя в качестве эфемерных исходных портов при обращении к серверам, но они также могут идентифицировать именованные службы, зарегистрированные третьей стороной. Динамические или частные порты также могут использоваться приложениями конечного пользователя, однако эти порты обычно не содержат никакого значения за пределами конкретного TCP-соединения.
Трансляция сетевых адресов (NAT) обычно использует динамические номера портов на общедоступной стороне для устранения неоднозначности потока трафика, проходящего между общедоступной сетью и частной подсетью , тем самым позволяя обслуживать множество IP-адресов (и их портов) в подсети одним общедоступным адресом.
TCP — сложный протокол. Однако, несмотря на то, что за эти годы были сделаны и предложены значительные усовершенствования, его основная работа существенно не изменилась с момента его первой спецификации RFC 675 в 1974 году и спецификации v4 RFC 793, опубликованной в сентябре 1981 года. RFC 1122, опубликованный в октябре 1989 года, прояснил ряд требований к реализации протокола TCP. Список из 8 требуемых спецификаций и более 20 настоятельно рекомендуемых улучшений доступен в RFC 7414. Среди этого списка есть RFC 2581, TCP Congestion Control, один из самых важных связанных с TCP RFC за последние годы, описывающий обновленные алгоритмы, которые позволяют избежать ненужной перегрузки. В 2001 году был написан RFC 3168 для описания явного уведомления о перегрузке (ECN), механизма сигнализации для предотвращения перегрузки.
Первоначальный алгоритм предотвращения перегрузки TCP был известен как TCP Tahoe , но с тех пор было предложено много альтернативных алгоритмов (включая TCP Reno , TCP Vegas , FAST TCP , TCP New Reno и TCP Hybla ).
Multipath TCP (MPTCP) [79] [80] — это текущая работа в рамках IETF, направленная на то, чтобы разрешить TCP-соединению использовать несколько путей для максимального использования ресурсов и повышения избыточности. Избыточность, предлагаемая Multipath TCP в контексте беспроводных сетей, позволяет одновременно использовать разные сети, что обеспечивает более высокую пропускную способность и лучшие возможности передачи данных. Multipath TCP также обеспечивает преимущества производительности в средах центров обработки данных. [81] Эталонная реализация [82] Multipath TCP была разработана в ядре Linux. [83] Multipath TCP используется для поддержки приложения распознавания голоса Siri на iPhone, iPad и Mac. [84]
tcpcrypt — это расширение, предложенное в июле 2010 года для обеспечения шифрования на транспортном уровне непосредственно в самом TCP. Оно разработано для прозрачной работы и не требует какой-либо настройки. В отличие от TLS (SSL), tcpcrypt сам по себе не обеспечивает аутентификацию, но предоставляет простые примитивы для этого приложению. tcpcrypt RFC был опубликован IETF в мае 2019 года. [85]
TCP Fast Open — это расширение для ускорения открытия последовательных TCP-соединений между двумя конечными точками. Оно работает, пропуская трехстороннее рукопожатие с использованием криптографического cookie . Оно похоже на более раннее предложение под названием T/TCP , которое не получило широкого распространения из-за проблем безопасности. [86] TCP Fast Open был опубликован как RFC 7413 в 2014 году. [87]
Предложенный в мае 2013 года, Proportional Rate Reduction (PRR) — это расширение TCP, разработанное инженерами Google. PRR гарантирует, что размер окна TCP после восстановления будет максимально близок к порогу медленного старта . [88] Алгоритм предназначен для повышения скорости восстановления и является алгоритмом управления перегрузкой по умолчанию в ядрах Linux 3.2+. [89]
TCP Cookie Transactions (TCPCT) — это расширение, предложенное в декабре 2009 года [90] для защиты серверов от атак типа «отказ в обслуживании». В отличие от SYN-cookie, TCPCT не конфликтует с другими расширениями TCP, такими как масштабирование окна . TCPCT был разработан из-за необходимости DNSSEC , где серверам приходится обрабатывать большое количество кратковременных TCP-соединений. В 2016 году TCPCT был устарел в пользу TCP Fast Open. Статус исходного RFC был изменен на исторический . [91]
Одним из способов преодоления требований к вычислительной мощности TCP является создание его аппаратных реализаций, широко известных как TCP offload engines (TOE). Основная проблема TOE заключается в том, что их трудно интегрировать в вычислительные системы, что требует значительных изменений в операционной системе компьютера или устройства.
Проводные данные TCP предоставляют наблюдателям на пути значительные возможности сбора и изменения информации, поскольку метаданные протокола передаются в открытом виде . [92] [93] Хотя эта прозрачность полезна для сетевых операторов [94] и исследователей, [95] информация, собранная из метаданных протокола, может снизить конфиденциальность конечного пользователя. [96] Эта видимость и пластичность метаданных привела к тому, что TCP стало трудно расширять — случай окостенения протокола — поскольку любой промежуточный узел (« middlebox ») может принимать решения на основе этих метаданных или даже изменять их, [97] [98] нарушая принцип сквозного соединения . [99] Одно измерение показало, что треть путей через Интернет сталкиваются по крайней мере с одним посредником, который изменяет метаданные TCP, и 6,5% путей сталкиваются с вредными эффектами окостенения от посредников. [100] Избегание рисков расширяемости от посредников наложило существенные ограничения на разработку MPTCP , [101] [102] и трудности, вызванные посредниками, затруднили развертывание TCP Fast Open в веб-браузерах . [103] Другим источником окостенения является сложность модификации функций TCP на конечных точках, как правило, в ядре операционной системы [104] или в оборудовании с механизмом разгрузки TCP . [105]
Поскольку TCP предоставляет приложениям абстракцию надежного потока байтов , он может страдать от блокировки начала очереди : если пакеты переупорядочены или потеряны и должны быть повторно переданы (и, таким образом, переупорядочены), данные из последовательно более поздних частей потока могут быть получены до последовательно более ранних частей потока; однако более поздние данные обычно не могут быть использованы до тех пор, пока не будут получены более ранние данные, что приводит к задержке в сети . Если несколько независимых сообщений более высокого уровня инкапсулируются и мультиплексируются в одно соединение TCP, то блокировка начала очереди может привести к обработке полностью полученного сообщения, которое было отправлено позже, в ожидании доставки сообщения, которое было отправлено ранее. [106] Веб-браузеры пытаются смягчить блокировку начала очереди, открывая несколько параллельных соединений. Это влечет за собой затраты на повторное установление соединения, а также умножение ресурсов, необходимых для отслеживания этих соединений в конечных точках. [107] Параллельные соединения также имеют контроль перегрузки, работающий независимо друг от друга, вместо того, чтобы иметь возможность объединять информацию и быстрее реагировать на наблюдаемые сетевые условия; [108] Агрессивные начальные шаблоны отправки TCP могут вызвать перегрузку, если открыто несколько параллельных соединений; а модель справедливости для каждого соединения приводит к монополизации ресурсов приложениями, которые используют этот подход. [109]
Установление соединения является основным фактором задержки, с которой сталкиваются веб-пользователи. [110] [111] Трехэтапное рукопожатие TCP вносит один RTT задержки во время установления соединения, прежде чем данные могут быть отправлены. [111] Для коротких потоков эти задержки очень значительны. [112] Безопасность транспортного уровня (TLS) требует собственного рукопожатия для обмена ключами при установлении соединения. Из-за многоуровневой конструкции рукопожатие TCP и рукопожатие TLS выполняются последовательно; рукопожатие TLS не может начаться, пока не завершится рукопожатие TCP. [113] Для установления соединения с TLS 1.2 по TCP требуются два RTT . [114] TLS 1.3 допускает возобновление соединения с нулевым RTT в некоторых обстоятельствах, но при наложении поверх TCP для рукопожатия TCP все еще требуется один RTT, и это не может помочь первоначальному соединению; Рукопожатия с нулевым RTT также представляют криптографические проблемы, поскольку эффективный, безопасный для повторного воспроизведения и прямой безопасный неинтерактивный обмен ключами является открытой темой для исследований. [115] TCP Fast Open позволяет передавать данные в начальных (т. е. SYN и SYN-ACK) пакетах, устраняя одну задержку RTT во время установления соединения. [116] Однако TCP Fast Open было сложно развернуть из-за окостенения протокола; по состоянию на 2020 год [обновлять]ни один веб-браузер не использовал его по умолчанию. [103]
Пропускная способность TCP зависит от переупорядочения пакетов . Переупорядоченные пакеты могут вызывать отправку дублирующих подтверждений, которые, если они пересекают пороговое значение, затем запускают ложную повторную передачу и контроль перегрузки. Поведение передачи также может стать неравномерным, поскольку большие диапазоны подтверждаются все сразу, когда принимается переупорядоченный пакет в начале диапазона (подобно тому, как блокировка начала очереди влияет на приложения). [117] Блэнтон и Оллман (2002) обнаружили, что пропускная способность обратно пропорциональна объему переупорядочения, вплоть до порогового значения, при котором все переупорядочения запускают ложную повторную передачу. [118] Смягчение переупорядочения зависит от способности отправителя определить, что он отправил ложную повторную передачу, и, следовательно, от разрешения неоднозначности повторной передачи. [119] Уменьшение ложных повторных передач, вызванных переупорядочением, может замедлить восстановление после настоящей потери. [120]
Выборочное подтверждение может обеспечить значительное преимущество в пропускной способности; Bruyeron, Hemon & Zhang (1998) измерили прирост до 45%. [121] Важным фактором улучшения является то, что выборочное подтверждение может чаще избегать перехода к медленному старту после потери и, следовательно, может лучше использовать доступную полосу пропускания. [122] Однако TCP может выборочно подтверждать только максимум три блока порядковых номеров. Это может ограничить скорость повторной передачи и, следовательно, восстановление после потери или вызвать ненужные повторные передачи, особенно в средах с высокими потерями. [123] [124]
TCP изначально был разработан для проводных сетей. Потеря пакетов считается результатом перегрузки сети , и размер окна перегрузки резко сокращается в качестве меры предосторожности. Однако известно, что беспроводные соединения испытывают спорадические и обычно временные потери из-за затухания, затенения, передачи обслуживания, помех и других радиоэффектов, которые не являются строго перегрузкой. После (ошибочного) уменьшения размера окна перегрузки из-за потери беспроводных пакетов может наступить фаза предотвращения перегрузки с консервативным уменьшением размера окна. Это приводит к недоиспользованию радиоканала. Были проведены обширные исследования по борьбе с этими вредными эффектами. Предлагаемые решения можно отнести к категориям сквозных решений, которые требуют изменений на клиенте или сервере, [125] решений на уровне канала, таких как протокол радиосвязи ( RLP ) в сотовых сетях, или решений на основе прокси, которые требуют некоторых изменений в сети без изменения конечных узлов. [125] [126]
Для решения проблемы беспроводной связи было предложено несколько альтернативных алгоритмов управления перегрузкой, таких как Vegas , Westwood , Veno и Santa Cruz. [ необходима ссылка ]
Идея ускорителя TCP заключается в том, чтобы завершить соединения TCP внутри сетевого процессора и затем передать данные на второе соединение к конечной системе. Пакеты данных, исходящие от отправителя, буферизуются на узле ускорителя, который отвечает за выполнение локальных повторных передач в случае потери пакетов. Таким образом, в случае потерь обратная связь между отправителем и получателем сокращается до петли между узлом ускорения и получателем, что гарантирует более быструю доставку данных получателю. [127]
Поскольку TCP является протоколом с адаптивной скоростью, скорость, с которой отправитель TCP вводит пакеты в сеть, прямо пропорциональна преобладающему состоянию нагрузки в сети, а также вычислительной мощности получателя. Преобладающие условия в сети оцениваются отправителем на основе полученных им подтверждений. Узел ускорения разделяет обратную связь между отправителем и получателем и, таким образом, гарантирует более короткое время кругового обхода (RTT) для каждого пакета. Более короткое RTT выгодно, поскольку обеспечивает более быстрое время отклика на любые изменения в сети и более быструю адаптацию отправителя для борьбы с этими изменениями.
Недостатки метода включают тот факт, что сеанс TCP должен быть направлен через ускоритель; это означает, что если маршрутизация изменится, так что ускоритель больше не будет на пути, соединение будет разорвано. Он также разрушает свойство end-to-end механизма TCP ack; когда ACK получен отправителем, пакет был сохранен ускорителем, а не доставлен получателю.
Сниффер пакетов , который перехватывает трафик TCP на сетевом соединении, может быть полезен при отладке сетей, сетевых стеков и приложений, использующих TCP, показывая пользователю, какие пакеты проходят через соединение. Некоторые сетевые стеки поддерживают опцию сокета SO_DEBUG, которую можно включить на сокете с помощью setsockopt. Эта опция выводит все пакеты, состояния TCP и события на этом сокете, что полезно при отладке. Netstat — еще одна утилита, которую можно использовать для отладки.
Для многих приложений TCP не подходит. Одна из проблем (по крайней мере, при нормальных реализациях) заключается в том, что приложение не может получить доступ к пакетам, следующим за потерянным пакетом, пока не будет получена повторно переданная копия потерянного пакета. Это вызывает проблемы для приложений реального времени, таких как потоковое мультимедиа, многопользовательские игры в реальном времени и передача голоса по IP (VoIP), где обычно полезнее получить большую часть данных своевременно, чем упорядочить все данные.
По историческим причинам и причинам, связанным с производительностью, большинство сетей хранения данных (SAN) используют протокол Fibre Channel (FCP) поверх соединений Fibre Channel .
Также для встроенных систем , сетевой загрузки и серверов, обслуживающих простые запросы от огромного количества клиентов (например, DNS- серверов), сложность TCP может быть проблемой. Наконец, некоторые трюки, такие как передача данных между двумя хостами, которые оба находятся за NAT (используя STUN или подобные системы), намного проще без относительно сложного протокола, такого как TCP.
Обычно, когда TCP не подходит, используется протокол пользовательских датаграмм (UDP). Он обеспечивает мультиплексирование приложений и контрольные суммы, которые делает TCP, но не обрабатывает потоки или повторную передачу, предоставляя разработчику приложений возможность кодировать их в соответствии с ситуацией или заменять другими методами, такими как прямое исправление ошибок или интерполяция .
Stream Control Transmission Protocol (SCTP) — еще один протокол, который предоставляет надежные потокоориентированные сервисы, похожие на TCP. Он новее и значительно сложнее TCP и пока не получил широкого распространения. Однако он специально разработан для использования в ситуациях, когда важны надежность и соображения, близкие к реальному времени.
Протокол Venturi Transport Protocol (VTP) — запатентованный фирменный протокол , предназначенный для прозрачной замены TCP с целью преодоления предполагаемой неэффективности, связанной с беспроводной передачей данных.
У TCP также есть проблемы в средах с высокой пропускной способностью. Алгоритм предотвращения перегрузки TCP очень хорошо работает в средах ad-hoc, где отправитель данных заранее неизвестен. Если среда предсказуема, протокол на основе синхронизации, такой как асинхронный режим передачи (ATM), может избежать накладных расходов TCP на повторные передачи.
Протокол передачи данных (UDT) на основе UDP имеет лучшую эффективность и справедливость, чем TCP в сетях с высоким соотношением пропускной способности и задержки . [128]
Многоцелевой протокол транзакций (MTP/IP) — это запатентованное фирменное программное обеспечение, разработанное для адаптивного достижения высокой пропускной способности и производительности транзакций в самых разных сетевых условиях, особенно там, где TCP считается неэффективным.
Когда TCP работает поверх IPv4 , метод, используемый для вычисления контрольной суммы, определяется следующим образом: [16]
Поле контрольной суммы представляет собой 16-битное дополнение по единицам суммы дополнений по единицам всех 16-битных слов в заголовке и тексте. Вычисление контрольной суммы должно гарантировать 16-битное выравнивание суммируемых данных. Если сегмент содержит нечетное количество октетов заголовка и текста, выравнивание может быть достигнуто путем дополнения последнего октета нулями справа для формирования 16-битного слова для целей контрольной суммы. Дополнение не передается как часть сегмента. При вычислении контрольной суммы само поле контрольной суммы заменяется нулями.
Другими словами, после соответствующего заполнения все 16-битные слова добавляются с использованием арифметики с дополнением до единиц . Затем сумма побитно дополняется и вставляется как поле контрольной суммы. Псевдозаголовок, который имитирует заголовок пакета IPv4, используемый при вычислении контрольной суммы, показан в таблице ниже.
Контрольная сумма вычисляется по следующим полям:
Когда TCP работает поверх IPv6 , метод вычисления контрольной суммы изменяется: [129]
Любой транспортный или другой протокол верхнего уровня, который включает адреса из заголовка IP при вычислении контрольной суммы, должен быть изменен для использования поверх IPv6, чтобы включить 128-битные адреса IPv6 вместо 32-битных адресов IPv4.
Ниже показан псевдозаголовок, имитирующий заголовок IPv6 для вычисления контрольной суммы.
Контрольная сумма вычисляется по следующим полям:
Многие реализации программного стека TCP/IP предоставляют возможность использовать аппаратную помощь для автоматического вычисления контрольной суммы в сетевом адаптере перед передачей в сеть или при получении из сети для проверки. Это может избавить ОС от использования драгоценных циклов ЦП для вычисления контрольной суммы. Таким образом, общая производительность сети увеличивается.
Эта функция может привести к тому, что анализаторы пакетов , которые не знают или не уверены в использовании разгрузки контрольной суммы, будут сообщать о недействительных контрольных суммах в исходящих пакетах, которые еще не достигли сетевого адаптера. [130] Это произойдет только для пакетов, которые перехватываются до передачи сетевым адаптером; все пакеты, переданные сетевым адаптером по проводу, будут иметь действительные контрольные суммы. [131] Эта проблема также может возникнуть при мониторинге пакетов, передаваемых между виртуальными машинами на одном хосте, где драйвер виртуального устройства может пропустить расчет контрольной суммы (в качестве оптимизации), зная, что контрольная сумма будет рассчитана позже ядром хоста виртуальной машины или его физическим оборудованием.
Мы портим дизайн интернет-протоколов, нарушая принцип многоуровневости. В частности, мы пытаемся использовать TCP для двух целей: служить сквозным протоколом уровня хоста и служить протоколом упаковки и маршрутизации интернета. Эти две вещи должны быть реализованы многоуровневым и модульным образом.
{{cite book}}
: CS1 maint: location missing publisher (link){{cite web}}
: CS1 maint: bot: original URL status unknown (link)Wireshark захватывает пакеты до того, как они будут отправлены на сетевой адаптер. Он не увидит правильную контрольную сумму, потому что она еще не рассчитана. Хуже того, большинство ОС не утруждают себя инициализацией этих данных, поэтому вы, вероятно, видите небольшие фрагменты памяти, которые не должны видеть. Новые установки Wireshark 1.2 и выше по умолчанию отключают проверку контрольной суммы IP, TCP и UDP. При необходимости вы можете отключить проверку контрольной суммы в каждом из этих диссекторов вручную.
Выгрузка контрольных сумм часто вызывает путаницу, поскольку сетевые пакеты, которые должны быть переданы, передаются Wireshark до того, как контрольные суммы фактически вычисляются. Wireshark получает эти "пустые" контрольные суммы и отображает их как недействительные, хотя пакеты будут содержать действительные контрольные суммы, когда они позже покинут сетевое оборудование.