본문 바로가기
CS/네트워크

[네트워크] 응용 계층 Application Layer : Web과 HTTP

by DenverAlmighty 2024. 12. 11.

1. HTTP

1) HTTP 정의 및 특징

HTTP : Hypertext transfer protocol

HTTP는 Web에서 사용하기 위해 만들어진 프로토콜이다. 이메일, 멀티미디어 스트리밍에 사용되기도 한다. 

웹 페이지는 레퍼런스 객체들(이미지, 오디오, Java applet 등)을 포함한 html파일로 구성되어있다. 각 객체들은 URL로 접근할 수 있다.

 

- 클라이언트/서버 구조이다.

클라이언트 : 클라이언트 프로세스가 실행된다. 브라우저가 url을 입력하면, url에 웹 페이지를 가져와 보여준다. 

서버 : 서버 프로세스가 실행된다. 클라이언트의 요청을 기다라다가, 요청을 받으면 해당 객체를 전송한다.

 

- TCP를 사용한다.

Web은 data integrity가 중요하다.

클라이언트가  서버에게 TCP 연결을 시작한다(소켓 생성). (port 80)

서버는 클라이언트가 보낸 TCP연결을 받아들인다.

브라우저와 웹서버간 HTTP 메세지 (어플리케이션 계층 프로토콜 메세지)를 교환한다.

TCP 연결이 끊긴다.

 

- HTTP는 상태를 보존하지 않는다(stateless)

클라이언트가가 이전에 보냈던 요청이 뭐였는지 기억하지 않는다.

stateful하기위해서는 모든 request를 저장하는데도 overhead 발생하고, crash 발생 시 서버와 클라이언트 뷰 일치시키는데도 상당한 비용이 발생한다.  

 

2) Non-persistent VS persistent HTTP

(1) Non-persistent(비지속적) HTTP

최조에 고안된 HTTP는 비지속적이었다. 서버가 객체 1개를 보내고 연결을 끊었다.

웹 페이지는 여러 객체로 구성되어있는데, 객체 수 만큼 연결을 맺어야했다. 이 방식은 비효율적이므로 persistent HTTP가 만들어졌다.

 

None-persistent HTTP 동작 과정

동작 과정은 아래와 같다. 

None-persistent HTTP 동작 과정

  1. HTTP 클라이언트가 HTTP 서버(프로세스)에게 TCP연결 시작 (URL + 80포트)
  2. HTTP 서버는 80포트의 TCP 연결 기다림. 연결이 승낙되면 클라이언트에게 알림
  3. HTTP 클라이언트가 URL을 포함한 HTTP 요청 메세지를 TCP 연결 소켓으로 보낸다.
  4. HTTP서버는 요청 메세지를 받고, 요청 객체를 포함한 응답 메세지를 작성한다. 그리고 소켓으로 메세지를 보낸다.
  5. 소켓에 넣은 후 HTTP서버가 TCP 연결을 끊는다.
  6. HTTP 클라이언트는  html 파일을 포함한 응답 메세지를 받아 보여준다. html 파일을 파싱해 참조된 객쳊들 찾는다.
  7. 각각의 객체에 대해 위의 과정을 반복한다.

Non-persistent HTTP Response Time

Response Time : 사용자가 URL을 입력 후 부터 웹 페이지가 보이기까지 시간

RTT (Round Trip Time) : 작은 패킷(=transmit하는데=미디엄에 밀어넣는데 걸리는 시간이 거의 무시할 만한 수준인 경우)이 클라이언트->서버->클라이언트로 돌아오는데 걸리는 시간

 

Non-Persistent HTTP Response Time

Non-persistent HTTP Response Time

None-persistent HTTP Respons Time = 2 RTT + 파일 전송시간

= TCP 연결을 초기화하는데 1 RTT

+ HTTP 요청과 HTTP 응답의 처음 몇 바이트가 돌아오는데 1 RTT

+ 파일 전송 시간

 

 

응답 메세지 전송 후 연결을 종료하므로 객체마다 TCP 연결 새로 시작하는데, 매번 2 RTT가 걸린다.

병렬 TCP 연결로 시간을 줄일 수 있다. 

전송 계층 이하는 OS가 하는데 소켓을 할당하고, TCP연결마다 버퍼가 필요한데 OS 자원이 사용된다.(+연결 관리에도)

그래서 Persistent HTTP 가 등장했다. 

 

 

(2) Persistent HTTP

서버는 응답 메세지를 전송한 후 연결을 닫지 않고 유지한다.

클라이언트가  참조된 객체를 찾자마자 요청을 보낸다.

참조된 모든 객체에 대해 최소한 1 RTT만 필요하다.

 

 

3) HTTP 메세지

http 메세지는 request, response 2가지가 있다.

(1) HTTP request 메세지

HTTP request 메세지는 ASCII 코드로 되어있다.

메세지는 Request Line, Header Line으로 구성되어있고, 헤더 뒤에 entity body가 올 수도있다.

라인 시작에 carriage return, line feed는 헤더의 마지막을 나타낸다.

일반적인 HTTP Request 메세지 형식
HTTP request 메세지 예시

  • Request line :
    • Method(GET, POST, ...) : 어떤 작업을 할 지
    • 요청하는 파일 URL
    • HTTP Client가 사용하는 HTTP 버전
    • Host : HTTP host
    • User Agent : 클라이언트 브라우저 와 버전
    • Accept-Language : 클라이언트 언어(브라우저 설정)
    • Connection :
      • keep-alive : 서버에게 연결 유지 요청 

 

소켓으로 메세지를 주고받으므로 주소가 정해져있는데 Request line에 또 쓰는 이유?

 

 

입력 양식 업로드

- POST : 웹 페이지에 입력을 사용하기도 하는데, 입력값이 서버의 entity body에 업로드된다.

- URL : GET method를 사용한다. 입력값은 request line의  URL필드에 업로드된다.

 

HEAD : response 메세지만 보내고 지금 요청한 파일 보내지는 마 (개발/테스트 시)

 

HTTP 버전 별 Method 종류

  • HTTP/1.0 : GET, POST, HEAD Method가 있는데 서버에게 요청하는 기능이다.
  • HTTP/1.1 : 관리자 기능을할 수 있는 PUT, DELETE method가 추가되었다. 
    • PUT : entity body에 파일 업로드 특정 URL필드 경로로
    • DELETE : 특정 URL 필드의 파일 삭제

(1) HTTP Response 메세지

Response 메세지는 status line, header line, data로 구성된다.

HTTP Response 메세지 예세지

  • Status line : 
    • HTTP 버전
    • Status 코드
    • Status phrase : Status Code와 동일한 내용의 문구이다.
  • Header Line
    • Date : response를 제공하는 시간
    • Server : 서버 종류
    • Last-Modified  : 서버가 제공하는 페이지가 마지막으로 수정된 시간
    • Request Line과 동일하게 라인 시작에 carriage return, line feed는 헤더의 마지막을 나타낸다.
  • Data : response에서 요청한 데이터

 

HTTP Response Status Code

코드는 100~599까지 있는데, 100번단위로 상태가 다르다.

 

100번대는 정보적 응답

200번대는 성공적인 응답

300번대는 리디렉션 메세지

400번대는 클라이언트 오류 응답

500번대는 서버 오류 응답

 

아래는 대표적인 Status Code와 그 의미이다.

Status Code + Phrase 의미
200 OK 요청 성공. 이 메세지 뒤에 요청한 객체있다.
301 Moved Permanently 요청한 객체가 이동했다. 이 메세지 뒤 헤더 Location에 새 위치 보낸다.
400 Bad Request 서버가 요청한 메세지를 이해할 수 없다.
404 Not Found 요청된 문서를 이 서버에서 찾을 수 없다.
505 HTTP Version Not Supported 서버가 요청한 HTTP 버전을 지원하지 않는다.