소켓에 대해 알아보자

Alex·2025년 1월 20일
0

CS를 공부하자

목록 보기
17/74

소켓이란?

소켓은 네트워크상에서 데이터를 주고받을 때 사용하는 엔드포인트이다.
TCP/IP 4계층에서 전송 계층에 놓인다.

소켓이 연결되면 중간에 파이프 같은 것이 생성되고, 이를 통해서 데이터를 주고받게 된다.
서버들이 데이터를 주고받이 위해서 주요한 것은 이 소켓을 먼저 만드는 것이다.

실제로는 서버가 먼저 소켓을 만들고, 소켓에 클라이언트가 파이프를 연결하길 기다린다.
클라이언트에서도 소켓을 만들어서 연결하는 방식이다.

단계는 각각

1) 소켓 작성단계
2) 접속 단계
3) 송/수신 단계
4) 연결 끊기 단계

이 네가지 동작을 실행하는 것은 OS 내부의 프로토콜스택이다. 브라우저 등의 애플리케이션은 자체에서 파이프를 연결하거나 거기에 데이터를 쏟아붓지 않고, 프로토콜 스택에 의뢰해서 파이프를 연결하거나 데이터를 쏟아붓는다.

소켓의 작성단계

  1. 소켓 라이브러리의 socket이라는 프로그램 부품을 호출한다.
  2. socket을 호출하면, socket 내부에 제어가 넘어가서 소켓을 만드는 동작을 실행하고 애플리케이션에 제어가 돌아온다.
  3. 소켓을 생성하면, 1)디스크립터가 생성돼서 돌아오는데 애플리케이션은 이를 메모리에 기록한다.

[각주]

1)디스크립터는 소켓을 식별하기 위해 사용한다. 브라우저가 웹 서버에 접근하면, 컴퓨터 내부에서는 복수의 데이터 송/수신 동작이 동시에 진행되는 경우가 있다. 브라우저에서 창 2개를 열어 2개의 웹 서버에 동시에 액세스 하는 경우다. 이 경우 2개의 소켓을 만들어야 하는데, 하나하나의 소켓을 식별해야 하기 때문에 디스크립터가 필요하다.

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

  1. 이제 클라이언트는 만든 소켓을 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다. 애플리케이션은 connect라는 프로그램 부품을 호출한다. (connect를 호출할 때 핵심은 디스크립터, 서버의 ip주소, 포트번호 세가지값이다)
  2. 최초의 디스크립터는 소켓을 만들 때 돌아온 디스크립터다. connect가 프토토콜 스택에 이 디스크립터를 통지한다. 프로토콜 스택은 통지받은 디스크립터를 보고, 어느 소켓을 서버측의 소켓에 접속할지 판단하고 접속 동작을 실행한다.
  3. 다음은 IP 주소로, DNS 서버에 조회해 조사한 액세스 대상의 서버 IP주소다. 이것을 프로토콜 스택에 알려야 한다.
  4. IP주소로 지정할 수 있는 것은 네트워크의 어느 컴퓨터인가까지이다. 접속 동작은 상대측의 소켓에 대해 이루어지므로, 소켓을 지정해야 한다. IP주소로는 소켓까지 지정할 수 없다. 전화를 걸었을 때 "ㅇㅇ님 계십니까?"라고 말하여 통화할 상대를 바꿔달라는 중간 과정이 필요한데, 이 중관 과정이 포트번호다. 2)IP 주소와 포트번호 두가지를 지정하면, 어느 컴퓨터의 어느 소켓에 접속할 지 분명히 지정할 수 있다.

[각주]
2)디스크립터를 통해서 소켓에 연결하면 되지 않을까? 싶을 수도 있다. 하지만, 우리는 서버 소켓의 디스크립터를 알지 못하기 때문에 불가능하다.
3)포트 번호를 어떻게 알 수 있을까? 보통, 서버에서는 미리 알려진 포트 번호를 사용한다. 웹은 80/메일은 25라는 식이다.
4)서버측에서도 클라이언트의 소켓 번호가 필요하다. 클라이언트 측 소켓의 포트번호는 소켓을 만들 때 프로토콜 스택이 적당한 값을 골라서 할당한다. 이 값을 접속 동작을 실행할 때 서버측에 통지한다.

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

이제 소켓에서 데이터를 쏟아 부으면 상대측 소켓에 데이터가 도착한다. 이때 write라는 프로그램 부품을 사용한다.
1. 애플리케이션은 송신 데이터를 메모리에 준비한다. 사용자가 입력한 URL을 바탕으로 만든 HTTP 메시지의 리퀘스트 메시지가 올라가는 것이다.
2. write를 호출할 때 디스크립터와 송신 데이터를 지정한다.
3. 프토토콜 스택이 송신 데이터를 서버에 송신한다. 소켓에는 연결된 상대가 기록되어 있으므로, 디스크립터로 소켓을 지정하면 연결된 상대가 판명돼 그곳을 향해 데이터가 날라간다.
4.수신할 땐 read 프로그램 부품을 활용해서, 프로토콜스택에 수신 동작을 의뢰한다. 수신한 응답 메시지를 저장하기 이해서 메모리 영역을 지정하는데, 이 메모리 영역을 수신 버퍼라고 한다.

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

  1. 브라우저가 데이터 수신을 완료하면 송/수신 동작은 끝난다.
  2. close라는 프로그램 부품을 호출해서 연결 끊기를 의뢰한다.
  3. 소켓 사이를 연결한 파이프와 같은 것이 분리되고, 소켓도 말소된다.

포트와는 어떻게 다른거야?

쉽게 생각하면, 포트는 데이터가 어떤 서비스로 가야할지 명시하는 주소이고 소켓은 실제로 대화하는 통로이다.
여러 컴퓨터가 동일한 포트 번호를 사용할 수 있다. 즉, 포트는 PC를 고유하게 특정하지 못한다.
소켓은 IP 주소와 포트 번호의 조합이고, PC와 프로그램을 고유하게 식별한다.

출처

-성공과 실패를 결정하는 1%의 네트워크 원리

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글