Socket

소켓은 네트워크 환경에 연결할 수 있게 만들어진 연결부를 의미한다.

네트워크에 연결하기 위한 소켓은 정해진 규약, 즉, 통신을 위한 프로토콜 (Protocol) 에 맞게 만들어져야 한다.

소켓 종류

  1. 보통 OSI 7 Layers (Open System Interconnection 7 Layer) 의 네 번째 계층인 TCP(Transport Control Protocol) 상에서 동작하는 소켓을 주로 사용하는데, 이를 “TCP 소켓” 또는 “TCP/IP 소켓”이라고 부른다.
  2. UDP 에서 동작하는 소켓은 “UDP 소켓”이라고 한다.

TCP/IP Socket Programming

클라이언트 소켓 (Client Socket) 과 서버 소켓 (Server Socket)

두 개의 시스템 (또는 프로세스) 이 소켓을 통해 네트워크 연결 (Connection) 을 만들기 위해서는, 최초 어느 한 곳에서 그 대상이 되는 곳으로 연결을 요청해야 한다.

이때, 연결 요청을 보내는 소켓을 클라이언트 소켓 (Client Socket), 그리고 연결 요청을 받아들이는 소켓을 (Server Socket) 이라고 한다. 다만, 이 소켓들은 실질적으로 동일한 소켓이다. 다만, 각 소켓의 역할에 따라서 부르는 명칭이 달라질 뿐이다.

참고로 서버 소켓은 클라이언트 소켓의 연결 요청을 받아들이는 역할만 수행할 뿐, 직접적인 데이터 송수신은 서버 소켓의 연결 요청 수락의 결과로 만들어지는 새로운 소켓을 통해 처리된다.

클라이언트 소켓과 서버 소켓의 연결

Socket API 실행 흐름

대부분의 프로그래밍 언어와 개발 플랫폼에서 소켓 (Socket) 관련 API 가 제공된다. 이러한 API 를 사용하였을 때, 구체적으로 각 Socket 이 처리되는 흐름을 알아보자.

소켓 API 실행 흐름

Client Socket

  1. 소켓을 생성한다. (socket())
    • TCP 소켓을 위해서는 스트림 (stream) 타입, UDP 소켓을 위해서는 데이터그램 (Datagram) 타입을 지정할 수 있다.
  2. 서버측에 연결 요청을 한다. (connect())
    • IP 주소와 포트 번호로 식별되는 대상으로 연결 요청을 보낸다.
  3. 서버 소켓에서 연결이 받아지면, 데이터를 송/수신 한다.(send()/recv())
    • 데이터 수신 (recv()) 의 경우, 별도의 스레드에서 실행한다. 왜냐하면, 상대방이 언제 데이터를 송신할지 모르므로, 계속 기다릴 순 없기 때문이다.
  4. 모든 처리가 완료되면 소켓을 닫는다.(close())

Server Socket

  1. 소켓을 생성한다. (socket())
  2. 서버가 사용할 IP 주소와 포트 번호를 생성한 소켓에 결합시킨다. (bind())
    • 이때, 특정 포트 번호를 사용하기 위해 OS 에 요청하게 되고, OS 는 포트 번호 충돌이 발생하지 않는지 검사한다.
    • 이를 주로 소켓 바인딩 또는 소켓 바인드 라고 부른다.
  3. 클라이언트로 부터 연결 요청이 오는지 주시한다. (listen())
    • 연결 요청이 수신되었는지의 여부만 확인한다. 연결 정보는 알지 못한다.
  4. 요청이 수신되면 요청을 받아들여서 데이터 통신을 위한 소켓을 생성한다.(accept())
  5. 새로운 소켓을 통해 연결이 수립되면, 데이터를 송/수신 한다. (send()/recv())
  6. 데이터 송/수신이 완료되면, 소켓을 닫는다. (close())
    • 이때 socket() 에 의해 생성된 서버 소켓 뿐만 아니라, accept() 에 의해 생성된 소켓도 같이 관리해 준다.

Related

References

Reference

https://recipes4dev.tistory.com/153