> For the complete documentation index, see [llms.txt](https://woungsub1234.gitbook.io/woungsub-devlog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://woungsub1234.gitbook.io/woungsub-devlog/infra/network/tcp-udp.md).

# Tcp-udp.md

***

오늘은 네트워크 7계층 중 전송계층에 속하는 프로토콜 중 TCP와 UDP에 대해서 알아보겠습니다.

![ositcp](https://github.com/WoungSub-Byun/TIL/blob/main/Infra/Image/ositcp.jfif)

## TCP

***

### 정의

**Transmission Control Protocol**

직역해보면 **'전송 제어 프로토콜'**

> ☝ **인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜**

일반적으로 TCP만을 부르지 않고 TCP/IP라고 많이 표기하는데요, 그 이유는 IP가 TCP에서 중요한 역할을 하기 때문입니다.

> IP (Internet Protocol Address)
>
> 인터넷상에 있는 컴퓨터의 고유한 주소

IP가 데이터의 배달을 처리한다면 TCP는 패킷을 추적 및 관리합니다.

> 🟢 패킷(Packet)이란?
>
> 인터넷 통신시테 데이터를 보내기 위한 라우팅을 효율적으로 하기 위해 데이터를 여러 개의 조각들로 나누어 전송하게 되는데, 이때 이 조각을 패킷이라고 합니다.

> 🟠 TCP가 패킷을 추적 및 관리하는 방법
>
> 패킷 A, B, C가 있다고 가정해봅시다. 세 패킷 모두 목적지 Z에 순차적으로 도달해야합니다. 그런데 패킷이 전송되는 도중 B가 분실되었다고 가정합시다. 하지만 목적지 Z에서는 A, C만 보고 전송이 완료되었다고 생각할 수 있습니다. 따라서 A, B, C 패킷에 1,2,3이라는 번호를 부여하여 패킷의 분실 확인과 같은 처리를 하여 목적지에서 재조립하는 과정을 거치게 됩니다. 이러한 과정으로 TCP는 패킷을 추적하고, 나누어 보내진 데이터를 받고 조립할 수 있습니다.

> ***TCP Flow***
>
> <img src="https://github.com/WoungSub-Byun/TIL/blob/main/Infra/Image/tcpflow.png" alt="tcpflow" data-size="original">

TCP는 연결형 서비스를 지원하는 프로토콜로 인터넷 환경에서 기본으로 사용합니다.

![pakitexchange](https://github.com/WoungSub-Byun/TIL/blob/main/Infra/Image/pakitexchange.png)

### 특징

* 연결형 서비스로 가상 회선 방식을 제공
* 3-way handshaking 과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제한다.
* 흐름제어 및 혼잡 제어
* 높은 신뢰성 보장
* UDP보다 느린 속도
* 전이중, 점대점 방식

> *3-way-handshaking* ![3wayhandshaking](https://github.com/WoungSub-Byun/TIL/blob/main/Infra/Image/3wayhandshaking.png)

> 위와 같은 특징들을 통해 발신지와 수신지를 연결하여 정확한 전송을 보장하지만 이런 기능들을 제공하는 것은 cpu를 사용하기 때문에 UDP에 비해 속도가 느립니다.

✔ **따라서 TCP는 연속성보다는 신뢰성있는 전송이 중요할 때에 주로 사용합니다**

## UDP

***

## 정의

**User Datagram Protocol**

> ☝ **데이터를 데이터그램 단위로 처리하는 프로토콜**

데이터그램이란 독립적인 관계를 지니는 패킷을 의미합니다.

TCP와 다르게 UDP는 **비연결형 프로토콜**입니다. 즉, *연결을 위해 논리적인 경로가 할당되지 않습니다*. 따라서 *각각의 패킷은 다른 경로로 전송*되고, 각각의 패킷은 독립적인 관계를 지니게 되는데 이렇게 **데이터를 서로 다른 경로로 독립적으로 처리하게 되는 형태**를 지닌 프로토콜을 UDP라고 합니다.

![udproute](https://github.com/WoungSub-Byun/TIL/blob/main/Infra/Image/udproute.png)

### 특징

* **비연결형 서비스**로 데이터그램 방식 제공
* 정보를 주고 받을 때 보내거나 받는다는 신호절차를 거치지 않는다.
* UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
* **신뢰성이 낮다.**
* **TCP보다 빠른 속도**

> 비연결형 서비스인 UDP는 서로 다른 경로로 독립적으로 처리함에도 패킷 재조립이나 순서를 지정하는 과정이 없기 떄문에 *TCP보다 속도가 빠르고 네트워크의 부하가 없지만* *신뢰성있는 데이터의 전송을 보장하지는 않습니다*. 그렇기 떄문에 **신뢰성보다는 연속성이 중요한 실시간 서비스(streaming)에** 자주 사용됩니다.

> ***UDP Flow***
>
> <img src="https://github.com/WoungSub-Byun/TIL/blob/main/Infra/Image/udpflow.png" alt="udpflow" data-size="original">

* UDP는 연결 자체가 없기 때문에 서버소켓과 클라이언트 소켓의 구분이 없습니다. 또한 흐름제어(flow-control)가 없기 때문에 패킷이 제대로 전송되었는지, 오류가 없는지 확인할 수 없습니다.

> 흐름제어(flow-control)란?
>
> 흐름제어란 데이터를 송신하는 곳과 수신하는 곳의 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를방지하는 것입니다.

> 혼잡제어(Congestion-control)란?
>
> 혼잡제어란 네트워크 애의 패킷 수가 넘치지 않도록 방지하는 것입니다. 만약 정보의 소통량이 과다하다면 패킷을 조금만 전송하여 혼잡 붕괴 현상이 일어나는 것을 막습니다.

## TCP vs UDP

***

| 프로토콜     | TCP     | UDP               |
| -------- | ------- | ----------------- |
| 연결 방식    | 연결형     | 비 연결형             |
| 패킷 교환 방식 | 가상회선 방식 | 데이터 그램 방식         |
| 전송 순서    | 보장      | 보장하지 않음           |
| 수신 여부    | 확인      | 확인하지않음            |
| 통신 방식    | 1:1     | 1:1 or 1:N or N:N |
| 신뢰성      | ⬆       | ⬇                 |
| 속도       | 느림      | 빠름                |
