Алексей Лапаев - Протоколы межкомпонентного...

72

Upload: yandex

Post on 02-Jul-2015

544 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Алексей Лапаев - Протоколы межкомпонентного взаимодействия
Page 2: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

Алексей ЛапаевНаправление монетизации

Протоколы межкомпонентного взаимодействия

Page 3: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

О каких компонентах речь

Как это происходит в сети

Покажите наглядно

Как это сделать

Протоколы

Page 4: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

4

О каких компонентах речь?

Page 5: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

5

О каких компонентах речь?

Page 6: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

6

Процессы – это те же компоненты

Page 7: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

7

И они не изолированы

Page 8: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

8

Межпроцессное взаимодействие (IPC) — набор способов обмена данными между множеством потоков в одном или более процессах.

Page 9: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

9

Примеры методов IPC

• Файл

• Канал

• Разделяемая память

• Сокет

• Удалённый вызов процедур

Page 10: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

10

• Права доступа

• Возможность искажения содержимого

• Недетерминированное время жизни

Примеры методов IPC: Файл

Page 11: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

11

Примеры методов IPC: Канал

Page 12: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

12

Примеры методов IPC: Канал

Page 13: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

13

Примеры методов IPC: Память

Page 14: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

14

Примеры методов IPC: Память

Page 15: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

15

Примеры методов IPC: UDS

Page 16: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

16

Примеры методов IPC: UDS#UDS Serverimport socket,oss = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)try: os.remove("/tmp/socketname")except OSError: passs.bind("/tmp/socketname")s.listen(1)conn, addr = s.accept()while 1: data = conn.recv(1024) if not data: break conn.send(data) conn.close()

#UDS Clientimport sockets = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)s.connect("/tmp/socketname")s.send('Hello, world')data = s.recv(1024)s.close()print 'Received', repr(data)

Page 17: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

17

Примеры методов IPC: UDS

alapaev@:~/Documents/Proto$ python udsS.py &[1] 12481

alapaev@:~/Documents/Proto$ cd /tmp; ls -l | grep socketsrwxr-xr-x 1 alapaev wheel 0 28 мар 14:12 socketname

alapaev@:/tmp$ cd -/Users/alapaev/Documents/Proto

alapaev@:~/Documents/Proto$ python udsC.pyReceived 'Hello, world'

Page 18: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

18

Примеры методов IPC: RPC

Page 19: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

19

Примеры методов IPC: RPC:~>cat /etc/rpcportmapper 100000 portmap sunrpcrstatd 100001 rstat rstat_svc rup perfmeterrusersd 100002 rusersnfs 100003 nfsprogypserv 100004 ypprogmountd 100005 mount showmountypbind 100007walld 100008 rwall shutdownyppasswdd 100009 yppasswdbootparam 100026ypupdated 100028 ypupdate

:~>rpcinfo -p somehostname program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 32781 status 100024 1 tcp 32775 status 100011 1 udp 32787 rquotad 100002 2 udp 32789 rusersd

Page 20: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

О каких компонентах речь

Как это происходит в сети

Покажите наглядно

Как это сделать

Протоколы

Page 21: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

21

Клиент ↔ Сервер

Page 22: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

22

Трёхзвенная система

Page 23: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

23

Протокол передачи данных — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами.

Page 24: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

24

Требования к протоколам

• Адреса

• Формат

• [Отслеживание ошибок]

• [Подтверждение доставки]

• [Контроль очерёдности]

Page 25: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

25

Сетевая модель OSI

Page 26: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

26

Ничего не напоминает?

Page 27: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

27

Сетевая модель DoD

Page 28: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

28

Примеры протоколов

• Application layer:– DNS, HTTP/HTTPS, DNS, FTP/TFTP, Telnet/SSH, SMTP, NTP, SPDY,

HTTP2.0

• Transport layer:– TCP, UDP

• Internet layer:– IP, ICMP, IPsec

• Network Interface layer:– Ethernet, IEEE 802.11 (WiFi), IEEE 802.16 (WiMAX), USB, Bluetooth,

IEEE 1394 (FireWire)

Page 29: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

29

Стэк протоколов TCP/IP

Page 30: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

О каких компонентах речь

Как это происходит в сети

Покажите наглядно

Как это сделать

Протоколы

Page 31: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

31

Network interface layer (физический)

• Провода

• Радиоволны

• Птицы

Page 32: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

32

Вы сказали “Птицы”?!

Page 33: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

33

RFC1149 → RFC2549 → RFC6214Script started on Sat Apr 28 11:24:09 2001vegard@gyversalen:~$ /sbin/ifconfig tun0tun0 Link encap:Point-to-Point Protocol inet addr:10.0.3.2 P-t-P:10.0.3.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:150 Metric:1 RX packets:1 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 RX bytes:88 (88.0 b) TX bytes:168 (168.0 b)

vegard@gyversalen:~$ ping -c 9 -i 900 10.0.3.1PING 10.0.3.1 (10.0.3.1): 56 data bytes64 bytes from 10.0.3.1: icmp_seq=0 ttl=255 time=6165731.1 ms64 bytes from 10.0.3.1: icmp_seq=4 ttl=255 time=3211900.8 ms64 bytes from 10.0.3.1: icmp_seq=2 ttl=255 time=5124922.8 ms64 bytes from 10.0.3.1: icmp_seq=1 ttl=255 time=6388671.9 ms

--- 10.0.3.1 ping statistics ---9 packets transmitted, 4 packets received, 55% packet lossround-trip min/avg/max = 3211900.8/5222806.6/6388671.9 msvegard@gyversalen:~$ exit

Script done on Sat Apr 28 14:14:28 2001

Page 34: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

34

Network layer (Сетевой)

Page 35: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

35

Заголовок IPv4

Page 36: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

36

Это один и тот же адрес:

• 192.0.2.235

• 0xC0.0x00.0x02.0xEB

• 0300.0000.0002.0353

• 0xC00002EB

• 3221226219

• 030000001353

Page 37: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

37

Пробуем..ubuntu@qabs-school-infra-srv:~$ host yandex.ruyandex.ru has address 93.158.134.11ubuntu@qabs-school-infra-srv:~$ telnet 93.158.134.11 80Trying 93.158.134.11...Connected to 93.158.134.11.Escape character is '^]'.GET /index.html HTTP1.1HTTP/1.1 400 Bad requestContent-Length: 0Connection closed by foreign host.ubuntu@qabs-school-infra-srv:~$ telnet 1570670091 80Trying 93.158.134.11...Connected to 1570670091.Escape character is '^]'.GET /index.html HTTP1.1HTTP/1.1 400 Bad requestContent-Length: 0Connection closed by foreign host.

Page 38: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

38

Заголовок IPv6

Page 39: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

39

IPv6 адреса

• 2a02:6b8::11

• 2a02:6b8:0:0:0:0:0:11

Page 40: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

40

Пробуем..ubuntu@qabs-school-infra-srv:~$ host yandex.ruyandex.ru has IPv6 address 2a02:6b8::11ubuntu@qabs-school-infra-srv:~$ telnet 2a02:6b8::11 80Trying 2a02:6b8::11...Connected to 2a02:6b8::11.Escape character is '^]'.GET /index.html HTTP1.0HTTP/1.1 400 Bad requestContent-Length: 0Connection closed by foreign host.

Page 41: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

41

Удобно, но наши пакеты могут:

• прийти не в том порядке

• продублироваться

• оказаться повреждёнными

• не прийти вовсе

Page 42: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

42

Что-то такое до боли знакомое, да?

Page 43: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

43

Transport layer (Транспортный)

Page 44: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

44

Page 45: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

45

Открываем yandex.ru и...

Page 46: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

46

Page 47: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

47

Page 48: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

48

Application layer (Прикладной)

Page 49: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

49

noop <00>close <FF>login <01>login-response <81>create-game <02>create-game-response <82>list-games <03>games <83>game-info <84>join-game <05>join-game-response <85>request-bot <06>leave-game <07>set <88>go <08>move <09>world <89>score <8A>retire <0B>game-over <8B>

Internet Pong Protocol

Page 50: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

50

FTP

Page 51: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

51

SMTPubuntu@qabs-school-infra-srv:~$ telnet mail.port25.com 25Trying 69.63.149.30...Connected to mail.port25.com.Escape character is '^]'.220 mail.port25.com ESMTP service readyMAIL FROM: <[email protected]>250 2.1.0 MAIL okRCPT TO: <[email protected]>250 2.1.5 <[email protected]> okDATA354 send messageFrom: "Alex" <[email protected]>To: "Support" <[email protected]>Subject: test message sent from manual telnet sessionDate: Tue, 28 March 2014 13:12:57 +0400

Hello World,

Thx,Alex250 2.1.5 your message deliveredQUIT221 2.0.0 closing channel

Page 52: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

52

HTTP

Page 53: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

53

HTTP

Page 54: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

54

Методы HTTP

Page 55: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

55

Методы HTTP (RESTfull)

Page 56: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

56

HTCPCP (RFC2324)BREW – Заварить кофеGET – Получить кофеPROPFIND – Информация о кофеWHEN – Завершить добаление молока

Возможные ошибки:406 «Not Acceptable»418 «I’m a teapot»

Page 57: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

57

• Binary

• XML

• JSON

• YAML

• ReST

Посмотрим на payload..

Page 58: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

58

Посмотрим на payload..

Page 59: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

59

<Order> <ID>1</ID> <Description>Яндекс.ШТыБС</Description> <Sum>100500</Sum> <Banner> <ID>1</ID> <Title>Не бетон, а ШТыБС!</Title> <Body>Всё становится лучше с ШТыБС.</Body> <Href>http://shtbs.com</Href> <Price>5</Price> <Phrase>купить бетон</Phrase> <Phrase>продать бетон</Phrase> <Phrase>тазы с бетоном</Phrase> </Banner> <Banner> <ID>2</ID> <Title>ШТыБС – мечта каждого</Title> <Body>Знания бесплатны. Ждите нас.</Body> <Href>http://shtbs.com</Href> <Price>2</Price> <Phrase>как стать крутым тестировщиком</Phrase> <Phrase>хочу в яндекс</Phrase> </Banner></Order>

eXtensible Markup Language (XML)

Page 60: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

60

JavaScript Object Notation (JSON){ "ID": 1, "Description": "Яндекс.ШТыБС", "Sum": 100500, "Banner": { "1": { "Title": "Не бетон, а ШТыБС!", "Body": "Всё становится лучше с ШТыБС.", "Href": "http://shtbs.com", "Price": 5, "Phrase": [ "купить бетон", "продать бетон", "тазы с бетоном" ] }, "2": { "Title": "ШТыБС – мечта каждого", "Body": "Знания бесплатны. Ждите нас.", "Href": "http://shtbs.com", "Price": 2, "Phrase": [ "как стать крутым тестировщиком", "хочу в яндекс" ] } }}

Page 61: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

61

Ain't Markup Language (YAML)Order: ID: 1 Description: "Яндекс.ШТыБС" Sum: 100500 Banner: 1: Title: "Не бетон, а ШТыБС!" Body: "Всё становится лучше с ШТыБС." Href: "http://shtbs.com" Price: 5 Phrase: - "купить бетон" - "продать бетон" - "тазы с бетоном" 2: Title: "ШТыБС – мечта каждого" Body: "Знания бесплатны. Ждите нас." Href: "http://shtbs.com" Price: 2 Phrase: - "как стать крутым тестировщиком" - "хочу в яндекс"

Page 62: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

62

ReStructuredText (ReST)

Page 63: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

63

HTTP может быть транспортом

Page 64: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

64

XML-RPC<?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>

<?xml version="1.0"?> <methodResponse> <params> <param> <value><string>South Dakota</string></value> </param> </params> </methodResponse>

Page 65: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

65

JSON-RPC

{ "method": "examples.getStateName", "params": [4], "id":1}

{ "result": "South Dakota", "error": null, "id":1}

Page 66: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

66

SOAP (Запрос)POST /v4/soap/1/ HTTP/1.1Content-Length: 524Content-Type: text/xml; charset=utf-8SOAPAction: "API#GetClientInfo"Host: api.direct.yandex.ru

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="API" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header> <locale>ru</locale> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns0:GetClientInfo SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params soapenc:arrayType="xsd:string[]"> <xsd:string>agrom</xsd:string> <Login>agrom</Login> </params> </ns0:GetClientInfo> </SOAP-ENV:Body></SOAP-ENV:Envelope>

Page 67: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

67

SOAP (Ответ)<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" <SOAP-ENV:Body> <namesp3:GetClientInfoResponse xmlns:namesp3="API"> <SOAP-ENC:Array xsi:type="namesp2:ArrayOfClientInfo" SOAP-ENC:arrayType="namesp2:ClientInfo[1]"> <item xsi:type="namesp2:ClientInfo"> <SendAccNews xsi:type="xsd:string">Yes</SendAccNews> <Discount xsi:nil="true" xsi:type="xsd:float"/> <Login xsi:type="xsd:string">agrom</Login> <Email xsi:type="xsd:string">[email protected]</Email> <Role xsi:type="xsd:string">Client</Role> <FIO xsi:type="xsd:string">Andrew Smith</FIO> <DateCreate xsi:type="xsd:date">2011-01-06</DateCreate> <StatusArch xsi:type="xsd:string">No</StatusArch> <SendNews xsi:type="xsd:string">Yes</SendNews> <Phone xsi:nil="true" xsi:type="xsd:string"/> <NonResident xsi:type="xsd:string">No</NonResident> <SendWarn xsi:type="xsd:string">Yes</SendWarn> </item> </SOAP-ENC:Array> </namesp3:GetClientInfoResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>

Page 68: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

О каких компонентах речь

Как это происходит в сети

Покажите наглядно

Как это сделать

Протоколы

Page 69: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

69

RPyC: Пишем RPC-серверimport rpyc

class MyService(rpyc.Service): def on_connect(self): # code that runs when a connection is created pass

def on_disconnect(self): # code that runs when the connection has already closed pass

def exposed_get_answer(self): return 42

def get_question(self): return "Answer to The Ultimate Question of Life, the Universe, and Everything?"

if __name__ == "__main__": from rpyc.utils.server import ThreadedServer t = ThreadedServer(MyService, port = 13404) t.start()

Page 70: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

70

RPyC: Делаем RPC-запрос>>> import rpyc>>> c = rpyc.connect("localhost", 13404)>>>>>> c.root.get_answer>>> c.root.get_answer()42>>> c.root.exposed_get_answer() # it can be accessed with the 'exposed_' prefix as well42>>> c.root.get_question() # but "get_question" is not exposed!======= Remote traceback =======... File "/home/tomer/workspace/rpyc/core/protocol.py", line 298, in sync_request raise objAttributeError: cannot access 'get_question'

Page 71: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

71

Django JSON-RPCfrom jsonrpc import JsonRpc, publicmethodfrom django.core.urlresolvers import reversefrom django.http import HttpResponse

class MyRpcMethods(object): url = reverse("myapp-rpc") @publicmethod def add(x, y): return x+y @publicmethod def sub(x, y): return x-y

def my_rpc_view(request): rpc = JsonRpc( MyRpcMethods() ) result = rpc.handle_request(request) return result

var rpc = new dojo.rpc.JsonService("/myapp/rpc/");rpc.add(3,4).addCallback(function(result) { console.log(result);});>>> 7rpc.callRemote("sub", [9,5]).addCallback(function(result) { console.log(result);});>>> 4

Page 72: Алексей Лапаев - Протоколы межкомпонентного взаимодействия

Алексей Лапаев

[email protected]

Спасибо

Направление монетизации