[ STUDY ]/CS

[ 컴퓨터 네트워크 ] TCP와 UDP

김강니 2024. 11. 13. 02:20

TCP

TCP는 전송 계층에 해당하는 네트워크 프로토콜로, 연결형 서비스를 지원하고 데이터의 신뢰성을 보장한다.

  • 송신부와 수신부의 연결을 확인하는 연결형 서비스
  • 패킷 교환 방식 : 패킷이 전달되는 회선이 정해져 있는 가상 회선 방식
  • 패킷 전송 순서가 보장된다.
  • 패킷의 수신 여부를 확인한다.
  • 송신부와 수신부가 1 : 1 통신을 한다.
  • 데이터 손실이 없음을 보장하므로 신뢰성이 높다.
  • 느리다

☝🏻 패킷 교환 방식 2가지

· 가상 회선 방식

데이터를 주고받기 전에 패킷을 전송할 경로인 가상 회선을 설정해서 모든 패킷을 같은 경로로 전송

 

· 데이터그램 방식

패킷마다 최적의 경로로 전송한다. 때문에 송신부에서 보낸 패킷 순서와 수신부에서 받는 패킷의 순서가 다를 수 있다.

 

TCP 핸드셰이킹

TCP에서는 연결형 서비스를 지원하기에 송신부와 수신부를 연결하는 과정을 거친다.

  • 연결을 시작할 때는 3-way 핸드셰이킹
  • 연결을 종료할 때는 4-way 핸드셰이킹
  • 핸드셰이킹 과정에서는 플래그(flag) 값을 주고받는다.

 

🔍  핸드셰이킹에서 주고받는 플래그 값

  • SYN : Synchronization(동기화)의 약자로, 연결을 생성할 때 사용
  • FIN : Finish(종료)의 약자로, 연결을 끊을 때 사용
  • ACK : Acknowledgment(승인)의 약자로, 데이터를 전송하면 수신자가 받았음을 알려 줄 때 사용
  • RST : Reset(초기화)의 약자로, 연결을 재설정할 때 사용
  • PSH : Push(밀다)의 약자로, 빠른 응답이 필요한 데이터를 응용 계층으로 즉시 전송할 때 사용
  • URG : Urgent(긴급)의 약자로, 다른 데이터보다 우선순위가 높은 데이터를 전송할 때 사용

 

3-way 핸드셰이킹

3-way 핸드셰이킹은 데이터를 본격적으로 주고받기 전에 상대방 컴퓨터와 세션을 수립하는 과정이다.

 

 

💡 3-way 핸드셰이킹 과정

  1. 송신부가 수신부와 연결하기 위해 SYN메시지와 함께 임의의 숫자 N을 보낸다.
    이때 송신부는 수신부의 응답을 받기 전까지 SYN_SENT상태가 된다.

  2. 수신부가 송신부로부터 SYN메시지를 받으면 요청을 수락하는 의미의 ACK와 송신부로 받은 N에 1을 더한 값을 함께 보낸다. 또한 수신부도 송신부와의 연결 확인을 위해 SYN메시지와 함께 임의의 숫자 M을 보낸다.
    이때 수신부는 송신부의 응답을 받기 전까지 SYN_RECEIVED상태가 된다.
  3. 송신부가 수신부로부터 ACK+SYN 메시지를 받으면 연결이 성립되었다는 ESTABLISHED상태가 된다.
    그리고 수신부에게 응답으로 ACK메시지와 수신부로부터 받은 M에 1을 더한 값을 보낸다. 이때 ACK에 송신부에서 전송하려던 데이터가 포함될 수 있다.
    수신부도 ACK메시지를 받으면 ESTABLISHED상태가 된다.
  4. 본격적으로 데이터 통신을 시작한다.

 

4-way 핸드셰이킹

4-way 핸드셰이킹은 TCP 연결을 해제할 때 이뤄지는 과정이다

 

 

💡 4-way 핸드셰이킹 과정

  1. 수신부가 송신부로부터 FIN메시지를 받으면 이에 대한 응답으로 ACK메시지를 보낸다.
    이때 수신부는 CLOSE_WAIT상태가 된다. 그리고 연결을 종료하기 위한 작업을 한다.(앱 종료 등)
  2. 송신부에서는 수신부에서 보낸 ACK메시지를 받고 FIN_WAIT2 상태가 된다.

  3. 수신부에서 연결 종료할 준비가 끝나면 송신부에 FIN메시지를 보낸다.
    이때 수신부는 LAST_WAIT상태가 된다.

  4. 송신부는 FIN메시지에 응답을 위해 ACK 메시지를 보내고 TIME_WAIT상태가 되며, 일정 시간이 지나면 CLOSED상태가 된다.
  5. 수신부도 ACK메시지를 받고 CLOSED상태가 된다.

 

 

 

 

 

TCP Keep Alive

세션이 연결되고 이를 유지하기 위해 일정 시간 경과 후 연결 유지 상태를 확인하는 것이다.

  • 동일한 송신부로부터 재요청이 오는 경우 불필요한 3-way 핸드셰이킹을 줄일 수 있다.
  • 또한 FIN메시지를 받지 못한 경우 발생할 수 있는 불필요한 연결, 즉 좀비 커넥션도 방지한다.

 

💡 TCP Keep Alive 흐름

  1. 연결을 유지하길 원하는 쪽에서 일정시간이 되면 TCP Keep Alive패킷을 던진다.
  2. 응답을 받은 경우 : 시간을 다시 측정
    응답을 받지 못한 경우 : 연결 종료

 

 

TCP 제어 방법

TCP의 데이터 신뢰성을 보장하기 위한 제어 방법

 

흐름 제어

흐름 제어는 데이터 송신부와 수신부에서 데이터 처리 속도의 차이 때문에 생기는 데이터 손실을 방지하는 방법이다.

 

1️⃣  정지-대기

송신부에서 데이터를 보낸 후 수신부로부터 ACK메시지를 받을 때까지 다음 데이터를 보내지 않고 기다리는 방식

ACK메시지를 일정시간 받지 못하면 재전송한다.

간단하지만, 이전 메시지에 대한 응답을 받아야만 다음 메시지를 보낼 수 있어 시간 면에서 비효율적이다.

 

 

2️⃣  슬라이딩 윈도우

응답받지 않고도 보낼 수 있는 데이터의 최대 개수의 윈도우 크기를 정해서 윈도우 크기만큼 데이터를 연속적으로 보낼 수 있게 한다.

 

만약, 윈도우 크기가 4일때

수신부 > 송신부 : 1, 2 패킷 보냄(1-4까지 보낼 수 있음)

송신부 > 수신부 : 1, 2에 대한 ACK

수신부 > 송신부 : 3, 4, 5 패킷 보냄(3-6까지 보낼 수 있음)

송신부 > 수신부 : 3, 4에 대한 ACK

수신부               : 5에 대한 ACK를 못받았으므로 윈도우를 2칸만 이동(5-8 보낼 수 있음)

 

 

혼잡 제어

혼잡 제어는 송신부의 데이터 전달 속도와 네트워크 속도 차이로 데이터 손실이 발생하는 것을 방지하기 위한 방법이다.

  • 혼잡이 발생해 네트워크에 패킷이 쌓여 송신부가 ACK를 받지 못하면 메시지 전송이 실패했다고 판단해 수신부에 패킷을 재전송한다.
    이는 혼잡을 가중해 악순환을 야기한다.

 

1️⃣  AIMD(Additive Increase Multiplicative Decrease)

데이터를 증가할 때 합 증가 방식으로 혼잡 윈도우 크기를 더해가면서 키운다.
만약, 데이터 유실이 발생하면 혼잡 윈도우 크기를 1/2 줄인다.

 

📖 AIMD의 장단점
시간이 지나면 여러 송신부 간에 네트워크 대역폭을 공평하게 사용 가능하다.

데이터 유실이 발생하면 1/2로 줄어들기에 다시 대역폭을 넓게 사용하기까지 시간이 오래걸린다.

 

 

2️⃣  느린 시작



윈도우 크기가 1인 상태에서 시작해 ACK받을 때마다 윈도우 크기를 1 증가시킨다. 그러다 혼잡이 발생하면 1로 줄인다.

 

☝🏻 보낼 수 있는 패킷 수가 지수 함수 형태로 증가한다.

송신 > 수신 : 패킷(1개) 보냄

수신 > 송신 : ACK(1개)

송신 > 수신 : 패킷(2개 - 원래 1개 + ACK1개) 보냄

수신 > 송신 : ACK(2개)

송신 > 수신 : 패킷(4개 - 원래 2개 + ACK2개) 보냄

수신 > 송신 : ACK(4개)

송신 > 수신 : 패킷(8개 - 원래 4개 + ACK4개) 보냄

수신 > 송신 : ACK(8개)

 

☝🏻 AIMD 방식에서 초기에 전송 가능한 패킷 수가 적다는 단점을 보완한다.

 

 

3️⃣  혼잡 회피

윈도우 크기가 지수 함수 형태로 증가하다가 혼잡이 발생하는 것을 방지하기 위해 윈도우 크기에 대한 임계점을 정하는 방식이다.

ACK 메시지를 받지 못해 타임아웃이 발생하면 윈도우 크기의 절반을 임계점으로 설정하고, 윈도우 크기를 초기 값으로 변경한다.

 

 

4️⃣  빠른 회복

혼잡이 발생하면 혼잡 윈도우 크기를 절반으로 줄이고 선형적으로 증가하는 방식이다.

 

 

 

5️⃣  빠른 재전송

Duplicate ACK가 3번 발생하면 해당 시점의 윈도우 크기를 1/2로 줄인다. 

 

💡 Duplicate ACK

패킷이 순서대로 도착하지 않아서 받아야 할 차례의 패킷을 ACK 메시지와 함께 요청하는 것

 

예를 들어, 

송신 > 수신 : 0, 1, 2, 3, 4, 5 패킷을 보냄

수신            : 패킷 2를 받지 못함 -> 패킷 3, 4, 5에 대해 패킷 2를 요청하는 Duplicate ACK를 보냄

송신 > 수신 : 패킷 2를 재전송하고 윈도우 크기를 1/2로 줄인다.

 

 

오류 제어

오류 제어는 통신 중 데이터에 오류 또는 유실이 발생할 때 데이터의 신뢰성을 보장하기 위해 오류를 제어하는 방식이다.

 

💡 데이터에 오류 또는 유실 발생을 인지하는 경우

  • 수신부에서 잘못된 데이터를 받았다는 응답인 NAK(Negative Acknowledge) 메시지를 보낸 경우
  • 3 Duplicate ACK가 발생할 때
  • 수신부로부터 ACK메시지를 받지 못해 타임아웃이 발생할 때

 

1️⃣  정지-대기

송신된 패킷에 대한 ACK를 일정 시간 동안 받지 못해 타임아웃이 발생하면 해당 패킷을 다시 보내는 방식이다.

 

 

2️⃣  Go-Back-N ARQ

송신부에서 연속된 데이터를 보냈을 때 누락된 데이터가 있으면 해당 데이터부터 재전송하는 방식이다.

 

 

3️⃣  Selective-Repeat ARQ

송신부에서 연속된 데이터를 보냈을 때 누락된 데이터가 있으면 해당 데이터만 재전송하는 방식이다.

 

 

UDP

UDP는 전송 계층에 해당하는 네트워크 프로토콜로, 비연결형 서비스로 데이터 그램 형태의 통신을 지원한다.

  • 송신부와 수신부의 연결이 보장되지 않는 비연결형 서비스
  • 패킷이 서로 다른 회선으로 교환될 수 있는 데이터그램 패킷 교환 방식
  • 송신부에서 전달한 패킷 순서와 수신부가 받은 패킷 순서가 다를 수 있다.
  • 패킷의 수신 여부를 확인하지 않는다.
  • 데이터의 신뢰성이 낮다
  • 데이터 전송 속도가 빠르다
  • 1:1 통신, 1:N 통신, N:N 통신 모두 가능하다.

· 데이터그램 방식

패킷마다 최적의 경로로 전송한다. 때문에 송신부에서 보낸 패킷 순서와 수신부에서 받는 패킷의 순서가 다를 수 있다.

 

UDP의 오류 검출 - 체크섬(checksum)

UDP는 최소한의 신뢰성을 보장하기 위해 체크섬 방식으로 오류를 검출한다.

 

💡 체크섬(checksum)

데이터의 무결성을 보장하는 간단한 방법으로, 체크섬을 만들기 위한 데이터를 모두 더한다.

이때 오버플로되는 캐리가 발생하면 해당 캐리를 떼서 데이터에 다시 더한 후 1의 보수를 취해 체크섬을 만든다.

 

  1. UDP 송신부는 UDP의 헤더, IP헤더의 일부 정보(발신 IP 주소, 수신 IP 주소, 프로토콜 ID 등)와 데이터로 체크섬 값을 생성한다.
  2. 생성한 체크섬 값을 UDP헤더의 체크섬 영역에 넣어 수신부로 보낸다.
  3. 수신부는 체크섬을 포함한 모든 값을 더해 비트가 모두 1이 나오는 지 확인한다.
    비트가 모두 1이라는 뜻은 송신부와 동일한 체크섬 값이 나온다는 것을 의미한다.

☝🏻 체크섬을 이용해도 오류를 100% 검출할 수는 없다. 또한 체크섬은 선택사항으로 송신부에서 체크섬을 0으로 보내면 수신부는 계산하지 않는다.