소켓(Socket) 이란?

Socket은 네트워크로 연결된 둘 이상의 장치(Device)의 프로세스가 데이터를 주고 받기 위한 연결 도구를 의미합니다. 
Socket은 OS(운영체제)가 제공하며 두 Socket이 연결되면 서로 다른 프로세스끼리 데이터를 전달할 수 있습니다.

용어 정리(Server, Client, Listen, Connect)

Soket은 전화로 비유할 수 있습니다.
전화 통화를 위해서는 전화 거는 사람, 전화 받는 사람 모두 전화기(Socket)가 필요합니다.
전화기는 대리점(운영체제)에서 임대하여 사용하며 전화를 기다리는 사람은 Server라 하고, 전화를 거는 사람은 Client라 할 수 있습니다.
Server에서 기다림을 의미하는 용어로 Listen을 사용하고, 전화를 거는 쪽은 Connect라는 용어를 사용합니다. 
Server의 소켓이 Listen할 때, Client의 Socket이 Connect하는 것입니다.


IP주소와 PORT 번호

특정인에게 전화를 하기 위해서는 전화번호가 필요합니다.
한사람이 여러개의 전화번호를 사용할 수 있듯이 장치도 여러개의 Socket을 사용할 수 있습니다. 이 Socket을 식별하는 것이 IP주소와 PORT번호 입니다.
  • IP(Internet Protocol) 주소
    컴퓨터에는 일반적으로 랜카드라고 불리우는 NIC(Network Interface Card) 데이터 송수신 장치가 있습니다. IP주소는 운영체제에 설치되어 있는 NIC의 소프트웨어(이더넷 드라이브)에 부여됩니다. WIFI를 연결하는 장소에 따라 IP가 달라지는 이유가 바로 이것입니다.
  • PORT 번호
    컴퓨터 내부로 전송된 데이터를 운영체제가 적절한 소켓에 분배하기 위한 식별자를 의미합니다. PORT 번호는 0~65535번까지 존재하고 0~1023번은 well-known PORT라고 하여, 이미 할당이 예약되어 사용이 불가능합니다. 이후 번호는 자유롭게 연결이 가능하지만 한 운영체제 내에서 두 소켓이 같은 PORT를 공유할 수 없습니다. 단, TCP와 UDP처럼 소켓의 종류가 서로 다른 경우에는 허용됩니다.

Socket API 호출 순서도

위에 비유했던 전화 통화 관점에서 클라이언트와 서버의 소켓이 어떻게 다루어지는지, API 호출 순서도를 그려보면 아래와 같습니다.

Socket 확인

네트워크 상태를 확인하는 netstat 명령으로 Socket 정보를 확인할 수 있습니다.

netstat 명령 참고 : https://chosign.blogspot.com/2022/12/windows-netstat.html

윈도우 명령 프롬프트(윈도우+R > cmd) 에서 아래 명령어를 입력하여 연결된 Socket 조회가 가능합니다.

C:\WINDOWS\system32>netstat -ano | find "ESTABLISHED"

netstat 명령어의 실행 결과는 아래와 같습니다. 프토로콜(TCP, UDP), 로컬 주소(컴퓨터IP와 포트), 외부 주소(호스트-서버 주소와 포트), 상태, 프로세스ID가 표시 됩니다.


위 3개의 Socket 상태는 "ESTABLISHED"로 Server와 Client 간에 세션 연결이 성립되어 통신이 이루어지고 있는 상태를 의미하며 도식화 하면 아래와 같습니다.

Socket 전송 방식

Socket 의 전송 방식(Protocol)은 TCP, UDP 두 가지가 있습니다.
여기서는 개념만 다루고 자세한 내용은 다른 포스트에서 다루겠습니다.
  • TCP(Transmission Control Protocol)
    TCP 통신은 전화와 같은 방식으로 동작합니다. 상대방의 전화번호(IP 주소와 Port번호)를 알고 있어야 연결을 요청할 수 있고, 연결을 시도했을 때 상대방이 응답을 받아주지 않으면 계속적으로 연결 요청을 하게 됩니다. 전화는 한번 연결되면 계속해서 서로에게 음성을 전달할 수 있는 것처럼 TCP 통신에서도 한번 연결되면 계속적으로 소켓을 통해서 데이터를 주고 받을 수 있습니다(양방향 통신). 또한 상대방에게 데이터를 보냈을 경우 확인하는 절차도 거치게 됩니다. 만약 통화 도중 잘못 들었다면 "다시 말해주세요" 라고 하는 것처럼 TCP 통신에서도 데이터 수신 도중 받지 못한 패킷은 송신측에 다시 요청하는 메커니즘(Mechanism)을 가지고 있습니다.

  • UDP(User Datagram Protocol)
    UDP통신은 편지에 비유할 수 있습니다. 편지를 보내는 사람은 상대방의 집주소(IP주소와 Port번호)만 알면 편지를 쓰고 우체통(Socket)에 넣으면 됩니다. 편지를 받는 사람은 자신의 편지통에 편지가 왔는지 직접 확인할 때까진 편지가 제대로 도착했는지 알수가 없습니다.(단방향 통신)