[네트워크] 소켓의 생성

문돌이 개발자·2023년 11월 11일
0

데이터 송, 수신 동작의 개요

  • IP 주소 조사 후 OS 내부 프로토콜 스택에 액세스 대상 웹서버에 메세지를 송신하도록 의뢰
  • OS 내부의 프로토콜 스택에 메세지 송신 동작을 의뢰할 때는 Socket 라이브러리 프로그램 부품을 결정된 순번대로 호출합니다.
  • 파이프는 처음부터 존재하는 것이 아니라 송, 수신 동작 전에 연결하는 과정이 존재한다.
  • 파이프의 양쪽 출입구는 소켓이라 불리고 이 소켓은 서버측에서 소켓을 만들고 클라이언트가 파이프를 연결할 때까지 대기한다.
  • 요약하면 소켓 작성 단계 → 접속 단계 → 송,수신 단계 → 연결 끊기 단계 로 구성
  • 모든 동작의 주체는 OS 내부의 프로토콜 스택이다. 소켓 라이브러리는 중개역으로 의뢰를 프로토콜 스택에 전달하는 역할만 수행한다.

1. 소켓의 작성 단계

  • 클라이언트는 소켓을 만들기 위해 소켓이라 부르는 프로그램 부품을 호출한다.
  • 소켓을 작성하면 소켓을 식별할 수 있는 디스크립터를 반환하고 애플리케이션은 이것을 메모리에 기록한다.

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

  • 소켓을 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다.
  • 소켓 라이브러리의 connect 라는 프로그램 부품을 호출하여 이 동작을 실행
  • connect를 호출할 때 디스크립터, 서버의 IP 주소, 포트 번호를 지정한다.
  • 최초의 디스크립터는 소켓을 만들 때 기록한 디스크립터이다. 이를 통해 어떤 소켓을 서버측의 소켓에 접속할지 판단한다.
  • IP 주소는 네트워크 내의 어떤 컴퓨터에 접속할 지 알려준다.
  • IP 주소를 통해 상대방의 컴퓨터에 접속해도 어떤 소켓에 접속할지는 알 수 없다. 어떤 소켓에 접속할지 알려주는 정보가 포트 번호이다.

❓ 디스크립터를 상대 소켓에 접속하는 용도로 사용하면 안되는가? → 디스크립터는 소켓을 만들도록 의뢰한 애플리케이션에게 건네주는 용도, 접속 상대에게 주는 것이 아님
→ why? 보안 문제

  • 포트 번호를 통해 상대방의 소켓에 접속한다. 포트 번호는 서버측에서 애플리케이션 종류에 따라 미리 결정된 값을 사용한다.
  • 클라이언트 측의 포트 번호는 프로토콜 스택이 적당한 값을 만든 후 서버와 연결할 때 통지한다.

메세지를 주고받는 송, 수신 단계

  • 소켓이 연결되면 소켓에서 데이터를 쏟아서 데이터를 송신한다. 이때도 소켓 라이브러리를 통해 프로토콜 스택에 의뢰한다. write라는 프로그램 부품을 사용한다.
  1. 애플리케이션은 HTTP 리퀘스트 메세지를 송신 데이터로써 메모리에 준비한다.
  2. write를 호출하면서 디스크립터와 송신데이터를 지정한다.
  3. 프로토콜 스택이 송신 데이터를 서버에 송신한다.
  4. 송신데이터는 네트워크를 통해 액세스 대상 서버에 도착하고 서버는 수신 동작을 실행한 후 응답 메세지를 반송한다.
  • 메세지를 수신할 때는 read라는 프로그램 부품을 사용한다.
  • 응답 메세지를 저장하기 위해 수신 버퍼라 부르는 메모리 영역을 지정한다.

송, 수신이 종료되는 연결 끊기 단계

  • 웹에서 사용하는 HTTP 프로토콜에서는 응답 메세지 송신을 완료했을 때 서버 측에서 연결 끊기 동작을 수행한다.
  1. 웹 서버측에서 close를 호출하여 연결을 끊는다.
  2. 클라이언트는 이를 전달받아 연결 끊기 단계로 들어간다.
  3. 브라우저가 read로 수신 동작을 의뢰했을 때 라이브러리는 브라우저에게데이터 대신 연결이 끊겼다는 사실을 통지한다.
  4. 사실을 통지받은 브라우저도 연결 끊기 단계에 진입한다.
  • HTTP는 데이터 하나하나를 별도의 것으로 취급하여 1개의 데이터를 읽을 때마다 접속, 리퀘스트 메세지 송신, 응답 메세지 수신, 연결끊기 동작을 반복한다.
  • 이후 복수의 데이터를 주고받기 위해 접속을 끊지 않고 리퀘스트와 응답을 주고받는 방법도 마련되었다. 이 때는 브라우저 측에서 더 이상 리퀘스트를 요청할 데이터가 없으면 연결 끊기 동작에 먼저 진입한다.

프로토콜 스택

  • 네트워크 애플리케이션: 브라우저, 메일러 등의 프로그램
  • 소켓 라이브러리: DNS 서버에 조회하는 리졸버 내장
  • OS 내부에 프로토콜 스택이 존재
  • TCP: 프로토콜 스택의 윗부분에 존재, 데이터 송,수신을 담당
  • UDP: 프로토콜의 송,수신을 담당
    • 일반적인 애플리케이션은 TCP
    • DNS 서버에 대한 조회 등에서 짧은 제어용 데이터를 송,수신 할때는 UDP
  • IP 프로토콜을 이용하여 송, 수신을 제어하는 부분이 TCP, UDP 아래 존재
    • 인터넷에서 데이터를 운반할 때 데이터를 작게 나누어 패킷이라는 형태로 운반
    • 패킷을 운반하는 것이 IP의 역할, IP에는 ICMP와 ARP가 포함
    • ICMP는 패킷을 운반할 때 발생하는 오류나 제어용 메세지를 통지
    • ARP는 IP 주소에 대응하는 이더넷의 MAC 주소를 조사
  • LAN 드라이버: LAN 어댑터 제어

소켓

  • 통신 제어용 제어 정보
  • 프로토콜 스택은 내부에 제어 정보를 기록하는 메모리 영역이 존재
  • 통신 상대의 IP 주소, 포트 번호, 통신 동작의 진행 상태 등을 기록한 메모리 영역이 소켓의 실체라고 봐도 무방하다.
  • 프로토콜 스택은 이 정보들을 통해 동작을 수행

참고자료

  • 1%의 네트워크 원리(Tsutomu Tone)
profile
까먹고 다시 보려고 남기는 기록

0개의 댓글