HTTP
HTTP (HyperText Transfer Protocol)
request - response 방식의 web 통신 protocol
HTML 문서를 주고 받는데 사용
TCP/UDP를 사용
port 80번 사용
특징
connectionless: 요청/응답 후 바로 연결이 끊김
stateless: 연결을 끊는 순간 client-server의 통신이 끊어짐
HTTPS (HyperText Transfer Protocol over Secure Socket Layer)
SSL (Secure Socket Layer)
TCP/IP 사용, 443 port
공개키 알고리즘 방식
인증서 유지 비용 등 보안 관련 overhead
HTTP request header
POST / HTTP/1.1
# request header------------------
Host: localhost:8000
User-Agent: Mozilla/5.0 (...
Accept: text/html, application/xhtml+xml,...,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
# general headers-----------------
Connetion: keep-alive
Upgrade-Insecure-Requests: 1
# Entity headers -----------------
Connection-Type: Multipart/form-data; boundary=-12656974
Content-Length: 345
Accept: content type
ex. text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Charset: ex. utf-8
Accept-Encoding: gzip, deflate
Connection: Keep-alive / Upgrade
Referer: http://en....
X-Forwarded-For: client1, proxy1, proxy2, 129.78.138.66
X-Forwarded-Host: en.wikipedia.org:80
Warning: 199 Miscelaneous warning
HTTP response header
HTTP/1.1 200 OK
# response headers
Access-Control-Allow-Origin: * <- CORS 허용 범위
Connection: Keep-Alive
Content-Encoding: gzip
# General headers
Date: Wed, 10 Aug ... GMT
Etag: "d9.........b"
Last-Modified: Wed, 10 Aug ...... GMT
Server: Apache
Set-Cookie: csrftoken=...
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Frame-Options: DENY
Age: proxy cache에 있던 시간 ex. 12
Cache-Control: server의 cache 설정 시간 ex. max-age=3600
Connection: close
Content-Disposition: content type ex. attachment; filename="hello.png"
Content-Encoding: gzip
Content-Length: 348
Program: no-cache
CORS (Cross Origin Resources Sharing)
외부 domain 통신을 위한 표준 정책
XMLHttpRequest는 외부 domain server와 통신 불가
서버에 CORS 지원 확인
Access-Control-Request-Method로 보낼 method를 알림
Access-Control-Request-Headers로 보낼 header를 알림
Allow 항목은 Request에 대응됨 - 서버가 허용하는 method와 header 응답 시 사용
Request와 allow가 일치 시 CORS 요청이 수행됨
HTTP/2
Hypertext Transfer Protocol Version 2 HTTP/2는 클라이언트와 서버 간에 데이터 서식(프레임)이 지정되는 방식과 데이터가 전송되는 방식을 수정
SPDY 기반 97년 HTTP 1.1의 개선 2015년 HTTP 2가 승인 후 공개
주요 특징
- HTTP header data 압축
- server push
- 요청에 대한 HTTP pipeline 처리
- 1.x의 HOL blocking 문제 해결
- single TCP 연결로 multiple 요청 처리 (다중화)
+------------------------+
| application (HTTP 2.0) |
| +----------------+ |
| | Binary framing | |
+-+----------------+-----+
| Session (TLS) (opt) |
+------------------------+
| Transport (TCP) |
+------------------------+
| Network (IP) |
+------------------------+
Binary frame 계층
HTTP messgae가 encapsulated 되어 client와 server 사이에 전송됨
HTTP 1.1 header
POST /upload HTTP/1.1
Host: www.example.org
Content-Type: application/json
Content-Length: 15
{"msg":"hello"}
HTTP 2.0
HEADERS frame <-- 위 POST 부터 Contnet-Length 까지
DATA frame <-- 위 {"msg":"hello"} 부분
server/client간 data 교환 방식
binary frame 지원을 위해 변경 되었음
stream: 연결 내에서 전달되는 byte stream의 flow (하나 이상 전달 될 수 있음)
message: 요청/응답에 대한 frame sequence
frame: HTTP/2에서의 최소 통신 단위
frame은 header, message paylod등 특정 유형의 data를 전달함
TCP 연결
HTTP/1.x
성능 개선을 위해 client에서 여러 병렬 요청 수행 시 여러 TCP 연결 사용
HTTP/1.x 전달 모델의 직접적인 결과로 발생
연결당 하나의 응답만 전달되도록 보장함
HOL (Head-of-Line) 차단과 기본 TCP 연결의 비효율적인 사용을 초래
HTTP/2는 위와 같은 제한을 제거
전체 요청 및 응답을 다중화
server/client간 HTTP message를 여러 frame으로 세분화 (interleaving) 해서 처리
ex.
stream1에 대한 data frame
stream2에 대한 headers
stream1에 대한 headers
...
->
여러 요청에 대해 병렬 처리 가능
요청을 차단하지 않고 병렬 처리 가능
flow control
HTTP/2 stream flow control 가능
양방향
credit 기반의 flow
flow control은 비활성화 될 수 없음
흐름제어는 E2E (End-to-End) 방식이 아니라 Hop-by-Hop 방식
TCP
Transmisson Control Protocol
flow control
connection-oriented: persistent connection
연결 -> 전송 -> 종료(close)
segment에 checksum check로 손상파악
sequence number 할당 (순서)
ACK, ReTransmission mechanism 사용
bidirectional
TCP는
무결성을 전제하기에 거리가 멀어질수록 RTT가 늘어남.. 느려짐
수신 측에서 보낸 전송 확인 ACK를 받고 다시 전송함
64KB window size
RTT는 ICMP protocol 사용한 ping으로 확인 가능
RTT가 100ms 경우, 1MB는 1.6 sec의 시간 소모됨
100ms 마다 64KB
1024 / 64 = 16
16 x 100ms = 1.6 sec
UDP, IP
connectionless protocol
Socket
Berkley Sockets
Socket -> TCP -> IP
stream socket
uses TCP
TCP socket -> use TCP port
datagram socket
use UDP
~65500B
UDP socket -> use UDP port
TCP socket
bind 후, (address, port에 bind)
server는 accept로 wait
client는 connect로 server 연결
이후 send/receive 가능
session oriented
3 way handshaking 과정으로 session 생성
UDP socket
bind 후,
UDP datagram은 비동기로 send/recv
Socket
create a new communication endpoint
Bind
attach a local address to a socket
listen
announce willingness to accept connections
accept
block caller until a connection request arrives
connect
actively attemp to establish a connection
send
send some data over the connection
receive
receive some data over the connection
close
release the connection
SPDY
web content 전송용 Google의 비표준 protocol 압축, 다중화, 우선순위 설정을 통해 latency 감소 SPDY는 Google의 상표 2016년 부터 Chrome browser에서 SPDY 지원 제거 -> HTTP 2.0 사용 목적 web page loading 시간 감소 목적 1 socket 연결로 page 구성 요소들을 한번에 전송 gzip(/DEFLATE)로 압축 server PUSH 무조건 암호화 연결 (SSL or TLS)
SPDY in HTTP HTTP의 전송 계층에서 사용되는 protocol임 SDPY는 HTTP header를 해석하고 단순화하여 압축 전송 (동일 header 전송 시 다시 보내지 않음) HTTP header는 압축해서 전달
HTTP Hypertext Transfer Protocol 주로 HTML 문서 전송용 TCP, UDP 사용 80 port 사용 request - response protocol client에서의 요청 -> server 응답 history 팀버너스리의 팀이 HTTP를 발명, WWW 제안 최초 protocol은 GET method만 존재
RSA 소인수분해의 시간이 오래 걸리는 것에 기반한 암호화 알고리즘 2개 키 사용 public key : encryption 용 private key : decription 용
sender가 public key로 암호화 해서 전송
receiver가 private key로 복호화 해서 사용
SHA secure hash algorithm
SHA-0은 충돌 발생 -> 퇴출 수속
SHA-1 구글이 충돌 발견
국세청 홈택스에서 이를 사용
SHA-2
SHA-245
인터넷뱅킹