Установка соединения в TCP («Трехкратное рукопожатие»)
Серверпринимает запрос на установку соединения (пассивная сторона).
Клиент посылает запрос (активная сторона).
1) Когда выполняется установка соединения, клиент посылает на заданный порт пакет с флагом установки соединения (SYN). При этом, когда посылается пакет SYN, порядковый номер (SN) клиентом выбирается случайным образом и вписывается в пакет;
2) Сервер, получив запрос, отправляет на него ответ. В этом ответе устанавливаются флаги SYN, ACK. Тот IP адрес и порт, которые будут использоваться клиентом, берутся из ответного пакета, а для того чтобы сопоставить первый пакет и ответный пакет и нужен RandomSN. Диапазон SN - Int32.
3) Получив пакет, клиент отправляет пакет с флагом ACK, после чего сервер переходит в состояние ESTABLISHED.
Уязвимость TCP: если какой-либо узел в глобальной сети начнет посылать подтверждения клиентам, указывая свои значения IP-адреса и порта, то это подтверждение клиент может получить раньше подтверждения, отправленного сервером, следовательно, клиент будет считать, что необходимо взаимодействовать с сервером, использую IP-адрес и порт злоумышленника.
Гнезда (Socket)
Общие сведения
Для работы с протоколами стека протоколов TCP/IP предоставляется специальный интерфейс прикладного программирования – SocketAPI.
Говорят, что ниже транспортного уровня (включая его) сообщения управляются сетью, потому что нет прикладного интерфейса программирования для работы непосредственно с сетевым уровнем, пакетами Ethernet; есть драйверы с их функциональностью, но уровню программ возможности управления не предоставлено. Так происходит потому, что на уровне IP, Ethernet-пакетов программы не имеют способа идентификации, а также отсутствуют гарантии безопасности.
|
|
Принцип организации
Введено специальное понятие – гнездо, или сокет.
Гнёзда являются интерфейсом для стека протоколов TCP/IP, предоставляют возможность работы по протоколу TCP, UDP, с использованием «сырых» дейтаграмм IP.
Сокет (гнездо) – это точка подключения программы к сетевому интерфейсу.
– у каждой программы, которая хочет использовать интерфейс, должно быть гнездо;
– гнезд может быть много, т.к. они идентифицируют канал связи для программы;
– гнездо имеет идентификатор – целочисленный номер, который по смыслу идентичен дескриптору файла в файловой системе.
Программный интерфейс SocketAPIподдерживается всеми ОС.
Сценарии использования
Использование протокола UDP
Схема работы с функциями по протоколу UDPдля сервера и клиента одинаковая:
Функция | Описание |
Socket | Создание гнезда. |
Bind | Позволяет назначить IP-адрес и порт гнезду. |
Sendto | Послать кому-то. |
Recvfrom (“Receive”) | Получить от кого-то. |
Close | Завершение взаимодействия. Уничтожает само гнездо, освобождая ресурсы драйвера для повторного использования. |
|
|
Использование протокола TCP
Сервер
Функция | Описание |
Socket | Создание гнезда. |
Bind | Привязка к гнезду IP-адреса и номера порта. |
Listen | Начинает прослушивание сокета на предмет входящих запросов на установку соединения. |
Accept | Принимает входящий запрос на установку соединения, отправляя подтверждение и обеспечивая механизм «трехкратного рукопожатия». Результат функции Accept – создание нового сокета с установкой соединения, в рамках которого можно вызывать функции Sendи Recv. |
Send | Посылка данных. |
Recv(“Receive”) | Принятие данных. |
Shutdown | Упорядоченное закрытие дуплексного канала связи в одном, втором или обоих направлениях. Гарантирует, что данные будут полностью получены. |
Close | Закрывает гнездо, освобождая ресурсы. |
Клиент
Функция | Описание |
Socket | Создание гнезда. |
Bind | Привязка к гнезду IP-адреса и номера порта. |
Connect | Обеспечивает подключение клиента к серверу, инициирует установку соединения. |
Send | Посылка данных по установленному дуплексному каналу связи. |
Recv(“Receive”) | Принятие данных по установленному дуплексному каналу связи. |
Shutdown | Упорядоченное закрытие дуплексного канала связи в одном, втором или обоих направлениях. Гарантирует, что данные получены полностью. |
Close | Закрывает гнездо, освобождая ресурсы. |
|
|
Функции работы с сокетами
Функция, structure | Описание |
int socket (int af, int type, int protocol) af: AF_UNIX AF_INET type: sock_stream sock_dram protocol: PROTO_TCP PROTO_UDP PROTO_XXX | 1. Функция socket создает гнездо и возвращает номер гнезда в качестве результата. Этот идентификатор служит идентификатором логической связи между компьютерами; 2. af (addressfamily)– целочисленный идентификатор семейства адресов (вид адресации, которая будет использоваться сокетом). o AF_UNIX – используется идентификация компьютера с помощью символьного имени; o AF_INET – используется система адресов Internet; 3. type – целочисленный идентификатор типа. · sock_stream – потоковый сокет, используются средств для передачи с подверждением потока данных; · sock_dram – сокет с передачей дейтаграмм; ОбычнодляTCPиспользуется тип sock_stream, для UPD – sock_dram. 4. Protocol – протокол.Константы помечают не только TCP и UDP, но и WinSocket (используется префикс WSA). Стандартныекомбинации: AF_INET + sock_stream + PROTO_TCP AF_INET + sock_dram + PROTO_UDP |
unionsockaddr { sockaddr_insin; // дляInternet sockaddr_usu; // дляUnix }; | Важно:объединение (union) в программировании — это структура данных, члены которой расположены по одному и тому же адресу. Поэтому размер объединения равен размеру его наибольшего члена. В любой момент времени объединение хранит значение только одного из членов. |
struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; charsin_zero [8]; } | 1. sin_family – семейство адресов. Позволяет определить тип адресации и понять, как дальше интерпретировать данные; 2. sin_port – номер порта; 3. sin_addr – структура, в которой закодирован IP-адрес; 4. sin_zero[8] – дополнение нулями до общего размера, т.к. в Unix имя занимает 13 символов. |
struct sockaddr_4 { shortsu_family; char su_name [13];// имя host’а UNIX’а } | 1. su_family – семейство адресов. Позволяет определить тип адресации и понять как дальше интерпретировать данные. |
int bind (int socket, const struct sockaddr* name, int namelen) | Используется, чтобы назначить гнезду «номер». Связывает с гнездом IP-адрес и порт, указанные в параметре name.В параметре namelen – длина структуры sockaddr (фактически, sizeof()структуры).По размеру можно проверить, корректно ли передана структура (той ли версии). Функция bindвозвращает 0 иликодошибки. |
int listen (int socket, int backlog) | Backlog определяет размер очереди входящих запросов на установку соединения. Физически драйвер ограничивает данное значение. Функция listenиспользуется сервером: она переводит гнездо в режим прослушивания и организует входную очередь для приема запроса на установку соединения. Эта функция просто включает прослушивание и завершается. Это не значит, что, когда сервер вызвал функцию listen, она не завершается, пока не придет запрос на установку соединения (т.е. функцияне является блокирующей). Входная очередь запросов – это количество запросов с флагом SYN, которые одновременно могут прийти и ожидать подтверждения установки соединения (функции accept). Важно:Backlog–это внутренняя очередь на установку соединений, а не количество установленных одновременно соединений(их может быть сколько угодно).Когда приходит запрос с флагом SYN, он попадает в эту очередь(для того, чтобы быстро приходящие запросы не пропадали). Сервер предусматривает периодическую выдачу запросам команды accept, то есть в этой очереди запросы не остаются надолго. Если сервер выполняет команду acceptв течение длительного времени, то на все запросы в очереди отправляется подтверждение с флагом ACK, но без признака установки соединения(SYN), что позволяет клиенту дождаться, пока сервер завершит командуaccept. Если одновременно пришло больше запросов, чем может вместить очередь, то некоторые запросы просто пропадут, и клиент не сможет соединиться из-за таймаута. Таким образом обеспечивается некоторая защита от DDOS-атак (Distributed Denial of Service), которая возникает в случае «бомбардирования» сервера запросами на установку соединения. |
intconnect (intsocket, conststructsockaddr*name, int namelen) | Используется клиентом. В нее передается номер сокета, структура адреса. Для структуры используется слово name, т.к. в UNIXэто были имена и изредка IP-адреса, а сейчас это прежде всего IP-адреса и очень редко имена. namelen – размер структуры name, который используется только для контроля. В структуре передается IP-адрес и порт, на который устанавливается соединение. Возвращает 0 в случае успеха и код ошибки в случае ошибки. |
int accept (int socket, struct sockaddr* addr, int addrlen); | socket – номер сокета; sockaddr – указатель на IP-адрес и порт ( те IP-адрес и порт, которые соответствуют клиенту). Если соединения нет, то функция ждет. Если запрос был поставлен в очередь, то он изымается из очереди запросов и обрабатывается: создается новое гнездо и в структуре sockaddr возвращается его номер, IP-адрес и порт гнезда. |
int shutdown (int socket, int how) How: SD_SEND SD_RECEIVE SD_BOTH | Выполняет закрытие входного и/или выходного канала связи (задается полем how). При закрытии канала все отправленные данные проталкиваются дальше. Если мы работаем с потоком данных, то вызов этой функции на отправку фактически означает получение клиентом признака конца файла при чтении. |
int send (int socket, const char* buf, int len, int flags) int resv (int socket, char* buf, int len, int flags) int sendto (int socket, const char* buf, int len, int flags, const struct sockaddr* to, int tolen) int resvfrom (int socket, char* buf, int len, int flags, const struct sockaddr* from , int fromlen) | При взаимодействии сервера с клиентом устанавливается дуплексная связь. send, resv используются в протоколах TCP и UDP. sendto и resvfrom – только в UDP. socket – номер сокета buf - указатель на буфер данных, из которого или в который пишутся данные len – длина буфера flags – флаги: MSG_OOB - out of band – срочныеданные MSG_XXX sockaddr – непосредственно указываются IP-адрес и порт куда (to)/откуда (from) отправляются данные recv, recvfrom возвращают реальное количество байт. Когда вызывается функция recv, а канал данных уже закрыт, функция возвращает 0. В случае ошибки возвращает отрицательное значение. Таким образом, отсутствует понятие EndOfFile, т.е. нельзя проверить соединение на то, что данные получены. Единственный способ узнать о конце данных - это принять их. В функции recv совмещены две функции: прием данных и проверка на конец. |
int closesocket(int socket) | Закрывает гнездо, его дескриптор освобождается для повторного использования. Закрыть сокет можно и без функции shutdown, если вам не важно, дошли ли последние данные. Система выжидает некоторое время перед повторным использованием. Это связано с особенностью работы TCP. |
|
|
Система доменных имен (DNS)
Общие сведения
IP-адрес трудно запоминать (ассоциация – телефонный номер, который пытаются выбрать с «красивыми» цифрами, чтобы было проще запоминать), им неудобно пользоваться, поэтому была придумана система доменных имен (DNS). Она решала проблему отображения семьи выдачи.
DNS (Domainnamesystem) – система управления некоторыми именами; иерархическая распределенная база данных, которая хранит отображение имени в IP-адрес. Система была сразу рассчитана на глобальные сети.
В глобальных сетях отсутствует понятие "главного (управляющего) узла", что отличает их от локальных сетей (в локальных сетяхсуществует понятие сервера и клиента; сервер – это особый выделенный узел, который занимается предоставлением какого-либо ресурса (жесткий диск, печать, вычислительные ресурсы, оперативное хранилище, база данных), а клиент - потребитель ресурса). Исходя из этого, и создавалась система доменных имен.
Дата добавления: 2018-08-06; просмотров: 507; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!