CC HTTP
CC HTTP
URL exemplo:
http://www.di.uminho.pt/cursos/miei.html
l Modelo cliente/servidor
P ed
ido
l cliente: browser pede, recebe e HT
Re s TP
mostra objetos Web po s
ta
HT
l servidor: servidor envia objetos TP
como resposta a pedidos
T P
HT P Servidor a
HTTP 0.9: versão inicial (não oficial) dido H TT executar
P e
o sta o servidor
HTTP 1.0: RFC 1945 (maio 1996) s p
Re WEB Apache
HTTP 1.1: RFC 2068 (janeiro 1997)
HTTP 2.0: RFC 7540 (maio 2015)
Mac a executar o
HTTP 3.0: Draft de 23 março 2021 Safari
~
~ entity body ~
~ body
Host: www.sitio.pt
Connection: close Linhas do
cabeçalho
User-Agent: Mozilla/4.0
Accept-Language: PT
<new line>
Dados da
Corpo da mensagem (vazio no caso do GET) mensagem
Linha do pedido
HEAD
POST URL HTTP/v
GET...
l POST l PUT
tempo
28/04/21 22
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 23
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 24
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 25
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 26
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 27
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 28
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 29
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 30
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 31
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 32
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 33
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 34
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 35
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 36
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 37
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
fin
t=428
28/04/21 38
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
fin
t=428
RTT ack + fin
t=448 ack
28/04/21 39
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
fin
t=428
RTT ack + fin
t=448 ack
28/04/21 40
... ainda falta uma imagem img5 à
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=568
28/04/21
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=568 fin
RTT ack + fin
t=588 ack
28/04/21
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=568 fin
RTT ack + fin
t=588 ack
28/04/21
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 47
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 48
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 49
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=148
28/04/21 50
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 51
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=168 tt(img2)=80ms
(simplificado!)
t=248
28/04/21 52
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=168 tt(img2)=80ms
(simplificado!)
28/04/21 53
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=168 tt(img2)=80ms
(simplificado!)
28/04/21 54
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=168 tt(img2)=80ms
(simplificado!)
28/04/21 55
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=168 tt(img2)=80ms
(simplificado!)
28/04/21 56
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=168 tt(img2)=80ms
(simplificado!)
28/04/21 57
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=168 tt(img2)=80ms
(simplificado!)
28/04/21 59
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 60
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
28/04/21 61
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=148
28/04/21 62
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=148 tt(img2)=80ms
t=228
28/04/21 63
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=148 tt(img2)=80ms
t=228
tt(img3)=80ms
t=308
28/04/21 64
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=308
28/04/21 65
Dados: RTT = 20 ms
6 Objectos à { html, img1, img2, img3, img4, img5 }
tt (html) = 8 ms tt(img) = 80 ms
t=308
T.c.total = 468 ms (ou 488 ms contando com fecho conexão)
28/04/21 66
Cookies: informação de estado
A maioria dos sites Web usa cookies
Exemplo:
l Susana acede sempre à Internet
Quatro componentes:
a partir do seu PC
1) Linha com cookie no cabeçalho da
mensagem HTTP response l visita um site de comércio
ebay 8734
usual http request msg Amazon server
cookie file creates ID
usual http response
1678 for user create backend
ebay 8734
set-cookie: 1678 entry database
amazon 1678
usual http request msg
cookie: 1678 cookie- access
specific
usual http response msg action
Consequências
1.54 Mbps
access link
l Utilização da LAN = 15%
(15 pedidos/sec).(100Kbits/pedido)/(10Mbps) institutional
network
l Utilização do Link de acesso = 99% 1 Gbps LAN
(15 pedidos/sec).(100Kbits/pedido)/(1.54Mbps)
l Total delay =
= Internet delay + access delay + LAN delay
= 2 sec + minutes + milliseconds
28/04/21 Universidade do Minho 72
Exemplo de Caching (cont)
Solução possível
l Aumentar a largura de banda do link origin
de acesso para 10 Mbps servers
public
Internet
Consequência
l Utilização da LAN = 15%
l Utilização do Link de Acesso = 15%
1.54 Mbps
154 Mbps
l Total delay = Internet delay + access access link
delay + LAN delay
institutional
= 2 sec + msecs + msecs network
1 Gbps LAN
Link layer
Head-of-line blocking
● Bloqueio do cabeça de fila, acumula pedidos em queue e atrasa
a solicitação por parte do cliente
● Servidor obrigado a responder pela ordem (ordem restrita)
2. Request → Stream
o Streams são multiplexadas!
o Streams são priorizadas!
3. Camada de “framing”
binário
o Priorização
o Controlo de Fluxo
o Server push
4. Compressão do cabeçalho
(HPACK)
HTTP2 – “Framing” binário
GET /product/123
Server: “You asked for /product/123, but
/product/123 you’ll need app.js, product-photo-1.jpg, as
well… I promise to deliver these to you. That
/app.js
is, unless you decline or cancel.”
/product-photo-1.jpg
l Permite ao cliente fazer uma pausa na stream e retomar o envio mais tarde
l Controlo de fluxo baseado num sistema de créditos (janela):
l Cada frame do tipo DATA decrementa o valor
l Cada frame do tipo WINDOW_UPDATE atualiza o valor
HTTP2 – priorização
l Priorização é fundamental para um rendering eficiente!
l Com HTTP2, o cliente define as prioridade e faz logo os pedidos;
cabe ao servidor entregar os conteúdos com a prioridade certa
time
GET index.html
High
Priority
GET style.css
l Experimentar URLs:
l https://http2.akamai.com/demo
l http://www.http2demo.io/
l https://http2.golang.org/serverpush
t=308
T.c.total = 468 ms (ou 488 ms contando com fecho conexão)
28/04/21 102
Relembrar o exercício HTTP
d) HTTP2 múltiplas streams numa mesma conexão com Server Push
t=0 syn
RTT ack + syn
t=20 ack + GET html
RTT Servidor antecipa necessidade e faz PUSH PROMISE
t=40 de GET img1 / GET Img2 / ... / GET img5
28/04/21 103
QUIC
l Controlo de congestão, cifragem e parte do HTTP2 muda-se
para o QUIC que vai correr sobre UDP...
l Nasce o HTTP/3
HTTP/2 QUIC
HTTP/2 HTTP/2
TLS QUIC
TCP UDP
IP IP
HTTP
Aplicações Web:
Suporte HTTP para Web Services
Conceitos práticos
HTTP Request
Browser Web Server Acesso via
HTTP Reply
Sistema
INTERNET /var/www/cgi-bin/… Operativo
/var/www/html/…
/var/www/icons/…
Web Pages
Páginas HTML,
l Cliente HTTP (Browser) faz “rendering” de HTML com imagens… Imagens,
l Servidor HTTP (Web Server) base serve apenas conteúdos estáticos… Exec. output,
28/04/21 Universidade do Minho etc 106
Aplicações Web: conceitos
l Web Applications
Como construir aplicações mais interactivas (tipo Desktop) sobre este modelo?
– Extensões do lado do cliente: External Viewers Plug-Ins Client Side Scripting
– Extensões do lado do servidor: Server Side Includes, Server Side Scripting
HTTP Request
Browser Web Server
HTTP Reply
HTML5/CSS3 INTERNET Files: HTML, IMG…
JavaScript
Microsoft Silverlight PHP (*.php) (mod_php)
Adobe Flash Java Server Pages (*.jsp *.jsf)
JavaFX
ASP/ASP.NET (*.asp *.aspx)
PDF Viewer
Python (*.py)
…….
Ruby (*.rb *.rbw)
…….
28/04/21 Universidade do Minho 107
Aplicações Web: REST API Design
l Lista de operações sobre um RECURSO (ex: livros) é definida
aproveitando a semântica dos métodos do protocolo HTTP:
POST GET PUT DELETE
Recurso (Create) (Read) (Update) (Delete)
/livros Cria um novo Lista todos os Atualiza um Apaga todos os
livro; livros; conjunto de livros livros;
Pedido: objeto Pedido: vazio; passados no Pedido: vazio;
“livro” no corpo Resposta: corpo do pedido Resposta:
do HTTP listagem de HTTP sucesso ou
Request! livros; insucesso;
/livros/01 Normalmente Devolve o objeto Se existe livro 01 Se existe livro 01
não é usado! que representa o então atualiza-o; apaga-o;
Erro! livro com id 01 Senão dá erro!
POSTMAN WireShark
https://curl.haxx.se
https://httpie.org
https://www.getpostman.com/docs/introduction
https://www.wireshark.org
28/04/21 Universidade do Minho 109
Teste
l Teste com “Developer Tools” do browser
Resultado!
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 53
Content-Type: application/json
Date: Mon, 28 Nov 2016 13:34:09 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.23 (Amazon) OpenSSL/1.0.1k-fips PHP/5.6.28
X-Powered-By: PHP/5.6.28
[
{
"autor": "Camoes",
"id": "01",
"titulo": "Os Lusiadas"
}
]
28/04/21 Universidade do Minho 112
API REST: GET (read one)
$ http GET http://ec2-54-175-51-193.compute-1.amazonaws.com/PHPWebServices/biblioteca.php/livros/01 -v
GET /PHPWebServices/biblioteca.php/livros/01 HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: ec2-54-175-51-193.compute-1.amazonaws.com
User-Agent: HTTPie/0.9.4
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 51
Content-Type: application/json
Date: Mon, 28 Nov 2016 13:39:20 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.23 (Amazon) OpenSSL/1.0.1k-fips PHP/5.6.28
X-Powered-By: PHP/5.6.28
{
"autor": "Camoes",
"id": "01",
"titulo": "Os Lusiadas"
}
{
"autor": "Eça de Queirós",
"id": "02",
"titulo": "Os Maias"
}
{
"autor": "Eca de Queiros",
"id": "02",
"titulo": "Os Maias"
}