CS/Network

소켓(Socket)

olsohee 2024. 3. 26. 15:22

소켓(Socket)

  • 소켓은 네트워크에서 프로세스 간 통신을 가능하게 하는 연결부라고 할 수 있다.

  • 서로 다른 머신에 존재하는 프로세스 간 통신을 위해서는 연결을 위한 인터페이스가 필요하다. 이때 각 머신의 운영체제가 제공하는 네트워크 연결과 관련된 시스템 콜을 소켓 api라고 한다.
  • 네트워크에 연결하기 위한 소켓은 통신 프로토콜에 맞게 만들어져야 한다. 따라서 소켓의 종류는 다음 두가지로 나뉜다.
    • TCP 소켓: TCP 상에서 동작하는 소켓 (소켓 스트림) 
    • UDP 소켓: UDP 상에서 동작하는 소켓 (소켓 데이터그램)

TCP 소켓을 통한 통신 흐름(소켓 api)

  • 서버 소켓
    • socket()
      • 소켓을 생성한다.
      • 이때 인자로 소켓의 종류를 지정할 수 있다. TCP 소켓을 위해서는 SOCK_STREAM, UDP 소켓을 위해서는 SOCK_DGRAM을 인자로 전달하면 된다.
    • bind()
      • 포트번호를 인자로 전달하며 해당 포트와 소켓을 결합한다.
      • 만약 해당 포트 번호를 다른 소켓이 이미 사용 중이라면, bind()는 에러를 리턴한다.
      • 소켓에 bind() api를 호출하는 것을 "소켓 바인딩"이라고 부른다.
    • listen()
      • 서버 소켓에 포트 번호를 결합하고 나면, 클라이언트의 연결 요청을 받아들일 준비가 된 것이다. 따라서 클라이언트로부터 연결 요청이 오는지 기다린다.
      • 클라이언트로부터 연결 요청이 오면 내부적으로 관리되는 큐에 쌓인다. (listen()은 내부적으로 큐만 생성하고 종료된다. 연결 요청을 큐에 넣는 것은 운영체제가 수행한다.)
    • accept()
      • 큐에 연결 요청이 들어오면 소켓을 새로 생성하고, 연결한다.
      • 이때 주의할 점은 최종적으로 클라이언트 소켓과 연결되는 소켓은 앞서 사용한 서버 소켓이 아니라, accept() api 내부에서 새로 만들어지는 소켓이다.
      • 즉, 앞서 사용된 서버 소켓은 연결 요청을 받기 위한 창구 역할을 하는 소켓이고, 실질적으로 연결되는 소켓은 새로 생성된다. 그리고 이 새로 생성된 소켓을 통해 데이터 송수신이 이뤄진다.
    • send() / recv()
      • 서버 소켓에서 연결을 받아들이면 데이터를 송수신한다.
    • close()
      • 데이터 송수신이 완료되면 소켓을 닫는다. 
      • 데이터 송수신이 끝난 후에는 소켓을 닫기 위해 close() api를 호출한다. 닫힌 소켓은 더이상 유효하지 않기 때문에 해당 소켓을 통해 데이터 송수신이 불가하다.
      • 만약 소켓 연결이 종료된 후 데이터 송수신을 하려면 다시 소켓을 생성하고 연결하는 과정을 거쳐야 한다.
  • 클라이언트 소켓
    • socket()
    • connect()
      • IP 주소와 포트 번호를 통해 서버 측 소켓에 연결 요청을 보낸다.
      • connect() api는 블럭(block) 방식으로 동작한다. 즉, 연결 요청에 대한 결과가 리턴되기 전까지 connect()의 실행이 끝나지 않는다.
      • 서버 측 소켓이 연결 요청을 수락하면 연결된 서버 측 소켓의 번호가 리턴된다.
    • send() / recv()
    • close()

Reference

'CS > Network' 카테고리의 다른 글

네트워크 계층: IP  (0) 2024.03.28
전송 계층: UDP, TCP  (1) 2024.03.26
애플리케이션 계층: DNS  (1) 2024.03.26
애플리케이션 계층: HTTP  (0) 2024.03.26
PDU, SDU  (0) 2023.12.09