TCP와 UDP

...·2024년 6월 17일

network

목록 보기
2/5

전송 계층에서 가장 중요한 프로토콜은 TCP와 UDP이다.
TCP(Transmission Control Protocol)는 신뢰할 수 있는 통신을 위한 연결형 프로토콜이고, UDP(User Datagram Protocol)는 TCP보다 신뢰성은 떨어지지만 비교적 빠른 통신이 가능한 비연결형 프로토콜이다.

TCP 통신 단계와 세그먼트 구조

1. 연결 수립 -> 2. 데이터 송수신(재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어) -> 3. 연결 종료

TCP는 통신(데이터 송수신)하기 전에 연결을 수립하고 통신이 끝나면 연결을 종료한다. 그리고 데이터 송수신 과정에서 재전승을 통한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공한다.

TCP의 연결 수립과 종료를 이해하려면 가장 먼저 MSS라는 단위와 TCP의 세그먼트 구조를 이해해야 한다. MSS(Maximum Segment Size)는 TCP로 전송할 수 있는 최대 페이로드 크기를 의미한다. MSS의 크기를 고려할 때 TCP 헤더 크기는 제외한다. 헤더의 크기까지 포함했던 단위인 MTU와는 대조적이다.

다음은 TCP 세그먼트 구조이다.

  • source port, destination port: 필드 이름 그대로 송신 또는 수신 애플리케이션을 식별하는 포트 번호가 명시되는 필드이다.
  • sequence number: 순서 번호가 명시되는 필드이다. 순서 번호란 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호이다.
  • acknowledgement number: 상대 호스트가 보낸 세그먼트에 대한 응답으로, 다음으로 수신하기를 기대하는 순서 번호가 명시된다.
  • control beat: 플래그 비트(flag bits)라고도 부른다. 현재 세그먼트에 대한 부가 정보를 나타낸다.
  • window size: 수신 윈도우의 크기가 명시된다. 수신 윈도우란 한 번에 수신하고자 하는 데이터의 양을 나타낸다.

control beat

sequence number와 acknowledgement number를 학습하려면 먼저 control beat 필드에 대한 간략한 이해가 필요하다. control beat는 기본적으로 8비트로 구성된다. 각 자리의 비트는 각기 다른 의미를 가지는데, TCP의 기본 동작을 논할 때 가장 자주 언급되는 세 개의 control beat는 다음과 같다.

  • ACK: 세그먼트의 승인을 나타내기 위한 비트
  • SYN: 연결을 수립하기 위한 비트
  • FIN: 연결을 종료하기 위한 비트

sequence number, acknowledgement number

sequence number 필드와 acknowledgement number 필드는 TCP의 신뢰성을 보장하기 위해 사용되는 중요한 필드이다.

sequence number는 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호로, 세그먼트 데이터의 첫 바이트에 부여되는 번호이다.

예를 들어 전송 계층이 응용 계층으로부터 전송해야 하는 1900바이트 크기의 데이터를 전달받았다고 가정해보자.

이는 MSS 단위로 전송될 수 있다. 편의상 MSS가 500바이트라고 가정했을 때, 1900바이트짜리 데이터 덩어리를 MSS 단위로 쪼개면 네 개의 세그먼트로 쪼갤 수 있을 것이다. 이때, 세그먼트 A, B, C, D순으로 전송된다고 가정해 보자.

처음 통신을 위해 연결을 수립한 경우, 즉 control beat에서 연결을 수립하기 위한 비트인 SYN 플래그가 1로 설정된 세그먼트의 경우 sequence 번호는 무작위 값이 된다. 이를 ISN(Initial Sequence Number)라고 한다. ISN이 100이라면 가장 먼저 보내게 될 세그먼트 A의 sequence number가 ISN인 100이 되는 것이다.

연결 수립 이후 데이터를 송신하는 동안 sequence number는 송신한 바이트를 더해 가는 형태로 누적값을 가진다. 즉, sequence number는 ISN + 송신한 바이트 수가 되는 셈이다.

acknowledgement number는 sequence number에 대한 응답이다. 즉, acknowledgement number는 수신자가 다음으로 받기를 기대하는 sequence number이다.

TCP 연결 수립과 종료

연결 수립: three way handshake

TCP의 연결 수립은 three way handshake를 통해 이루어진다. three way handshake는 이름처럼 3개의 단계로 이루어진 TCP의 연결 수립 과정을 의미한다.

송수신 방향세그먼트세그먼트에 포함된 주요 정보비유
A → BSYN 세그먼트호스트 A의 ISN / 1로 설정된 SYN 비트연결 시작
B → ASYN + ACK 세그먼트호스트 B의 ISN / 호스트 A가 전송한 세그먼트에 대한 acknowledgement number / 1로 설정된 SYN 비트 / 1로 설정된 ACK 비트확인 / 연결 시작
A → BACK 세그먼트호스트 A의 다음 sequence number / 호스트 B가 전송한 세그먼트에 대한 acknowledgement number / 1로 설정된 ACK 비트확인

이때 처음 연결을 시작하는 호스트의 연결 수립 과정을 액티브 오픈(active open)이라 한다.
active open은 주로 서버 - 클라이언트 관계에서 클라이언트에 의해 수행된다.

반대로 연결 요청을 받고 나서 요청에 따라 연결을 수립해 주는 호스트도 있다.
이 호스트의 연결 수립 과정을 패시브 오픈(passive open)이라고 한다. 주로 서버에 의해 수행된다.

연결 종료

TCP가 연결을 종료하는 과정은 송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 이루어진다.

송수신 방향세그먼트세그먼트에 포함된 주요 정보비유
A -> BFIN 세그먼트1로 설정된 FIN 비트연결 끊음
B -> AACK 세그먼트호스트 A가 전송한 세그먼트에 대한 acknowledgement number / 1로 설정된 ACK 비트확인
B -> AFIN 세그먼트1로 설정된 FIN 비트연결 끊음
A -> BACK 세그먼트호스트 B가 전송한 세그먼트에 대한 acknowledgement number / 1로 설정된 ACK 비트확인

액티브 클로즈(active close)는 먼저 연결을 종료하려는 호스트에 의해 수행된다.
패시브 클로즈(passive close)는 연결 종료 요청을 받아들이는 호스트에 의해 수행된다.

TCP 상태

TCP는 연결형 통신과 신뢰할 수 있는 통신을 유지하기 위해 다양한 상태를 유지한다. TCP는 상태를 유지하고 활용한다는 점에서 stateful 프로토콜이라고도 부른다.

상태 분류주요 상태
1CLOSED, LISTEN
2SYN-SENT, SYN-RECEIVED, ESTABLISHED
3FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSING

연결이 수립되지 않은 상태

아직 연결 수립이 이루어지기 전의 호스트는 주로 CLOSED나 LISTEN 상태를 유지하고 있다.

  • CLOSED: 아무런 연결이 없는 상태이다.
  • LISTEN: 일종의 연결 대시 상태이다. 일반적으로 서버로서 동작하는 패시브 오픈 호스트는 LISTEN 상태를 유지한다.

연결 수립 상태

TCP 연결 수립 과정에서는 주로 SYN-SENT, SYN-RECEIVED, ESTABLISHED 상태를 볼 수 있다.

  • SYN-SENT: 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태이다.
  • SYN-RECEIVED: 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태이다.
  • ESTABLISHED: 연결이 확립되었음을 나타내는 상태이다.

연결 종료 상태

TCP 연결을 종료하는 과정에서는 주로 FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSED 상태를 볼 수 있다.

  • FIN-WAIT-1: 일반적인 TCP 연결 종료 과정에 있어 FIN-WAIT-1은 연결 종료의 첫 단계가 된다. FIN 세그먼트로서 연결 종료 요청을 보낸 액티브 클로즈 호스트는 FIN-WAIT-1 상태로 접어들게 된다.
  • CLOSE-WAIT: 종료 요청인 FIN 세그먼트를 받은 패시브 클로즈 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태이다.
  • FIN-WAIT-2: FIN-WAIT-1 상태에서 ACK 세그먼트를 받게 되면 FIN-WAIT-2 상태가 된다. 상대 호스트의 FIN 세그먼트를 기다리는 상태이다.
  • LAST-ACK: CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태이다.
  • TIME-WAIT: 액티브 클로즈 호스트가 FIN 세그먼트를 수신한 뒤, 이에 대한 ACK 세그먼트를 전송한 뒤 접어드는 상태이다. 패시브 클로즈 호스트가 마지막 ACK 세그먼트를 수신하면 CLOSED 상태로 전이하는 반면, TIME-WAIT 상태에 접어든 액티브 클로즈 호스트는 일정 시간을 기다린 뒤 CLOSED 상태로 전이한다.

** 만약 TIME-WAIT 상태로 일정 시간 대기하지 않고 곧바로 연결을 종료해버리면 상대 호스트 입장에서는 마지막 ACK 세그먼트를 재전송받을 수 없다. 또, 한 연결을 종료하고 다른 연결을 수립하는 과정 사이에 대기 시간이 없다면 서로 다른 연결의 패킷들이 혼란을 야기할 수 있다.

참고로 CLOSING 상태는 보통 동시에 연결을 종료하려 할 때 전이되는 상태이다. 서로가 FIN 세그먼트를 보내고 받은 뒤 각자 그에 대한 ACK 세그먼트를 보냈지만, 아직 자신의 FIN 세그먼트에 대한 ACK 세그먼트를 받지 못했을 때 접어드는 상태이다. 양쪽 모두가 연결 종료를 요청하고, 서로의 종료 응답을 기다리는 경우 CLOSING 상태로 접어드는 셈이다. 이 경우 ACK 세그먼트를 수신한다면 각자 TIME-WAIT 상태로 접어든 뒤 종료하게 된다.

UDP 데이터그램 구조

UDP는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 없는 프로토콜이다. 그래서 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어 등을 수행하지 않는다. TCP처럼 상태를 유지하지도 않는다.
상태를 유지하지도, 활용하지도 않는다는 점에서 UDP를 stateless 프로토콜의 일종이라고도 한다.

UDP 데이터그램 헤더는 크게 송신지 포트와 수신지 포트, 길이, 체크섬 필드의 네개 필드로 구성되어 있다.

0 ~ 1616 ~ 32
source portdestination port
길이체크섬
  • source port, destination port: 송수신지의 포트 번호가 담긴다.
  • 길이: 헤더를 포함한 UDP 데이터그램의 바이트가 담긴다.
  • 체크섬: 데이터그램 전송 과정에서 오류가 발생했는 지 검사하기 위한 필드이다. 수신지는 이 필드의 값을 토대로 데이터그램의 정보가 훼손되었는지를 판단하고, 문제가 있다고 판단한 데이터그램은 폐기한다.

UDP는 TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리할 수 있다. 그래서 주로 실시간 스트리밍 서비스, 인터넷 전화처럼 실시간성이 강조되는 상황에서 TCP보다 더 많이 쓰인다.

참고: https://nogan.tistory.com/20
참고: https://www.thenetworkdna.com/2020/09/all-about-ip-mtu-and-ip-tcp-mss.html
참고 서적: 혼자 공부하는 네트워크

profile
주니어 백엔드 개발자

0개의 댓글