컴퓨터/Network

[Network] 소켓에 대해서 알아보자(UDP/TCP에 대하여)

도도새 도 2023. 10. 31. 17:50

소켓에 대하여

 

소켓은 서로 떨어진 두 프로세스가 통신하기 위한 인터페이스이다. 이는 프로세스에서 데이터를 내보내거나 받기 위한 실질적인 창구 역할을 하게 된다. 즉, 데이터를 주고받기 위한 연결부이다. 프로세스는 데이터 통신을 위해 반드시 소켓을 열어 소켓에 데이터를 써 보내거나 소켓으로부터 데이터를 받아와야한다. 우리는 OS가 제공하는 인터페이스를 사용하여 소켓을 이용하게 된다.

 

이를 테면 윈도우 OS의 경우 아래의 형태를 따르게 된다. 왼쪽 그림이 네트워크에서 말하는 OSI 7계층, 오른쪽에 그에 따른 윈도우 소켓 모델이다.

 

출처: http://diranieh.com/SOCKETS/Concepts

(해당 윈도우 시스템에서는 upper layers를 Winsock application이라고 부르며, lower layers를 lower layer the network system이라고 칭하게 된다.)

 

소켓의 종류

 

소켓은 대표적으로 두 종류로 말해진다. 첫 번째가 TCP인 스트림 소켓, 두 번째가 UDP인 데이터그램 소켓이다. 이 중 TCP는 에러 핸들링 매커니즘을 이용하여 신뢰성 있는 통신을 가능하게 한다. 

 

TCP와 UDP의 특징은 아래와 같다.

 

스트림 소켓(TCP)

  • 연결 지향성 (Connection-Oriented): TCP는 연결 지향 프로토콜로, 클라이언트와 서버 간의 안정적인 연결을 설정하고 데이터를 신뢰성 있게 전송한다.
  • 오류 수정 (Error Correction), 정송 처리 (Reliability), 흐름 제어 (Flow Control) 보장: TCP는 데이터의 오류 검출 및 복구, 패킷 재전송, 흐름 제어를 통해 데이터 전송의 신뢰성을 보장한다.
  • 송신된 순서에 따라 중복되지 않게 데이터를 수신: TCP는 패킷의 순서를 보장하며, 중복된 데이터 수신을 방지한다.
  • 소량 및 대량 데이터 전송 모두 가능: TCP는 소량 및 대량 데이터 전송 모두를 처리할 수 있으며, 안정적인 연결을 통해 대용량 데이터를 신뢰성 있게 전송하는 데 적합하다.

 

이를 테면 TCP는 아래 기능을 지원한다. seq(순서 번호), checksum(에러 발견을 위함) 등의 정보는 TCP 세그먼트 헤더에 담기게 된다.

  1. 패킷 로스 처리 (Packet Loss Handling): TCP는 패킷 손실을 감지하고 복구하기 위해 재전송 메커니즘을 사용한다. 송신자는 일정 시간 동안 ACK(응답)를 받지 못하면 패킷을 다시 전송한다. (타이머 사용)
  2. 패킷 중복 처리 (Packet Duplication Handling): TCP는 각 패킷에 일련 번호 (sequence number)를 할당하고, 수신자는 이 번호를 사용하여 중복된 패킷을 식별하고 폐기처리한다.
  3. 에러 처리 (Error Handling): TCP는 에러 감지 및 복구를 위한 다양한 메커니즘을 제공한다. 오류 검출 코드, 패킷 재전송, 흐름 제어, 혼잡 제어 등이 포함된다.
  4. ACK/NAK (Acknowledgment/Negative Acknowledgment): TCP는 ACK를 사용하여 데이터 수신을 확인하며, NAK를 사용하여 송신자에게 패킷 재전송을 요청하게 된다.

 

 

데이터그램 소켓(UDP)

  • 비연결형 소켓 (Connectionless): UDP는 연결을 설정하지 않는 비연결형 프로토콜로, 데이터를 빠르게 전송하는 데 사용된다.
  • 데이터 크기 제한: UDP 패킷의 크기에 제한이 있으며, 큰 데이터를 작은 패킷으로 분할하여 전송해야 한다.
  • 확실한 전달 보장되지 않음: UDP는 데이터의 확실한 전달을 보장하지 않으며, 데이터가 손실될 수 있다. 오류 검출만 수행하며 복구는 하지 않는다.
  • 실시간 멀티미디어 정보 처리에 적합: UDP는 실시간 멀티미디어 스트리밍, VoIP (음성 통화), 게임 등 실시간 응용 프로그램에서 사용되며, 데이터를 신속하게 전송하는 데 적합하다. 이는 TCP에서 사용되는 핸드쉐이크 등 신뢰성을 보장하기 위한 작업을 하지 않기 떄문이다.

 

UDP의 경우 TCP와 다르게 신뢰성 있는 통신을 보장하지 않는다. 하지만 UDP 세그먼트 헤더에도 체크섬이 있어서 최소한의 에러는 캐치할 수 있다.

 

소켓 통신의 흐름

 

출처:https://www.researchgate.net/figure/Flow-chart-of-creating-a-socket-model_fig1_343811935

 

위 플로우는 소켓 통신의 동작 방식을 보여준다. 일단 한 번 소켓을 열고 연결이 되면 read와 write를 반복함을 확인 할 수 있다. 위의 소켓 관련 함수들은 앞서 윈도우 소켓 모델에서 보았듯이 운영체제가 제공한다.

 

서버

서버는 클라이언트 소켓의 연결 요청을 대기한다. 만약 연결 요청이 올 경우 각종 함수를 이용하여 클라이언트 소켓을 생성하여 통신이 가능하도록 한다.

socket() : 소켓을 생성하는 데 사용된다. 소켓은 네트워크 통신을 수행하는 데 필요한 기본 구조를 만들어낸다.

bind() : 로컬 주소와 포트 번호를 소켓에 연결한다. 이 함수를 사용하여 소켓을 특정 IP 주소 및 포트 번호에 바인딩하면, 해당 주소와 포트로 들어오는 연결을 수락할 수 있다.

listen(): 서버가 클라이언트의 연결 요청을 받을 수 있도록 소켓을 대기 상태로 만든다.

accept() : 서버가 클라이언트의 연결 요청을 수락하고, 연결된 소켓을 반환하는 역할을 한다. 클라이언트와 서버 간의 통신은 이후 이 연결된 소켓을 통해 이루어집니다.(read, write)

 

클라이언트

클라이언트 소켓은 서버 소켓에 연결을 요청하고 서버로 부터 응답을 받는 역할을 한다.

connect() : 원격 서버로 연결을 시도한다. 클라이언트에서 사용되며, 서버로 연결을 설정할 때 사용된다.

 


참고로 일반적으로 웹 어플리케이션을 개발할 때 양방향 통신은 소켓 통신, 단방향 통신을 HTTP 통신으로 이름짓고 개발을 하게 된다. 그런데 실제로는 HTTP통신 또한 TCP를 이용하기 때문에, HTTP 또한 TCP 소켓 통신을 이용하게 되는 것이다.

즉, HTTP 통신은 소켓 통신을 단방향으로 사용하는 것이다. 즉, 일반적인 의미로 웹개발에서 소켓 프로그래밍을 한다는 것은 “소켓을 사용한 통신”을 구현하는 것이 아니다. “양방향 통신, 혹은 단방향 통신”을 하느냐에 따라 소켓 프로그래밍과 HTTP 프로그래밍으로 구분하게 되는 것이다. 웹 개발에서는 흔히 이런 양방향 통신을 구현하기 위해 웹소켓을 이용하게 된다.