아래 내용은 네이버 카페 'VC++ 삽질공간' 의 제온 님의 글 중 퍼온 것입니다.
[출처] HTTP Protocol|작성자 함박웃음
HTTP
HTTP 서버를 구현하려면 HTTP 프로토콜을 지원하여야 할 것입니다.
이곳에 가면 HTTP 프로토콜에 대한 문서를 보실 수 있습니다.
http://www.w3.org/Protocols/rfc2616/rfc2616.html
또 이곳에는 HTTP 프로토콜 문서를 한국어로 번역해놓은 문서가 있습니다. 단 이곳에서 번역해 놓은 문서는 HTTP/1.0 버전입니다. (위에 있는 문서는 HTTP/1.1 버전입니다.)
http://www.initech.com/%7Eqkim/HTTP/http10v3.html
제가 구한 자료에서는 HTTP 프로토콜을 알기쉽게 요약해 놓은 것이 있습니다. 이 자료는 저작권 문제상 함부로 업로드해놓지는 않을 것입니다만(하지만 인터넷에서 약간의 검색으로 구한 자료이니 맘만 먹으면 쉽게 구하실 수 있을 겁니다.), HTTP 프로토콜에 대한 설명만 살짝 ^^; 가져다 보여드리면 다음과 같습니다.
HTTP Protocol
TCP/IP의 애플리케이션 계층의 프로토콜인 HTTP 메시지는 요청라인과 상태라인에 의해서 요청 메시지와 응답메시지로 나눌 수 있다.
l 요청라인
메소드 (Method)
요청 메시지는 메소드에 의해 분류되는데 다음과 같은 메서드를 가진다.
Method |
기 능 |
GET |
클라이언트가 URL 에 정의되어 있는 문서를 검색 오류가 없을 경우 메시지의 BODY 에 문서의 내용을 저장하여 응답 |
HEAD |
GET 과 유사하나 응답메세지에 BODY 를 포함하지 않음 |
POST |
클라이언트가 서버로 정보를 입력 ( 제공 ) 할 때 |
PUT |
URL 의 위치에 문서를 저장할 때 사용 |
PATCH |
변경사항의 목록을 가진다는 점을 제외하고 PUT 과 유사함 |
COPY |
파일을 다른 위치로 복사할 때 사용. 원본파일은 URL 에서 표기되고, 목적지는 헤더에서 주어짐 |
MOVE |
파일을 다른 위치로 이동할 때 사용. 원본파일은 URL 에서 표기되고, 목적지는 헤더에서 주어짐 |
DELETE |
서버에서 문서를 제거하기 위해 사용 |
LINK |
링크를 생성할 때 사용 |
UNLINK |
LINK 에서 생성한 링크를 삭제할 때 사용 |
OPTION |
클라이언트가 서버에게 사용 가능한 옵션을 질의하기 위해 사용 |
URL
예를 들면, "http://www.abc.com/abc"와 같이 나타냄
HTTP 버전 (HTTP version)
HTTP 버전은 "HTTP/1.x" 와 같은 표현으로 표시됨
l 응답라인(상태라인)
HTTP 버전 (HTTP version)
요청라인의 HTTP version 필드와 동일
상태코드
Code |
Phrase |
Description |
Informational | ||
100 |
Continue |
The initial part of the request has been received and the client may continue with its request |
101 |
Switching |
The server is complying with a client request to switch protocols defined in the upgrade header |
Success | ||
200 |
OK |
The request is successful |
201 |
Created |
A new URL is created |
202 |
Accepted |
The request is accepted, but it is not immediately acted upon |
204 |
No content |
There is no content in the body |
Redirection | ||
301 |
Multiple choices |
The requested URL refers to more than one resource |
302 |
Moved permanently |
The requested URL is no longer used by the server |
304 |
Moved temporarily |
The requested URL has moved temporarily |
Client Error | ||
400 |
Bad request |
There is a syntax error in the request |
401 |
Unauthorized |
The request lacks proper authorization |
403 |
Forbidden |
Service is denied |
404 |
Not found |
The document is not found |
405 |
Method not allowed |
The method is not supported in this URL |
406 |
Not acceptable |
The format requested is not acceptable |
Server Error |
|
|
500 |
Internal server error |
There is an error, such as a crash, in the server site |
501 |
Not implemented |
The action requested cannot be performed |
503 |
Service unavailable |
The service is temporarily unavailable, but may ve requested in the future |
상태구문 (Status phrase)
문자로 상태코드를 설명하는데 상태코드의 Description 부분임
음냐… 하지만 학습을 목적으로 만드는 간단한 http 서버에서 저 프로토콜들을 모두 지원할 필요는 없지 않을까요? -_-;
프로젝트의 목적은 저 프로토콜을 모두 지원하여 제대로 된 HTTP 서버를 만드는 것이 아니라, 간단한 HTTP 서버를 구현해보고 그 전체적인 아키텍쳐를 이해하고자 하는 것입니다. 문제를 초-간단화시키기 위해 저 많은 클라이언트로부터의 요청 라인의 메소드 중 GET 만을 지원할 것입니다. 그것도 다음과 같은 초간단 형태로 말입니다.
GET http-path-to-file\r\n\r\n
GET http-path-to-file 이외의 모든 클라이언트로부터의 요청 정보는 깔끔하게.. 무시할 것입니다. -_-;
응답 라인에서는 클라이언트로부터의 요청 메소드가 GET이 아니라면 405를, 요청된 문서가 발견되지 않았다면 404를, 성공적으로 요청된 문서를 보낼 때는 200을 클라이언트에게 보낼 것입니다.