Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Finn의 개발블로그

1-4. 프로토콜 스택에 메시지 송신을 의뢰하다 본문

Network

1-4. 프로토콜 스택에 메시지 송신을 의뢰하다

BeginnerFinn 2019. 4. 25. 23:08

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

  • IP 주소를 조사했으면 IP 주소의 상대, 여기에서는 액세스 대상 웹 서버에 메시지를 송신하도록 OS의 내부에 있는 프로토콜 스택에 의뢰합니다.
  • 데이터를 송수신하는 컴퓨터 사이에 데이터의 통로 같은 것이 있고, 이것을 통해 데이터가 흐르면서 상대측에 도착합니다
  • 데이터는 어느 쪽에서 쏟아부어도 상관없고 양방향으로 데이터를 흘릴 수 있습니다.
  • 송수신 동작을 하기 전에 송수신하는 양자 사이를 파이프로 연결하는 동작이 필요합니다.
  • 실제로 서버 측에서 소켓을 만들고 클라이언트측에도 소켓을 만들고, 소켓에서 파이프를 늘려 서버측의 소켓에 연결하는 것입니다.
  • 데이터를 전부 보내고나면 연결했던 파이프가 분리됩니다.
  • 송 수신 동작 단계
    1. 소켓 생성
    2. 서버측의 소켓에 파이프 연결
    3. 데이터 송수신
    4. 파이프를 분리하고 소켓 말소
  • 네 가지 동작을 실행하는 것은 OS 내부의 프로토콜 스택입니다

2. 소켓의 작성 단계

  • 소켓 라이브러리의 socket이라는 프로그램 부품을 호출하면 됩니다.
  • socket을 호출한 후의 동작은 리졸버를 호출했을 때와 같이 socket 내부에 제어가 넘어가서 소켓을 만드는 동작을 실행하고 끝나면 애플리케이션에 제어가 돌아옵니다.
  • 소켓이 생기면 디스크립터라는 것이 돌아오므로 애플리케이션은 이것을 받아서 메모리에 기록해 둡니다.
  • 브라우저에서 창 2개를 열면 2개의 데이터 송수신 동작이 동시에 진행되므로 2개 소켓을 만들어야 합니다. 이 경우 하나하나 소켓을 식별해야 하는데, 이것이 디스크립터입니다. 디스크립터는 소켓에 할당한 번호와 같은 것 입니다.

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

  • 만든 소켓을 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰합니다.
  • 애플리케이션은 Socket 라이브러리의 connect라는 프로그램 부품을 호출하여 이 동작을 실행합니다.
  • connect를 호출 할 때 지정하는 디스크립터, 서버의 IP주소, 포트 번호 세 가지 값입니다.
  • connect가 디스크립터를 프로토콜 스택에 통지합니다. 그리고 프로토콜 스택이 통지받은 디스크립터를 보고 어느 소켓을 서버척의 소켓에 접속할지 판단하여 접속 동작을 실행합니다.
  • IP 주소와 포트 번호의 두 가지를 지정해야 어느 컴퓨터의 어느 소켓과 접속할지를 분명히 지정할 수 있습니다.
  • 디스크립터는 컴퓨터 한 대의 내부에서 소켓을 식별하기 위해 사용합니다.
  • 포트 번호는 접속 상대층에서 소켓을 식별하기 위해 사용합니다.
  • 클라이언트측의 소켓의 포트 번호는 소켓을 만들 떄 프로토콜 스택이 적당한 값을 골라서 할당합니다.

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

  • HTTP의 리퀘스트 메시지가 송신 데이터이고 Scoket 라이브러리의 write를 호출할 때 디스크립터와 송신 데이터를 지정합니다. 그러면 프로토콜 스택이 송신 데이터를 서버에게 송신합니다.
  • 소켓에는 연결된 상대가 기록되어 있으므로 디스크릅터로 소켓을 지정하면 연결된 상대가 판명되어 목적지를 향해 데이터를 송신합니다.
  • 서버는 수신 동작을 실행하여 받은 데이터의 내용을 조사하고 적절한 처리를 실행하여 응답 메시지를 반송합니다.
  • 수신할 때는 Socket 라이브러리의 read라는 프로그램 부품을 통해 프로토콜 스택에 수신동작을 의뢰합니다.
  • 수신한 응답 메시지를 저장하기 위한 메로리 영역을 지정하는데, 이 메모리 여역을 수신 버퍼라고 부릅니다.
  • 수신 버퍼는 애플리케이션 프로그램 내부에 마련된 메모리 영역이므로 수신 버퍼에 메시지를 저장한 시점에서 메시지를 애플리케이션에 건네줍니다.

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

  • HTTP 프로토콜에서는 본래 응답 메시지의 송신을 완료했을 떄 웹 서버측에서 연결 끊기 동작을 실행하므로 먼저 웹 서버측에서 Socket 라이브러리의 close를 호출하여 연결을 끊습니다.
  • 클라이언트측에 전달되어 클라이언트의 소켓은 연결 끊기 단계로 들어갑니다.
  • 브라우저가 read로 수신 동작을 의뢰했을 때 read는 수신한 데이터를 건네주는 대신 송 수신 동작이 완료되어 연결이 끊겼다는 사실을 브라우저에 통지합니다.
  • 송 수신이 종료되었다는 것을 알 수 있으므로 브라우저에서도 close를 호출하여 연결 끊기 단계에 들어갑니다