HTTP
HTTP란?
HyperText Transfer Protocol의 약자
•
클라이언트 모델
◦
클라이언트(브라우저)는 요청, 수신 그리고 웹 오브젝트 표현을 담당한다.
•
서버 모델
◦
서버는 요청에 따른 응답을 보낸다.
HTTP는 stateless 하다.
서버는 클라이언트의 과거응답에 대한 정보를 유지하지 않는다.
왜냐하면 상대를 유지하는것은 복잡하기 때문이다.
Non-Persistent HTTP
서버쪽에서 하나의 오브젝트만 보낸 뒤, TPC 커넥션을 종료하는 HTTP
HTTP의 요청 흐름
1.
유저가 URL을 입력 (www.someSchool.edu/someDepartment/home.index)
2.
HTTP 클라이언트 (브라우저)는 HTTP서버에 TCP커넥션을 맺음 (:80 포트)
a.
HTTP의 경우 well known port 번호를 이용한다. 80번
3.
서버는 80번 포트의 커넥션을 기다린다. 커넥션이 맺어질 경우 클라이언트에게 알림
4.
그러면 클라이언트는 TCP 소켓을 통해서 HTTP 메세지를 보냄. 위 요청에서는 someDepartment/home.index를 나타내길 원한다는 메세지임
5.
HTTP서버는 요청 메세지를 수신함, 그리고 요청에 맞는 Response 메세지를 소켓을 통해 클라이언트로 보내줌
6.
해당 메세지를 보낸 서버는 TCP커넥션을 종료함
7.
HTTP 클라이언트는 응답을 받고 HTML을 파싱하고 화면에 표시함, 그리고 파싱중 여러 다른 파일들(이미지)를 발견함
HTTP의 응답 시간
RTT에 관한 설명이미지
응답시간(Response Time)이란? 유저가 보낸 응답이 server를 거쳐 유저에게 display 될때 까지의 시간
•
RTT(Round Trip Time) : 작은 패킷이 클라이언트에서 보내 서버에서 되돌아올때까지의 시간
•
HTTP Response Time
◦
TCP 커넥션을 위한 하나의 RTT
◦
HTTP 요청과 작은 응답 바이트가 돌아올때 까지의 RTT
◦
파일 전송 시간
◦
응답시간 = 2RTT + 파일 전송 시간
Persistent HTTP
Non-Persistent HTTP Issues (A.K.A. HTTP 1.0)
•
매 오브젝트 요청마다 2개의 RTT가 필요하다.
•
이런 딜레이를 막기위해 브라우저가 경우에 따라 병렬적 TCP커넥션을 맺기도 한다.
•
OS는 이런 각각의 커넥션에 오버헤드를 겪는다.
◦
각 소켓마다 버퍼, TCP 커넥션을 할당해줘야 하므로!
Persistent HTTP (A.K.A. HTTP 1.1)
•
서버는 응답을 전송한 후 연결된 커넥션을 닫는다.
•
HTTP 메세지를 이미 열려져 있는 커넥션을 통해서 요청한다.
•
때문에 모든 참조 오브젝트에 대해 최소 하나의 RTT만을 사용한다.
HTTP Message
HTTP에는 2가지 종류의 메세지 타입이 있다. (Request, Response)
HTTP Request Message
HTTP 요청에 대한 메세지
HTTP 요청의 일반적인 포멧
•
HTTP 요청 메세지는 ASCII 코드로 이루어져 있다.
POST 메서드
•
웹페이지는 가끔 사용자의 입력을 받아야할때가 있다.
•
입력은 entry body에 입력되어 서버로 전송된다.
URL 메서드
•
GET 메서드를 이용한다.
•
URL 필드에 요청을 보낸다. (쿼리 파라미터)
요청 타입의 호환성
•
HTTP 1.0
◦
GET, POST, HEAD
•
HTTP 1.1
◦
GET, POST, HEAD, DELETE, PUT
HTTP Response Message
HTTP Status Code
상태코드는 응답의 첫번째 줄에 위치해있습니다.
•
200 : OK
•
301 : Moved Permently
•
400 : Bad Request
•
404 : Not Found
•
505 : HTTP Version Not Support
참고하기 좋은 자료
1) well known port list - https://ko.wikipedia.org/wiki/TCP/UDP의_포트_목록
2) 모질라 개발자 상태코드 문서 - https://developer.mozilla.org/ko/docs/Web/HTTP/Status
3) Multipart/form-data는 GET과 POST만 지원한다 : https://mangkyu.tistory.com/218
4) HTTP 3.0 QUIC 프로토콜 : https://blog.naver.com/PostView.nhn?blogId=renucs&logNo=220887163028