Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
чтиво_ч1.doc
Скачиваний:
9
Добавлен:
15.11.2019
Размер:
384 Кб
Скачать

Интернет соединения

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

Рисунок 2. Соединение

Клиент – это «сторона» соединения, которая запрашивает определенные данные, а сервер отвечает в соответствии с этими запросами. Например, когда открывается сайт, интернет-обозреватель выступает в роли клиента, а сервер, на котором расположен сайт, - в роли сервера. Обозреватель устанавливает соединение с сервером и запрашивает определенные данные. В ответ на это сервер посылает обратно запрос и запрашиваемую информацию.

Сервер непрерывно ждет поступающие соединения. Это называется прослушиванием (listening), которое всегда происходит по определенному IP адресу и порту. Клиент всего лишь подключается, когда необходимо, т.к. клиент всегда инициатор соединения и отправитель запросов. Чтобы создать соединение, клиент должен знать IP адрес и номер порта, по которым сервер производит прослушивание.

И клиент, и сервер используют определенные IP адрес и номер порта, но обычно у сервера порт фиксированный. Стандартный порт для сайтов – 80. Например, на момент написания статьи, у сайта www.google.ru был IP адрес 74.125.79.147 и порт 80. Каждый подключившийся к сайту клиент устанавливал соединение с этим IP адресом по 80-му порту. Таким образом, сервер может принимать множество клиентов по одному порту. На клиентской «стороне» соединения порт неважен, т.е. может быть использован любой порт. Некоторые думают, что номер порта с обеих «сторон» соединения должен быть одинаков. Это не так. Введи в командной строке «netstat –an» после того как зайдешь на сайт. Ты увидишь примерно следующее: TCP xxx.xxx.xxx.xxx:2672 74.125.79.147:80 ESTABLISHED. xxx.xxx.xxx.xxx - это мой IP адрес, 74.125.79.147 – адрес google, значение после двоеточия – номер порта. Как ты можешь заметить, сервер использует порт 80, в то время как клиент использует случайный номер порта. Каждый подключенный клиент должен иметь разный номер порта, т.к. каждое соединение связано с разными клиентами.

Как итог этого раздела, выделим два определения: Клиент – программа, устанавливающая соединение и отправляющая запрос. Сервер – программа, ожидающая входящие соединения, принимающая их и отвечающая в соответствии с запросами клиента. IP адрес и номер порта сервера должны быть известны клиенту, перед тем как тот (клиент) установит соединение с сервером.

Снова протоколы

Ранее я затронул несколько протоколов на разных уровнях сетевого интерфейса. Теперь осталось обсудить протоколы, работающие на программном уровне, например HTTP, FTP, POP3, SMTP. Большинство этих протоколов работают по типу клиент-сервер. Это значит, что клиент отправляет запрос, а сервер на него отвечает. Точный формат запроса и ответа на него описан в этих протоколах. Я не буду сейчас обсуждать эти протоколы, но позже, когда ты будешь знать основы WinSock, мы к ним вернемся.

Сокеты

WinSock (Windows Socket) – это Windows API, который взаимодействует с сетью. Примечание: Socket переводится с английского языка как «гнездо». Но поскольку употребление русского варианта этого слова не совсем вписывается в тему этого материала, то я буду использовать английское значение этого слова.

Как говорилось ранее, тебе придется работать с соединением клиент-сервер. Конечными точками этого соединения являются socket’ы. И у клиента, и у сервера есть socket. Socket связан с определенным IP адресом и номером порта. Почти все WinSock функции оперируют socket’ами. С помощью socket’а ты будешь управлять соединением. Обе «стороны» соединения используют socket’ы, и они (socket’ы) платформенно- независимы. Это значит, что машина с Windows может «общаться» по сети с Unix машиной, используя сокеты. По socket’ам данные могут передаваться и приниматься.

Выделяют два типа socket’ов: потоковый socket (SOCK_STREAM) и, так называемый, дейтаграммный socket (datagram socket, SOCK_DGRAM). Потоковый вариант разработан для приложений, нуждающихся в надежном соединении и часто использующем продолжительные потоки данных. Протокол, использующийся для данного типа socket’ов – TCP. В этом материале будет использоваться только потоковый тип socket’ов, т.к. он чаще всего используется в хорошо известных протоколах, таких как SMTP, POP3, HTTP, TCP.

Дейтаграммные socket’ы используют UDP протокол и имеют низкий сигнал соединения и большой размер буфера данных. Они применяются в приложениях, которые отправляют данные малых размеров и не нуждаются в идеальной надежности. В отличии от потоковых socket’ов, дейтаграммные socket’ы не гарантируют стопроцентной передачи данных получателю, как и не гарантируют передачи данных в нужном порядке. Данный тип socket’ов полезнее для приложений, где надежность не является высоким приоритетом, таким как скорость (например аудио или видео трансляция). В приложениях, которые нуждаются в надежности, целесообразней использовать потоковые сокеты.

Связывание (binding) socket’ов

Связать socket значит «прикрепить» определенный адрес (IP адрес и номер порта) к данному socket’у. Это можно сделать вручную, используя связывающую функцию, но в некоторых случаем WinSock сам автоматически свяжет socket. Более подробно об этом будет рассказано далее в этом разделе.

Соединение

Способ использования socket’ов зависит от того, где ты их используешь: на клиентской или серверной части. Клиентская часть создает соединение путем создания socket’а и вызовом соединяющей функции с определенной адресной информацией. До того как socket не соединится, он не будет связан с адресом. Это связано с тем, что клиент может использовать любой адрес (IP адрес и номер порта) для соединения с сервером.

Когда соединение вызвано, WinSock выберет IP адрес и номер порта для соединения и свяжет с ними socket до того, как клиент фактически соединится с сервером. Номером порта может быть любой номер, который свободен в момент соединения, с выбором IP адреса надо быть аккуратнее. Компьютеры могут иметь более одного IP адреса. Например, компьютер, подключенный к локальной сети и к интернету, имеет три IP адреса: внешний для использования интернета; адрес в локальной сети (192.168.x.x или 10.0.x.x и т.д.); адрес, так называемой «внутренней петли»(loopback), для обозначения «локального хоста» в сети из одного компьютера (127.0.0.1). Здесь выбор IP адреса, с которым связан socket, имеет значение, т.к. также определяет сеть, которую ты используешь для соединения. Если ты хочешь подключиться к локальному компьютеру 192.168.0.4, ты не сможешь сделать это через сеть интернет провайдера. Тебе потребуется связать socket с Вашим IP адресом в такой же сети (192.168.0.1, например).

К счастью, WinSock сам выберет IP адрес на твоем компьютере, который может использоваться для соединения с нужным адресом. Ничего не мешает тебе связать socket самостоятельно, но помнишь, что ты должен взять ситуацию, описанную выше, во внимание. Так же связывающая функция дает пользователю возможность установить IP адрес или номер порта в нулевое значение. В этом случаем нулевое значение значит «пускай WinSock выберет что-нибудь для меня». Это полезно, когда ты хочешь подключиться, используя определенный IP адрес, но, не указывая значение порта.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]