TCP(연결 지향형 프로토콜)이란?

Dmori_2562·2022년 10월 24일
1

TCP 미리보기

  • 가득찬 양방향의 데이터(full duplex data)

    같은 연결 내에서 양방향의 데이터 흐름
    MSS: Maximum Segment Size

  • 연결 지향적(connection-oriented)

    데이터를 교환하기 전에 handshaking 과정을 거친다.

  • 흐름 제어(flow controlled)

    수신자의 용량에 넘치도록 데이터를 보내지 않는다.

  • 1:1(point-to-point)

    하나의 송신자, 수신자

  • 신뢰성 있는(reliable), 순서가 보장되는(in-order)

  • 파이프라이닝(pipelined)


TCP 세그먼트


1. 시퀀스 번호와 ACKs

  • 데이터 흐름의 첫 번째 바이트는 0번으로 지정된다.

예제 1: File은 500,000 바이트, MSS는 1,000 바이트.

  • 첫 번째 세그먼트는 시퀀스 번호가 0으로 지정된다.
  • 두 번째 세그먼트는 시퀀스 번호가 1000으로 지정된다.
  • 그 이후도 이런 식으로 진행된다.

MSS vs MTU

MSS: Maximum Segment Size
MTU: Maximum Transmission Unit

예제 2: 호스트 A가 호스트 B로부터 0~535까지 바이트와 900~1000까지 바이트를 받았다고 하자.

  • 이 경우, 호스트 A는 536~899까지 바이트를 받지 못한 것이다.
  • 이 경우 호스트 A는 536 바이트를 기다리고 있고, 호스트 B에게 536 바이트가 포함된 ACK 번호 필드를 보낼 것이다.

    TCP는 스트림에서 첫 번째 누락된 바이트까지만 바이트를 인식하기 때문에, TCP는 누적된 ACK(cumulative acknowledgements)을 제공한다.


시퀀스 번호

  • 처음: 랜덤한 난수로 지정된 시퀀스 번호(Initial sequence number)

  • 그 이후: Initial sequence number(ISN) + 전송한 바이트의 수

ACK

  • 다른 측에서 올 것이라고 예상되는 seq # 번호.

  • 누적된 ACK 방식.

시퀀스 번호와 ACK 예제

위의 그림에서는 클라이언트와 서버의 시퀀스 번호가 각각 42와 79로 시작.
보내는 데이터의 바이트 수가 1이기에 +1씩 된 것임.


2. TCP의 RTT와 timeout

어떻게 TCP의 timeout 값을 결정할까?

  • RTT보다는 길게 한다.

하지만 RTT의 값은 변화한다!

  • timeout이 너무 짧다면? - 일찍 timeout이 될 수 있고, 불필요한 재전송이 일어날 수 있다.
  • timeout이 너무 길다면? - 세그먼트 손실에 대해 느리게 반응한다.

어떻게 RTT를 측정하는가?

  • SampleRTT를 통해 측정한다.
  • SampleRTT는 달라지기에, estimated RTT를 "smoother"하게 만들어야 한다.
  • 주로 a = 0.125 이다.

timeout 간격

Estimated RTT + safety margin


TCP의 신뢰적인 데이터 전송

TCP는 IP를 신뢰할 수 없기에 그 위에 rdt 서비스를 만든다.

  • 파이프라이닝 된 세그먼트

  • 누적된 ACKs

  • 단일의 재전송 타이머

재전송의 유발 요소

  • timeout 이벤트
  • 중복된 ACKs

간단한 TCP 예제

  • 중복된 ACKs를 무시한다.

  • 흐름 제어와 혼잡 제어를 무시한다.

재전송 1) ACK lost 발생시

재전송 2) timeout 발생시(Seq=100은 재전송 X)

재전송을 통해 수신자는 Seq=92를 받았지만, 이전에 Seq=100, 20 bytes의 data 까지 받았다는 뜻으로 ACK=120을 보낸다!

늦은 재전송: timeout interval이 너무 김

TCP의 빠른 재전송

중복된 ACKs를 통해서 잃어버린 세그먼트를 탐색한다.

TCP 빠른 재전송
송신자가 같은 데이터에 대해서 3 ACKs("triple duplicate ACKs)를 받으면 가장 작은 seq #를 가지고 있는 unACKed 세그먼트를 재전송한다.


TCP의 흐름 제어

TCP는 흐름 제어 서비스를 어플리케이션에 제공한다.

왜?
: 송신자가 수신자의 버퍼를 넘치게 하는 가능성을 제거하기 위해서!

어떻게?
: TCP는 송신자가 수신 창이라는 변수를 유지 관리하도록 하여 흐름 제어를 제공한다.


RcvBuffer

송신자가 TCP 연결을 통해 수신자에게 큰 파일을 보내고 있다고 가정하자.

  • 수신자는 이 연결에 수신 버퍼를 할당하고, RcvBuffer로 그 크기를 나타낸다.

    RcvBuffer의 크기는 소켓 옵션에 설정되어있다.(주로 4096 바이트 크기)

  • 수신자는 수신자 대 송신자 세그먼트의 TCP 헤더에 rwnd 값을 포함함으로써 사용 가능한 버퍼 공간을 "광고"한다.

    송신자는 unACKed("in-flight") 데이터의 양을 수신자의 rwnd 값으로 제한하여 수신자의 버퍼가 넘치지 않도록 한다!



연결 관리

연결 시작

데이터를 교환하기 전에, 송신자와 수신자는 "handshake"를 진행한다.

TCP 연결은 3-way handshake가 기반이 된다!

연결 종료

클라이언트, 서버 각각이 연결 측면을 닫는다.

  • FIN bit가 1인 TCP 세그먼트를 보낸다.

  • 수신한 FIN에 ACK로 응답한다.

Syn Flood Attack

profile
어제보다 더 나은 오늘의 나를 위해 달려나가는 중입니다!

0개의 댓글