[네트워크 프로그래밍] HTTP
[네트워크 프로그래밍] HTTP
- HTTP는 웹 클라이언트가 서버와 대화하는 방법과 서버에서 다시 클라이언트로 데이터가 전송되는 방법을 정의한 표준이다.
프로토콜
- HTTP는 웹 브라우저와 웹 서버 사이에 통신을 위한 표준 프로토콜.
- HTTP는 클라이언트와 서버가 연결을 맺는 방법, 클라이언트가 서버에게 데이터를 요청하는 방법, 서버가 요청에 응답하는 방법, 그리고 연결을 종료하는 방법 에 대해서 명시한다.
- HTTP 연결은 데이터 전송을 위해 TCP/IP 프로토콜을 사용한다.
[클라이언트가 서버로 보내는 요청은 4단계를 거친다]
1. 클라이언트가 서버의 HTTP 기본 포트 80에 대해 TCP 연결을 연다. 다른 포트 사용 시 URL에 명시한다.
2. 클라이언트가 특정 경로에 위치한 리소스를 요청하는 메시지를 서버로 보낸다. 요청에는 헤더와 선택적으로 빈 줄로 구분된 데이터가 포함된다.
3. 서버는 클라이언트에게 응답을 보낸다. 응답은 응답 코드로 시작하며, 메타 데이터의 전체 헤더와 빈 줄 그리고 요청된 문서 또는 에러 메시지가 뒤따라온다.
4. 서버는 클라이언트와 연결을 종료한다.
- 아래의 일반적인 클라이언트의 요청 형태를 봐보자.
GET /index.html HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:20.0)
Gecko/20100101 Firefox/20.0
Host: en.wikipedia.org
Connection: Keep-alive
Accept-Language: en-US, en;q=0.5
Accept-Encoding: gzip, deflate
Accept: text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8
- 이 요청의 첫 번째 줄을 요청라인(request line)이라고 부르며 메소드, 리소스 경로, HTTP 버전 정보 를 포함하고 있다.
- 메소드는 요청 방식을 명시하며, GET 메소드는 서버에 해당 리소스의 반환을 요청한다.
- ./index.html은 서버에 요청된 리소스의 경로를 나타낸다.
- HTTP/1.1은 클라이언트가 지원하는 프로토콜이다.
- 헤더의 각 줄은 캐리지 리턴과 라인 피드의 쌍으로 끝난다.
- User-Agent는 접속에 사용된 브라우저의 종류를 서버에게 알려주며, 서버는 이 헤더를 보고 특정 브라우저 타입에 최적화된 파일을 보내는 것이 가능하다.
- 대부분의 브라우저들은 헤더에 서버의 이름을 명시한 Host 필드를 보낸다. Host 필드는 동일한 IP주소에서 서비스되는 서로 다른 이름의 호스트를 서버가 구분하는 데 사용된다.
- Accept 키워드는 클라이언트가 처리할 수 있는 데이터 타입을 서버에게 알려준다.(이 값을 무시하는 서버도 꽤 있음)
- 요청의 끝은 두번의 캐리지 리턴, 라인 피드 쌍으로 끝난다.
- 요청을 받은 서버는 마지막 빈 줄을 확인하는 즉시, 동일한 연결을 통해 클라이언트에게 응답을 보내기 시작한다. 응답은 상태 라인으로 시작하고, 이어서 요청 헤더와 동일한 이름:값 구문을 사용하여 응답을 설명하는 헤더가 온다. 그리고 하나의 빈 줄과 요청된 리소스가 온다.
- 아래 응답 구문을 봐보자
HTTP/1.1 200 OK
Date: Sun, 21 Apr 2013 15:12:46 GMT
Server: Apache
Connection: close
Content-Type : text/html; charset=ISO-8859-1
Content-length: 115
-> 리소스 내용
- 첫째 줄은 서버가 사용하는 프로토콜(HTTP/1.1)과 응답 코드를 나타낸다. 200 OK는 가장 일반적인 응답 코드이며, 요청이 성공적으로 처리되었음을 의미한다.
- 다른 헤더에는 응압이 만들어진 서버 기준의 시간, 서버 소프트웨어(Apache), 전송 종료 후 연결의 상태, MIME 미디어 타입, 전송된 문서의 크기 등을 나타낸다.
- HTTP 버전과 상관없이, 100~199까지의 응답 코드는 항상 정보를 제공하는 용도로 사용되고, 200~299는 항상 성공을 의미, 300~399는 항상 전송 방향을 바꾸는 용도로 사용되고, 400~499는 항상 클라이언트의 요청 에러를 나타낸다. 500~599까지는 서버 에러를 나타냄.
Keep-Alive
- HTTP 1.1 이후 버전부터는 서버가 응답을 보낸 후에 소켓을 닫지 않는다. 서버는 소켓을 열어 둔 채로 클라이언트가 해당 소켓을 통해 새로운 요청을 보내길 기다린다.
- 이는 다수의 요청과 응답을 단일 TCP 연결을 통해 연속적으로 보낼 수 있다는 것을 의미함.
- 하지만 클라이언트의 요청이 있어야만 응답이 오는 기본 구조는 변하지 않는다.
- 클라이언트는 HTTP 요청 헤더의 Connection 필드의 값을 Keep-Alive로 설정하여 소켓을 재사용할 것임을 표시한다.
- URL 클래스는 명시적으로 해제하지 않는 한 투명하게 HTTP 연결 유지(Keep Alive) 기능을 지원한다. 즉, URL 클래스는 서버가 해당 연결을 종료하기 전에 같은 서버에 다시 연결할 경우 소켓을 재사용한다.
댓글남기기