Установка соединения в 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!