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

С++. Сетевое программирование. Часть 1

Сетевое программирование... Я думаю, что актуальность этой темы не стоит объяснять, и так понятно, что сегодня сетевые технологии находятся на достаточно высоком уровне развития. А это значит, что программисты в этой области нужны не менее чем в других областях. Вообще, сетевое программирование кажется легче, чем оно есть на самом деле. WinSock функции, которые ты будешь использовать для коммуникации через сеть, довольно просты в использовании, но многие забывают, что просто вызов функции не сделает всю работу. Первые попытки программирования с использованием WinSock часто заканчиваются программами, которые "иногда" не работают или завершаются необъяснимыми ошибками.

Сетевое программирование - это больше чем просто получение или отправление данных. Например, тебе придется столкнуться с синхронизацией: все ли данные отправлены (или получены)? Готова ли программа принять следующую "порцию" данных? Другая проблема - сверка полученных данных, разбор этих данных, предотвращение угроз безопасности и многое другое. Поэтому ты заметишь, что первые главы не содержат много кода. Я решил начать с основ сетей и принципов работы сетевого программирования. Не пропускай этот материал, очень важно прочесть его прежде, чем начнешь писать программы. Весь материал сфокусирован на аспектах сетевого программирования. Я предполагаю, что ты достаточно хорошо владеешь языком программирования (С++), что бы успешно продвигаться по материалу. Что ж...приступим.

Сети и протоколы

Любой из вас уже знает что-нибудь про сети, серверы, клиенты и т.д. Но все же я решил начать с введения в организацию и принцип работы компьютерных сетей, чтобы быть уверенным, что ты знаешь достаточно для сетевого программирования. Для сетевого программирования тебе не понадобятся все детали, упомянутые ниже в этом разделе, но лишними эти знания точно не будут.

Ты, наверное, знаешь, что такое «сеть». Это - несколько компьютеров, соединенных между собой таким образом, что они могут обмениваться данными. Существует несколько типов сетей, такие как LAN (Local Area Network), WAN (Wide Area Network) и, конечно же, Internet. Что бы удостоверится, что весь трафик проходит без искажений, сети полагаются на протоколы. Протокол – это набор правил, согласно которым данные передаются по сети. Из определения понятно, что протокол описывает, как «общаться» через сеть. Протокол подобен человеческому языку: почти каждый человек с рождения может издавать и слышать какие-то звуки (электронные сигналы), но люди не будут понимать друг друга, если они не общаются в соответствии с определенным языком, который понятен им обоим (протокол).

Ethernet

Ethernet — это протокол канального уровня, используемый подавляющим большинством современных локальных сетей. Сеть использует несколько слоев протокола, каждый из которых выполняет свою задачу в коммуникационном процессе. Наиболее используемая конфигурация таких протоколов - ethernet LAN с TCP/IP. MAC

Низший слой Ethernet интерфейса. Это - аппаратный уровень, называемый уровнем медиа доступа (Media Access Layer, сокращенно MAC). Этим слоем чаще всего является сетевая карта, которая заботится о конвертации данных в электронные сигналы и передаче их в нужное место. Естественно, что пакеты, отправленные по сети, должны преодолеть определенное расстояние до нужного адресата. Разные слои протокола Ethernet имеют разные методы адресации. На нижнем, MAC уровне, адресация осуществляется с помощью MAC-адресов. MAC-адрес – это 48-битовый идентификатор, «вшитый» в каждую сетевую карту. Проще говоря, MAC-адрес – это физический адрес сетевой карты. Обычно MAC-адреса записываются в виде разделенных шестнадцатеричных чисел: 14:74:A0:17:95:D7.

Чтобы отправить данные на другую сетевую карту, данные должны включать в себя MAC-адрес получателя. В локальных сетях (LANs) используется простой метод отправки данных нужному адресату: широковещание (broadcasting). Это значит, что твоя сетевая карта посылает пакет всем другим сетевым адаптерам, которые могут его принять. Каждый принявший адаптер «смотрит» на MAC-адрес конечного адресата и только в случае совпадения этого MAC-адреса со своим собственным сохраняет данные в буфер. По очевидным причинам за пределами LAN (WAN и Internet) этот метод не используется.

IP

Сразу над аппаратным уровнем расположен IP уровень. Так же как и MAC уровень, IP тоже имеет свой способ адресации. Для опознания компьютеров на этом слое используются IP адреса. IP адрес состоит из 4-х чисел от 0 до 225, разделенных точками. В отличии от MAC адресов IP адреса устанавливаются на программном, а не аппаратном, уровне. Подобно предшествующему уровню (забегая вперед, скажу, что и последующим тоже) на IP уровне к отправляемым данным прикрепляется IP адрес получателя (и отправителя).

TCP

Следующий слой – TCP слой (или, в качестве альтернативы, UDP). В дополнении к адресу, TCP добавляет порт, по которому должна быть передана информация. Если IP-адреса используются для определения компьютера, которому надо передать данные, то порт определяет, какой запущенный процесс должен принять эти данные. Номер порта 16 битовый, поэтому ограничен 65536 значениями.

Множество портов связаны с определенными службами. Например, www использует 80 порт, FTP – 21, e-mail использует 25 (SMTP) и 101 (POP). Но ничего не мешает выбрать тебе любой другой порт. Хорошим стилем считается использование в своем приложении портов, начиная от 1024. В отличии от IP уровня, который не заботится об успешной передаче, TCP уровень делает именно это. TCP слой обеспечивает не только прибытие данных по назначению, но и сохранность этих данных в ходе передачи. Также этот слой позволяет получателю контролировать поток данных, т.е. получатель может решить, когда получать данные. Если данные «потерялись» во время передачи, TCP отправляет эти данные заново. Еще одной особенностью TCP является возможность упорядочивать пакеты, в случае если они пришли не в том порядке, в котором были отправлены. Это делает нашу жизнь легче, т.к. мы уверены, что данные не только придут, но и придут в нужном порядке. UDP, как альтернатива TCP, не обладает такими свойствами и не может гарантировать полную передачу данных. Н UDP обладает рядом других полезных свойств, которых лишен TCP. Поэтому этот протокол тоже имеет право на жизнь. Я не буду писать про UDP в этом разделе, т.к. это не входит в ряд необходимой, для понимания этого материла, информации.

Программное обеспечение

Последний уровень - это сетевое ПО. В Windows твое приложении взаимодействует с TCP не напрямую, а с помощью WinSock API. Программный уровень обеспечивает очень простой и удобный способ взаимодействия с сетью. Благодаря всем нижележащим слоям, тебе не надо волноваться о пакетах, размерах пакетов, повреждении или потере данных и т.д. За тебя все сделает ОС.

Стек интерфейса Ethernet

Рисунок 1. Процесс передачи данных по сети

На рисунке 1 показана инкапсуляция каждого слоя в протоколе Ethernet. Все начинается с программного уровня, в котором содержатся данные для передачи по сети. Сначала эти данные достигают TCP уровня, на котором к ним (данным) добавляется начальный и конечный номер порта. Потом IP слой добавляет начальный и конечный адреса. В конце концов, данные подключают к себе MAC адреса отправителя и получателя. Т.е. на картинке показан процесс передачи данных по проводам. Как ты мог заметить, этот процесс переполняет передаваемые данные (на входе у нас один «прямоугольник», а на выходе четыре). Это переполнение может быть минимизировано с помощью выделения достаточно большого объема памяти для этих данных. К счастью WinSock сделает это за нас.

Теперь, когда ты знаешь основные уровни сетевого интерфейса, я расскажу про базовые принципы, касающиеся соединений, протоколов программного уровня и имен серверов.

DNS

Аббревиатура DNS расшифровывается как Domain Name System (система доменных имен). Эта система применяется для преобразования имени сервера в его IP адрес. Поскольку не всем и не всегда легко запомнить IP адрес, была создана другая система наименований. Теперь вместо IP адреса определенного компьютера в сети можно использовать его имя (аналогичная ситуация с сайтами в интернете). Когда ты подключаешься к какому-нибудь сайту, тебе требуется его IP адрес. То есть, если в строку браузера ты ввел имя сервера, как например www.google.com, то сначала будет произведен поиск IP адреса, соответствующего имени google. Это как раз тот момент, когда в дело вступает DNS. Твой компьютер отправляет поисковой запрос с именем сервера в DNS твоего провайдера. Если DNS может обнаружить имя сервера, то тебе отправляется соответствующий IP адрес.

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