소켓프로그래밍#2 : TCP와 UDP

kkado·2022년 5월 6일
0
post-thumbnail

들어가기 앞서

대학교에서 네트워크 프로그래밍 과목을 수강하면서 전반적인 이해가 많이 부족하다고 느껴 공부한 것을 정리하는 차원에서 가볍게 작성한 글이므로, 내용이 부족하거나 틀린 점이 있을 수 있습니다. 그리고 모든 코드의 작성과 구현은 리눅스 운영체제에서 실행하고 있음을 미리 알려드립니다.
틀린 점 지적이나 첨언은 언제든지 환영합니다!! 잘 부탁드립니다. :D

저번 글에서 소켓이란 무엇인지, 그리고 소켓의 기본 동작 구조에 대해 알아보았고 이번 글에서는 TCP와 UDP의 뜻과 차이에 대해서 알아보자.

TCP

Transmisson Control Protocol, (전송 제어 프로토콜)의 약자로, 컴퓨터가 다른 컴퓨터와 통신하기 위한 통신 규약(프로토콜)의 일종이다.
두 개의 호스트를 연결하고 데이터를 교환하게 해 주는 네트워크 프로토콜이다. 두 소켓 간의 '연결' 을 구성한 후 정보를 주고받는다는 특성 때문에 연결 지향형 프로토콜이라고도 한다.

TCP는 4가지의 특성이 있다.

  • 중간에 데이터가 소멸되지 않는다.
  • 전송 순서대로 데이터가 수신된다.
  • 데이터의 경계가 존재하지 않는다.
  • 소켓 대 소켓의 연결은 반드시 1대 1 구조이다.

또한 TCP는 연결하는 데에 3-way handshaking을 사용하고 연결 해제하는 데에 4-way handshaking을 사용하는데 핸드셰이킹과 관련된 내용들은 다음 글에서 다루도록 하겠다.

TCP 소켓의 구현

int tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

첫 번째, 두 번째로 전달된 인자를 통해서 사실상 TCP 프로토콜임이 결정되기 때문에, 세 번째 인자로는 0을 전달해 주어도 되고, 보편적으로 이와 같이 사용한다.

TCP는 연속성보다는 신뢰성 있는 전송이 중요할 때 사용하는 프로토콜이다.

UDP

User Datagram Protocol, (사용자 데이터그램 프로토콜)의 약자로, 데이터를 '데이터그램' 단위로 처리하는 프로토콜이다. 소켓 간의 '연결' 이라는 개념이 없이 데이터만을 주고받으므로, 비 연결지향형 프로토콜이라고도 한다.

데이터그램이라 함은, 서로 독립적인 관계를 지니는 패킷을 말한다. 즉 데이터 몇 개를 보낼 때 이 데이터들이 각각 다른 독자적인 경로로 전달된다고 이해할 수 있다. 이렇게 각각 다른 경로로 데이터를 보냄에도, UDP는 데이터의 '전달' 과 '수신' 에 주안점을 두고 속도를 지향하는 방식이기 때문에 이 패킷들 간의 순서나 신뢰성 등을 처리하지 않는다. 따라서 데이터가 뒤죽박죽으로 도착하거나 중간에 소실 및 손상될 우려가 있다.

UDP의 특성은 다음과 같다.

  • 전송순서와 상관없이 빠른 속도의 전송을 지향
  • 데이터의 손실과 파손의 우려가 있다. → 신뢰성이 낮다.
  • 데이터의 경계가 존재한다.
  • 한 번에 전송할 수 있는 데이터의 크기가 제한된다.
  • TCP에 비해 속도가 빠르다.

두 호스트가 서로 1대 1로 연결되는 TCP와는 달리, 연결의 개념 자체가 없어서 서버/클라이언트 또한 존재하지 않는다.

UDP 소켓의 구현

int udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

TCP와 마찬가지로 첫 번째, 두 번째 인자를 통해 사실상 UDP임이 결정되기 때문에 세 번째 인자로는 0을 전달해도 무방하다.

UDP는 파일 전송 등과 같이 신뢰성이 요구되는 서비스보다 성능이 중요시 되는 경우에 사용된다.

TCP vs UDP


이미지 출처 (https://mangkyu.tistory.com/15)

다음에는...

Handshaking에 대해 다루고, TCP의 연결 구성과 해제에 사용되는 3-way handshaking과 4-way handshaking에 대해 알아볼 예정입니다.

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글