ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 성공과 실패를 결정하는 1%의 네트워크 원리 6장
    Study/성공과 실패를 결정하는 1%의 네트워크 원리 2022. 2. 13. 18:10

    이번 장에서는 웹 서버에 HTTP 요청이 수신되고 처리 후 브라우저에 응답을 주는 과정을 정리하겠습니다.

    1. 서버의 개요

    서버가 요청을 받기 위해서는 클라이언트가 요청을 송신할 때와 동일하게 소켓과 프로토콜 스택을 이용합니다. 하지만 클라이언트와 사용하는 방법이 다릅니다. 클라이언트가 tcp 연결을 할 때는 서버에 바로 연결을 진행하면 되지만 서버는 클라이언트와 송수신을 하기 위해 접속을 대기하는 과정이 필요합니다. 따라서 서버는 접속을 대기하는 부분과 접속 이후 클라이언트와 송수신 하는 부분으로 프로그램이 나뉩니다.

     

    서버는 처음 프로그램을 시작할 때 소켓을 생성하고 접속을 수신하기 위한 포트를 바인딩합니다. 그리고 접속 대기를 시작합니다. 이후 클라이언트가 해당 서버에 접속을 하면 접속 대기용 소켓을 복사해서 클라이언트와 송수신을 하기 위한 소켓을 생성합니다. 이때 소켓이 통신하는 대상을 구분하기 위해 <서버IP>,<서버PORT><클라이언트IP><클라이언트PORT> 4쌍을 이용해서 해당 소켓을 이용해서 어떤 클라이언트와 데이터를 송수신하는지 구분합니다.

     

    해당 정보가 있으면 디스크립터가 필요없다고 생각할 수 있는데 접속 대기 이후 소켓에 해당 정보를 설정하기 전에는 소켓을 식별할 방법이 디스크립터 밖에 없으므로 디스크립터가 필요합니다. 또한 디스크립터의 값이 사용하기 훨씬 간단한 이유도 있습니다.

    2. 서버의 수신 동작

    서버의 수신은 LAN 어댑터에서 패킷의 전기 신호를 데이터로 변환하는 작업부터 시작됩니다. LAN 어댑터가 전기 신호를 읽어서 디지털 데이터로 변환이 되면 LAN 어댑터의 버퍼에 저장이 되고, 인터럽트를 통해 CPU에 통지합니다. 통지를 받은 CPU는 LAN 드라이버를 실행해서 해당 버퍼를 읽어서 프로토콜 스택에 전달합니다.

     

    프로토콜 스택은 읽은 패킷의 MAC 어드레스가 서버의 MAC과 동일한지 확인하고 패킷을 검증한 후 해당하는 소켓을 찾아서 데이터를 전달합니다. 만약 SYN 패킷이라면 연결 과정을 진행합니다. IP 패킷이 분할 되었으면 합치는 과정도 진행합니다.

     

    데이터가 모두 수신 됐으면 수신 버퍼에 저장하고 최종적으로 서버 애플리케이션에게 전달합니다. 서버 애플리케이션은 데이터를 읽고 처리하고 응답을 합니다. 모든 요청이 완료 됐으면 연결을 종료시킵니다.

    3. 웹서버 소프트웨어가 리퀘스트 메시지의 의미를 해석하여 요구에 응한다

    웹 서버가 리퀘스트를 수신한 이후에는 이를 분석해서 처리하는 과정을 진행합니다. 요청 헤더와 요청 바디를 이용해서 처리를 합니다. 요청 메소드와 URI를 이용해서 처리를 할 때 두가지 방식이 있는데(옛날 방식으로, 현재는 다른 방식을 많이 씀) 파일에서 데이터를 읽어서 응답해주는 방식과, cgi 프로그램을 실행 시켜 결과를 반환하는 방식이 있습니다.

     

    파일에서 데이터를 읽을 때는 보안 문제가 있으므로 URI에 가상 디렉토리를 사용해서 실제 디렉토리와 매핑하는 과정이 있습니다. CGI를 호출할 때는 OS에 프로세스 실행을 요청하면서 요청 데이터를 전달합니다.

     

    요청 처리가 완료됐으면 응답 데이터를 작성하고 다시 소켓을 통해 클라이언트에게 응답 데이터를 전달합니다.

    4. 웹 브라우저가 응답 메시지를 받아 화면에 표시한다

    브라우저가 웹 서버로 부터 응답 메세지를 받으면 이를 분석해서 화면에 표시합니다. 이때 Content-Type 헤더를 이용해서 어떤 데이터 타입인지 분석하고, 타입에 맞도록 데이터를 화면에 표시합니다.

    댓글

Designed by Tistory.