TCP [2]

임승섭·2023년 6월 10일
0

Computer Network

목록 보기
25/27

Connection setup / teardown

  • TCP is bi-directional
  • Each side should initialize connection

connection setup : 3-way handshake

  • client가 server에게 SYN 보낸다
  • server가 client에게 SYN + ACK 보낸다
  • client가 server에게 ACK 보낸다

  • SYN packet은 data를 옮기지 않지만,
    but it consumes one byte number (???)

  • ACK packet do NOT consume byte numbers

SYN flooding attack

  • Dos(Denial of Service) attack 중 하나이다
  • 가짜 source IP address를 이용해서
    여러 client가 server로 SYN packet을 보내는 척을 한다.
  • server는 연결을 할 수가 없고,
    대기 상태가 되면서 다른 user들이 server에 연결할 수 없는 상태가 된다.
  • SYN flooding attack이 가능한 이유
    • server가 SYN을 받으면,
      server는 SYN + ACK을 보내고 ACK을 기다리고 있는다
      (half-open 상태)
    • server는 half-open 상태에서
      client에 대한 기록을 저장해야 하고, 이 과정에서 메모리를 사용한다.

connection teardown

half-close

  • 한쪽 방향만 close되고, 다른 쪽 방향은 아직 open인 상태
  • client가 server에게 FIN 보낸다
  • server는 FIN + ACK 대신 ACK 보낸다
  • 이 상황에서, server만 client에게 data를 보낼 수 있다
  • 이후에 close 할 때는 FIN만 보낸다.

Sliding Window

  • Bytes are trasnferred using send window and receive window
    • Send window
      • window 좌측 : 이미 보내고 ACK 받은 애들
      • window 내부 : 한꺼번에 보낼 수 있는 애들
      • window 우측 : 아직 와도 보내지 않고 기다려야 하는 애들
    • Receive window
      • window 내부 : 받을 수 있는 애들
    • ARQ와 동일
  • sliding window size = min(rwnd, cwnd)

    • rwnd(receiver window)
      : depends on receiver status (advertised window)
    • cwnd(congestion window)
      : depends on network status
  • 위치에 따른 byte 종류

    • left of window : bytes sent and acknowledged
    • inside of window : bytes that can be sent
    • right of window : bytes that cannot be sent

Example

  • receiver host가 size 5,000 bytes짜리 buffer를 갖는다.
    그 buffer는 현재 unprocessed data가 1,000 bytes만큼 차있다.
  • 이 때, advertised window (rwnd)는 4,000 bytes이고,
    sender의 window size는 이 이상으로 올리면 안된다.

TCP

review

  • Connection-oriented
    • setup : 3-way handshake
    • teardown
  • Sliding window
    • bytes inside the window can be sent
    • window moves to the right when the bytes are acknowledged
  • Goal
    • Reliable delivery
    • Fast delivery

Sliding Window Size

  • Large sliding window -> Sender sends bytes rapidly
  • Small sliding window -> Sender sends bytes slowly
  • 그럼 그냥 Large한걸로 사용하면 되는거 아니냐
  • If sending speed is too fast
    • router 또는 receiver에서 drop될 수 있다.
    • packet이 drop되면 재전송해야 하고, waste of bandwidth
  • If sending speed is too slow
    • waste of bandwidth
  • 그래서, what is the proper size? -> Control

Sliding Window Control

  • 최대한 많이 실어서 send한다. 하지만,
    • packet이 receiver에서 drop되면 안된다. (flow control)
    • packet이 router에서 drop되면 안된다. (congestion control)

Flow Control

  • receiver가 sender에게 자기 receiver buffer에 여유 공간이 얼마나 있는지 알려준다.
    • TCP header에 있는 'window size' field를 이용한다
    • sender는 이를 rwnd로 기록한다.
  • Window size field가 16 bits이므로,
    max size = 65535 bytes.
  • 근데 이건 너무 작다
  • 그래서 option의 window scale을 이용해서 이를 더 키운다.
    • window scale = 3이면,
      rwnd = window size * 232^3
  • window scale value의 최댓값은 14
  • 이건 처음에 SYN으로 연결 설정할 때 넣어준다. (매번 보내는게 아니야)

Silly Window Syndrome

  • receiver의 buffer가 거의 가득 찼어 (10 bytes밖에 안남았어)
  • sender에게 10 bytes 남았다고 advertised window size 보내줘
  • sender 입장에서는, cwnd보다 rwnd가 더 작을거니까
    rwnd를 따라갈거야.
  • 계속 10bytes 보내주고, 받고, 10bytes를 보내주고 받어.
    size가 나아지지 않아.
  • 즉, 계속 small segment밖에 보낼 수가 없어.
  • header size는 고정이기 때문에, (IP : 20bytes, TCP : 20bytes)
    data가 10 bytes고 header가 40bytes로 계속 보내면 이건
    매우 큰 overhead야.
  • 즉, segment size가 클 수록 좋은데, 작게 보낼 수밖에 없는 상황

MSS (Maximum Segment Size)

  • A system parameter
  • Operating system에 의해 default determined
  • MTU - Header size (IP + TCP)
    (MTU : 한 번에 보낼 수 있는 데이터 패킷의 최대 크기)

Solution to Silly Window Syndrom

Nagle's algorithm (sender)

  • data를 안보내고 기다린다.
  • MSS가 될 때까지 기다렸다가, 한 번에 큰 data를 보낸다
  • 무작정 계속 기다리는 건 아니고, timer를 설정해서
    timer가 expire되어버리면 segment size가 작아도 그냥 보낸다

Clark's algorithm (receiver)

  • buffer space가 특정 임계값 아래로 내려가면
    advertised window로 0을 보낸다.

Congestion Control

  • receiver 버퍼가 비어 있어도, segment는 중간 router에서 drop될 수 있다.
  • If input speed is faster than output speed at the router, the buffers fill up -> delay increase ->buffer overflow -> packet drop
  • 하지만, 지금 transport layer에서 receiver는 말을 해줄 수 있지만, 중간 router들은 말을 해줄 수가 없다...

Congestion

  • 막힘 현상
  • load가 커질수록 delay는 상승한다.
    load가 capacity에 도달하면 delay는 무한대가 된다 (packet drop)
  • throughput은 처음에는 보내는 만큼 다 들어가니까 상승한다.
  • packet이 drop되면 계속 재전송을 해야 해서 throuput이
    오히려 떨어진다.

Goal

  • best throughput을 맞추기 위해 load를 조절한다

Method

  • 위에 언급했듯이 router는 feedback을 줄 수 없다.
  • "By experience"
  • NO congestion -> increase CWND
  • Congestion -> decrease CWND
  • 단순하네...?
  • packet lost가 발생하면 congestion이라고 생각한다
    • 대부분의 유선에서는 그렇지만, 무선(Wi-Fi)에서는 다른 요인이 있을 수 있다

SLOW START Phase

  • 제어 변수 : CWND
  • 단위 : MSS
  • Initial CWND = 1MSS
  • Initial Phase : SLOW START
    • 1부터 시작하고, 1씩 늘린다.
    • 처음 CWND = 1 -> 1개 보내면 window 끝나
      -> ACK 받아 -> CWND 1 늘려
    • 두번째 CWND = 2 -> 2개 보내면 window 끝나
      -> 각각 ACK 받아 -> CWND 2 늘려
    • 이런 식으로 4개 보내, 8개 보내, 16개 보내
  • CWND increase exponentially

  • RTT(round trip time)마다, CWND는 두 배가 된다.
  • Sending speed는 CWND와 함께 향상된다.
  • 어느 지점에서, congestion이 발생한다 -> packet drop
  • 이걸 어떻게 확인하냐
    • sender가 timer를 켜두고,
      expire될 때까지 ACK이 오지 않으면 packet이 drop되었다고 판단한다.

Timeout

  • 각 TCP segment별로, sender가 timer를 설정한다
  • 만약 일정 시간동안 ACK이 오지 않으면, TIMEOUT
  • timeout이 발생하면, segment가 lost되었다고 판단한다
  • sender는 segment를 재전송한다
  • When a timeout occurs,
    SSThresh is set to CWND / 2
    • SSThresh : Slow-Start Threshold
  • CWND becomes 1
  • Restart the Slow Start phase
  • After timeout, CWND가 다시 상승하기 시작한다.
  • CWND가 SSThresh에 도달하면, Slow Start phase ends
  • Sender는 Congestion avoidance phase로 간다.

Congestion Avoidance Phase

  • 각 RTT마다, CWND는 1MSS씩 상승한다
  • CWND += MSS * (MSS/CWND)
  • additive increase
  • Congestion avoidance phase는 segment가 lost될 때까지 지속된다.

Basic CWND behavior

0개의 댓글