TCP vs UDP

조윤호·2023년 10월 14일

Transport Layer

  • 포트 간 전송 == 프로세스 단위의 통신.
  • 동일 ip의 다른 port 간에도 통신이 이뤄질 수 있다.
  • Transport Layer를 통해 프로세스마다 맞는 통신 방식을 사용할 수 있다 -> TCP or UDP

TCP vs UDP

TCP

  • 연결 지향적 : 상대방에서 연결이 불가능할 경우 데이터 송수신이 불가능. 데이터 송수신에 앞서 두 기기 간의 연결(TCP 3-way handshake)을 먼저 수행
  • reliable : 세그먼트가 유실되지 않도록 보장
  • in-order delivery : 전송된 세그먼트의 순서 보장
  • flow control / congestion control 제공
image

UDP

  • unreliable, unordered
  • best effort service
image

TCP에서 보장되지 않는 것

  • delay : "적어도 이 시간 안에는 도착한다" 라는 보장은 없음
  • bandwidth : "적어도 초당 이만큼의 데이터는 전송한다"라는 보장은 없음

socket

  • 소켓 : Transport layer에서 Application Layer로 데이터를 전달하기 위한 "파일"
  • 포트로 들어온 데이터는 소켓에 적힌다 / 소켓에 새로 쓰인 데이터는 포트를 통해 전송된다
  • Application Layer 입장에서
    • new Socket(ip, port) 통신 연결 : 새로운 소켓 생성
    • socket.getOutputStream() app이 소켓에 write : 데이터 송신
    • socket.getInputStream() app이 소켓의 데이터 read : 데이터 수신
  • UDP : {serverIP, serverPort} 마다 하나의 소켓 생성됨 -> 하나의 프로세스마다 하나의 소켓
  • TCP : {serverIP, serverPort, clientIP, clientPort} 마다 하나의 소켓 생성됨 -> 하나의 접속자마다 하나의 소켓
image image

Reliablie Data Transfer

Reliablie Data Transfer의 요구사항

  • no error : 세그먼트의 데이터 깨지지 않도록
  • no loss : 전송되지 않는 세그먼트 없도록
  • in-order delivery : 세그먼트의 순서가 맞춰지도록
  • no duplication : 세그먼트의 중복이 없도록

key elements

  • check-sum : 세그먼트에 에러가 발생했는지 여부 확인가능하다.
  • ack : 수신자는 모든 세그먼트에 대해 acknologyment를 보내어 전송 완료를 확인하다.
  • sequence number : 점차 증가하는 숫자를 넣는다 -> 세그먼트의 순서&중복을 알 수 있다.
  • timeout : ack이 도착하지 않는 경우, 송신자는 재전송한다.

case study

  • (a) 정상적으로 통신 이뤄짐
  • (b) 데이터 전송 중 loss -> timeout 후 재전송 -> 정상적으로 처리됨
  • (c) ack 전송 중 loss -> timeout 후 재전송 -> 세그먼트 중복 -> seq 통해 중복확인
  • (d) 데이터 전송 지연으로 중복 ack -> 무시
image image

RDT for many segment

  • 세그먼트를 하나씩 보내면 너무 오래걸린다.
  • 여러 세그먼트를 동시에 보내는 방법이 필요

TCP

ACK and SEQ

  • host A와 B는 모두 데이터를 전송한다.
  • A,B 각각의 전송 데이터의 ACK, SEQ 모두 필요
  • 각 ACK,SEQ의 시작 숫자는 3-way handshake에서 정해진다.
  • ACK = 내가 받아야 하는 데이터의 byte index = 상대방이 보낸 세그먼트의 SEQ + data length(byte)
  • SEQ = 상대방이 보낸 세그먼트의 ACK
    image

case study

  • (a) ACK이 유실된 경우 -> 재전송된 seqment에 대해 동일한 ACK
  • (b) timeout 발생한 경우 -> hostB에게 필요한 120을 ACK으로 전송
  • (c) ACK이 유실된 경우, 하지만 ACK=120이 도착했으므로 120부터 이어서 진행 가능하다.
    image
    image

3-way handshake

  • 전송 시작을 위한 연결 설정
    1. SYN
    • header의 SYN flag = 1
    • SEQ_client = 임의의 숫자(난수)
    • 데이터 전송 x
    1. SYNACK
    • header의 SYN flag = 1
    • ACK_server = SEQ_client + 1
    • SEQ_server = 임의의 숫자(난수)
    • 데이터 전송 x
    1. ACK
    • header의 SYN flag = 0
    • ACK_client = SEQ_server + 1
    • SEQ_client = ACK_server
    • 데이터 전송 o (전송시작)
      image

4-way handshake

  • 연결 종료를 위한 통신
  • 둘 모두가 데이터 전송이 종료되어야 함.
  • 먼저 전송 끝난 host
    • FIN = 1 전송
    • ACK 반환
    • 데이터 이어서 송수신
  • 나중에 끝난 host
    • FIN = 1 전송
    • ACK 반환
      image

Flow Control : 수신 소켓의 처리량에 따른 전송량 조절

  • buffer overflow 방지
  • header의 window field -> 수용 가능한 window 범위 입력 -> 송신자는 window 이내의 데이터만 전송한다.
    image

Congestion Control : 통신 링크의 혼잡도에 따른 전송량 조절

  • 한번에 무작정 많은 데이터를 보내면 네트워크 전체에 혼잡을 초래할 수 있다.

  • 네트워크 상황에 맞는 적절한 전송량을 찾는 것이 중요하다.

  • Concept

    • host는 네트워크의 상태를 직접 확인할 수 없다.
    • loss가 발생할 때 까지 전송량을 늘린다!
    • loss or timeout이 발생하면 즉시 전송량을 줄인다.
    • image
  • congestion-control algorithm

    • slow start : 두배씩 전송 segment 수를 늘린다. (빨리 올리기)
    • congestion avoidance : 하나씩 전송 segment 수를 늘린다. (천천히 올리기)
    • fast recovery : 전송량을 줄인다.
    image
  • variable

    • cwnd(congestion window size) : ack이 도착하기 전까지 한번에 보내는 segment 수
    • ssthresh : slow start를 수행하는 한계점. segment 수가 ssthresh 이상이면 congestion avoidance 수행

case study

  1. TCP Tahoe
  • ssthresh = 이전 cwnd / 2
  • fast recovery : 1로 복구
  1. TCP Reno
  • ssthresh = 이전 cwnd / 2
  • fast recovery : ssthresh로 복구
    image
profile
한걸음씩 성실히

0개의 댓글