TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end

11 visualizações

Publicada em

Sua aplicação ruby end to end

Publicada em: Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
11
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
0
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end

  1. 1. Sua app Ruby end to end Willian Molinari (a.k.a PotHix)
  2. 2. Aviso
  3. 3. Willian Molinari a.k.a PotHix
  4. 4. Plaev.github.io
  5. 5. Motivação
  6. 6. Escrevi um livro! https://desconstruindoaweb.com.br 315 horas de pesquisa e dedicação 8 meses de duração de escrita 127 referências sabe aquelas famosas RFCs? Então...
  7. 7. Essa talk se baseia em
  8. 8. https://gurusp.org https://gurusp.org
  9. 9. https://gurusp.org https://gurusp.org
  10. 10. https://gurusp.org É uma URL? https://gurusp.org
  11. 11. “O que significa PotHix” “O que significa PotHix”
  12. 12. https://gurusp.org É uma URL! https://gurusp.org
  13. 13. https://gurusp.org https://gurusp.org Tem HSTS? Strict-Transport-Security
  14. 14. https://gurusp.org https://gurusp.org Tem HSTS? Strict-Transport-Security config.force_ssl = true
  15. 15. https://gurusp.org Tem cache? Expires Cache-Control https://gurusp.org ETag
  16. 16. Protocolo: https:// Domínio: gurusp.org Path: / Tem cache de DNS?
  17. 17. Sem cache
  18. 18. Com cache
  19. 19. Chrome Faz cache de DNS
  20. 20. http://aosabook.org/en/posa/high-performance-networking-in-chrome.html
  21. 21. getaddrinfo()
  22. 22. sistema operacional
  23. 23. glibc I’m watching you! n u
  24. 24. glibc -> /etc/hosts nss/nss_files/files-hosts.c
  25. 25. glibc -> getaddrinfo() sysdeps/posix/getaddrinfo.c 2321 getaddrinfo (const char *name, const char *service, 2322 const struct addrinfo *hints, struct addrinfo **pai) 2323 {
  26. 26. getaddrinfo() Tem nscd para cache de DNS?
  27. 27. Internet - glibc POSIX
  28. 28. Aplicação Apresentação Sessão Transporte Rede Enlace Físico Modelo OSI
  29. 29. Aplicação Apresentação Sessão Transporte Rede Enlace Físico Modelo OSI
  30. 30. S R L Y ?
  31. 31. Aplicação Transporte Rede Enlace Físico Sessão Apresentação
  32. 32. Aplicação Transporte Rede Enlace Físico
  33. 33. Aplicação Transporte Rede Enlace Físico SO user
  34. 34. TCP / UDP DNSAplicação Transporte Rede Enlace Físico IP Ethernet / Wi-Fi 010101001011
  35. 35. DNS TCP / UDP Aplicação Transporte Rede Enlace Físico IP Ethernet / Wi-Fi 010101001011
  36. 36. código disponível em: chromium/src/net/dns
  37. 37. getaddrinfo() __socket() & __connect() sysdeps/posix/getaddrinfo.c 2515 fd = __socket (af, SOCK_DGRAM, IPPROTO_IP); [...] 2526 [...] && __connect (fd, q->ai_addr, q->ai_addrlen) == 0
  38. 38. terminal $ sudo strace -f -e socket,connect -p $(ps aux | grep chromium | grep -v nacl | awk '{ print $2}' | xargs echo | sed 's/ /,/g') [...] [pid 8739] socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 8739] connect(134, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "2001:4860:4860::8888", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable) [pid 9010] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 9010] connect(134, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, 16) = 0 [pid 8739] socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 134 [pid 8739] connect(134, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("173.233.93.210")}, 16) = -1 EINPROGRESS (Operation now in progress) [...] Syscalls in action! (*stripped)
  39. 39. terminal request UDP ipv4 $ sudo strace -f -e socket,connect -p $(ps aux | grep chromium | grep -v nacl | awk '{ print $2}' | xargs echo | sed 's/ /,/g') [...] [pid 8739] socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 8739] connect(134, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "2001:4860:4860::8888", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable) [pid 9010] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 9010] connect(134, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, 16) = 0 [pid 8739] socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 134 [pid 8739] connect(134, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("173.233.93.210")}, 16) = -1 EINPROGRESS (Operation now in progress) [...] Syscalls in action! (*stripped) UDP para ipv6 nope :(
  40. 40. Happy eyebals (rfc6555): https://www.ietf.org/mail-archive/web/v6ops/current/msg22455.html
  41. 41. AAAA A Browser sitev6 sitev4 Happy eyeballs de acordo com a rfc6555
  42. 42. AAAA A Browser sitev6 sitev4 Happy eyeballs de acordo com a rfc6555
  43. 43. AAAA A Browser sitev6 sitev4RST Happy eyeballs de acordo com a rfc6555
  44. 44. DNSAplicação Transporte Rede Enlace Físico TCP / UDP IP Ethernet / Wi-Fi 010101001011
  45. 45. UDP/IP linux/blob/master/net/ipv4/udp.c
  46. 46. UDP
  47. 47. Conteúdo
  48. 48. Endereço (IP)
  49. 49. ?
  50. 50. DNSAplicação Transporte Rede Enlace Físico TCP / UDP IP Ethernet / Wi-Fi 010101001011
  51. 51. DNSAplicação Transporte Rede Enlace Físico TCP / UDP IP Mágica, bro!
  52. 52. A visual explanation of how dns lookups work
  53. 53. Via dnstracer: `dnstracer -s . -4 -o -c gurusp.org` A.ROOT-SERVERS.NET [.] (198.41.0.4) d0.org.afilias-nst.org [org] (199.19.57.1) ns2ckr.name.com [gurusp.org] (98.124.246.1) Got authoritative answer ns3fqs.name.com (98.124.246.2) gurusp.org -> 173.233.93.210 ns1dhl.name.com (184.172.60.181) gurusp.org -> 173.233.93.210 ns2ckr.name.com (98.124.246.1) gurusp.org -> 173.233.93.210
  54. 54. Internet glibc DNS TCP/IP UDP/IP POSIX
  55. 55. Internet glibc DNS TCP/IP UDP/IP POSIX HTTP
  56. 56. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  57. 57. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  58. 58. TCP linux/blob/master/net/ipv4/tcp.c
  59. 59. https://en.wikipedia.org/wiki/Transmission_Control_Protocol
  60. 60. Three-way handshake Estabelecendo uma conexão
  61. 61. LISTENINGSYN LISTENSYNSENT
  62. 62. SYN+ACK LISTEN SYN RECEIVED SYNSENT
  63. 63. SYN RECEIVED SYNSENTESTABLISHED ACK
  64. 64. ESTABLISHEDSYNSENTESTABLISHED É NÓIS! É NÓIS!
  65. 65. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  66. 66. HTTPS
  67. 67. TLS = fork(SSLv3) SSLv3 is no longer supported in chrome
  68. 68. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico TLS
  69. 69. TLS
  70. 70. conexão estabelecida client hello (CIPHERS, URL) Os primeiros milisegundos de uma conexão HTTPS
  71. 71. https://cc.dcsec.uni-hannover.de/
  72. 72. conexão estabelecida Server hello (certificado, CIPHER) TLS_RSA_WITH_RC4_128_MD5 Criptografia assimétrica Criptografia simétrica hash
  73. 73. conexão estabelecida Data válida? CA confiável? Assinatura válida? URL esperada?
  74. 74. conexão estabelecida
  75. 75. conexão estabelecida Gerei uma parada aqui (pre_master secret) !^*@#$&!@(#$&!@#)$^$^ TLS_RSA_WITH_RC4_128_MD5
  76. 76. conexão estabelecida !!@U#$N!Y*@#$* master secret TLS_RSA_WITH_RC4_128_MD5
  77. 77. conexão estabelecida É NÓIS! TLS_RSA_WITH_RC4_128_MD5 criptografia dos dados verificação contra conteúdo “batizado” É NÓIS!
  78. 78. TLSHTTP HTTP Internetheaders cookies params URLs sessions form data headers cookies params URLs sessions form data
  79. 79. HTTP/HTTP2 chromium - net/http & net/spdy
  80. 80. Rafael Rinaldi Dissecando o protocolo HTTP/2
  81. 81. HTTP 1x via telnet $ telnet gurusp.org 80 Trying 173.233.93.210... Connected to gurusp.org. Escape character is '^]'. GET / HTTP/1.1 HOST: gurusp.org HTTP/1.1 301 Moved Permanently Location: https://gurusp.org/ terminal
  82. 82. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  83. 83. Aplicação Transporte Rede Enlace Físico
  84. 84. papers/Vipin_Analysis_of_open_source_WLAN_driver_paper.pdf ➔ net/ipv4/tcp.c ➔ include/net/cfg80211.h ➔ net/wireless/nl80211.c ➔ include/net/mac80211.h ➔ drivers/net/wireless/iwlwifi/
  85. 85. Internetglibc DNS TCP/IP UDP/IP HTTP POSIX
  86. 86. a/b/g/n/ac
  87. 87. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  88. 88. # traceroute -T gurusp.org traceroute to gurusp.org (173.233.93.210), 30 hops max, 60 byte packets 1 palantir (192.168.1.1) 5.698 ms 5.697 ms 5.697 ms 2 10.14.128.1 (10.14.128.1) 458.092 ms 458.104 ms 462.246 ms 3 200.189.80.1 (200.189.80.1) 462.984 ms 462.986 ms 462.985 ms 4 embratel-T0-1-0-0-uacc02.spo.embratel.net.br (200.231.241.9) 465.114 ms embratel-T0-3-1-0-tacc01.spo.embratel.net.br (189.86.58.29) 469.047 ms embratel-T0-0-1-3-uacc01.spolp.embratel.net.br (200.178.80.13) 469.027 ms 5 ebt-T0-3-0-1-tcore01.spo.embratel.net.br (200.230.158.54) 587.308 ms ebt-H0-1-0-0-tcore01.spomb.embratel.net.br (200.244.212.75) 470.475 ms ebt-T0-3-0-1-tcore01.spo.embratel.net.br (200.230.158.54) 587.323 ms 6 ebt-B11151-intl01.atl.embratel.net.br (200.230.230.32) 590.492 ms ebt-B10851-intl01.atl.embratel.net.br (200.230.230.36) 584.693 ms ebt-B11151-intl01.atl.embratel.net.br (200.230.230.32) 584.711 ms 7 hu0-9-0-1.ccr41.atl04.atlas.cogentco.com (38.88.194.105) 581.785 ms 605.417 ms 607.792 ms 8 be2848.ccr42.atl01.atlas.cogentco.com (154.54.6.117) 603.762 ms 604.337 ms 604.350 ms 9 be2113.ccr42.dca01.atlas.cogentco.com (154.54.24.221) 613.834 ms 611.769 ms 601.983 ms 10 be2807.ccr42.jfk02.atlas.cogentco.com (154.54.40.109) 602.241 ms 604.763 ms 604.756 ms 11 be2916.ccr22.alb02.atlas.cogentco.com (154.54.41.61) 607.982 ms 612.526 ms 612.805 ms 12 xe-2-3-0.edge1.ny01.as40244.net (38.104.52.90) 701.213 ms 701.161 ms 700.555 ms 13 xe-1-0-1.core123.ny01.as40244.net (66.206.33.196) 612.066 ms 611.781 ms 618.261 ms 14 173-233-93-210.static.as40244.net (173.233.93.210) 618.297 ms 618.291 ms 618.248 ms TCP meu router Backbone Congent Hospedagem backbone embratel NET Rede interna do provedor router condomínio
  89. 89. Internet
  90. 90. Nginx conf file upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; } ... http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server TCP Unix Socket
  91. 91. Internet assets TCP http://12factor.net/port-binding
  92. 92. HTTP parsing ragel vindo lá do velho mongrel* *de acordo com o documento de design do unicorn
  93. 93. Internet assets TCP
  94. 94. Webserver -> Framework baseado no PEP3333
  95. 95. Internet TCP assets
  96. 96. lib/rails/application.rb Rack -> Rails mais informações no post do timaro no omniref
  97. 97. É um Rack application ... # Implements call according to the Rack API. It simply # dispatches the request to the underlying middleware stack. def call(env) env["ORIGINAL_FULLPATH"] = build_original_fullpath(env) env["ORIGINAL_SCRIPT_NAME"] = env["SCRIPT_NAME"] super(env) end ...
  98. 98. E um Rails::Engine Todas as apps são Engines mais informações no post do timaro no omniref
  99. 99. mais informações no post do timaro no omniref Informações que vem do Rack {"GATEWAY_INTERFACE"=>"CGI/1.1", "PATH_INFO"=>"/", "QUERY_STRING"=>"", "REMOTE_ADDR"=>"127.0.0.1", "REMOTE_HOST"=>"localhost.localdomain", "REQUEST_METHOD"=>"GET", "REQUEST_URI"=>"http://localhost:9292/favicon.ico" , "SCRIPT_NAME"=>"", "SERVER_NAME"=>"localhost", "SERVER_PORT"=>"9292", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/2.2.3/2015-08-18)", "HTTP_HOST"=>"localhost:9292", "HTTP_CONNECTION"=>"keep-alive", "HTTP_USER_AGENT"=>"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36", "HTTP_ACCEPT"=>"*/*", "HTTP_REFERER"=>"http://localhost:9292/", "HTTP_ACCEPT_ENCODING"=>"gzip, deflate, sdch", "HTTP_ACCEPT_LANGUAGE"=>"en-US,en;q=0.8,pt-BR;q=0. 6,pt;q=0.4,es;q=0.2,eo;q=0.2", "rack.version"=>[1, 2], "rack.multithread"=>true, "rack.multiprocess"=>false, "rack.run_once"=>false, "rack.url_scheme"=>"http", "HTTP_VERSION"=>"HTTP/1.1", "REQUEST_PATH"=>"/favicon.ico"}
  100. 100. mais informações no post do timaro no omniref Passa por vários Rack middlewares [ Rack::Sendfile, ActionDispatch::Static, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Midd leware:0x000000028fa168>, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActiveRecord::ConnectionAdapters::ConnectionManage ment, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::Head, Rack::ConditionalGet, Rack::ETag ]
  101. 101. ActionDispatch ::Journey::Router a primeira parte do seu código a ser tocada mais informações no post do timaro no omniref req.path_parameters => {:controller=>"pages", :action=>"index"}
  102. 102. ActionDispatch::Routing ::RouteSet::Dispatcher achando o controller via rotas mais informações no post do timaro no omniref ActiveSupport::Dependencies.constantize("#{params[:controller].camelize}Controller") => PagesController
  103. 103. ActionController::Metal prepara o request e manda processar mais informações no post do timaro no omniref def dispatch(name, request) #:nodoc: [...] process(name)
  104. 104. AbstractController::Base encaminha para o seu controller mais informações no post do timaro no omniref def process(action, *args) [...] process_action(action_name, *args) # que no fim é só um `send`
  105. 105. Internet TCP MV VM C assets
  106. 106. Internet TCP MV VM C assets
  107. 107. Internet TCP MV VM C assets
  108. 108. pega aí Rack -> [status, header, body] mais informações no post do timaro no omniref ActionDispatch ::Journey::Router
  109. 109. Internet assets TCP MV VM C
  110. 110. Internet TCP MV VM C assets
  111. 111. Internet TCP MV VM C assets
  112. 112. Internet TCP MV VM C assets
  113. 113. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  114. 114. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  115. 115. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  116. 116. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  117. 117. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet c-c-c-combo breaker
  118. 118. HTML
  119. 119. exemplos retirados do post “How browsers work” algoritmo de parsing implementado no webkit do chrome
  120. 120. HTML syntax error
  121. 121. <img src=”http://pothix.com/avatar.gif”> thread <img src=”http://pothix.com/esperanto.png”> thread <img src=”http://pothix.com/fotodasferias.scr”> thread <script src=”http://pothix.com/marotagem.js”> sincrono <link href=”http://pothix.com/estiloso.css”> thread <script src=”http://pothix.com/javaescrito.js”> sincrono <img src=”http://pothix.com/fotodasferias.jpg”>
  122. 122. <img src=”http://pothix.com/avatar.gif”> thread <img src=”http://pothix.com/esperanto.png”> thread <img src=”http://pothix.com/fotodasferias.scr”> <script src=”http://pothix.com/marotagem.js”> sincrono <img src=”http://pothix.com/fotodasferias.jpg”> <link href=”http://pothix.com/estiloso.css”> thread <script src=”http://pothix.com/javaescrito.js”> sincrono thread
  123. 123. exemplos retirados do post “How browsers work”
  124. 124. exemplos retirados do post “How browsers work”
  125. 125. Diego Eis: DOM, CSSOM e RenderThree - Introdução ao Browser Render Path
  126. 126. Resumindo essa bagaça
  127. 127. glibc MV VM C Internet Internet
  128. 128. Não acredite em mágica entenda como funciona de verdade ceeeeerto.
  129. 129. Perguntas? Willian Molinari @PotHix pothix@pothix.com Slides: http://cege.la/k8GNKr

×