* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Протокол TCP
23 февраля 2009

Протокол TCP (Transmission Control Protocol - протокол управления передачей) является надёжным потоковым протоколом с соединением, т.е. полной противоположностью UDP. Единственное, что у этих протоколов общее - это способ адресации: в TCP каждому сокету также назначается уникальный номер порта. Уникальность номера порта требуется только в пределах протокола: два сокета могут использовать одинаковые номера портов, если один из них работает через TCP, а другой - через UDP.
В TCP предусмотрены т.н. хорошо известные (well-known) порты, которые зарезервированы для нужд системы и не должны использоваться программами. Стандарт TCP определяет диапазон хорошо известных портов от 0 до 255, в Windows и в некоторых других системах этот диапазон расширен до 0-1023. Часть портов UDP тоже используется для системных нужд, но зарезервированного диапазона в UDP нет. Кроме того, некоторые системные утилиты используют порты за пределами диапазона 0-1023. Полный список системных портов для TCP и UDP содержится в MSDN'е, в разделе Resource Kits/Windows 2000 Server Resource Kit/TCP/IP Core Networking/Appendixes/TCP and UDP Port Assignment.
Для отправки пакета с помощью TCP отправителю необходимо сначала установить соединение с получателем. После выполнения этого действия соединённые таким образом сокеты могут использоваться только для отправки сообщений друг другу. Если соединение разрывается (самой программой или из-за проблем в сети), эти сокеты уже не могут быть использованы для установления нового соединения: они должны быть уничтожены, а вместо них созданы новые сокеты.
Механизм соединения, принятый в TCP, подразумевает разделение ролей соединяемых сторон: одна из них пассивно ждёт, когда кто-то установит с ней соединение, и называется сервером, другая самостоятельно устанавливает соединение и называется клиентом. Действия клиента по установлению связи заключаются в следующем: создать сокет, привязать его к адресу и порту, вызвать функцию для установления соединения, передав ей адрес сервера. Если все эти операции выполнены успешно, то связь установлена, и можно начинать обмен данными. Действия сервера выглядят следующим образом: создать сокет, привязать его к адресу и порту, перевести в режим ожидания соединения и дождаться соединения. При соединении система создаст на стороне сервера специальный сокет, который будет связан с соединившимся клиентом, и обмениваться данными с подключившимся клиентом сервер будет через этот новый сокет. Старый сокет останется в режиме ожидания соединения, и другой клиент сможет к нему подключиться. Для каждого нового подключения будет создаваться новый сокет, обслуживающий только данное соединение, а исходный будет по-прежнему ожидать соединения. Это позволяет нескольким клиентам одновременно соединяться с одним сервером, а серверу - не путаться в своих клиентах. Точное число клиентов, которые могут одновременно работать с сервером, мне найти не удалось, но оно достаточно большое.
Установление такого соединения позволяет осуществлять дополнительный контроль прохождения пакетов. В рамках протокола TCP выполняется проверка доставки пакета, соблюдения очерёдности и отсутствия дублей. Механизмы обеспечения надёжности достаточно сложны, и мы их здесь рассматривать не будем. Программисту для начала достаточно знать, что данные, переданные с помощью TCP, не теряются, не дублируются и доставляются в том порядке, в каком были отправлены. В противном случае отправитель получает сообщение об ошибке. Соединённые сокеты время от времени обмениваются между собой специальными пакетами, чтобы проверить наличие соединения.
Если из-за неполадок в сети произошёл разрыв связи, при попытке отправить данные или прочитать их клиент получит отказ, а соединение будет разорвано. После этого клиент должен уничтожить сокет, создать новый и повторить подключение. Сервер также получает ошибку на сокете, обслуживающем данное соединение, но существенно позже (эта задержка может достигать часа). При обнаружении ошибки сервер просто уничтожает сокет и ждёт нового подключения от клиента. Возможна ситуация, когда клиент уже подключился заново и для него создан новый сокет, а старый сокет ещё не закрыт. Это не является существенной проблемой - на старом сокете рано или поздно будет получена ошибка, и он будет закрыт. Тем не менее, сервер может учитывать такую ситуацию и уничтожать старый сокет, не дожидаясь, пока на нём будет получена ошибка, если новое соединение с клиентом уже установлено. На исходный сокет, находящийся в режиме ожидания подключения, физические разрывы связи никак не влияют, после восстановления связи никаких действий с ним проводить не нужно.
Если на клиентской стороне не удалось для нового сокета установить соединение с сервером с первого раза (из-за отсутствия связи или неработоспособности сервера), этот сокет не обязательно уничтожать: он может использоваться при последующих попытках установления связи неограниченное число раз, пока связь не будет установлена.
Протокол TCP называется потоковым потому, что он собирает входящие пакеты в один поток. В частности, если в буфере сокета лежат 30 байт, принятые по сети, не существует возможности определить, были ли эти 30 байт отправлены одним пакетом, 30-ю пакетами по 1 байту или ещё как-либо. Гарантируется только то, что порядок байт в буфере совпадает с тем порядком, в котором они были отправлены. Принимающая сторона также не ограничена в том, как она будет читать информацию из буфера: всё сразу или по частям. Это существенно отличает TCP от UDP, в котором дейтаграммы не объединяются и не разбиваются на части.
TCP используется там, где программа не хочет заботиться о проверке целостности данных. За отсутствие этой проверки приходится расплачиваться более сложной процедурой установления и восстановления связи. Если при использовании UDP сообщение не будет отправлено из-за проблем в сети или на удалённой стороне, никаких действий перед отправкой следующего сообщения выполнять не нужно и можно использовать тот же сокет. В случае же TCP, как это было сказано выше, необходимо сначала уничтожать старый сокет, затем создать новый и подключить его к серверу, и только потом можно будет снова отправлять сообщения. Другим недостатком TCP по сравнению с UDP является то, что один сокет может использоваться только для отправки пакетов по одному адресу, в то время как UDP позволяет с одного сокета отправлять разные пакеты по разным адресам. И, наконец, TCP не позволяет рассылать широковещательные сообщения. Но несмотря на эти неудобства, TCP используется существенно чаще UDP, потому что автоматическая проверка целостности данных и гарантия из доставки является очень важным преимуществом. Кроме того, по причинам, которые не будут обсуждаться в данной статье, TCP обеспечивает большую безопасность в интернете.
То, что TCP склеивает данные в один поток, не всегда удобно. Во многих случаях пакеты, приходящие по сети, обрабатываются отдельно, поэтому и читать их из буфера желательно тоже по одному. Это просто сделать, если все пакеты имеют одинаковую длину. Но если пакеты имеют разную длину, принимающая сторона заранее не знает, сколько байт нужно прочитать из буфера, чтобы получить ровно один пакет и ни байта больше. Чтобы обойти эту ситуацию, в пакете можно предусмотреть обязательный заголовок фиксированной длины, одно из полей которого хранит длину пакета. В этом случае принимающая сторона может читать пакет по частям: сначала заголовок известной длины, а потом и тело пакета, размер которого стал известен благодаря заголовку.
Но самым неудобным является то, что пакеты не только склеиваются, но и разбиваются на части. Принимающая сторона может получить пакет меньшего размера, чем отправленный. Это значит, что отправленный пакет был послан по частям, и на момент его чтения принимающей стороной ещё не все части были получены. В этом случае нужно повторить операцию чтения данных, пока не будет получено всё, что нужно.
В отличие от UDP, при использовании TCP данные, которые программа отправляет одной командой, могут разбиваться на части и отправляться несколькими IP-пакетами. Поэтому ограничение на длину данных, отправляемых за один раз, в TCP отсутствует (точнее, определяется доступными ресурсами системы). Количество данных, получаемое отправителем за одну операцию чтения, ограничено размером низкоуровнего буфера сокета и может быть разным в разных реализациях. Следует иметь ввиду, что при переполнении буфера принимающей стороны протокол TCP предусматривает передачу отправляющей стороне сигнала, по которому она приостанавливает отправку, причём этот сигнал приостанавливает всю передачу данных между этими двумя компьютерами с помощью TCP, т.е. это может повлиять и на другие программы. Поэтому желательно не допускать таких ситуаций, когда у принимающей стороны в буфере накапливается много данных.


Теги: Протокол TCP, IP-пакет Borland Delphi

Статьи по теме:

Свойство Enabled
Сабклассинг окон на VCL
Выключение секций
IndexName
Признаки автоматизированных рабочих мест. Классификация автоматизированных рабочих мест
SearchKey
Компонент TQRMemo
Настольные издательские системы
Exclusive
Гипертекстовые и мультимедийные информационные технологии
ReadOnly
Использование выражений
Плавающая запятая в BASM
UpdateIndexDefs
Метод NewColumn
| Borland Delphi | Alex |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | Borland Delphi | Протокол TCP. Регион сайта: Москва и Санкт-Петербург