Chapter 3 Transport layer - 3

주리링·2021년 11월 30일
0

컴퓨터 네트워크

목록 보기
3/5
post-thumbnail

3.5 connection-oriented transport : TCP

Overview

  1. point-to-point
    one sender, one receiver
  2. reliable, in-order
  3. pipelined
    TCP congestion and flow control
  4. full duplex data
    데이터를 보내면서 동시에 받을 수 있다.
  5. connection-oriented
    handshaking
  6. flow controlled
    받을 사람이 받을 수 있는 정보만

TCP segment structure

  1. seq #: TCP는 패킷#가 아니라 byte#를 사용한다. 따라서 해당 패킷의 가장 처음 나오는 byte#를 seq#로 사용한다.
  2. ack #: 다음에 받을 seq# 이고 byte#를 사용한다.
    sender가 보낼 때 0, receiver가 보낼 때 1?
  3. U : uegent data가 있을 경우 1 → Urg data pointer에 저장되어 있는 포인터의 데이터를 바로 app layer로 올린다.
  4. Urg data pointer : 바로 application layer로 올릴 데이터의 포인터가 저장되어 있다.
  5. A : ack#가 유효하면 1, 아니면 0으로 ack#를 무시한다.
  6. P : application layer로 바로 데이터를 보내야하는 경우 1로 표시한다.
  7. R : reset의 약자로 컨넥션을 재설정한다.
  8. S : sink의 약자로 컨넥션을 연결한다.
  9. F : finish의 약자로 컨넥션을 끊는다.
  10. receiver window(rwnd) : socket의 free buffer space, free buffer가 얼마나 남았는지 알려주고, ack를 보낼 때 같이 보낸다.

TCP seq#, ack#

1byte의 데이터 'C'를 보낼 때 seq#가 42고 ACK를 보낼 때 그 다음에 받을 seq#인 43을 보낸다.

그리고 ack#을 43을 받은 sender은 seq#가 43인 패킷을 보낸다.

RTT(round trip time)

rtt값은 timeout값을 정하기 위해서 사용된다.

timeout값은

  1. RTT값보다 커야하고
  2. 너무 짧으면 premature timeout이 발생하고 불필요한 재전송이 많고
  3. 너무 길면 loss된 segment를 위해 너무 오래 기다린다.

sample RTT : RTT시간을 계산한 것

estimated RTT

estimated RTT를 계속 계산하여 약간의 마진을 더해 timeout interval을 교체한다.

reliable data transfer

TCP는 unreliable한 IP위에 reliable data transfer service를 올린 것

rdt service

  • pipelined segment
  • cumulative acks
  • single retransmission timer
    timeout된 seg만 packet만 재전송

TCP sender

application layer로부터 data를 받았을 때

  1. segment를 만들면서 segment의 첫번째 byte#로 seq#를 정한다.
  2. timer start

retransmission이 발생하는 이유

  1. timeout event

ack loss가 발생해서 다시 segment를 보낸다. ⇒ 중복된 seq#이므로 버린다.

ack100은 오지 않고 ack120이 왔으므로 그전 seq#은 다 받았다는 의미 이므로 120을 보내도 된다.

  1. duplicate acks

3번 이상 중복된 ack를 보냈으므로 timeout이 되기 전에 재전송한다.

TCP fast retransmit

timeout 시간은 상대적으로 길기때문에, 중복된 ack를 통해 lost segment를 detect

TCP ACK generation

  1. seq#대로 seg가 도착했고 이전 ack가 모두 도착한 상태 → 다른 seg가 올 때까지 500ms기다린다.
  2. seq#대로 seg가 도착했지만 이전에 받은 seq에 대한 ack를 보내지 않았을 때 → 가장 마지막으로 받은 seq에 대한 ack를 보낸다.
  3. seq#가 out-order일 때 → 가장 최근에 순서대로 받은 ack을 다시 보냄, out-order seq#은 buffer에 저장한다.
  4. 부분적, 혹은 모두 gap을 충족할 때 → 가장 최근에 순서대로 받은 ack를 보낸다.

flow control

flow control → receiver가 sender를 control
connection을 맺을 때 socket에 buffer를 할당한다.
ack를 보낼 때 rwnd도 함께 보내서 남은 버퍼의 양을 알려준다.

connection management

sender와 receiver는 데이터를 교환하기 전에 handshake를 한다.
이 과정을 통해 state, seq#, rcvBuffer를 할당한다.
2-way연결을 요청할 때 loss가 발생할 수 있기 때문에 3-way 연결을 사용한다.

3-way handshake

  1. client에서 S=1,seq=x(OS에서 랜덤하게 생성)
  2. server는 S=1,ACK=1,seq=y(OS에서 랜덤하게 생성)
  3. client는 ACK=1를 보낸다.

SYN → SYN+ACK → ACK

closing a connection

  1. client에서 F=1
  2. server에서 ACK=1
  3. server에서 F=1
  4. client에서 ACK=1
  5. 4에서 loss가 생길 수 있으니 seg의 lifetime의 *2만큼 timer

2와 3은 1개로 합쳐질 수 있다.

3.6 principles of congestion control

congestion control이란?

network가 소화할 수 있도록 data를 덜 보내고 speed를 줄이게 하는 것

flow control과의 차이점 : receiver(flow) ↔ network(congestion)

manifestations

  1. lost packet : error이 발생해서 drop될 수도 있지만 packet buffer가 꽉차서 그럴 때가 더 많다.
  2. long delays : router buffer에서 queueing delay가 발생한다.

scenario 1

one router, infinite buffers, output link capacity : R

병목 현상으로 R/2이상이 되면 일정한 output을 가지고 delay가 기하급수적으로 늘어난다.

scenario 2

one router, finite buffers ⇒ packet loss 발생

router buffer가 꽉 차서 packet이 drop됐을 때
time out이 되어 retransmission을 했을 때

scenario 3


loss로 인해 아무것도 전송되지 않는다.
⇒ 이런 일을 막기위해 congestion control이 필요하다.

3.7 TCP congestion control

TCP congestion control

  1. additive increase : loss가 발견되기 전까지 cwnd를 늘려나간다.
  2. multiplicative decrease : loss가 발견되면 cwnd를 반으로 줄인다.

sender

limit transmission : last byte sent - last byte acked ≤ cwnd ⇒ 보낼 량을 cwnd보다 작거나 같게 설정

TCP sending rate : cwnd/RTT bytes/sec

TCP slow start

connection이 처음 시작할 때 loss가 발생하지 전까지 sending rate를 지수적으로 증가시킨다.

TCP detecting, reacting to loss

ssthresh : slow start를 끝낼 마지노선
파란선 → cwnd

  1. by timeout
    ssthresh를 cwnd/2로 조정
    cwnd를 1로 조정
    ssthresh까지 slow start
  2. by 3 duplication ACKs
    cwnd를 cwnd/2로 조정

=> timeout이 발생한 경우 congestion이 더 심각하므로 극단적인 조정

TCP throughput

TCP throughput는 window size와 RTT에 따라 달라진다.

window size (W) = min(swnd, cwnd, rwnd)

avg TCP throughput =3/4 W/RTT bytes/sec
TCP throughtput = 1.22
MSS/RTT* root(L)

TCP Fairness


각 connection이 보내는 throughput의 합이 R보다 커지면 둘다 cwnd값이 1/2로 줄고 큰 값을 가진 connection은 크게 줄고 작은 값은 가진 connection은 작게 줄어들기 때문에, 결국 같은 양을 보내게 된다.

Explicit congestion notification(ECN)

router에서 congestion이 발생할 것 같다고 ECN을 11로 설정하여 전송한다.

des에서 ECE를 1로 설정하여 ACK seg를 보낼 때 congestion이 발생했다고 source에 직접적으로 알려주는 system

profile
코딩하는 감자

0개의 댓글