Алексей Лапаев - Протоколы межкомпонентного...
TRANSCRIPT
Алексей ЛапаевНаправление монетизации
Протоколы межкомпонентного взаимодействия
О каких компонентах речь
Как это происходит в сети
Покажите наглядно
Как это сделать
Протоколы
4
О каких компонентах речь?
5
О каких компонентах речь?
6
Процессы – это те же компоненты
7
И они не изолированы
8
Межпроцессное взаимодействие (IPC) — набор способов обмена данными между множеством потоков в одном или более процессах.
9
Примеры методов IPC
• Файл
• Канал
• Разделяемая память
• Сокет
• Удалённый вызов процедур
10
• Права доступа
• Возможность искажения содержимого
• Недетерминированное время жизни
Примеры методов IPC: Файл
11
Примеры методов IPC: Канал
12
Примеры методов IPC: Канал
13
Примеры методов IPC: Память
14
Примеры методов IPC: Память
15
Примеры методов IPC: UDS
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)
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'
18
Примеры методов IPC: RPC
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
О каких компонентах речь
Как это происходит в сети
Покажите наглядно
Как это сделать
Протоколы
21
Клиент ↔ Сервер
22
Трёхзвенная система
23
Протокол передачи данных — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами.
24
Требования к протоколам
• Адреса
• Формат
• [Отслеживание ошибок]
• [Подтверждение доставки]
• [Контроль очерёдности]
25
Сетевая модель OSI
26
Ничего не напоминает?
27
Сетевая модель DoD
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)
29
Стэк протоколов TCP/IP
О каких компонентах речь
Как это происходит в сети
Покажите наглядно
Как это сделать
Протоколы
31
Network interface layer (физический)
• Провода
• Радиоволны
• Птицы
32
Вы сказали “Птицы”?!
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
34
Network layer (Сетевой)
35
Заголовок IPv4
36
Это один и тот же адрес:
• 192.0.2.235
• 0xC0.0x00.0x02.0xEB
• 0300.0000.0002.0353
• 0xC00002EB
• 3221226219
• 030000001353
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.
38
Заголовок IPv6
39
IPv6 адреса
• 2a02:6b8::11
• 2a02:6b8:0:0:0:0:0:11
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.
41
Удобно, но наши пакеты могут:
• прийти не в том порядке
• продублироваться
• оказаться повреждёнными
• не прийти вовсе
42
Что-то такое до боли знакомое, да?
43
Transport layer (Транспортный)
44
45
Открываем yandex.ru и...
46
47
48
Application layer (Прикладной)
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
50
FTP
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
52
HTTP
53
HTTP
54
Методы HTTP
55
Методы HTTP (RESTfull)
56
HTCPCP (RFC2324)BREW – Заварить кофеGET – Получить кофеPROPFIND – Информация о кофеWHEN – Завершить добаление молока
Возможные ошибки:406 «Not Acceptable»418 «I’m a teapot»
57
• Binary
• XML
• JSON
• YAML
• ReST
Посмотрим на payload..
58
Посмотрим на payload..
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)
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": [ "как стать крутым тестировщиком", "хочу в яндекс" ] } }}
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: - "как стать крутым тестировщиком" - "хочу в яндекс"
62
ReStructuredText (ReST)
63
HTTP может быть транспортом
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>
65
JSON-RPC
{ "method": "examples.getStateName", "params": [4], "id":1}
{ "result": "South Dakota", "error": null, "id":1}
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>
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>
О каких компонентах речь
Как это происходит в сети
Покажите наглядно
Как это сделать
Протоколы
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()
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'
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