우선 프로토콜을 이야기하기 전에 먼저 계층 모델을 통해 컴퓨터 네트워크 통신 원리를 간단히 살펴보자. 컴퓨터 네트워크는 여러 통신 계층이 조합된 형태로 구성되어 있으며, 각 통신에 참여하는 장비나 프로그램은 각각 맡은 역할이 있는데 이 역할을 추상화 한 것을 계층 모델이라고 한다. 각 계층은 독립적으로 맡은 역할을 수행한다.
서비스 내용을 결정
응용 계층
에 속하는 웹 브라우저가 웹 서버에에게 웹 페이지의 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 | 요청한 내용을 찾을 수 없음 |
참고