• 04. 프로토콜 스택에 메시지 송신을 의뢰한다

    2021. 9. 27.

    by. ahntree

    728x90

    1. 데이터 송 · 수신 동작의 개요

    DNS 서버로부터 응답받은 IP 주소로 데이터를 송신하려면 OS의 프로토콜 스택에 송신을 의뢰해야 한다. 비단 HTTP 메시지뿐만 아니라 모든 네트워크 애플리케이션이 공통적으로 거쳐야 하는 작업이다.

     

    프로토콜 스택에 메시지 송신 동작을 의뢰할 때는 Socker 라이브러리 프로그램 부품을 결정된 순번대로 호출해야 한다. 여기서 라이브러리는 애플리케이션과 프로토콜 스택의 중재자 역할을 한다고 생각하면 된다. 먼저 전체적인 흐름부터 살펴보면 다음과 같다.

     

     

    1-1. 소켓 생성 (소켓 작성)

    서버와 클라이언트가 데이터를 주고 받기 위해서는 각자 소켓을 만들어야 한다. 서버측에서 먼저 만들어 두고 클라이언트와의 연결을 기다린다.

     

     

    1-2. 서버측의 소켓에 파이프 연결 (접속)

    클라이언트에도 소켓을 만들고 소켓에서 파이프를 늘려 서버측의 소켓에 연결한다. 파이프는 소켓 간에 연결이 이루어진 것을 이미지화한 것이라고 생각하면 된다.

     

     

    1-3. 데이터 송수신

    파이프를 통해 데이터를 주고 받는다.

     

     

    1-4. 파이프 분리, 소켓 말소 (연결 끊기)

    파이프 연결은 클라이언트 -> 서버로 이루어지지만 분리는 순서가 없다. 파이프가 분리되면 각 소켓 또한 말소된다.

     

     

     

    2. 소켓의 작성 단계

    클라이언트의 소켓을 만드는 작업은 간단하다. Socket 라이브러리의 socket을 호출하면 된다. 소켓 작성이 완료되면 소켓을 식별할 수 있는 디스크립터를 반환한다. 애플리케이션은 이것을 메모리에 저장해 두고 소켓을 식별하는 데에 사용한다.

     

     

     

    3. 파이프를 연결하는 접속 단계

    소켓을 작성했으면 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다. Socket 라이브러리의 connect를 호출한다. 이 때 디스크립터, IP 주소, 포트 번호 이렇게 3가지 인자를 전달해야 한다.

     

    서버측의 포트 번호는 애플리케이션의 종류에 따라 미리 정해져 있다. 클라이언트의 포트 번호는 프로토콜 스택이 소켓을 작성할 때 임의로 할당한다. 클라이언트는 미리 정해져 있기 때문에 서버의 포트 번호를 알고 있고 서버의 경우에는 프로토콜 스택에서 연결 요청과 함께 클라이언트의 포트 번호를 함께 보내기 때문에 알 수 있다.

     

     

     

    4. 메시지를 주고받는 송 · 수신 단계

    연결이 이루어지면 메시지를 주고 받는다. 애플리케이션은 송신할 메시지를 메모리에 준비한다. 그리고 디스크립터와 함께 write를 호출한다.

     

    메시지를 수신할 때는 read를 호출한다. 이 때 수신 버퍼에 데이터를 저장하며, 저장한 시점에서 애플리케이션에게 메시지를 건내준다.

     

     

    5. 연결 끊기 단계에서 송 · 수신이 종료된다

    1. HTTP의 경우 웹 서버측에서 먼저 close를 호출해 연결 끊기 동작을 시행한다.
    2. 클라이언트에 연결을 끊었다는 것을 알린다.
    3. 브라우저가 read를 통해 수신 동작을 요청한다.
    4. 응답 데이터 대신 연결이 끊겼다는 사실을 통지한다.
    5. 브라우저도 close를 호출해 연결을 끊는다.

     

    위와 같은 단계로 연결이 종료된다. HTTP 1.0까지는 하나의 데이터를 요청할 때마다 하나의 연결을 맺고 끊어야 했지만 HTTP 1.1부터는 연결을 유지하는 것이 가능해졌다.

     

     

    728x90

    댓글