
우선 프로토콜을 이야기하기 전에 먼저 계층 모델을 통해 컴퓨터 네트워크 통신 원리를 간단히 살펴보자. 컴퓨터 네트워크는 여러 통신 계층이 조합된 형태로 구성되어 있으며, 각 통신에 참여하는 장비나 프로그램은 각각 맡은 역할이 있는데 이 역할을 추상화 한 것을 계층 모델이라고 한다. 각 계층은 독립적으로 맡은 역할을 수행한다.

서비스 내용을 결정 응용 계층에 속하는 웹 브라우저가 웹 서버에에게 웹 페이지의 URL을 요청하면 웹 서버는 요청에 대한 응답 결과에 해당하는 HTML 데이터를 웹 브라우저에게 응답하고 웹 브라우저는 전달 받은 HTML 데이터를 웹 페이지 형태로 보여준다.
얼핏 보면 사용자 PC의 응용 계층과 서버의 응용 계층간의 데이터 요청/응답 프로세스라고 보여지지만 이는 각 계층이 모두 맡을 일을 처리해야 이루어 지는 체계적이 프로세스이다.
계층의 최상단인응용 계층에서 사용자 PC에서 보고싶어하는 페이지의 URL을 요청하면, 하위 계층인 전송 계층은 응용 계층의 데이터를 목적지에 전달하기 위해 데이터 헤더에 현재 웹 브라우저의 몇 번 포트에서 웹 서버의 몇 번 포트로 요청을 하는지에 대한 내용을 적어서 인터넷 계층에 전달 한다. 이때 데이터가 제대로 전달되지 않으면 재전송한다.
인터넷 계층은 전송 계층에게 전달받은 데이터에 컴퓨터를 식별할 수 있는 address 정보를 덧붙여서 멀리 떨어져 있는 목적지까지 데이터를 잘 전달할 수 있도록 한다.
네트워크 접근 계층은 물리적으로 인접하고 있는 네트워크 어댑터(스위치)가 처리할 수 있는 형태로 데이터를 변환하고 주변 장치까지 데이터를 전달하는 데 필요한 정보를 이더넷 헤더에 적어서 인접해있는 장비나, 컴퓨터에게 변환된 데이터를 전달한다.
컴퓨터와 컴퓨터가 통신할 때 어떤 절차에 따라 무엇을 보낼 것인지, 또 전송이 되지 않았을 때 어떻게 할 것인지 등에 대한 내용을 주고 받아야 한다. 원활한 통신을 위해 통신 시 지켜야할 절차나 규칙을 미리 정해놓았는데 이를 프로토콜(protocol)이라고 한다. 각기 다른 역할을 수행하는 계층마다 동작 방식에 맞는 프로토콜을 사용한다.

클라이언트 PC의 웹 브라우저와 웹 서버는 HTTP(Hypertext Transfer Protocol)라는 응용 계층의 프로토콜을 사용한다. 통신은 요청(request)와 응답(response)로 이뤄지는 데 이 과정에서 주고받는 정보들을 HTTP 메세지라고 한다.

HTTP 응답 메세지은 4개 영역으로 구성되어 있으며 각 영역별 내용은 다음과 같다.
HTTP는 요청과 응답을 한 번씩 주고받은 후에 통신을 끊어(Connectionless) 통신 상태 정보를 저장하지 않는 Stateless 프로토콜이다. 그럼 이러한 특징으로 발생할 수 있는 문제들을 (e.g. 동일 사용자가 보낸 요청을 인식하지 못하는 문제) 어떻게 해결할 수 있을까?
Connectionless: 클라이언트에서 서버에 요청을 보내면 서버는 응답 후 접속을 끊는다. 이를 방지하기위해 HTTP1.1에서 Connection 헤더에 keep-alive를 입력하면 연결이 끊기지 않는다.
Stateless: 서버가 응답 헤더에 쿠키(Cookie)값을 추가하여 응답하여 클라이언트 PC에 쿠키를 저장하게끔 한다.앞서 언급했던 바와 같이 웹 페이지를 받아보기 위해서 HTTP 요청을 보낼 때는 URL(Uniform Resource Locator)을 사용하는데 URL의 각 요소가 의미하는 바는 다음과 같다.


- 100번대: 정보
- 200번대: 성공
- 300번대: 경로 전환
- 400번대: 에러
| 상태 코드 | 상태 | 의미 |
|---|---|---|
| 100 | Continue | 서버는 헤더가 받았고 바디를 기다리는 중 |
| 101 | Switching Protocols | 클라이언트가 서버에게 프로토콜을 바꾸자고 제안했고 서버가 수락함 |
| 200 | OK | 요청이 성공했고 요청한 결과 데이터를 응답으로 보냈음 |
| 201 | Created | 요청이 성공했고 새로 만들어진 URL을 응답으로 보냄. 웹 서비스나 웹 애플리케이션에서 사용됨 |
| 301 | Moved Permanently | 요청한 내용이 다른 경로로 옮겨졌음. 이후 옮겨진 경로로 요청해야 함 |
| 302 | Found | 요청한 내용이 다른경로로 옮겨졌음. 임시로 옮겨진 것이라 이후에도 동일한 경로로 요청해야 함 |
| 304 | Not Modified | 요청한 내용은 갱신되지 않았음 |
| 400 | Bad Request | 요청에 문제가 있음 |
| 403 | Forbidden | 요청한 내용은 접근 금지됨 |
| 404 | Not Found | 요청한 내용을 찾을 수 없음 |
참고