본문 바로가기

Network

[Network] TCP(TCP 설명, 혼잡 제어)

728x90
TCP 전체적인 설명, 헤더 분석, 혼잡 제어에 대한 기록이다.

개요

TCP에서 Control은 크게 3가지가 있다.
1.Flow control
2.Error control
3.Congestion control

전체적인 TCP의 구조는 위의 3 Control에 기반해서 그려보면 좋을 것 같다.

TCP의 특징

1. 신뢰성 있는 스트림 전송 서비스 제공을 목적으로 한다.

2. p-Ack 재전송 기법 사용

p-Ack 재전송 기법
-수신 측에서 데이터를 수신하면  'Ack' 메시지를 재전송하는 기법

-전송 측에서는 'Ack' 메시지를 받기 전까지 전송한 데이터를 가지고 있는다. (오류에 대비)

3. 송신 측과 수신 측은 버퍼를 가진다.

버퍼
-송신측 : 에러가 발생할 수 있으니 버퍼에 저장해놓음

-수신측 : 단편화된 패킷은 순서에 맞춰서 Application Layer에 보내야 하므로 버퍼에 저장한다.

4. 전이중 서비스

  • 송신 데이터와 수신 데이터에 대한 확인 응답(Ack)을 함께 보내는 피기백킹(piggybacking)

5. 연결 지향 서비스

  • 요청-승인-데이터 교환-해제 순으로 통신이 진행된다.

TCP 헤더

  • 송신자와 수신자의 포트 주소
  • 순서 번호(Sequence Number) : 해당 segment 바이트 스트림의 첫 번째 번호
  • 확인 응답 번호(Acknowledge Number) : 상대방 노드로부터 수신하고자 하는 바이트의 번호

  • flag
    • ack : Ack 메시지
    • reset, syn, fin : 연결을 만들려는 신호

TCP 오류 제어(Error Control)

오류 발견 도구
1. 검사합(checksum) : 데이터 훼손 여부 확인
2. 확인 응답 : 수신을 송신 측에 알려주는 확인 응답 이용
3. 시간 초과 : 시간 초과 전까지 확인 응답되지 않으면 훼손 또는 손실로 간주

시간 초과는 RDT 서비스에 의해 제공된다.

재전송이 요구될 때

  1. timeout events(reasonable time)
  2. duplicate acks(3 time)

 

TCP Flow Control

수신자는 송신자에게 수신자의 RWND(Reciever Window)를 보낸다.
-> RWND이상의 데이터는 보내지 말라는 의미
  • window 사이즈를 초과하면 drop 되기 때문에 이에 맞는 flow control이 필요함.

여기서 window는 버퍼를 생각하면 된다.

즉, 감당할 수 있을 만큼의 메시지 양을 정한 버퍼를 뜻한다.

TCP 3-way handshake

  • 클라이언트와 서버 모두 Ack 패킷을 받은 시점부터 connection이 생긴다.
  • 위의 시점이 다르기 때문에 각각 다른 시점에서 connection이 생긴다.

TCP Closing Connection

  1. 클라이언트가 final data를 보냄
  2. 서버에서 data를 받고, ack을 보냄
  3. 서버에서 final data를 보냄
  4. 클라이언트에서 data를 받고, ack을 보냄
  5. 서버가 ack을 받음 (서버에서 연결을 끊음)
  6. 클라이언트는 ack을 보내고, 기다렸다가 연결을 끊음(loss가 있을 수 있기 때문)
TCP는 양방향 통신이기 때문에, 양쪽 모두 독립적으로 종료를 완수해야만 완전한 종료라고 할 수 있다.

TCP Congestion Control

Congetion Control을 보기 전에 Congestion이 뜻하는 것은 뭘까?
말 그대로 '혼잡 상태'를 말한다.

네트워크 혼잡으로 앞서 기록한 에러(Time Out, Duplicate Acks) 들이 발생하는 상황을 뜻한다. 

Congetion

  1. Time Out : 보낸 메시지나 상대방의 메시지가 loss난 상황으로 정말 네트워크가 혼잡함을 뜻한다.
  2. Duplicative Acks : 순서가 꼬이는 등의 일시적인 오류로 일어날 수 있는 에러이다.

Congestion Control에서는 Congestion이 발생했을 때 Congestion Window를 감소시킨다.
이때 중요한 것은 위의 두 에러를 구분하는가이다.

여기서 Congestion Window는 송신 측에서 정하는 window를 말하며,
송신측 window와 수신 측 window 중 더 작은 값을 선택해서 결정한다.


위에서 언급한 대로 Time Out은 정말 네트워크가 혼잡한 상황이지만, Duplicative Acks는 일시적인 오류일 수 있다.
따라서 Duplicative Acks가 날 때마다 네트워크가 혼잡하다고 간주하고 Congetion Window를 대폭 감소시킨다면,  비효율적일 것이다.

두 에러를 구분하지 않는 TCP는 1세대 TCP인 TCP Tahoe이고,
두 에러를 구분하는 TCP는 2세대 TCP인 TCP Reno이다.

Congetion Control은 크게 3개의 구간으로 나뉘는데 어떤 구간들인지 각각 보고, 두 TCP를 비교해보자

Congestion Section

Congestion Section에서 키워드는 AIHD(Additive Increase Multiplicative Decrease)이다.
말 그대로 느리게 증가, 빠르게 감소이다.

이에 기반해 구간은 
1. Slow Start
2. Congestion Avoidance
3. Congetion Detection
으로 나뉜다.

아래의 그래프를 중심으로 기록하겠다.

Slow Start

congestion window를 1부터 지수 형태로 SSThreshold(Slow Start Threshold)까지 증가시키는 것을 말한다.

 

SSThreshold는 "임계치"를 말하며, 혼잡이 발생할 가능성이 있는 구간의 시작을 말한고,

초깃값은 최대 윈도우 크기의 절반으로 정한다.

 

Congestion Avoidance

SSThreshold에 도달했을 때부터의 구간이다.

이때부터는 혼잡 window 크기를 1씩 증가시킨다.

 

Congestion Detection

혼잡이 발생한 시점부터의 구간이다.

Multiplicative Decrease를 수행하고, 다시 slow start를 시작한다.

여기서 중요한 것은 Threshold를 혼잡 발생 시점의 윈도우의 절반으로 낮춘다는 것이다.

만약 일시적인 오류일 수 있는 Duplicative Acks 에러에 대해 위처럼 대처한다면 비효율적일 것이다.
이제 앞서 말했던 두 TCP를 비교해보자

Two TCP

TCP Tahoe

위에서도 볼 수 있듯이 두 에러를 구분하지 않고,

에러가 발생하면 바로 Congetsion Window를 1까지 낮추는 것을 볼 수 있다.

 

이렇게 되면 매우 비효율적일 것이다.

 

TCP Reno

Reno는 Duplicative Acks 에러일 때 CWND를 새로운 값으로 감소시킨다.

이 새로운 값은 해당 에러가 발생한 CWND의 절반으로 설정한다.

 

CWND가 위의 지점까지 감소하면, Slow Start로 시작하는 것이 아니라 1씩 증가시킨다.

위에서 보듯 Tahoe보다 훨씬 효율적인 방법임을 알 수 있다.

 

 

 

 

 

728x90

'Network' 카테고리의 다른 글

[Network] HTTP/1,2,3(QUIC)  (0) 2022.12.05
[Network] UDP  (0) 2022.12.02
[Network] Transport Layer  (0) 2022.12.02
[Network] OSI 모델과 TCP/IP 프로토콜  (0) 2022.11.04