TCP, UDP 통신
네트워크란
네트워크란 여러 시스템이 프로토콜을 사용하여 데이터를 주고받는 것들을 하나의 단위로 통칭한 것이라고 할 수 있다. 즉, 다수의 시스템을 전송 매체(케이블, 공기, 무선 신호 등)로 연결해 구성한 시스템들의 집합체이다.
여기서 시스템이란 일반적으로 컴퓨터 시스템을 의미하지만 ‘내부 규칙에 따라 능동적으로 동작하는 대상’을 말한다. 자동차나 자판기, 컴퓨터 등과 같은 물리적 장치 뿐만 아니라 운영체제, 프로세스 등과 같은 논리적 대상 또한 시스템이라고 할 수 있다.
또한 프로토콜은 시스템이 전송 매체를 통해 데이터를 교환할 때 따르는 ‘표준화된 특정 규칙’을 말한다.
네트워크를 얘기하면 흔히 뒤따라오는 것이 있다. 바로 OSI 7 계층이다.
OSI 7 계층이란 통신 기능을 7개의 기능으로 모듈화 하여 계층 형식으로 나타낸 것을 말한다. 응용, 표현, 세션, 전송, 네트워크, 데이터 링크, 물리 계층이 있다.
(https://coderdocument.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B5%AC%EC%A1%B0 참고)
시스템 간 데이터 송수신 과정을 간략하게 표현하자면 아래와 같이 나타낼 수 있다.
TCP, UDP는 이 중 4계층. 전송 계층 프로토콜에 해당한다.
TCP란
TCP는 Transmission Control Protocol의 약자로, 전송을 제어하는 규약이라는 뜻을 가지고 있다. IP 프로토콜 위에서 연결형 서비스를 지원하는 전송계층 프로토콜로, 인터넷 환경에서 기본으로 사용한다.
TCP의 특징으로는 연결형 서비스, 혼잡 제어, 신뢰성, 전이중 방식의 양방향 통신 이 있다.
- 연결형 서비스 : TCP는 송/수신 사이의 논리적 연결을 생성하여, 서버와 클라이언트가 연결된 상태에서 데이터를 주고받는다.
- 혼잡 제어 : 패킷 수가 과도하게 증가하지 않도록 한다.
- 신뢰성 : TCP는 데이터를 패킷이라는 단위로 작게 나눠 전송하는데, 이러한 패킷을 추적, 관리하는 기능을 한다. IP 주소체계를 따르면서 IP프로토콜 위에서 동작하는데, IP가 패킷의 전송 여부나 순서를 신경쓰지 않기 때문에 TCP에서 패킷의 신뢰성을 유지하도록 하는 기능을 한다. 이로 인해 뒤에서 설명할 UDP보다 전송 속도가 느리다는 단점이 있다.
- 전이중 방식의 양방향 통신 : 전송이 양방향으로 동시에 일어날 수 있다.
TCP 통신 방식 - 연결 및 데이터 전송
TCP는 서버-클라이언트 간 논리적 연결을 생성한 후 데이터를 주고받는다고 하였다.
연결 설정 과정은 3단계로 진행되며, 3-Way Handshake 방식이라고 한다.
과정을 살펴보면 다음과 같은 절차로 이루어진다.
SYN : 연결 설정을 요구하는 플래그
ACK : SYN을 받았다는 응답 플래그
이를 풀어서 말하자면,
서버에 연결해도 돼? -> 응, 연결할게? -> 응!
이런 과정인 것이다.
3-Way Handshake 방식을 통해 연결을 확인한 후 데이터 전송이 시작된다.
데이터 전송 또한 연결과 마찬가지로 Data를 보내고 수신측으로부터 ACK 플래그를 받는 식으로 전송 여부를 확인한다.
[코드] TCP Server code - socket, bind, listen
#define PORT 7000
int my_bind(int sock, const char* ipaddr, int port)
{
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons (port);
if (!ipaddr
|| strcmp(ipaddr, "127.0.0.1") == 0
|| strcmp(ipaddr, "localhost") == 0)
{
addr.sin_addr.s_addr = INADDR_ANY;
}
else
{
if (inet_pton(AF_INET, ipaddr, &addr.sin_addr) <= 0)
{
printf("Invalid address. %s\n", ipaddr);
return -1;
}
}
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0)
return -1;
}
int my_listen(int sock, int backlog)
{
if (listen(sock, backlog) < 0)
return -1;
return 0;
}
int main()
{
int mSock = -1;
mSock = socket(AF_INET, SOCK_STREAM, 0);
int reuse = 1;
if (setsockopt(mSock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0)
{
printf("Cannot set reuseaddr failed.\n");
return -1;
}
if(my_bind(mSock, NULL, PORT) < 0 )
{
if (mSock > 0)
{
close(mSock);
fd = -1;
}
return false;
}
if(my_listen(mSock, 2) == -1 )
{
if (mSock > 0)
{
close(mSock);
fd = -1;
}
return false;
}
return;
}
TCP 단점
TCP는 위에서 설명한 것처럼 전송 신뢰도가 높지만 그로인해 생기는 단점 또한 존재한다.
첫 번째로, 데이터 전송을 위해 두 프로세스간 반드시 연결이 되어야한다는 점.
두 번째로, 그렇게 연결 된 프로세스가 서버-클라이언트가 되어 1:1로만 통신할 수 있다는 점.
세 번째로, 패킷 전송 후, 반드시 응답(ack)을 받아야 한다는 점.
이 세 가지가 TCP 통신의 단점이라고 할 수 있겠다.
이어서 UDP에 대해 알아보자
UDP란
User Datagram Protocol의 약자로, 전송 계층의 비연결 지향적 프로토콜을 말한다.
위의 설명처럼 TCP와 다르게 통신 프로세스 간 연결을 하지 않고 통신함을 의미한다.
그렇다면 연결하지 않고 어떤 방식으로 통신하는지 알아보자.
UDP 통신 방식
UDP는 3-Way Handshake 같은 과정 없이 비연결형 서비스를 이용하여 데이터그램을 전송한다.
데이터그램이란 UDP에서 주고받는 데이터의 단위를 말한다.
각 데이터 그램은 전송 과정에서 독립적으로 보내지며 데이터그램이 목적지까지 잘 도착할 수 있게 최선을 다하지만, 반드시 목적지까지 도착한다는 것을 보장하지는 않는다.
이처럼 UDP는 상위 계층에서 받은 데이터를 IP프로토콜에 전달하지만, 전송한 데이터그램이 잘 도착했는지 확인하지 않는다. 따라서 TCP보다 전송 신뢰성이 떨어진다고 볼 수 있다.
다만 그렇기 때문에 전송 속도가 빠르다는 장점이 있어, 신뢰도보다 속도가 더 중요한 경우에 사용한다.
또 UDP는 흐름관리를 하지 않는다. 그렇기 때문에 버퍼 오버플로우로 인한 데이터 분실 오류가 발생할 수 있다.
이런 UDP의 단점을 보완해주는 RTP프로토콜과 같이 사용하기도 한다.
TCP와 UDP의 차이점
TCP | UDP | |
연결 여부 | 연결 | 비연결 |
전송 순서 | 전송 순서 보장 | 전송 순서 보장하지 않음 |
수신 여부 | 확인 | 비확인 |
통신 회선 | 1:1 | n:n |
신뢰도 | 높다 | 낮다 |
속도 | 느리다 | 빠르다 |
참고 사이트
[TCP/UDP] TCP와 UDP의 특징과 차이
TCP
velog.io
https://aws-hyoh.tistory.com/57
TCP/IP 쉽게 이해하기
IT 분야에서 실무를 담당하시는 분들뿐만 아니라 학생, IT 쪽에 조금이라도 관심이 있는 분들이라면 TCP/IP에 대해 들어보셨을 겁니다. 저 또한 학부시절에 TCP/IP에 대해서 여러 번 들어보았는데요.
aws-hyoh.tistory.com
https://dev-coco.tistory.com/144
TCP와 UDP의 특징 및 차이점 알아보기
TCP와 UDP는 OSI 7 계층들 중 TCP/IP의 전송 계층에서 사용되는 프로토콜이다. ※ 전송 계층은 송신자와 수신자를 연결하는 통신서비스를 제공하는 계층이다. 즉, 데이터의 전달을 담당하며 전달되는
dev-coco.tistory.com