들어가며
TCP/IP의 전송 계층은 두 응용 계층 사이에서 Process-To-Process 통신을 제공하는데, 이때 사용하는 프로토콜인 TCP와 UDP에 대해 알아보겠습니다. 아래 그림을 참고하면 좋을 것 같습니다.

TCP
TCP는 연결 지향성과 신뢰성 있는 전송이라는 특징을 가진 프로토콜로 전이중과 점대점 방식으로 동작합니다.
- 전이중 (Full-Duplex)
- 점대점 (Point to Point)
연결 지향
TCP 프로토콜은 다음과 그림과 같이 데이터를 전송합니다.

3-Way-HandShaking
TCP는 연결 지향형 프로토콜로 데이터를 전송하기 전 논리적 연결 과정이 필요합니다. 이를, Connection Set Up 이라고 부르며 다음과 같이 수행합니다.
- SYN (클라이언트 -> 서버)
- SYN 플래그가 설정된 패킷 전송 (시퀀스 번호 포함)
- SYN + ACK (서버 -> 클라이언트)
- SYN, ACK 플래그 설정
- 시퀀스 번호화 응답 번호를 포함 후 응답
- ACK (클라이언트 -> 서버)
4-Way-HandShaking
연결 지향형인 TCP 프로토콜은 Connection Set Up 과정에서 수행한 연결을 종료해야 할 필요가 있습니다. 이를 4-Way-HandShaking 방법을 통해 다음과 같이 수행합니다.
- FIN (클라이언트 -> 서버)
- ACK (서버 -> 클라이언트)
- 아직 남은 데이터가 존재할 때 ACK 플래그가 설정된 패킷 전송
- FIN (서버 -> 클라이언트)
- 모든 데이터 전송이 끝난 후 FIN 플래그가 설정된 패킷 전송
- ACK (클라이언트 서버)
- ACK 플래그가 설정된 패킷을 보낸 후 연결 종료
신뢰성 있는 전송
신뢰성 있는 전송을 위해 TCP Header의 Checksum, 확인 응답, 타임 아웃 등을 통해 오류 제어, 흐름 제어, 혼잡 제어를 수행합니다. 각 제어들은 다음과 같은 역할을 수행합니다.
- 오류 제어
- 훼손(손실)된 세그먼트의 감지 및 재전송
- 순서에 따라 세그먼트 정렬
- 중복 세그먼트 감지 및 폐기
- 흐름 제어
- 데이터를 보내는 속도와 데이터를 받는 속도의 균형 조절
- 혼잡 제어
- 네트워크의 혼잡 상황을 감지하고 이를 완화하기 위해 데이터 전송 속도를 조절
UDP
UDP는 연결 지향성을 갖지 않으며 신뢰성을 낮다는 특징을 가진 프로토콜입니다. TCP와 달리 논리적 연결을 설립하지 않고, 각각의 패킷은 독릭접인 관계를 가집니다. 이러한 단순성은 적은 양의 오버헤드를 가지기 때문에 속도가 매우 빠른 특징을 가지고 있습니다.
UDP는 완전히 신뢰성을 보장하지 않나요?
UDP의 경우 CheckSum 필드를 통해 최소한의 오류 검출은 수행합니다. 이에 따라, 신뢰성이 낮다고 하는 것이 정확한 표현합니다.
예상 질문
TCP란 무엇인가요?
전이중과 점대점 방식
연결 지향성
- 3-Way-HandShaking
- 논리적 연결 수립
- SYN -> SYN/ACK -> ACK
- 4-Way-HandShaking
- 논리적 연결 종료
- FIN -> ACK(TIME_WAIT) -> FIN -> ACK
신뢰성 보장
- Header의 CheckSum, 확인 응답, 타임 아웃
UDP란 무엇인가요?
비연결성
- 패킷은 독립적인 관계를 유지
- 물리적인 연결은 필요
신뢰성 낮음
TCP, UDP 차이
신뢰성
연결성
전송 순서
재전송 여부
통신 방식
- TCP : 전이중, 점대점(1:1)
- UDP : 1:1, 1:N, N:N 등
TCP, UDP는 각각 어느 상황에 사용하나요?
성능이 중요한 경우
안정성이 중요한 경우