[kocw 이미정] 5. HTTP

이건회·2022년 1월 15일
0

네트워크

목록 보기
5/24


  • 위 사진은 Non-persistent HTTP의 동작방법이다. http는 tcp위에서 동작하므로 유저가 url을 타이핑하면 http client인 브라우저는 tcp 커넥션 요청을 보낸다. 서버가 그 요청을 받아들이면 커넥션이 형성되고 클라이언트가 http request 메세지를 서버에 보내고, 이를 받은 그에 대한 response 메세지를 클라이언트로 보낸다. request 메세지에는 url이 표시가 되고 reponse 메세지에는 요청에 대한 object가 포함된다. 서버가 object를 보내면 http 서버는 tcp커넥션을 닫는다. 이후 http클라이언트는 response 메세지를 받아서 그곳에 실린 base html 파일을 스크린에 전시한 후, 그 파일을 파싱하여 base html이 참조하는 추가적인 objects를 발견한다. 그러면 그 추가 object를 받기 위해 다시 위의 과정을 반복한다.

  • +)TCP 커넥션을 만든다는 말은 서버와 클라이언트 프로세스가 애플리케이션과 트랜스포트 사이에 소켓을 만든다는 말이다.

  • Non-persistent http의 response time은 어떻게 될까? response time은 유저가 브라우저에 url을 타이핑을 하고 리턴한 이후로 유저에게 웹페이지가 팝업되기까지 얼마나 시간이 걸리는지를 의미한다.

  • RTT는 round trip time으로 아주 작은 패킷이 클라이언트로부터 서버로 갔다가 다시 돌아오기까지 걸리는 시간을 의미한다.

  • http의 response time: tcp 커넥션을 연결하기 위해 1 rtt가 걸린다. 커넥션을 맺고 request 메세지를 보내고 object를 보내 도착하기까지 다시 1 rtt가 걸리는데 여기서 file transmission(transmission time=L/R)하는 시간이 추가적으로 걸린다.따라서 Non-persistent http의 response time은 2RTT + file transmission time 이다.

  • 위의 클라이언트 time에서 서버 time으로 그은 단선 동안 걸린 시간은 propagation time이다.

  • 따라서 propagation time은 RTT/2 이다.

  • Non-persistent http에서는 object를 하나 보내면 서버가 커넥션을 닫으므로 매번 커넥션을 열어야 한다. 즉 각 object마다 두 번의 rtt가 필요하다. 이 때문에 시간이 길어지는 것을 피하기 위해 parallel tcp 커넥션을 사용하는데 http를 파싱할때 5개의 object가 추가 발견되면 5개의 tcp 커넥션을 동시에 여는 방식이다. 소켓이 5쌍이 열리는 것이다. 이를 통해 rtt를 줄일 수 있다. 그러나 이 경우 한 운영체제에서 각각에 tcp 커넥션에 의해 오버헤드가 발생할 수 있다.

  • 그러나 persistent http에서는 서버가 한 번 response를 보낸 후에도 tcp 커넥션을 오픈한다. 따라서 커넥션을 재연결할 필요가 없어 추가 적인 objects들을 1 rtt안에 처리할 수 있다.

  • http는 request와 response 두 종류의 메세지를 사용한다. http의 request 메세지를 ASCII코드로 표현된다. 사람이 읽을 수 있다. 맨 첫 줄은 request line(GET,POST,HEAD commands)이고 그 다음부터는 header lines가 오는데 마지막 줄에는 carriage return과 line feed 문자로 식별이 되고 그 후 경우에 따라 body가 올 수도 있다. request line 맨 처음에는 메소드가 온다(get 등) 이는 어떤 작업을 해달라는 것을 서버에 말하는 것이다. 그다음은 html 파일, http 버전이 온다. header line에서 host는 서버의 호스트 이름이 들어간다. 그 다음 user-agent 에는 클라이언트의 브라우저가 무엇인지를 보여주고 ,accept language는 어떤 언어로 된 버전을 보낼지 말한다. 그 다음 connection은 keep-aline라 써있는데 이는 서버에게 tcp 커넥션을 계속 오픈해달라는 즉 persistent동작을 요청하는 것이다.

  • 위는 http request 메세지의 포맷이다. 첫 줄에 한 줄의 request line 그 다음부터 header line 그 밑에 경우에 따라 body다. request 라인은 한 줄이지만 header는 몇 줄인지 알 수 없으므로 끝을 나타내는 carriage return과 line feed가 필요하다. request line은 서버에 동작을 요청하는 메소드와 url, 그리고 브라우저 버전이 들어간다. header 라인은 두 개의 필드로 구성되는데 하나는 필드 이름이고 하나는 value이다. 그 사이가 : 으로 구분되어있다.

  • 또 경우에 따라 사용자에게 input을 받는 경우(form)가 있다. 이때 검색어에 따라 서버가 보내주는 페이지가 다르다. 이 때 get대신 post method를 쓰면 http body에 유저가 form input에 타이핑하는 내용을 실어나르게 된다. 그럼 서버에서 body에 실어나른 내용을 보고 요구하는 데이터를 보내줄 수 있다. 그러나 get을 사용하여 input을 사용할 수도 있는데 이 경우 request url 필드에 경로명 뿐이 아닌 뒤에 ?를 적고 input할 내용을 달아주며 보낼 수 있다.

  • http에는 방금 언급한 get,post와 추가적으로 head 메소드가 있는데 이는 서버에게 내가 요청한 url 파일을 실제로는 보내지 말라고 하는 것이다. 즉, response message는 보내되 실제로 파일을 보내지는 말라는 것이다. 이는 개발 과정에서 테스트 목적으로 사용하기도 한다. 또한 PUT과 DELETE 메소드가 있는데, PUT은 서버의 구체적인 url 필드에 클라이언트가 파일을 업로드하는 것이고, DELETE는 서버의 구체적인 url 필드에 클라이언트가 파일을 삭제하는 것이다. 이는 아무 사용자가 아닌 서버를 관리하는 유저의 아이디로 로그인 한 경우에만 작동하도록 하는 식으로 사용한다.

  • http response line은 세 가지 라인으로 나눠진다. 먼저 status line은 서버의 버전이 온 후, status code와 status phrase가 오는데 이 둘은 실제로는 같지만 code는 사람이 이해하기 어려운 것이다. 그 다음은 header line 이 오는데 date에 response 제공 시작이 오고, 서버의 종류가 오며, 서버가 제공하는 웹페이지가 마지막으로 수정된 시각, 커넥션이 persistent하게 할 것인지 말 것인지를 말하고, 콘텐트의 길이 타입 등을 표시한다. 마지막으로 헤더라인이 끝나면 request message가 요청한 data가 온다.

  • 위 사진은 reponse line에 실리는 status code와 phrase의 예시이다.

profile
하마드

0개의 댓글