Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

788 views

Published on

  • Be the first to comment

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

  1. 1. Алексей Лапаев Направление монетизации Протоколы межкомпонентного взаимодействия
  2. 2. О каких компонентах речь Как это происходит в сети Покажите наглядно Как это сделать Протоколы
  3. 3. 4 О каких компонентах речь?
  4. 4. 5 О каких компонентах речь?
  5. 5. 6 Процессы – это те же компоненты
  6. 6. 7 И они не изолированы
  7. 7. 8 Межпроцессное взаимодействие (IPC) — набор способов обмена данными между множеством потоков в одном или более процессах.
  8. 8. 9 Примеры методов IPC • Файл • Канал • Разделяемая память • Сокет • Удалённый вызов процедур
  9. 9. 10 • Права доступа • Возможность искажения содержимого • Недетерминированное время жизни Примеры методов IPC: Файл
  10. 10. 11 Примеры методов IPC: Канал
  11. 11. 12 Примеры методов IPC: Канал
  12. 12. 13 Примеры методов IPC: Память
  13. 13. 14 Примеры методов IPC: Память
  14. 14. 15 Примеры методов IPC: UDS
  15. 15. 16 Примеры методов IPC: UDS #UDS Server import socket,os s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: os.remove("/tmp/socketname") except OSError: pass s.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 Client import socket s = 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)
  16. 16. 17 Примеры методов IPC: UDS alapaev@:~/Documents/Proto$ python udsS.py & [1] 12481 alapaev@:~/Documents/Proto$ cd /tmp; ls -l | grep socket srwxr-xr-x 1 alapaev wheel 0 28 мар 14:12 socketname alapaev@:/tmp$ cd - /Users/alapaev/Documents/Proto alapaev@:~/Documents/Proto$ python udsC.py Received 'Hello, world'
  17. 17. 18 Примеры методов IPC: RPC
  18. 18. 19 Примеры методов IPC: RPC :~>cat /etc/rpc portmapper 100000 portmap sunrpc rstatd 100001 rstat rstat_svc rup perfmeter rusersd 100002 rusers nfs 100003 nfsprog ypserv 100004 ypprog mountd 100005 mount showmount ypbind 100007 walld 100008 rwall shutdown yppasswdd 100009 yppasswd bootparam 100026 ypupdated 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
  19. 19. О каких компонентах речь Как это происходит в сети Покажите наглядно Как это сделать Протоколы
  20. 20. 21 Клиент ↔ Сервер
  21. 21. 22 Трёхзвенная система
  22. 22. 23 Протокол передачи данных — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами.
  23. 23. 24 Требования к протоколам • Адреса • Формат • [Отслеживание ошибок] • [Подтверждение доставки] • [Контроль очерёдности]
  24. 24. 25 Сетевая модель OSI
  25. 25. 26 Ничего не напоминает?
  26. 26. 27 Сетевая модель DoD
  27. 27. 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)
  28. 28. 29 Стэк протоколов TCP/IP
  29. 29. О каких компонентах речь Как это происходит в сети Покажите наглядно Как это сделать Протоколы
  30. 30. 31 Network interface layer (физический) • Провода • Радиоволны • Птицы
  31. 31. 32 Вы сказали “Птицы”?!
  32. 32. 33 RFC1149 → RFC2549 → RFC6214 Script started on Sat Apr 28 11:24:09 2001 vegard@gyversalen:~$ /sbin/ifconfig tun0 tun0 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.1 PING 10.0.3.1 (10.0.3.1): 56 data bytes 64 bytes from 10.0.3.1: icmp_seq=0 ttl=255 time=6165731.1 ms 64 bytes from 10.0.3.1: icmp_seq=4 ttl=255 time=3211900.8 ms 64 bytes from 10.0.3.1: icmp_seq=2 ttl=255 time=5124922.8 ms 64 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 loss round-trip min/avg/max = 3211900.8/5222806.6/6388671.9 ms vegard@gyversalen:~$ exit Script done on Sat Apr 28 14:14:28 2001
  33. 33. 34 Network layer (Сетевой)
  34. 34. 35 Заголовок IPv4
  35. 35. 36 Это один и тот же адрес: • 192.0.2.235 • 0xC0.0x00.0x02.0xEB • 0300.0000.0002.0353 • 0xC00002EB • 3221226219 • 030000001353
  36. 36. 37 Пробуем.. ubuntu@qabs-school-infra-srv:~$ host yandex.ru yandex.ru has address 93.158.134.11 ubuntu@qabs-school-infra-srv:~$ telnet 93.158.134.11 80 Trying 93.158.134.11... Connected to 93.158.134.11. Escape character is '^]'. GET /index.html HTTP1.1 HTTP/1.1 400 Bad request Content-Length: 0 Connection closed by foreign host. ubuntu@qabs-school-infra-srv:~$ telnet 1570670091 80 Trying 93.158.134.11... Connected to 1570670091. Escape character is '^]'. GET /index.html HTTP1.1 HTTP/1.1 400 Bad request Content-Length: 0 Connection closed by foreign host.
  37. 37. 38 Заголовок IPv6
  38. 38. 39 IPv6 адреса • 2a02:6b8::11 • 2a02:6b8:0:0:0:0:0:11
  39. 39. 40 Пробуем.. ubuntu@qabs-school-infra-srv:~$ host yandex.ru yandex.ru has IPv6 address 2a02:6b8::11 ubuntu@qabs-school-infra-srv:~$ telnet 2a02:6b8::11 80 Trying 2a02:6b8::11... Connected to 2a02:6b8::11. Escape character is '^]'. GET /index.html HTTP1.0 HTTP/1.1 400 Bad request Content-Length: 0 Connection closed by foreign host.
  40. 40. 41 Удобно, но наши пакеты могут: • прийти не в том порядке • продублироваться • оказаться повреждёнными • не прийти вовсе
  41. 41. 42 Что-то такое до боли знакомое, да?
  42. 42. 43 Transport layer (Транспортный)
  43. 43. 44
  44. 44. 45 Открываем yandex.ru и...
  45. 45. 46
  46. 46. 47
  47. 47. 48 Application layer (Прикладной)
  48. 48. 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
  49. 49. 50 FTP
  50. 50. 51 SMTP ubuntu@qabs-school-infra-srv:~$ telnet mail.port25.com 25 Trying 69.63.149.30... Connected to mail.port25.com. Escape character is '^]'. 220 mail.port25.com ESMTP service ready MAIL FROM: <test@port25.com> 250 2.1.0 MAIL ok RCPT TO: <support@port25.com> 250 2.1.5 <support@port25.com> ok DATA 354 send message From: "Alex" <alex@port25.com> To: "Support" <support@port25.com> Subject: test message sent from manual telnet session Date: Tue, 28 March 2014 13:12:57 +0400 Hello World, Thx, Alex 250 2.1.5 your message delivered QUIT 221 2.0.0 closing channel
  51. 51. 52 HTTP
  52. 52. 53 HTTP
  53. 53. 54 Методы HTTP
  54. 54. 55 Методы HTTP (RESTfull)
  55. 55. 56 HTCPCP (RFC2324) BREW – Заварить кофе GET – Получить кофе PROPFIND – Информация о кофе WHEN – Завершить добаление молока Возможные ошибки: 406 «Not Acceptable» 418 «I’m a teapot»
  56. 56. 57 • Binary • XML • JSON • YAML • ReST Посмотрим на payload..
  57. 57. 58 Посмотрим на payload..
  58. 58. 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)
  59. 59. 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": [ "как стать крутым тестировщиком", "хочу в яндекс" ] } } }
  60. 60. 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: - "как стать крутым тестировщиком" - "хочу в яндекс"
  61. 61. 62 ReStructuredText (ReST)
  62. 62. 63 HTTP может быть транспортом
  63. 63. 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>
  64. 64. 65 JSON-RPC { "method": "examples.getStateName", "params": [4], "id":1 } { "result": "South Dakota", "error": null, "id":1 }
  65. 65. 66 SOAP (Запрос) POST /v4/soap/1/ HTTP/1.1 Content-Length: 524 Content-Type: text/xml; charset=utf-8 SOAPAction: "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>
  66. 66. 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">agrom@yandex.ru</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>
  67. 67. О каких компонентах речь Как это происходит в сети Покажите наглядно Как это сделать Протоколы
  68. 68. 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()
  69. 69. 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 well 42 >>> 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 obj AttributeError: cannot access 'get_question'
  70. 70. 71 Django JSON-RPC from jsonrpc import JsonRpc, publicmethod from django.core.urlresolvers import reverse from 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);}); >>> 7 rpc.callRemote("sub", [9,5]).addCallback(function(result) { console.log(result);}); >>> 4
  71. 71. Алексей Лапаев lapayman@yandex.ru Спасибо Направление монетизации

×