PromleeBlog
sitemapaboutMe

posting thumbnail
연결 지향 데이터 전송: TCP
Connection-Oriented Transport: TCP

📅

💡

3.5.1 연결 지향 전송: TCP (Connection-Oriented Transport: TCP)🔗


🚀

TCP 개요🔗

➡️

정리 (TCP 개요)🔗


🚀

TCP 연결의 여러 종류 (Many Flavors of TCP)🔗

Taho ->
(New)Reno
-> Vegas -> Westwood -> Binary Increase Congestion control(BIC) ->
Cubic
->
BBR
혼잡 제어 알고리즘
(congestion control algorithm)의 가장 큰 차이점? ->
congestion window size
의 변화

🚀

TCP 세그먼트 구조 (TCP Segment Structure)🔗


🚀

TCP 시퀀스 번호, ACK 번호 (TCP Sequence Number, ACK Number)🔗

예시: 500kb 메시지를 보낼 때, MSS=1000bytes
image
500kb = 500,000bytes = 500개의 세그먼트
시퀀스 번호
: 각 세그먼트의
첫 번째 바이트
의 바이트 스트림 번호 - 0, 1000, 2000, 3000, 4000
ACK 번호
: 수신자가
다음에 받을 세그먼트
의 시퀀스 번호 - 1000, 2000, 3000, 4000, 5000

특징🔗

예시🔗

image
  1. 사용자가 'C'를 입력한다.
  2. 호스트 A는 시퀀스 번호 42, 인정 번호 79, 데이터 'C'를 가진 패킷을 전송한다.
  3. 호스트 B는 'C'의 수신을 인정하고 'C'를 에코(반사)로 돌려보낸다.
  4. 호스트 B는 시퀀스 번호 79, 인정 번호 43, 데이터 'C'를 가진 패킷을 전송한다.
    • 시퀀스 번호 79: A가 보낸 ACK
    • 인정 번호 43: A가 보낸 Seq + 1
  5. 호스트 A는 'C'의 수신을 인정하고 시퀀스 번호 43, 인정 번호 80을 가진 패킷을 전송한다.
    • 시퀀스 번호 43: B가 보낸 ACK
    • 인정 번호 80: B가 보낸 Seq + 1

🚀

TCP 왕복 시간, 타임아웃 (TCP Round-Trip Time, Timeout)🔗

TCP 는 패킷 손실을 회복하기 위해 타임아웃 후 재전송한다.
Q. Timeout 값을 설정하는 법
Q. RTT를 추정하는 방법

지수 가중 이동 평균 (Exponential Weighted Moving Average)🔗

EstimatedRTT = (1-α) * EstimatedRTT + α * SampleRTT

타임아웃 간격 (Timeout Interval)🔗

추정된 RTT
(EstimatedRTT)에 "안전 마진"이 추가됨

💡

3.5.2 TCP: 신뢰할 수 있는 데이터 전송 (Reliable Data Transfer)🔗

IP가 불안정하다
TCP
는 IP의 불안정성을
보완한다

🚀

TCP 송신자 이벤트(TCP Sender Events)🔗

image
  1. 애플리케이션으로부터 데이터를 받음
    • 시퀀스 번호를 할당하고, 데이터를 세그먼트로 나눔
    • 시퀀스 번호는 데이터의 첫 번째 바이트스트림 번호
    • NextSeqNum = NextSeqNum + 데이터 크기
    • 타이머가 시작됨: 만료 간격 -
      Timeout Interval
  2. 타임아웃
    • 아직 인정받지 않은 세그먼트를 재전송(가장 작은 시퀀스 번호)
    • 타이머 재설정
  3. ACK 수신
    • ACK가 이전에 인정받지 않은 세그먼트 인정
      • ACKed로 업데이트
      • 아직 인정받지 않은 세그먼트가 있다면 타이머 시작
    • ACK가 이전에 인정받은 세그먼트를 인정
      • 중복 ACK

🚀

TCP: 재전송 시나리오(TCP: Retransmission Scenario)🔗

시나리오1: 잃어버린 ACK 시나리오 (Lost ACK Scenario)🔗

image

시나리오2: 성급한 타임아웃 시나리오 (Premature Timeout Scenario)🔗

image

시나리오3: 누적 ACK 시나리오 (Cumulative ACK Scenario)🔗

image

🚀

TCP ACK 생성(TCP ACK Generation)🔗


🚀

TCP 빠른 재전송(TCP Fast Retransmit)🔗

문제정의
: 타임아웃 기간이 종종 상대적으로 김
아이디어
:
중복 ACK
을 통해 잃어버린 세그먼트를 식별하고, 즉시 재전송
TCP 빠른 재전송

예시 (TCP 빠른 재전송)🔗

image

💡

3.5.3 TCP: 흐름 제어 (TCP Flow Control)🔗


🚀

TCP 흐름 제어 (TCP Flow Control)🔗

image
수신자는 수신기-송신기 세그먼트 TCP 헤더에
rwnd
를 포함하여 송신기에 여유 버퍼를 알려준다.

💡

3.5.4 TCP: 연결 관리 (TCP Connection Management)🔗


🚀

연결 관리 (Connection Management)🔗

데이터를 교환하기 전에 송신자와 수신자는 "핸드셰이크" 과정을 통해 아래 사항에 동의한다.
클라이언트
Socket clientSocket = new Socket("hostname", "port number");
서버
Socket connectionSocket = welcomeSocket.accept();

🚀

연결 설정 합의 (Agreeing to Establish a Connection)🔗

양방향 핸드셰이크 실패 시나리오 (Two-Way Handshake Failure Scenario)🔗

image
ESTAB
: 연결 설정 상태
  1. host A: x를 선택하고 req_conn(x)를 전송한다.
  2. host A: 연결 응답이 오기 전에 req_conn(x)를 재전송한다.
  3. host B: acc_conn(x)로 응답하지만, host A는 연결을 종료한다.
  4. host B: 연결이 완료되었다고 판단하지만, 실제로는 반쪽짜리 연결이 된다.

🚀

TCP 3단계 핸드셰이크 (TCP Three-Way Handshake)🔗

image
  1. SYN
    : 클라이언트는 초기 순서 번호 x와 SYN 플래그를 가진 세그먼트를 전송한다.
  2. SYN-ACK
    : 서버는 x+1로 응답하고, 자신의 초기 순서 번호 y와 SYN 플래그를 가진 세그먼트를 전송한다.
  3. ACK
    : 클라이언트는 y+1로 응답하고, SYN 플래그를 제거한 세그먼트를 전송한다.

유한 상태 머신:FSM (Finite State Machine: FSM)🔗

image
  1. 상태: CLOSED -> LISTEN
    Socket connectionSocket = welcomeSocket.accept();
    • 연결이 설정되지 않은 초기 상태로 서버는 클라이언트의 연결 요청을 수락할 준비를 함.
  2. 상태: LISTEN -> SYN_RCVD
    SYN(x), SYNACK(seq=y, ACKnum=x+1)
    • 클라이언트와의 통신을 위한 새로운 소켓 생성
    • 서버는 SYN(x)를 수신하고, SYNACK(seq=y, ACKnum=x+1)를 전송하여 클라이언트에게 연결 설정을 알림
  3. 상태: SYN_RCVD -> ESTAB
    ACK(ACKnum=y+1)
    • 서버가 ACK(ACKnum=y+1)을 수신하고, 클라이언트와의 연결이 설정됨
  4. 상태: CLOSED -> SYN_SENT
    Socket clientSocket = newSocket("hostname", "port number");
    SYN(seq=x)
    • 클라이언트는 SYN(seq=x)를 전송하여 서버에게 연결 설정을 요청
  5. 상태: SYN_SENT -> ESTAB
    SYNACK(seq=y, ACKnum=x+1), ACK(ACKnum=y+1)
    • 클라이언트가 SYNACK(seq=y, ACKnum=x+1)을 수신하고, ACK(ACKnum=y+1)을 전송하여 서버와의 연결이 설정됨

🚀

TCP: 연결 종료 (TCP: Closing a Connection)🔗

image
클라이언트 상태
  1. ESTAB
    : 연결이 설정된 상태다.
  2. FIN_WAIT_1
    : 클라이언트가 clientSocket.close()를 호출하여 FIN 세그먼트를 전송한다.
    • 이 상태에서는 더 이상 데이터를 보낼 수 없지만 받을 수 있다.
  3. FIN_WAIT_2
    : 클라이언트는 서버로부터 FIN 세그먼트를 기다린다.
  4. TIMED_WAIT
    : 클라이언트는 2*최대 세그먼트 생명 시간 동안 대기하여 모든 패킷이 소멸되었는지 확인한다.
  5. CLOSED
    : 연결이 완전히 종료된 상태다.
서버 상태
  1. ESTAB
    : 연결이 설정된 상태다.
  2. CLOSE_WAIT
    : 서버가 클라이언트로부터 FIN 세그먼트를 수신하고 응답할 준비를 한다.
  3. LAST_ACK
    : 서버는 FIN 세그먼트를 전송하고, 클라이언트의 ACK를 기다린다.
    • 이 상태에서는 더 이상 데이터를 보낼 수 없다.
  4. CLOSED
    : 연결이 완전히 종료된 상태다.