TCP против UDP — что такое TCP-соединение?

Что такое TCP-соединение? Я понимаю, что нет физического соединения от клиента к серверу. Является ли это соединение просто сокетом клиента, связанным с новым сокетом, созданным сервером после трехэтапного рукопожатия? После этого, как только «соединение» установлено, сокеты на обоих концах соединения знают, куда отправлять свои пакеты.

Чем это отличается от того, как работает UDP, кроме начального рукопожатия с TCP? Дело в том, что у каждого сокета сервера есть только один клиент, который отправляет пакеты в этот конкретный сокет?

Каковы возможные преимущества выделенного соединения между хостами? Мое понимание TCP и UDP все еще очень базовое, поэтому общих обобщений должно быть достаточно.


person Cheese    schedule 16.11.2011    source источник


Ответы (2)


Давайте разобьем это на части. Во-первых, сеть основана на протоколе IP, который назначает адрес каждому сетевому узлу и позволяет отправлять небольшие объемы данных (обычно до 64 КБ, но обычно только 1500 КБ). ) от одного узла к другому.

Это само по себе еще ничего не стоит, потому что мы не можем проверить, что данные действительно поступили и что они поступили в правильном порядке. Если нам нужен абстрактный механизм для передачи произвольных объемов данных и обеспечения их доставки, нам нужен другой протокол поверх сети, который обрабатывает эту «передачу». И это цель TCP.

Однако параллельно с TCP существует еще один протокол «передачи», который вообще не выполняет никаких проверок и не отличается надежностью, — UDP. UDP — это просто тонкая оболочка необработанных IP-пакетов, которая добавляет немного метаданных (например, номер порта).

Однако UDP по-прежнему полезен, поскольку во многих ситуациях целостность данных уже передана протоколу еще более высокого уровня, поэтому нет необходимости в сложном протоколе передачи. Например, это используется в виртуальных сетевых службах, где другой экземпляр TCP/IP обычно запускается через канал UDP. (Использование в канале надежного протокола, такого как TCP, может иметь катастрофические последствия в этом случае из-за повторных каскадов отправки.)

Таким образом, термин «TCP-соединение» относится к применению TCP-протокола. Протокол естественно сохраняет состояние и обычно работает в последовательности SYN-ACK-data-FIN или SYN/RST в случае отклонения передачи; оба одноранговых узла поддерживают состояние соединения (рукопожатие, установлено, закрытие, закрыто). TCP также вводит термины «сервер» и «клиент», причем сервер является одноранговым узлом, который listen()s для входящего соединения.

person Kerrek SB    schedule 16.11.2011
comment
Хм... Я пытаюсь придумать, как мне это сформулировать, чтобы добраться до того, что мне нужно. Я понимаю, что TCP добавляет дополнительные функции, которые обеспечивают более надежную передачу данных. Он также имеет функции для управления перегрузкой. Думаю, я хочу игнорировать эти функции и сосредоточиться только на фактическом соединении. Если бы мне нужно было спроектировать клиент и сервер UDP, которые отправляли бы подтверждения туда и обратно для повышения надежности, было бы тогда это соединение, подобное используемому в TCP? - person Cheese; 16.11.2011
comment
Формирует ли установка TCP-соединения какое-то соглашение между хостом и сервером относительно того, как будущие пакеты будут обрабатываться или интерпретироваться? Это означало бы, что определенная информация будет передаваться только во время установки соединения. В то время как UDP, с другой стороны, должен включать такую ​​информацию в каждый отправляемый пакет. - person Cheese; 16.11.2011
comment
@Cheese: Первый вопрос: это, по сути, просто новое изобретение TCP! Второй вопрос: определенно существует нумерация пакетов, которые обрабатываются протоколом. На самом деле это не намного больше, чем я обещаю, что этот произвольный пакет данных прибудет на другой конец. Трудно представить себе решение с вашей стороны, которое было бы лучше, чем просто собственное TCP-соединение... - person Kerrek SB; 16.11.2011
comment
Чувак, последний абзац твоего ответа появляется в верхней части Google при поиске tcp connection. Поздравляю~, наверное. - person Parziphal; 13.11.2015
comment
@renocor: Ха-ха, действительно, спасибо :-) Это немного смущает, не так ли. Ну что ж. - person Kerrek SB; 13.11.2015
comment
@KerrekSB, не могли бы вы сказать мне, что означают SYN-ACK-data-FIN и SYN/RST - person Kasun Siyambalapitiya; 02.08.2017
comment
@KasunSiyambalapitiya: это виды TCP-пакетов. SYN, ACK, FIN и RST — это метаданные квитирования, которые устанавливают или завершают соединение. - person Kerrek SB; 02.08.2017
comment
Согласно комментариям OP, я думаю, что этот ответ (хотя и правильный) не отвечает на вопрос OP и не отвечает на мой. Мой вопрос: когда мы говорим, что между двумя хостами установлено соединение, что это значит? Если бы я мог достать волшебный микроскоп и осмотреть сервер или клиент, и — а-ха! - найти связь, на что бы я смотрел? Какая-то переменная, выделенная кодом ОС? Какая-то запись в какой-то таблице? Как и когда это туда попадает, и как и когда оттуда удаляется. - person Rafael Eyng; 11.03.2018
comment
@RafaelEyng: в самом общем смысле соединение представлено состоянием обоих одноранговых узлов внутри их соответствующего сетевого стека в операционной системе — состояние, подобное порту такой-то и такой-то по адресу такой-то, является частью открытого соединения. . Затем трафик от сетевого оборудования будет доступен для чтения из пользовательского процесса каким-либо подходящим образом (например, через подготовку файлового дескриптора к чтению). - person Kerrek SB; 11.03.2018
comment
@KerrekSB Как этот вопрос не по теме, можете ли вы его открыть, у меня были такие же сомнения, как и у многих других, это настоящий концептуальный вопрос. - person Suraj Jain; 08.07.2018
comment
@SurajJain: Без понятия. Критерии того, что делает вопросы правильными, менялись, и семь лет назад они определенно были другими. Рекомендую пометить вопрос для внимания модератора, чтобы можно было пересмотреть решение. - person Kerrek SB; 09.07.2018
comment
@KerrekSB Я отметил это, спрашивая, как я могу проголосовать за его открытие, но я не вижу ни одной ссылки, по которой я нажимаю, чтобы проголосовать. Можешь поставить отметку?? - person Suraj Jain; 09.07.2018
comment
@KerrekSB Также я открыл один вопрос stackoverflow.com/questions/51233307/, потому что этот был закрыт. - person Suraj Jain; 09.07.2018
comment
@SurajJain: Похоже, сейчас он закрыт по другой причине! - person Kerrek SB; 09.07.2018
comment
@KerrekSB Можете ли вы написать свой ответ и на другой вопрос, он действительно хорош, или вы можете открыть этот, я действительно не знаю, как они дублируются. - person Suraj Jain; 09.07.2018

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

Протокол управления передачей (TCP) является одним из основных протоколов набора интернет-протоколов. TCP является одним из двух исходных компонентов пакета, дополняющим Интернет-протокол (IP), поэтому весь пакет обычно называют TCP/IP. TCP обеспечивает надежную упорядоченную доставку потока байтов от программы на одном компьютере к другой программе на другом компьютере. TCP — это протокол, на который опираются основные интернет-приложения, такие как World Wide Web, электронная почта, удаленное администрирование и передача файлов. Другие приложения, которым не требуется надежный сервис потока данных, могут использовать протокол пользовательских дейтаграмм (UDP), который предоставляет сервис дейтаграмм, в котором приоритет отдается уменьшенной задержке, а не надежности.1

person Hasteur    schedule 16.11.2011