전송계층2

ㄱㅇㅁ·2023년 11월 4일

네트워크

목록 보기
6/20

TCP

1. point-to-point

  • 한쌍의 process 간의 통신만 관장
    • socket 1쌍 사이의 데이터 통신만 책임짐

2. reliable, in-order byte stream

  • 신뢰성이 보장되므로 데이터 유실 x
  • 데이터가 순서대로 전송

3. pipelined

  • 한번에 window 크기만큼 여러개 packet 보냄

4. full duplex data

  • 데이터가 양방향으로 전송
  • server, client가 sender이면서 receiver

5. send&receiver buffers

  • sender의 window buffer: 재전송하기 위해 packet 저장
  • receiver buffer: 순서가 바뀐 채로 들어오는packet 저장
  • 모두가 sender이면서 receiver이기 때문에 각자 2개의 buffer 필요

5. flow controlled

  • receiver가 받을 수 있는 양만큼만 전송

6. congestion control

  • 네트워크 상황에 맞게 전송

TCP segment structure

  • application layer의 전송 단위=message
  • TCP의 전송 단위=segment
  • Network layer의 전송 단위=packet
  • Link layer의 전송 단위=frame

  • 32bit
    • 각 포트 16bit
    • 포트 번호 이론적으로 0~21612^{16}-1
  • source port
    • 보내는 사람의 socket에 해당하는 identifier
  • destination port
  • sequence number
  • acknowledgement number
  • checksum
    • error detection에 사용
  • recevice window
    • receiver buffer에 얼마나 빈공간이 있는지 알려줌

TCP sequence numbers and ACKs

Sequence number

  • 세그먼트 데이터 제일 앞에 있는 byte number

ACK

  • cumulative ACK
  • ACK 10 : 9번까지 다 받았으니 10번 달라

Host A -> Host B

  • sender의 data=C, byte number=42
  • ACK=79 (78번까지 잘 받았으니 79번 보내달라고 요청)

Host B -> Host A

  • ACK= 42+1 (42번까지 잘 받았으니 43번 보내달라고 요청)
  • seq=79
  • 42: A에서 내려오는 message byte 번호
    = A의 send buffer의 sequence number
    = B의 receive buffer에서 관리하는 index 번호 (ACK)
  • 79: B에서 내려오는 message byte 번호
    = B의 send buffer의 sequence number
    = A의 receive buffer에서 관리하는 index 번호 (ACK)

Timeout -- function of RTT

  • segment 유실 - timer로 탐지

Timeout value를 무엇으로 할 것인가?

  • 작게하면 복구는 빠른 대신 오버헤드 늘어남
  • RTT: 어떤 segment가 목적지에 갔다가 돌아올 때까지 걸리는 시간
  • timeout=RTT
  • segment마다 RTT 값은 모두 다름
    1) segment의 경로가 다 다르기 때문
    2) 경로가 같더라도 queueing delay가 다름

  • RTT 측정할 때마다 편차 매우 큼
    -> 중구난방
    -> 대표할만한 RTT 값을 생성해야함

  • EstimatedRTT: 보정한 RTT값
  • SampleRTT: 측정한 값을 그대로 사용하면 편차가 너무 큼
    • 축적된 값에 더해서 평균 냄
  • 하지만, EstimatedRTT<SampleRTT인 경우 확실하지 않은 상태에서도 timeout으로 처리할 수 있음

  • 4*DevRTT를 더해 해결
  • 외울 필요는 x

TCP reliable data transfer

  1. pipeline 방식
  2. cumulative ACK 사용
  3. timer 하나만 사용
    • go-back-N과 비슷
    • 그러나, go-back-N과 달리, timeout 발생하면 해당 segment만 재전송

1. ACK가 유실되는 경우

  • A sender buffer의 92~99번 해당하는 segment전송
  • B receiver buffer 92~99번 받아서 올리고 ACK100 보내 100번 기다림
  • A의 timer 만료되며 재전송
  • B가 다시 ACK100 보냄

2. ACK 전송 도중 Timeout 발생한 경우

  • A가 92~99, 100~119번 보냄
  • B는 잘 받아 ACK100, ACK120 보냄
  • timer 만료되어 A가 다시 92~99번을 보냄
  • B의 receiver는 120번을 기다리는데 92~99번이 와서 버리고 ACK120 다시 보냄

3. 첫번째 ACK가 유실

  • A가 92~99, 100~119번 보냄
  • B는 ACK100, ACK120 보냈지만 ACK100이 유실되고 ACK120 받음
  • ACK100은 유실되었지만 ACK120은 119번까지 잘 받았다는 뜻이므로 buffer clear

Data 받을때마다 ACK 해야 하는가?

  • 권고사항: delayed ACK
    • 기다렸다가 ACK
    • 마지막 ACK만 받으면 상관 없기 때문
      • 여러개 받는 것보다 마지막 ACK 받는게 간편

Fast retransmit

  • timeout 긴시간동안 기다림
    • timeout 전 packet 유실 여부 알 수 있음
    • 중복 ACK 번호를 3번(총 4번) 받으면 유실로 판단
      -> timer 터지기 전 미리 재전송

0개의 댓글