TCP/IP_Transmission Control Protocol(TCP)

silups·2025년 3월 28일
0

TCP/IP

목록 보기
12/12

TCP Service

  • error control, flow control, congestion control 다 가능
  • connection oriented방식
    • 통신 시작 전 setup(연결) 과정이 있음

TCP의 well-known port

Stream delivery

  • TCP는 초기 연결 후, stream(연속된 byte) 형태로 data를 전송한다.

Sending and Receiving buffers

  • 분홍: sent, ACK X / 회색: Not sent
  • 버퍼: process가 전달한 data를 전송하기 전, 임시 보관 장소
  • 보통 1byte 단위로 동작

TCP segments

  • TCP packet = TCP segment
  • TCP는 buffer에 있는 data로 Segment를 만들어 전송
  • segment의 크기는 TCP 내부 protocol로 인해 정해짐 (0~65535)
    • SYN message를 통해 최초 sequence number 공유

TCP의 sequence number

  • 각 연결에서 전송되는 segments는 TCP에 의해 sequence number가 정해진다.
  • TCP가 임으로 최초의 sequence number를 지정

ex)

  • 5000byte data를 전송
  • first byte numbe is 10,001
  • each segment can carry 1,000bytes
  • sequence number는 해당 segment에 포함된 첫번 째 data byte의 number임
  • TCP의 ACK는 누적 ACK
    • ACK 11,001은 11,000번까지 잘 받았다는 의미

Segment

TCP Segment format

  • piggybacking 사용가능(ACK + data)
  • HLEN: Header length
    • 4bit로 표현 하기 때문에 HLEN값 * 4를 해줘야 실제 header length가 나온다th가 나온다 (IP와 동일)
  • Window size: TCP는 window size가 가변적이라 지정 필요
    • Receiver가 지정 (Receiver window size = ex)4 임을 segment에 담아 전송)(RWND)
    • Network 혼잡 시 window size를 줄여서 통신
    • flow control, congestion control
  • Urgent pointer: ufg에서 급히 처리해야 하는 data의 위치 정보
    • 100이면 여기부터 100byte 뒤에 urgent data가 있다는 의미

Control field

  • ufg: 급히 처리해야 하는 data (기준이 모호(OS끼리 충돌)하여 현재는 사용하지 않음)
  • ACK: 이 segment는 Acknowledgement를 포함한다.
  • PSH: buffer가 차지 않았어도 그냥 상위계층에 전송해라.
    • 보통 TCP는 효율을 위해 buffer가 일정 수준 이상 차면 전송한다.
  • RST: 연결을 끊자. (오류가 있거나 등)
    • 비정상적인 연결 해제
  • SYN: 연결을 시작하자.
    • SYN message를 통해 최초의 sequence number 공유
  • FIN: 연결을 끊자. (통신 완료 시)
    • 정상적인 연결 해제

Checksum

  • UDP와 마찬가지로 전달 오류 방지를 위해 Pseudo header를 checksum에 포함한다.
  • TCP는 UDP와 다르게 Checksum이 필수적이다(Mandatory)

Encapsulation

  • payload: 실제 전달하고자하는 정보 (header, metadata 제외)

TCP Connection

  • TCP는 Connection-oriented이다.
  • Source와 Destination에 가상의 path를 설정함(segment들이 이 path로 이동)
  • TCP는 가상의 conttection(path)를 생성하지만 실제로는 IP(Connectionless)를 통해 전달 된다.
  • IP에서 error로 packet이 손실 되더라도 TCP가 재전송 요청을 함

three-way handshake (Connection Establishment)

  • Active open: 능동적 접근
  • Passive open: 수동적 접근
  • SYN segment는 data를 포함하지 않지만 sequence number를 소비한다.
    • 가상의 1byte가 있다고 취급
    • 따라서 ACK 8001
  • SYN + ACK segment도 data를 포함하지 않지만 sequence number를 소비한다.
    • 가상의 1byte가 있다고 취급
    • 따라서 ACK 15001
    • rwnd(window size) 포함
  • ACK segment는 자체는 가상의 byte가 있다고 취급하지 않고 sequence number를 소비하지 않음.
    • 따라서 seq가 그대로 8000
    • rwnd(window size) 포함
  • 보내준 receive window size에 맞게 send window size를 조정한다.
    • 양방향 통신이기 때문에 둘다 rwnd를 보냄

Data transfer

  • three-way handshake 이후의 data transfer과정
  • Connection Termination과 Connection Establishment의 위치가 바뀜
  • sequence number의 흐름 이해 필요
    • Data에 따른 sequence number 변화
    • 마지막은 ACK만 있기 때문에 sequence number 변화 없음

Three-way handshake(Connection Termination)

  • FIN segment도 SYN segment와 마찬가지로 sequence number를 소비함
  • 양 방향 동시에 연결 종료

Half-close (Four-way handshake)

  • 한 쪽 연결 먼저 종료 후, 다른 쪽 연결 종료
    • 한 쪽에서는 더이상 보낼 data가 없고 다른 쪽은 있을 때
      ex) 통계 서버인 경우, 통계를 내는 시간 동안 한 쪽은 연결을 유지하고 있을 필요가 없음
    • Connection이 종료되어도 ACK는 보낼 수 있음 (Data는 전달 불가)
  • Client 측은 Connection을 먼저 종료하였기 때문에 sequence number가 x로 유지

State Trantion diagram

Time-Wait

  • Client가 FIN에 대한 ACK를 수신 한 후, TIME-WAIT 상태로 가는 이유
    • packet이 지연된 경우, Client가 이전 Connection의 packet을 다음 Connection의 packet으로 착각 할 수 있음
    • packet이 유실된 경우, ACK를 받지 못해 Server 측의 연결이 계속 연결 될 수 있음

Half-close일 떄, server와 client의 states

  • server와 client의 states를 각각 다른 방식으로 보여준다.

three-way handshake 일 때, server와 client의 states

Siultaneous

open

  • 양 쪽의 연결이 동시에 이루어 지는 방식
  • Client와 server간이 아니라 PC와 PC간의 연결에 사용

close

  • 오른쪽 FIN과 ACK의 위치가 반대임

Denying a Connection

  • 연결을 강제 종료할 때
    • error 등의 이유로 connection 거부(RST 전송)
  • Connection이 되어 있는 상태에서도 문제가 있다면 언제든 RST 전송 가능
    • 이전에 받은 packet에 대한 ACK.
    • 이전에 받은 packet에 ACK가 필요 없다면 안 보내도 됨.

State 정리

TCP Window

send window

receive window

  • TCP는 receive window size에 따라 window size가 가변적이다.
  • TCP에는 TCP 내부 buffer가 있음(size가 다름)
    • window size는 buffer size보다 항상 작아야 함
  • 왼쪽 벽이 움직이는 것(오른쪽으로)을 closes, 오른쪽 벽이 움직이는 것(오른쪽으로)을 opens
    • Go-Back-N이나 Selective reqeat는 오른쪽 벽과 왼쪽 벽이 함께 움직였지만 TCP는 따로 움직이며 Window size를 조정한다.
    • 왼쪽 벽은 ACK를 받았을 때 Closes
    • 오른쪽 벽은 수신 측에서 보낸 rwnd가 늘어났을 때 Opens
    • Shrinks(축소)는 수신 측에서 보낸 rwnd가 더 작을 때 일어남
      • 실제로는 더 복잡해지기 때문에 잘 사용하지 않음
      • window가 Shrinks 되는 과정에서 아직 ACK를 받지 못한 Byte가 Window 밖에 있는 경우가 생길 수 있음

Flow Control

  • push: 강제로 밀어 넣기
  • pull: 준비되면 빼가기
    • Flow control은 push에서 일어남

Flow Control Ex

  • rwnd로 window size 조정으로 flow control 가능

Shrinking of Windows 공식

  • new ackNo + new rwnd >= last ackNo + last rwnd
    ex) 210 + 4 (220) <= 206 + 12 (218) (성립 X)
    • 이 공식에 어긋나면 window가 shrink됨
      • shrink되면 ACK를 받지 못한 214가 window 밖으로 나가게 됨

Error Control

  • TCP는 reliable protocol
  • TCP에서 error control은
    • checksum
    • Acknowledgment
    • time-out
      을 통해 이뤄짐

checksum

  • checksum을 확인 후 오류가 있으면 packet을 버림
    • time-out으로 인해 재전송

Acknowledgment

  • TCP는 Go-Back-N + Selective repeat
    • Go-Back-N의 누적 응답
      • ACK3은 packet 2까지 잘 받았다
    • Selective repeat의 keep out of order packet
      • 순서에 어긋난 packet도 보관

sender FSM

receiver FSM

Generating Acknowledgments Rules (효율적인 방법)

  • Rule 1: ACK는 piggybacking으로 보낸다.
  • Rule 2: Segment가 한개 왔을 떄, timer(500ms)가 만료되면 ACK를 보낸다.
  • Rule 3: ACK를 보내지 않은 Segment가 2개 오면 즉시 ACK를 보냄
  • Rule 4: 도착한 Segment가 순서에 어긋난 경우 그 즉시 받아야할 Segment정보가 담긴 ACK를 보낸다.
  • Rule 5: 이전에 누락된 Segment를 받으면 즉시 다음에 받아야할 Segment정보가 담긴 ACK를 보낸다.
  • fast retransmission: 동일한 ACK가 3번 연속 오면 Timer 상관 없이 바로 재전송
  • ACK가 중간에 유실되어도 error control 가능
  • Rule 6: 중복된 Segment가 도착시 그 Segment를 버리고 바로 ACK 전송

  • ACK 손실을 적절히 처리하지 못하면 Deadlock이 발생할 수 있음

Deadlock

ex)

  • 수신측이 바쁠 떄, rwnd를 0으로 설정해 보낼 수 있음(진짜 0일 수도 있음)

    • 송신자는 rwnd가 생길 때까지 대기
  • 수신측이 rwnd가 회복되어 ACK를 전송 하였으나 유실

    • 결과
      • 송신측: rwnd가 회복된지 모르고 회복되기를 계속 기다림
      • 수신측: rwnd가 회복 되었으니 송신측에서 data를 보내길 계속 기다림

해결법

  • Persistence timer

Timer

  • Retransmission: 재전송 타이머
    • 일정 시간 ACK가 오지 않으면 Segment 재전송
  • Persistence: 지속 타이머
    • 송신측에서 Persistence timer 시간 마다 rwnd size를 물어봄.
    • Deadlock 방지를 위해 존재
  • Keepalive:
    • TCP session이 살아 있는지 서로 확인하기 위해 사용
  • TIME-WAIT:
    • TCP 연결을 끊을 때 충분한 시간을 두고 끊음

Silly Window Syndrome

  • 송신측 : 송신자가 1byte씩 전송할 때 (비효율적)
  • 수신측 : 수신측 process가 1byte씩 가져갈 때 (비효율적)
    • 1byte씩 가져갈 때마다 rwnd 조정됨
    • 수신 window가 꽉찬 상태 였다면 송신측도 1byte씩 보낼 수 밖에 없음

해결법

송신측

Nagle's Algorithm
1. process에서 처음 내려온 1byte는 바로 전송
2. 이후에 내려온 packet은 maximum segment size까지 모았다가 전송
3. 수신 측에서 ACK가 오면 maximum segment size가 아니더라도 바로 전송
4. ACK가 오지 않아도 maximum segment size가 되면 전송

수신측

Clark's Soulution
1. 수신측 process가 1byte를 가져가 rwnd 여유공간이 1byte생기더라도 송신측에 rwnd = 0으로 전송
2. maximum segment size를 수용할 수 있을 만큼 충분한 공간이 생긴 경우 rwnd를 풀어줌
3. 전체 buffer의 반 이상이 비어 있는 경우 rwnd를 풀어줌

Delayed Acknowledgment
1. ACK를 바로 보내지 않고 buffer에 충분한 공간이 생기면 ACK를 지연해서 보냄

Congestion control

  • Network 혼잡 제어
    • router는 network가 혼잡해지면 packet을 버리기도 함

Slow start mode

  • cwnd: congester window

    • congestion control을 위한 window이다.
  • RTT: Round trip time

    • 왕복 시간
  • slow start는 cwnd의 크기가 임계값(threshold)에 도달할 때까지 2배씩 증가한다 (2n2^n)

  • 송신자는 cwnd와 rwnd 중 크기가 더 작은 window를 기준으로 한다

Congestion avoidance mode

  • congestion 예방

  • congestion avoidance는 network congestion이 감지될 때까지 +1씩 순차적으로 증가한다 (Additive Increase)

  • Slow start로 cwnd가 threshold에 도달 했을 때 congestion avoidance mode로 진입

  • sender가 congestion을 인지하는 법
  1. Time-out으로 인한 재전송

  2. 3개의 중복 ACK 도착(fast retransmission)으로 인한 재전송

    • Congestion 감지시, Congestion Detection Mode로 진입
    • Time-out은 ACK가 오지도 않았기 때문에 3ACK보다 심각한 상황임

MD: 1/2로 감소

Time-out으로 인한 Congestion(더 심각)

  • Congestion Detection Mode 진입
  1. Congestion이 감지된 시점을 기준으로 threshold를 반으로 줄여 SlowStart(1부터)
  2. threshold에 도달 하면 다시 Congestion avoidance mode 진입

3ACK로 인한 Congestion

  • Congestion Detection Mode 진입
  1. Congestion이 감지된 시점을 기준으로 cwnd를 반으로 줄여 Additive Increase
profile
NDBT

0개의 댓글