Step 4 (S-44746)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14823/step/4

Step 4 (S-44746) 1.png

[00:00 - 00:16] итак браузеров получил ip адреса системы нас он знает ip адрес сервера теперь необходимо установить tcp соединения а зачем нужен протокол и почему не передавать данные просто через ip


[00:16 - 00:33] а дело в том что протокол ip не реализуют надежно доставку и а он позволяет передавать данные между 2 машинами между 2 программами


[00:33 - 00:49] есть небольшая разница а уж на веб сервере может быть запущена большое количество разных программ когда мы передаем какие то данные необходимо указать какой именно программы мы эти данные и передаем собственно говоря для решения этих 2 задач и


[00:49 - 01:07] составить протокол tcp ip обеспечивает следующие функции во 1 это надежная доставка да что значит надежно а надежно означает что после того как вы получили ответ в том что данные переданы


Step 4 (S-44746) 2.png

[01:07 - 01:22] они будут доставлены в том виде в котором вы их передали а если данные а тем или иным образом потерялись


[01:22 - 01:37] они будут доставляться до тех пор пока не не буду достало если же а протокол понимает что никак дальше продолжать нельзя то он вернет вам ошибку и вы узнаете о том что а передача действительно не удалась


[01:37 - 01:54] а в том случае с продаж удается корректно корректность а правильность данных гарантируется протоколом tcp с помощью проверочных суках су во 2 протокол и обеспечивает двустороннее передачу да


[01:54 - 02:09] очистить и соединения можно как передавать данные от клиента к серверу так и от сервера к клиенту и в 3 протокол tcp обеспечивают а защиту управление буфер


[02:09 - 02:24] то есть а при передаче данных важно синхронизоваться клиент и сервер на любой сервер клиент зависимости от того в какую сторону до передачи так чтобы передающая сторона данных


[02:24 - 02:39] передавала не больше чем получатель может потребить иначе будет происходить переполнение буфера да данные будут теряться либо отбрасывал а это функциональные особенности теперь поговорим про


Step 4 (S-44746) 3.png

[02:39 - 02:58] такую вещь как мы говорили а сейчас он скажет что нам нужно а передавать данные не просто меж 2 машинами а конкретной программе а в tcp вводится понятие поста номер порта номер порта это а адрес


[02:58 - 03:13] открытого соединения в пределах а в пределах 1 машины а таким образом у нас на 1 машине может быть открыто несколько портов и одновременно может существовать несколько сетевых соединений


[03:13 - 03:31] каждый порт связан с какой то конкретной программы и операционная система знаю такой программы не связан поэтому те данные которые передаются на этот порт они будут попадать в конкретную программу на данной машине


[03:31 - 03:46] адрес портала себя представляет просто целое число под него отводится 2 об этом в протоколе а теперь поэтому это число может быть больше 165000 с небольшим


[03:46 - 04:02] ты которая ниже чем то еще ты же 1024 а то есть с номером меньшим чем 1024 в системе а unix они считаются привилегированными портами и для того чтобы использовать данный порт а


[04:02 - 04:21] программе нужны привилегии супер пользователя то есть она должна быть запущена от имени администратора среди портов то есть адреса портов могут в принципе убираться произвольным образом а но исторически некоторые номера они закреплены за


[04:21 - 04:39] определенными приложениями правило чем меньше номер тем больше шанс что он будет закреплен за каким то приложением любой протокол например 20 21 это протоколов ти файл трансфер протокол


[04:39 - 04:55] 22 порт это протокола саш secure с удаленный доступ а компьютер компьютер в консоле компьютер 25 порт это протокол передачи почты


[04:55 - 05:15] сам то 80 и 443 это те партии которые нас интересуют аппараты отвечающая за передачи гипертекста теперь протокол работает по порту 86 p s по порту 443 а в принципе


[05:15 - 05:31] нет там ничего не чтобы использовать эти парты но для своих отдельных приложений свою пишется отдельно предложение кто работает по другому протоколу желательно выбирать более высокий порт итак


[05:31 - 05:50] давайте посмотрим что происходит при установлении соединения а при установлении соединения клиента сервер обмениваются 3 пакетами это так называемая тройное рукопожатие сначала клиент а в нашем случае браузер


[05:50 - 06:06] отправляет на сервер спи а сегмент со специальным флагом syn синхронизация а в этом пакете он управляется специальной а


[06:06 - 06:21] номер порядковый номер пакета с требует число начиная с которого а сегмент и сегменты будут нумероваться в потоке сервер отвечает клиенту


[06:21 - 06:37] возвращая а сегмент с флагами syn и а это 2 отдельных а ак означает о том что он принял от клиента пакет син и открывает обратную


[06:37 - 06:56] оба обратный обратный обратный сиденье устанавливается это тоже самое что эта овца полнодуплексный в соединениях он отправляет свой порядковый номер своего потока а на что клиент отвечает сегментам а


[06:56 - 07:11] пустота после тройного рукопожатия сервера и у клиента есть 2 числа это порядковые номера передача а и они могут поступать в передаче да


[07:11 - 07:28] спи на самом деле намного хитрее сложнее но у нас здесь интересует следующий момент а как мы видим что между началом когда клиент открывает соединение и моментом когда


[07:28 - 07:44] он может что то передавать происходит некоторое время проходит некоторое время установления соединения а примерно такой же время проходят на сервере а


[07:44 - 08:00] это время примерно равно round round trip time это время путешествия а данных от клиента к серверу обратно это время сильно зависит от того


[08:00 - 08:18] как э находится так близко сервер находится клиент если клиент и сервер находится в 1 датацентре время очень маленькая если они находятся на разных континентах здесь может быть 150 миллисекунд вполне свободно итак


[08:18 - 08:33] после того как произошло протокол степи в принципе готов передаче да но до этого должно пройти некоторое время этот факт мы запомним и посмотрим как он повлияет на работу протокола http


[08:33 - 08:51] рассмотрим теперь а каким образом можно работаю с протоколом tcp а при разработке программного обеспечения программный интерфейс а давайте посмотрим на подход это простейшее теперь клиент написанный на языке python


Step 4 (S-44746) 4.png

[08:51 - 09:08] по срокам разбирал что он делает итак 1 строка это import библиотеки soccer и просто библиотеке необходимо для того чтобы использовать функцию сипи далее м какое то сообщение просто строчка


[09:08 - 09:25] hello себе а начиная с 3 строки начинается самое самое интересно а создается новый объект соки а причем мы указываем 2 опции а ф и нет и


[09:25 - 09:40] сок зачем то нужно показывает что мы работаем а сетевыми сокетом дело в том что в юниксе есть 2 разновидности текстов сетевые для обмена


[09:40 - 09:57] данными по сети с помощью протокола tcp и локальной или передача а данных а внутри 1 unix машин опция сок stream указывает на то что мы будем использовать 2 софта для работы с протоколом tcp


[09:57 - 10:13] а после того как создал мы должны подключиться к удаленной машине для этого используется метод connect


[10:13 - 10:31] а методу коннект передаем имя хоста и порт машиной которая будет включать в данном случае мы а не меха сэнтай 5 используются 20 0 0 1


[10:31 - 10:49] на самом деле своей собственной машине а клиент и сервер запущен 1 машине но при этом используется тот же самый функционал а сетевых после того как тогда когда мы вызвали метод connect начинается паранойя


[10:49 - 11:07] рукопожатие а то есть вот в этом месяце вместе мы сделали вызов connect начинается тройное рукопожатие когда мы получили ответ от сервера метод connect возвращается то есть мы видим что метод connect может работать довольно длительное время


Step 4 (S-44746) 5.png

Step 4 (S-44746) 6.png

[11:07 - 11:24] может пройти время прежде чем он вернется а когда он отработал а если не произошло исключение это с никакой ошибки нас есть установленная сетевое соединение а мы можем отправлять данные


[11:24 - 11:40] то есть мы называем этот сад и отправляем строчку по протоколу tcp после чего мы вызываем метод для получения данных а мы передаем а размер буфера


[11:40 - 12:00] сколько данных мы хотим получить то есть не больше какого числа количество данных мы хотим получить данные получены соединение закрывается а вот общем то все то есть работа с открытым ртом сокетом она не сильно отличается от работы с 12


[12:00 - 12:19] также можно посылать данные также можно оттуда принимать данные а теперь давайте посмотрим как реализован сервер который работает с этим клиентом это эхо сервер то есть сервер который отвечает ровно теми же теми же данными которые вы прислали


[12:19 - 12:35] а начинается все примерно с того же самое мы импортируем библиотеку сокеты создаем новые сокеты так же указываем что это сокета работы сети протоколом


[12:35 - 12:52] теперь вместо вызова connect мы делаем 2 вызова или с вызов это говорит о том что данный soccer связывается с адресом а вызов listen говорит о том что


[12:52 - 13:11] необходимо начать принимать сетевые соединения на данном адресе таким образом а сотен с так называемым серверным сокетом то есть сокетом на котором а мы принимаем соединения далее


[13:11 - 13:25] сервер приходит бесконечный цикл а в начале этого цикла называется метод accept а метод accept возвращается тогда когда пришло новое


[13:25 - 13:41] а соединения от клиента причем не просто пришлось даже установлено то есть если мы посмотрим на вашу программу вот в этом месте где то а сервер делает вызов акцепт


Step 4 (S-44746) 7.png

[13:41 - 14:00] а возвращается вызов баксов только тогда когда рукопожатий закончен после того как вернулся на север может работать а с клиент возвращает 2 переменные


Step 4 (S-44746) 8.png

[14:00 - 14:15] собсно голосов для работы с клиентом в конкретном уже клиентов и а информацию о подключении адрес клиента с клиентом а сервер опять таки бесконечный цикл


[14:15 - 14:31] в котором он читает данные если данные не пришла выходит из этого цикла и а после чего он отправляет данные назад после этого соединения закрывается и сервер обслуживает следующего клиента


[14:31 - 14:49] теперь а для чего нужна эта цифра 10 эта цифра показывает длину очереди клиентов которые могут ожидать сервер а после того как сервер принял конкретного клиента сделал вызов акцепта умница время с ним работает


[14:49 - 15:07] а и в это время он не может вызвать другие сделать еще вызов accept и обрабатывать следующего клиента потом остальные клиенты которые пришли в это время они будут ожидать в очереди это очередь длиной 10 клиентов те кто пришел после


[15:07 - 15:22] после 10 клиента не получится соединения то есть протокол себе откажет соединения а таким образом выглядят простейшая серверов сетей


[15:22 - 15:38] однако в этих 2 снимках есть большое количество отговорки недоделок мы сейчас рассмотрим 1 из них связаны с тем как правильно читать и писать данные а


Step 4 (S-44746) 9.png

[15:38 - 15:57] дело в том что при чтении сокета никто не гарантирует нам что в нем окажется столько данных сколько да пусть мы хотим прочитать 1024 байта а 1 из за работы сети нам удалось пока доставят только 1 10 а


[15:57 - 16:14] оставшееся данные а допустим не получается доставить из за того что временно потеряла соединения то есть не соединения либо клиент например просто а


[16:14 - 16:31] работа под высокой нагрузкой и не успел пока отправить эти данные о таким образом когда мы вызываем функцию получения а мы не знаем сколько


[16:31 - 16:47] какой объем данных она нам дает нам можешь свернуть меньше чем нам нужны поэтому нам при чтении какого то а объемы данных и сети желательно знать сколько данных мы хотим получать


[16:47 - 17:02] и следить за тем сколько мы уже прочитали допустим мы знаем что мы хотим прочитать а скажем 1 1 килобайт это плохой пример а килобайт скорейшего продаются 1 куском скажем мы хотим прочитать 1 мегабайт


[17:02 - 17:19] а мы заводим специальный буфер месадж и в бесконечном цикле пока мы не прочитать достаточное количество то есть пока длина этого буфера меньше чем a 1 мегабайт мы


[17:19 - 17:37] читаем какой то кусочек из сокета то есть мы делаем а вызываем сокеты receive рекс и говорю что мы хотим прочитать а не больше чем нам осталось то есть 1 мегабайт - то что уже прочитали


[17:37 - 17:55] если ничего не пришло ошибка а иначе мы записываем данные а таким образом мы читаем в цикле небольшими кусочками до тех пор пока не прочитает тот объем который нам изначально необходим а если мы просто


[17:55 - 18:13] например сделаем вот такой вызов 1 гигабайт а это не даст желаемого результата


[18:13 - 18:30] вот этот вызов не означает что мы получим 1 гигабайт сразу мы хотим получить не больше 1 МБ но реально можем получить любой объем данных до 1 МБ поэтому вот таким образом читатель сокета не стоит аналогичная ситуация


[18:30 - 18:50] записью как правильно записывать сотен допустим мы хотим отправить какое то сообщение документ передать его в соке а мы не можем просто вызвать аналогичную конструкцию


[18:50 - 19:08] мы не можем написать просто так отправить весь документ почему а потому что клиент может не готов быть не готов принять такой объем данных возможно у клиента нет мусора для 1 МБ


[19:08 - 19:23] в документе а поэтому мы применяем похожий подход а мы заводим переменную в которой хранится сколько данных уже отправлена и в бесконечном цикле мы пытаемся отправить


[19:23 - 19:40] некоторые данные вот эта конструкция в питоне означает что нужно отправлять данные из буфера msg начиная со смещения тотал с этим уже 20 байт отправили то начиная с 20 отправляем


[19:40 - 19:59] метод возвращает это центр возвращает нам числом сколько бы это удалось отправить если не удалось отправить ничего это ошибка а иначе мы добавляем к нашему счетчику и отправляем небольшими кусочками до тех пор пока не будет весь документ


[19:59 - 20:16] а какие выводы можно сделать вот это надежный способ передачи а в чем здесь нюанс нам нужно знать длину документ когда мы передаем то есть записываем документ это общем то не так сложно


[20:16 - 20:33] то есть длина определяется например с помощью функции length длина строки длина буфера а когда мы получаем документ то есть функция receive мы предполагали что длина документа нам откуда это известно


[20:33 - 20:49] а поэтому при реализации протоколов прикладного уровня а нам необходимо каким то образом заранее передавать длину документа чтобы мы знали сколько данных нужно прочитать из сокета