Finn의 개발블로그
1-4. 프로토콜 스택에 메시지 송신을 의뢰하다 본문
1. 데이터 송 수신 동작의 개요
- IP 주소를 조사했으면 IP 주소의 상대, 여기에서는 액세스 대상 웹 서버에 메시지를 송신하도록 OS의 내부에 있는 프로토콜 스택에 의뢰합니다.
- 데이터를 송수신하는 컴퓨터 사이에 데이터의 통로 같은 것이 있고, 이것을 통해 데이터가 흐르면서 상대측에 도착합니다
- 데이터는 어느 쪽에서 쏟아부어도 상관없고 양방향으로 데이터를 흘릴 수 있습니다.
- 송수신 동작을 하기 전에 송수신하는 양자 사이를 파이프로 연결하는 동작이 필요합니다.
- 실제로 서버 측에서 소켓을 만들고 클라이언트측에도 소켓을 만들고, 소켓에서 파이프를 늘려 서버측의 소켓에 연결하는 것입니다.
- 데이터를 전부 보내고나면 연결했던 파이프가 분리됩니다.
- 송 수신 동작 단계
- 소켓 생성
- 서버측의 소켓에 파이프 연결
- 데이터 송수신
- 파이프를 분리하고 소켓 말소
- 네 가지 동작을 실행하는 것은 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를 호출하여 연결 끊기 단계에 들어갑니다
'Network' 카테고리의 다른 글
2-1. 소켓을 작성한다. (0) | 2019.04.27 |
---|---|
1-3. 전 세계의 DNS서버가 연대한다 (0) | 2019.04.16 |
1-2. 웹 서버의 IP주소를 DNS서버에 조회한다 (0) | 2019.04.09 |
1-1. HTTP 리퀘스트 메시지를 작성한다 (0) | 2019.04.04 |