http 정의는 여러번 했으니깐 넘어가겠다.
요즘은 hypertext를 넘어서 모든 형태의 데이터를 넘길 수 있고, 서버간의 실시간 데이터도 http로 주고받는다.
대규모 게임서버들은 여전히 tcp를 쓰지만, 모바일겜같은 일방향 통신게임들은 http로도 많이들 한다.
TCP : HTTP/1.1 HTTP/2
UDP : HTTP/3
일단은 1.1이 주류지만, 2 3 도 증가세이다.
구글같은경우 전부 3을 쓰고 네이버도 2를 쓴다.
이 글 참조
상태를 유지하지 않는 프로토콜이다.
상태유지를 하는 경우, 중간에 점원이 바뀌면 정보를 인수인계 해야한다.
무상태는 중간에 바꿔도 아무 문제가 없다
갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.
무상태는 응답서버를 쉽게 바꿀 수 있다.
클라이언트가 요청에 정보를 다 담아서 보내기때문에 상태를 보관할 필요가 없고 서버가 망가지더라도 교체가 가능하다.
모든것을 무상태로 설계할 수는 없다.
연결을 유지하는 모델은 클라이언트가 사용안해도 연결을 유지해야해서 자원낭비가 심하다
하지만 비연결모델은 요청 후 응답이 지나면 바로 연결을 끊어버린다. 이렇게 자원을 아낄 수 있다.
연결지속 방식에서는 모든 연결이 완료될때까지 지정시간동안 연결을 유지한다.
구조는 다음과 같다.
전체구조
start-line
header
emptyline CRLF
message body
요청
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
응답
HTTP/1.1 200 OK start-line 시작 라인
Host: www.google.com
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
<html>
<body>...</body>
</html>
request line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
총 3가지로 구성된다.
GET, POST, PUT, DELETE 로 수행동작을 지정한다.
절대경로로 시작하는 목표 쿼리
버전 들어간다.
status-line = HTTP-version SP status-code SP reason-phrase CRLF
버전이다
응답코드이다. 200 400 500으로 구분되는 그 코드이다.
200 - 성공
400 - 클라이언트 요청 오류
500 - 서버 요청 오류
이유문구는 간단한 설명이다.
header-field = field-name ":" OWS field-value OWS
호스트의 소대문자 구분을 하지 않는다.
전송에 필요한 모든 부가정보를 가지고 있다.
실제 전송할 데이터가 있으며, byte로 표현되는 모든 데이터가 전송가능하다.