
Листинг 3.3. Определение структуры UDP пакета |
|
||||
/*** |
Определение |
структуры UDP пакета. |
***/ |
||
/*** |
Формальное |
определение находится в файле netinet/udp.h. |
***/ |
||
typedef |
unsigned |
char ui8; |
|
||
typedef unsigned short int ui16; |
|
||||
struct UDP_header { |
|
||||
ui16 |
src_port; |
/* номер порта отправителя */ |
|
||
ui16 |
dst_port; |
/* номер порта получателя */ |
|
||
ui16 |
length; |
/* длина сообщения */ |
|
||
ui16 |
checksum; |
/* контрольная сумма сообщения */ |
|
||
uchar data[]; |
/* данные */ |
|
|||
|
|
0 |
|
|
|
|
|
|
IP заголовок (20 60 байтов) |
|
|
|
|
|
|
|
|
|
|
20 60 |
|
Номер порта отправителя |
|
|
|
|
|
|
|
|
|
22 62 |
|
Номер порта получателя |
|
|
|
|
|
|
|
|
|
24 64 |
|
Длина сообщения |
|
|
|
|
|
|
|
|
|
26 66 |
|
Контрольная сумма |
|
|
|
28 68\ |
|
Данные (до 65535 байтов минус заголовки) |
|
|
|
|
|
|
|
Рис. 3.4. Структура UDP пакета
В UDP для каждого сообщения создается виртуальный сетевой приемник, на$
зываемый портом. Благодаря портам IP$подсистема может быстро находить вла$ дельцев сообщений. Даже если порт не был назначен с помощью функции bind(),система создаст временный порт из списка эфемерных портов (см. гла$
ву 2, "Основы TCP/IP").
Протокол TCP
TCP (Transmission Control Protocol — протокол управления передачей) являет$ ся основным протоколом сокетов, используемым в Internet. Он позволяет исполь$ зовать функции read() и write() и требует повторного открытия сокета при каж$
дом новом подключении. Атрибуты пакета TCP перечислены в табл. 3.6.
Таблица 3.6. Характеристики пакета TCP |
|
|
Служебные данные (байты) |
40 120 |
|
Размер сообщения (байты) |
(не ограничен) |
|
Надежность |
Высокая (факт получения данных проверяется) |
|
Тип сообщения |
Поток |
|
Пропускная способность |
Низкая (в сравнении с другими протоколами) |
|
Целостностьданных |
Высокая (используются контрольные суммы) |
|
Фрагментация |
Мало вероятна |
|
Глава 3. Различные типы Internet пакетов |
71 |
Ⱦɚɧɧɚɹ ɜɟɪɫɢɹ ɤɧɢɝɢ ɜɵɩɭɳɟɧɚ ɷɥɟɤɬɪɨɧɧɵɦ ɢɡɞɚɬɟɥɶɫɬɜɨɦ %RRNV VKRS Ɋɚɫɩɪɨɫɬɪɚɧɟɧɢɟ ɩɪɨɞɚɠɚ ɩɟɪɟɡɚɩɢɫɶ ɞɚɧɧɨɣ ɤɧɢɝɢ ɢɥɢ ɟɟ ɱɚɫɬɟɣ ɁȺɉɊȿɓȿɇɕ Ɉ ɜɫɟɯ ɧɚɪɭɲɟɧɢɹɯ ɩɪɨɫɶɛɚ ɫɨɨɛɳɚɬɶ ɩɨ ɚɞɪɟɫɭ piracy@books-shop.com
Дальнейшее повышение надежности обеспечивается путем проверки того, что адресат действительно получил данные, причем именно в том виде, в каком они были посланы. Протокол UDP работает достаточно быстро, но он не имеет той надежности, которая требуется многим программам. Проблема надежности реша ется в протоколе TCP.
В самой сети, однако, присутствует ряд факторов, снижающих ее надежность. Это не связано с какими то внешними ограничениями, а заложено в сетевой ар хитектуре. Чтобы обеспечить надежную потоковую доставку сообщений в WWW, протокол TCP вынужден реализовывать многие из тех идей, которые были пред ложены выше для повышения надежности протокола UDP. Ниже рассматривают ся три ограничивающих фактора, существующих в Internet: динамические под ключения, потери данных и узкие каналы.
Динамические подключения
Один компьютер посылает сообщение другому. Сообщение путешествует по сети, проходя через различные маршрутизаторы и шлюзы. Путь, по которому оно передается, может быть самым разным. В зависимости от того, включен сервер или нет, сетевые сегменты (соединения между компьютерами) могут то появлять ся, то исчезать. Сила Internet заключается в адаптации к подобным изменениям и способности динамически изменять маршрут сообщения. К сожалению, данное преимущество также означает, что путь между клиентом и сервером может посто янно меняться, то удлиняясь, то укорачиваясь. При удлинении увеличивается время распространения сообщения. Таким образом, программа может послать не сколько последовательных сообщений, и все они пойдут разными маршрутами, будут передаваться в разное время и придут в неправильном порядке.
Протокол TCP гарантирует, что прежде чем будет послано следующее сообще ние, получатель правильно примет предыдущее. Предположим, программа посы лает 10 сообщений подряд. TCP подсистема перехватывает каждое сообщение, присваивает ему уникальный номер и отправляет его, Получатель принимает со общение и высылает подтверждение. Только получив его, протокол TCP позволя ет программе послать следующее сообщение.
Алгоритмраздвижногоокна
Описанная схема "отправил — подожди" работает слишком медленно. В ТСР применяется улуч шённая методика 'раздвижного окна"; в ней определяется, как «исто и при каких обстоятельст вах следует посылать подтверждение. В медленных и'шумящих соединениях число подтвер ждающих сообщений выше. В более быстрых и надежных соединениях между подтверждениями передается больше данных. Это результат применения алгоритма Нейгла (Nagle). Работу алго ритма можно отменить с помощью параметров сокета (подробнее об этом в главе 9, "Повышение производительности").
Потери данных
Когда адресат получает сообщение, он проверяет целостность содержащихся в нем данных. Сообщения могут передаваться по плохим линиям, теряющим или повреждающим данные. Протокол TCP сопровождает каждое сообщение кон трольной суммой и является последним уровнем, на котором поврежденные дан
ные могут быть обнаружены и исправлены.
Если получатель обнаруживает повреждение, он посылает сообщение об ошибке, запрашивая повторную передачу данных. Кроме того, если компьютер в течение заданного времени не получит подтверждение о том, что сообщение ус
72 |
Часть I. Создание сетевых клиентских приложений |
www.books-shop.com
пешно доставлено, TCP подсистема автоматически инициирует повторную дос тавку сообщения без вмешательства программы.
Узкиеканалы
Иногда случается, что сообщение слишком велико и не может пройти через встретившийся ему сегмент. Проблема связана с различными технологиями пере дачи данных. В некоторых сетях допускаются длинные пакеты, в других их раз мер ограничен.
Протокол UDP пытается передавать настолько большие данные, насколько это возможно, вследствие чего могут возникать проблемы, связанные с ограни ченными каналами передачи. В протоколе IP предполагается, что маршрутизато ры могут фрагментировать данные и сообщение потом придется собирать по час тям.
В свою очередь, протокол TCP ограничивает каждый пакет небольшим бло ком. Длинные сообщения разбиваются прежде, чем это произойдет где то в сети. Искомый размер выбирается таким, чтобы пакет мог передаваться в большинстве сетей без изменений. По умолчанию размер блока в TCP равен 536 байтам и мо жет быть увеличен до 1500 байтов. Вручную задать это значение можно с помо щью параметра MSS (maximum segment size — максимальный размер сегмента) ТСР сокета (обратитесь за детальной информацией к главе 9, "Повышение про изводительности").
Следует также отметить, что при получении пакетов сообщения в неправиль ном порядке TCP подсистема переупорядочивает их, прежде чем передавать программе.
Необходимость решения всех перечисленных проблем приводит к значитель ному усложнению протокола TCP и структуры его заголовка. Естественно, произ водительность от этого существенно падает.
Заголовок TCP$пакета
Протокол TCP предлагает много различных возможностей, поэтому в заголо вок TCP пакета добавлен целый ряд дополнительных полей. Размер заголовка в TCP примерно в три раза превышает размер UDP заголовка. Структура заголовка приведена в листинге 3.4.
Листинг3.4.ОпределениеструктурыTCP пакета
/*** Определение структуры TCP пакета. |
***/ |
/*** Формальное определение находится в файле netinet/tcp.h. ***/
/**************************************************************/
typedef unsigned char ui8; typedef unsigned short int ui16; typedef unsigned int ui32; typedef unsigned int uint;
struct TCP_header { ui16 src_port; ui16 dst_port; ui32 seq_num; ui32 ack_num;
/* номер порта отправителя */ /* номер порта получателя */ /* порядковый номер */ /* номер подтверждения */
Глава 3. Различные типы Internet пакетов |
73 |
www.books-shop.com

uint data_off:4; /* |
смещение данных */ |
|
|
||||||||
uint |
|
|
|
res:6; |
|
/* |
(зарезервировано) */ |
. |
|
||
uint |
urg_flag:1; /* |
срочное, |
внеполосное |
сообщение |
*/ |
||||||
uint ack_flag:1; /* поле подтверждения корректно */ |
|
||||||||||
uint psh_flag:1; /* |
немедленно выдать сообщение процессу */ |
||||||||||
uint |
rst_flag:1; /* |
разорвать соединение вследствие ошибок */ |
|||||||||
uint syn_flag:1; /* открыть виртуальное соединение (канал) */ |
|||||||||||
uint |
fin_flag:1; |
/* закрыть соединение */ |
|
|
|||||||
ui16 |
window; |
|
/* число байтов, получаемых адресатом */ |
||||||||
ui16 |
checksum; |
/* |
контрольная сумма сообщения */ |
|
|||||||
ui16 |
urg_pos; |
|
/* последний байт срочного сообщения */ |
||||||||
ui8 options[]; |
/* опции TCP */ |
|
|
||||||||
ui8 |
|
padding[]; |
/* |
(необходимо для выравнивания |
|
||||||
|
|
|
|
|
|
|
|
массива data[]) */ |
|
|
|
uchar |
|
data[]; |
|
|
|
|
|||||
|
|
/* |
данные */ |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
0 |
IР загаповок |
(20 60 |
байтов) |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 60 |
|
|
|
Номер порта отправителя |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 62 |
|
|
|
Номер порта получателя |
|
|||
|
|
|
24 64 |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
90 eg |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
32 72 |
Смещение данных | |
зарезервировано |
|urg|ack|psh|rst|syn|fin |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 74 |
|
|
|
Размер окна получателя |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 76 |
|
|
|
Контрольнаясумма |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 78 |
|
|
|
Байт срочного сообщения |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 80 |
|
|
|
Опции TCP |
f |
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
Данные (до 65536 байтов минус заголовки) |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
Рис. 3.5. Структура TCP!пакета |
|
Заголовок может иметь переменный размер, поэтому поле data_off указывает на начало данных. Для экономии места это поле, подобно полю header_len IP пакета, определяет не число байтов, предшествующих данным, а число 32 битовых слов.
Некоторые поля используются только для открытия соединения, управления передачей и закрытия соединения. Часть полей в процессе передачи данных не заполняется.
В TCP заголовках используются те же номера портов, что и в UDP. Поля seq_numи ack_num позволяют выполнять трассировку потока. Когда посылается сообщение, IP подсистема присваивает ему порядковый номер (seq_num). Получа тель уведомляет отправителя о доставке сообщения, посылая ему подтверждение
74 |
Часть I. Создание сетевых клиентских приложений |
www.books-shop.com
с номером (ack_num), на единицу большим, чем порядковый номер принятого со общения. Это позволяет в подтверждениях также передавать данные.
Взаимодействие посредством TCP
При открытии потокового соединения программа и сервер обмениваются со общениями по схеме, описанной в табл. 3.7.
Таблица 3.7. Трехфазовое квитирование |
|
|
Клиент посылает |
Сервер посылает |
Описание |
SYN=1 (syn_flag) |
|
Запрос на виртуальное подключение (канал) |
АСК=0 (ack_flag) |
|
Задание порядкового номера |
|
SYN=1 (syn_flag) |
Разрешает виртуальное подключение |
|
АСК=1 (ack_flag) |
|
SYN=0 (syn_flag) |
|
|
ACK=1 (ack_flag) |
|
Устанавливает виртуальное соединение |
Это называется трехфазовым квитированием. В процессе обмена сообщениями клиент и сервер устанавливают размеры приемных буферов (окон).
Разрыв соединения — тоже не такой простой процесс, как может показаться, ведь в пути могут находиться важные данные. Когда клиент закрывает соедине ние, обмен сообщениями происходит по схеме, представленной в табл. 3.8.
Таблица 3.8. Разрыв TCP соединения |
|
|
Клиент |
Сервер |
Описание |
|
|
|
FIN=1 (syn_flag) |
Передает данные |
Клиент запрашивает разрыв соединения |
|
Принимает данные |
|
АСК=1 |
Передает дополнитель |
Происходит очистка каналов сервера |
|
ные данные |
|
|
Принимает дополни |
|
|
тельные данные |
|
АСК=1 |
FIN=1 |
Разрыв принят. Сервер разрывает соединение и |
|
|
ждет подтверждения от клиента |
АСК=1 |
|
Клиент закрывает свой конец соединения |
|
|
|
Когда TCP соединение разорвано, сокет нельзя повторно использовать для организации других соединений. Если требуется подключиться к другому серверу, необходимо создать новый сокет. Остальные протоколы не имеют подобного ог раничения.
Взаимосвязь между протоколами
Изучая сетевое программирование, читатели, должно быть, не раз удивлялись: как взаимодействуют между собой все эти протоколы? Иногда кажется, что меж
Глава 3. Различные типы Internet пакетов |
75 |
www.books-shop.com
ду ними вообще нет никакой связи. Они могут использовать ряд функций друг друга, но все же столь тесного взаимодействия, чтобы считать их неразделимыми, не наблюдается.
Рассмотренные протоколы — ICMP, UDP, TCP и собственно IP — играют в сети каждый свою роль. Об этом следует помнить, проектируя сетевое приложе ние. Конечно, TCP надежнее и обладает большими возможностями по сравнению с другими протоколами, но его нельзя поменять на ICMP. В различных подсис темах Linux используются разные функции TCP/IP, и каждый протокол важен для корректной работы системы.
Физически пакеты ICMP, UDP и TCP основаны на неструктурированном IP пакете. Свои заголовки и данные они размещают в разделе данных этого пакета.
Анализ сетевого трафика с помощью
утилиты tcpdump
Наблюдая в реальном времени пакеты, проходящие по сети, можно узнать, каким образом ядро обрабатывает сообщения и как сетевая подсистема интер претирует адреса. Утилита tcpdump отображает данные, находящиеся в текущий момент в сети. Она "видит" как неструктурированные IP пакеты, так и TCP пакеты. По соображениям безопасности доступ к ней разрешен только пользо вателю root.
По умолчанию утилита работает в беспорядочном режиме, перехватывая все се тевые пакеты и взаимодействуя с сетевым интерфейсным устройством напрямую.
Сетевая этика
Знание является грозным оружием и налагает на его обладателя большую ответственность. Имея привилегии пользователя root, можно выполнять много полезной работы, а можно и нанести ог ромный вред. Будучи инсталлированной на вашем компьютере, система Linux предполагает, что вы используете ее с добрыми намерениями, Наилучший способ дискредитировать сообщество разра ботчиков открытого программного обеспечения— злоупотребить доверием и властью, которые из самых лучших побуждений были предоставлены вам хорошими людьми.
Обычно сетевой адаптер принимает только те сообщения, которые несут в се бе его Ethernet адрес. Вспомните главу 2, "Основы TCP/IP", в которой говори лось о том, что каждый адаптер Ethernet имеет уникальный 6 байтовый иденти фикатор. Этот идентификатор служит критерием фильтрации сообщений.
Программируемые идентификаторы Ethernet
Некоторые OEM производители (Original Equipment Manufacturer — изготовитель комплектного обо рудования) предлагают сетевые платы (с интерфейсом PCI или PCMCIA), поддерживающие про граммируемые МАС адреса (или идентификаторы Ethernet). Это позволяет нескольким производи телям осуществлять массовый выпуск плат, продаваемых сотнями фирм. К сожалению, существует риск получить плату с фиктивным идентификатором, поскольку фирма продавец не смогла пра вильно его запрограммировать. При этом идентификатор может оказаться неуникальным в сети.
76 |
Часть I. Создание сетевых клиентских приложений |
www.books-shop.com
Беспорядочный режим работы утилиты разрешается отключать. Утилита tcpdump располагает множеством опций, с помощью которых можно фильтровать нежелательные сообщения, выполнять переадресацию и многое другое. Перечис лим наиболее интересные опции.
Опция |
Директива |
а |
Пытаться связывать имена с сетевыми и широковещательными адресами (требуется |
|
доступ к серверу имен) |
с <счетчик> |
Остановиться после получения заданного числа сообщений |
п |
Не преобразовывать адреса узлов в символические адреса (полезна, когда нет дос |
|
тупа к серверу имен) |
р |
Не переводить плату в беспорядочный режим; при работе в небольшой сети про |
|
смотр всех пакетов может показаться интересным, но в крупной сети компьютер |
|
быстро "захлебнется" потоком сообщений |
v |
Выводить более детальный отчет (отображается значение поля TTL пакета) |
vv |
Выводить исчерпывающий отчет |
w <файл> |
Записывать пакеты в файл |
Утилиту tcpdump можно запустить на выполнение безо всяких опций и полу чить почти всю необходимую информацию. Можно также наблюдать интересные процессы, например, как протокол ARP запрашивает идентификатор Ethernet по заданному IP адресу. Вот пример перехвата 100 сообщений с выводом детального отчета без указания метки времени:
tcpdump v t с 100
Опция t подавляет вывод метки времени. Поскольку сообщения быстро прокру чиваются на экране, удобнее направлять результаты работы утилиты в файл.
В работе утилиты tcpdump есть несколько "странностей". Например, она не пе рехватывает сообщения, адресованные ей самой. Она не видит пакеты, посылае мые командой ping 127.0.0.1, так как сетевая подсистема не передает эти сооб щения протоколам нижних уровней.
Создание сетевого анализатора
Чтобы написать свой собственный анализатор сети (который работает подобно утилите tcpdump, но не поддерживает беспорядочный режим), достаточно узнать, как перехватывать сообщения, направляемые компьютеру. В первую очередь не обходимо получить привилегии пользователя root. Затем следует вызвать такие функции:
sd = socket(PF_INET, SOCK_PACKET, фильтр)!,
bytes_read = recvfrom(sd, buffer, sizeof(buffer), 0, 0, 0);
Обратите внимание на новый тип сокета: SOCK_PACKET. Эта константа задает сокет аппаратного уровня, доступный только для чтения. К данному сокету можно
Глава 3. Различные типы Internet пакетов |
11 |
www.books-shop.com
применять несколько фильтров. Фильтр сообщает IP подсистеме о том, какого рода пакеты следует перехватывать. Перечислим некоторые из фильтров:
ЕТН_Р_802_3 |
Кадры стандарта 802.3 |
ЕТН_Р_АХ25 |
Кадры стандарта АХ.25 |
ETH_P_ALL |
Все кадры (будьте осторожны!) |
ЕТН_Р_802_2 |
Кадры стандарта 802.2 |
Нужный нам фильтр задается константой ETH_P_ALL. Вызов функции socket() будет выглядеть следующим образом:
sd = socket(PF_INET, SOCK_PACKET, ETH_P_ALL);
Теперь при каждом вызове функции recvfrom() будет возвращаться сетевой кадр (сообщение физического уровня). В него входят аппаратный адрес (например, идентификатор Ethernet) и заголовок.
Сокет типа SOCK_PACKET позволяет получить доступ к физическим кадрам, гене рируемым в процессе передачи сообщений. С помощью этого сокета можно уз нать, как в сети создаются кадры. При анализе кадров необходимо помнить, что порядок следования битов может быть разным и зависит от аппаратуры. В струк туре IP адреса предполагается, что бит со смещением нуль является первым би том потока данных.
Имеющаяся на Web узле программа snooper.с переупорядочивает поля заго ловка таким образом, чтобы он соответствовал физическому кадру для процессо ра с прямым порядком следования байтов (Intel совместимый) и GNU компилятора.
Резюме: выбор правильного пакета
С помощью утилиты tcpdump можно узнать структуру пакетов различных ти пов. В случае протокола IP пакеты бывают неструктурированными, служебными (ICMP), дейтаграммными (UDP) и потоковыми (TCP). Все они играют свою роль
всети.
Укаждого пакета есть заголовок. Поскольку пакеты ICMP, UDP и TCP вклю чаются в IP пакет, общий размер заголовка может составлять от 20 до 120 байтов.
Соотношение между размером заголовка и объемом передаваемых данных опре деляет пропускную способность сети.
У протокола TCP наименьшая пропускная способность, так как у него самый большой размер заголовка. Этот протокол чаше всего применяется в Internet, по тому что он обеспечивает надежное соединение между компьютерами. В TCP можно работать с высокоуровневыми функциями ввода вывода, такими как fprintf() и fgets().
С помощью протокола UDP можно передавать одиночные сообщения между компьютерами, не устанавливая повторное соединение. В нем вводится понятие виртуального порта, посредством которого приложение имеет как бы монополь ный доступ к сети. Протокол UDP обеспечивает хорошую пропускную способ ность, но невысокую надежность передачи данных.
78 Часть I. Создание сетевых клиентских приложений
www.books-shop.com
Передача сообщений |
Глава |
между одноранговыми |
4 |
компьютерами |
В этой главе... |
|
Сокеты, требующие установления соединения |
82 |
Пример: подключение к демону HTTP |
86 |
Сокеты, не требующие установления соединения |
87 |
Прямая доставка сообщений |
92 |
Подтверждение доставки UDP сообщения |
97 |
Переключение задач: введение в многозадачность |
100 |
Резюме: модели взаимодействия с установлением и |
|
без установления соединения |
101 |
www.books-shop.com
Сообщения могут передаваться двумя различными способами: непрерывным потоком (TCP) или в виде дискретных пакетов (UDP). Первый способ напомина ет телефонное соединение, а второй — отправку письма в конверте.
ВTCP необходимо, чтобы с адресатом было установлено соединение. Это по зволяет гарантировать отсутствие потерь данных и доставку пакетов в нужном порядке. В UDP соединение можно не устанавливать. В этом случае программа должна помещать в каждое сообщение адрес получателя.
Внастоящей главе рассматриваются оба интерфейса передачи сообщений.
Сокеты, требующие установления
соединения
В Linux (и во всех других операционных системах семейства UNIX) програм мы могут взаимодействовать на трех различных уровнях, каждый из которых ос нован на системном вызове socket(). Три базовых протокола (неструктурирован ный IP, UDP и TCP, о которых рассказывалось в главе 3, "Различные типы Internet пакетов") позволяют абстрагироваться от низкоуровневых сетевых про цессов и повысить надежность соединения, хотя и ценой разумного снижения производительности. Протокол самого верхнего уровня, TCP, обеспечивает наи высшую надежность. Он гарантирует, что данные будут доставлены без потерь и в нужной последовательности. TCP соединение можно рассматривать как файл или системный канал между процессами. ТСР сокеты ориентированы на установле ние соединения.
Открытые каналы между программами
ТСР сокет образует открытый двунаправленный канал между двумя програм мами/Подобно комплекту с наушниками и микрофоном, канал позволяет пере давать и принимать данные синхронно. Программы могут посылать друг другу данные одновременно, не занимаясь расшифровкой диалога из отдельных сооб щений.
TCP подсистема запоминает, с кем общается программа. Каждое сообщение на более низком уровне (уровне протокола IP) несет в себе адрес получателя. Это подобно набору номера всякий раз, когда вы хотите поговорить по телефону со своим другом.
При подключении к другой программе (с помощью системного вызова connect()) сокет запоминает адрес получателя сообщений и его порт. В процессе дальнейшего обмена данными можно использовать высокоуровневые функции библиотеки потокового ввода вывода, такие как fprintf() и fgets(). Это сущест венно упрощает программирование.
Протокол TCP позволяет избежать проблемы потери данных, существующей в других протоколах, и сконцентрироваться на решении поставленной задачи.
Надежные соединения
В TCP предполагается, что путь, по которому передаются данные, чист и сво боден от каких либо помех. Протокол гарантирует надежность соединения: або
80 |
Часть I. Создание сетевых клиентских приложений |
www.books-shop.com