네트워크핵심 · 21분 읽기

TCP 헤더·상태·흐름 제어와 재전송

TCP의 바이트 번호와 연결 상태를 기준으로 연결 수립, 데이터 전달, 손실 복구, 종료를 해석한다. 헤더와 옵션의 크기를 읽고 원문 SSH 캡처의 ACK·재전송 사례를 다시 계산한다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 연결 수립과 종료를 sequence·ack 값으로 설명한다.
  2. 수신 윈도와 혼잡 제어의 목적을 구분한다.
  3. 재전송·RST·Zero Window를 관측 맥락에서 해석한다.
먼저 알면 좋은 개념IPv4 헤더·서브넷 계산·조각화

01바이트 스트림과 연결을 구별하기

  • 는 두 응용 프로그램 사이에 순서 있는 바이트 스트림을 제공한다. 송신 응용이 100바이트씩 두 번 기록해도 수신 응용은 200바이트를 한 번에 읽거나 여러 번 나누어 읽을 수 있다.
    • 세그먼트 경계는 응용 메시지 경계가 아니므로 HTTP 길이, 구분자, 별도 길이 필드처럼 응용이 자신의 메시지 형식을 정의해야 한다.
  • 연결은 출발지 IP·포트와 목적지 IP·포트의 조합으로 구별한다. 프로토콜까지 포함하면 흔히 5-tuple이라고 부른다.
    • 서버의 LISTEN 소켓과 접속 후 생성된 연결은 다른 상태이며 같은 서버 포트도 여러 상대와 동시에 통신할 수 있다.
    • 운영체제는 연결 제어 정보, 송수신 버퍼, 순서 번호, 윈도, 타이머를 관리한다.
    • 암호화와 은 자체 기능이 아니며 ·SSH 같은 상위 프로토콜이 제공한다.

02고정 헤더를 비트 단위로 읽기

  • 헤더의 최소 크기는 20바이트다. 출발지·목적지 포트는 각 16비트, Sequence와 Acknowledgment Number는 각 32비트다.
    • Data Offset 4비트는 32비트 워드 개수로 헤더 길이를 표현한다.
    • 값 5는 20바이트, 8은 32바이트이며 페이로드 시작 위치는 이 값으로 결정된다.
    • IHL과 Data Offset은 서로 다른 헤더 길이이므로 함께 읽어야 한다.
  • Window는 16비트이며 수신 측의 광고 윈도다. Checksum 16비트는 헤더·데이터와 IP 주소 등을 담은 의사 헤더를 포함해 검사한다.
    • 의사 헤더는 계산용 정보이지 앞에 실제 추가되는 별도 헤더가 아니다.
    • Urgent Pointer는 가 유효할 때 긴급 데이터 경계 해석에 사용하며 데이터 우선순위 큐를 만드는 필드가 아니다.
    • 옵션이 늘면 Data Offset도 늘어나고 32비트 경계에 맞춰 패딩한다.

설명과 함께 보는 보조 도식

구조 살펴보기

TCP 기본 헤더

옵션이 없는 기본 헤더는 20바이트이며 Data Offset으로 실제 길이를 확인한다.

뒤쪽 · 옵션은 기본 헤더 뒤에 오고 데이터 시작은 Data Offset으로 구분한다.

포트 쌍 4 B

Source Port 2 B + Destination Port 2 B

Sequence 4 B

이번 세그먼트의 시작 순서 번호

1001

Acknowledgment 4 B

ACK가 유효할 때 다음에 기대하는 순서 번호

5001

길이·제어·윈도 4 B

Data Offset·예약·flags 2 B + Window 2 B

검사·Urgent 4 B

Checksum 2 B + Urgent Pointer 2 B

각 필드를 누르면 역할과 예시를 확인할 수 있습니다. 칸의 너비는 실제 바이트 비율과 다릅니다.

프로토콜 필드 모식도. 블록 너비는 실제 크기 비율과 다르다.

03SYN·ACK·FIN·RST와 PSH의 의미

  • 은 초기 순서 번호를 교환하고 은 해당 송신 방향에 더 보낼 데이터가 없음을 알린다. 플래그는 Acknowledgment Number가 유효함을 뜻한다.
    • 는 존재하지 않는 연결에 대한 응답이나 연결 중단 등에 쓰인다.
    • 만 켜진 세그먼트도 데이터를 담을 수 있으므로 flags만 보고 ‘순수 ’라고 단정하지 않고 payload 길이를 함께 읽는다.
  • 는 송신 측이 해당 지점까지의 데이터를 전달하도록 표시하는 기능이다. 가 없다고 반드시 버퍼가 가득 찰 때까지 기다리거나, 가 있다고 즉시 화면 출력·응용 실행이 보장되는 것은 아니다.
    • 에 가 함께 관찰되어도 ‘연결 정리를 급히 시키기 위한 ’로 해석할 수 없다.
    • ECE·CWR는 ECN 협상과 혼잡 통지에 관련되며 구현이 사용하는 확장과 협상 상태를 함께 해석한다.

043-way handshake의 메시지와 상태

  • 은 데이터가 없어도 순서 공간 1을 소비한다. 따라서 1000의 확인은 1001, 5000의 확인은 5001이다.
  • 는 첫 을 Seq=0으로 정규화할 수 있다. raw 초기 번호와 상대 번호를 다른 연결로 오해하지 않는다.
  • + 송신과 마지막 수신은 서로 다른 증거다. 역방향 ·비대칭 경로를 고려하고 재전송의 초기 번호와 응답의 도착 위치를 연결한다.
  1. 클라이언트가 Seq=1000인 을 보낸다. 상태는 SYN_SENT가 된다.
  2. LISTEN 서버는 Seq=5000, =1001인 +을 보낸다. 서버는 SYN_RECEIVED가 된다.
  3. 클라이언트가 =5001을 보내고 로 전환한다. 아직 서버가 이 를 받았다는 뜻은 아니다.
  4. 서버가 마지막 를 수신하면 로 전환한다. 양쪽의 순서 번호를 확인한 연결에서 바이트를 교환한다.
수업 원본 자료

SYN+ACK 플래그의 실제 비트

Wireshark에서 Flags 0x012와 ACK·SYN 비트만 설정된 모습원본 크기로 보기 ↗
수업 원본 캡처 · SYN+ACK 플래그 전개

이 자료에서 읽어낼 것

  1. 0x012는 SYN 0x002와 ACK 0x010을 함께 설정한 값이다.
  2. PSH·RST·FIN이 해제되어 있어도 ACK 번호는 유효하다. 이 화면만으로 세 번째 ACK의 도착까지 증명하지는 않는다.

설명과 함께 보는 보조 도식

메시지 순서

TCP 수립과 데이터 확인

숫자는 순서 공간 계산용 가상 값이다.

클라이언트서버1. SYN2. SYN + ACK3. ACK4. 100 B 데이터5. 누적 ACK
전체 단계를 한 번에 읽기
  1. 01

    SYN

    초기 seq를 제안한다.

    seq
    1000
  2. 02

    SYN + ACK

    서버 초기 seq와 상대 SYN 확인.

    seq
    5000
    ack
    1001
  3. 03

    ACK

    서버 SYN까지 수신했다.

    seq
    1001
    ack
    5001
  4. 04

    100 B 데이터

    1001~1100번 바이트를 보낸다.

  5. 05

    누적 ACK

    1101부터 다음 데이터를 기대한다.

    ack
    1101
학습용 메시지 흐름 모식도. 재전송과 구현별 선택 동작은 축약했다.

05누적 ACK와 송수신 버퍼의 상태

  • 는 아직 확인되지 않은 가장 오래된 송신 바이트, 는 다음에 보낼 바이트, RCV.NXT는 다음에 연속 수신하기를 기대하는 바이트 위치를 뜻한다. 송신자는 아직 확인받지 못한 데이터를 재전송할 수 있도록 보관한다.
    • 수신자는 순서가 뒤바뀐 데이터를 잠시 저장할 수 있지만 중간에 구멍이 남아 있으면 누적 는 그 구멍의 시작을 가리킨다.
  • Seq=4132, Len=100인 데이터는 4132~4231을 차지한다. 이 범위까지 연속 수신하면 다음 는 4232다.
    • 실습 캡처의 SSH 사례에서 =4132가 계속 관찰되었다면 수신자는 아직 4132부터의 연속 데이터를 확인하지 못한 것이다.
    • 단, 하나의 만으로 해당 세그먼트의 손실을 확정할 수 없다.
    • 가 먼저 생성됐거나 패킷 순서가 바뀌었을 수 있으므로 시간, 뒤따르는 중복 , 재전송 데이터를 함께 읽는다.
  • 를 역방향 데이터에 실어 보내는 것을 piggybacking이라고 한다. Delayed 는 전송을 잠시 지연하는 별도 정책이며 두 개념은 관련되지만 같은 기능이 아니다.
    • 자체가 사라져도 이후 더 큰 누적 가 이전 바이트까지 확인할 수 있다.
    • 따라서 모든 손실이 반드시 같은 데이터 재전송으로 이어지지는 않는다.
수업 원본 자료

송신 데이터의 다음 순서 번호

Seq 4132, Next Sequence 4232, PSH ACK 플래그의 TCP 세부 화면원본 크기로 보기 ↗
수업 원본 캡처 · Seq 4132부터 100바이트 전송

이 자료에서 읽어낼 것

  1. Next Sequence 4232에서 Sequence 4132를 빼면 이 세그먼트가 차지한 데이터 범위는 100바이트다.
  2. 상대 방향 데이터에 대한 ACK 1924는 자기 송신 Seq와 별개인 역방향 수신 상태다.
수업 원본 자료

수신자가 아직 기대하는 위치

ACK 4132와 데이터 없는 ACK 세그먼트의 TCP 세부 화면원본 크기로 보기 ↗
수업 원본 캡처 · ACK가 4232가 아닌 4132에 머문 상태

이 자료에서 읽어낼 것

  1. Acknowledgment 4132는 그 번호부터의 연속 수신을 아직 확인하지 못했음을 뜻한다.
  2. Sequence와 Next Sequence가 모두1924여서 이 화면의 세그먼트에는 순서 공간을 소비하는 데이터가 없다. ACK 플래그만으로 데이터 유무를 추론한 것이 아니다.
수업 원본 자료

같은 바이트 범위가 다시 보임

Seq 4132와 Next Sequence 4232가 다시 나타난 TCP 헤더원본 크기로 보기 ↗
수업 원본 캡처 · 원문에서 재전송으로 기록한 같은 범위

이 자료에서 읽어낼 것

  1. Seq 4132~4231 범위가 다시 나타나 원문의 재전송 설명과 맞는다.
  2. 이 잘린 화면에는 시간·분석 라벨이 없으므로 단독으로 손실 지점이나 재전송 원인까지 확정하지 않는다.

06MSS·Window Scale·SACK·Timestamp 옵션

  • 옵션은 길이 4바이트이며 보통 에서 자신이 수신할 데이터의 최대 세그먼트 크기를 알린다. 1500에 헤더 20과 기본 헤더 20을 가정하면 기본 계산은 1460이다.
    • IP/ 옵션, 터널 오버헤드, 경로 가 달라지면 실제 데이터 크기도 조정된다.
    • 는 IP 패킷 전체 크기나 한 번에 보낼 총 데이터 양이 아니다.
  • 옵션은 3바이트이며 교환에서 협상한 shift로 이후 Window 필드를 확장한다. 예를 들어 shift=7이고 Window=1000이면 광고 윈도는 128000바이트로 해석한다.
    • 자체의 Window에는 이 배율을 적용하지 않는다.
    • 양 방향의 shift가 다를 수 있으므로 송신 방향을 바꿀 때 같은 배율을 무조건 사용하지 않는다.
  • Permitted는 2바이트 옵션이며 지원 의사를 에서 알린다. 실제 옵션은 종류·길이 2바이트와 각 수신 블록의 좌우 경계 8바이트를 사용하므로 크기는 2+8N이다.
    • 누적 가 구멍을 가리키는 동안 은 그 뒤에 이미 받은 범위를 알려 불필요한 재전송을 줄인다.
    • Timestamp는 10바이트로 TSval과 TSecr를 담고 측정·오래된 세그먼트 판별 등에 쓰인다.
    • NOP와 EOL은 각각 1바이트이며 옵션 정렬과 종료에 관련된다.
LEARN THROUGH PRACTICE

실습: 100바이트 전송과 누적 ACK·재전송 추적

SSH에서 수집한 Seq·Next Seq·로 확인되지 않은 바이트 범위를 찾는다.

실습 구성과 전제

  • SSH의 양방향 캡처다. 암호화된 내용 대신 전송 헤더를 분석한다.
  • 일부 화면은 헤더만 잘려 있다. 보이지 않는 지연이나 손실 위치는 추정하지 않는다.
  1. 동일 연결과 번호 기준 고정

    • 양끝 IP·포트가 같은 SSH 연결을 고르고 .stream으로 좁힌다. 다른 연결의 상대 Seq가 같아도 같은 데이터가 아니다.
    • 여기서는 상대 Seq로 계산한다. 는 반대 방향 데이터의 수신 상태임을 기록한다.
    text
    Wireshark 표시 필터: tcp.port == 22
    선택한 패킷 → Follow → TCP Stream
    표시 필터를 해당 tcp.stream으로 고정

    실제 stream 번호는 선택 결과를 사용한다.

    확인 기준

    raw와 relative 번호를 섞지 않는다.

  2. 송신 범위 계산

    • Seq 4132, Next Seq 4232이므로 100바이트이며 범위는 4132~4231이다. 1924는 역방향의 다음 수신 위치다.
    • Flags 0x018은 +다. 데이터 길이는 Seq 차이와 Len으로 판단하며 만으로 계산하지 않는다.
    TCP 패킷 교환 · 유실 시나리오 실제 확인 (7)원본 크기로 보기 ↗
    • Sequence 4132와 Next Sequence 4232가 보인다.
    • ACK 1924와 Flags 0x018이 별도 필드다.
    확인 기준

    4232−4132=100과 데이터 방향을 함께 기록한다.

  3. 반대 방향 누적 ACK 해석

    • 반대 방향의 Seq와 Next Seq는 모두 1924, 는 4132다. 4131까지 연속 수신을 확인하며 4132부터는 아직 누적 확인하지 않는다.
    • 하나만으로 직전 패킷이 반드시 손실되었다고 단정하지 않는다. 관측 위치·처리 순서·후속 도 필요하다.
    TCP 패킷 교환 · 유실 시나리오 실제 확인 (8)원본 크기로 보기 ↗
    • Seq와 Next Seq가 모두 1924다.
    • ACK 4132, Flags 0x010, Window 2944가 보인다.
    확인 기준

    4132와 기대값 4232를 비교하되 손실 지점을 추정하지 않는다.

  4. 반복 범위와 원인 분리

    • 후속 화면에도 Seq 4132~Next Seq 4232가 나타나 같은 100바이트 범위가 반복된다. 재전송 기록과 부합한다.
    • 빠른 재전송인지 만료인지는 시간과 패턴이 필요하다. 잘린 헤더만으로 원인을 확정하지 않는다.
    text
    Wireshark 표시 필터: tcp.analysis.retransmission || tcp.analysis.fast_retransmission

    실습 흐름을 재구성한 명령 예시. 장치·인터페이스 이름은 구성에 맞춰 사용한다.

    TCP 패킷 교환 · 유실 시나리오 실제 확인 (9)원본 크기로 보기 ↗
    • 4132~4232 범위가 다시 보인다.
    • ACK 1924와 PSH·ACK는 보이지만 시각은 없다.
    확인 기준

    전체 캡처에서 재전송 표시·시각·동일 범위를 함께 확인한다.

실습에서 확인한 동작 원리

  • 는 패킷 개수가 아니라 다음 연속 바이트 위치를 알린다.
  • 반복 범위 확인과 재전송 원인·손실 위치 확정은 다른 단계다.

설정·출력 추가로 확인하기 22장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 1장
5/20 - ip/port (virtual host) · 실습·개념 참고 화면 1원본 크기로 보기 ↗
  • 에 삽입된 원본 학습 화면이다. netstat -nat 출력에서 Local Address·Foreign Address·State 열과 LISTENING 소켓을 읽는 화면이다. 명령 옵션의 -nat는 NAT 변환 기능을 뜻하지 않는다.
실습 화면 묶음 02 1장
L4 · 설정·관리 화면 1원본 크기로 보기 ↗
  • 문서 문맥에 삽입된 원본 설정·관리 화면이다. TCP 헤더·상태·흐름 제어와 재전송 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 03 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습1-nc를 활용한 통신 확인원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습1-nc를 활용한 통신 확인에 수록된 화면·도식이다.
실습 화면 묶음 04 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습1-nc를 활용한 통신 확인원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습1-nc를 활용한 통신 확인에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습1-nc를 활용한 통신 확인원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습1-nc를 활용한 통신 확인에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습1-nc를 활용한 통신 확인원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습1-nc를 활용한 통신 확인에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습3-서버/클라이언트간 파일 전송원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습3-서버/클라이언트간 파일 전송에 수록된 화면·도식이다.
실습 화면 묶음 08 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습3-서버/클라이언트간 파일 전송원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습3-서버/클라이언트간 파일 전송에 수록된 화면·도식이다.
실습 화면 묶음 09 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습3-서버/클라이언트간 파일 전송원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습3-서버/클라이언트간 파일 전송에 수록된 화면·도식이다.
실습 화면 묶음 10 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습4-서버/클라이언트간 파일 전송 응용원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습4-서버/클라이언트간 파일 전송 응용에 수록된 화면·도식이다.
실습 화면 묶음 11 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습4-서버/클라이언트간 파일 전송 응용원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습4-서버/클라이언트간 파일 전송 응용에 수록된 화면·도식이다.
실습 화면 묶음 12 1장
Netcat 통신·파일 전송·로그 전달 · 바인드쉘 실습4-서버/클라이언트간 파일 전송 응용원본 크기로 보기 ↗
  • 학습 원본 · Netcat 통신·파일 전송·로그 전달의 바인드쉘 실습4-서버/클라이언트간 파일 전송 응용에 수록된 화면·도식이다.
실습 화면 묶음 13 7장
TCP 패킷 교환 · Flag : push 와 ack (10)원본 크기로 보기 ↗
  • 수업 원본 자료 · 연결 수립·순서 번호·유실 대응·종료 과정. 원문에서 「Flag : push 와 ack」에 배치된 그림 또는 화면이다.
TCP 패킷 교환 · Flag : push 와 ack (11)원본 크기로 보기 ↗
  • 수업 원본 자료 · 연결 수립·순서 번호·유실 대응·종료 과정. 원문에서 「Flag : push 와 ack」에 배치된 그림 또는 화면이다.
TCP 패킷 교환 · SEQ, ACK NUMBER 구조와 목적 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · 연결 수립·순서 번호·유실 대응·종료 과정. 원문에서 「SEQ, ACK NUMBER 구조와 목적」에 배치된 그림 또는 화면이다.
TCP 패킷 교환 · SEQ, ACK NUMBER 구조와 목적 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · 연결 수립·순서 번호·유실 대응·종료 과정. 원문에서 「SEQ, ACK NUMBER 구조와 목적」에 배치된 그림 또는 화면이다.
TCP 패킷 교환 · SEQ, ACK NUMBER 구조와 목적 (5)원본 크기로 보기 ↗
  • 수업 원본 자료 · 연결 수립·순서 번호·유실 대응·종료 과정. 원문에서 「SEQ, ACK NUMBER 구조와 목적」에 배치된 그림 또는 화면이다.
TCP 패킷 교환 · TCP 3way-handshake (2)원본 크기로 보기 ↗
  • 수업 원본 자료 · 연결 수립·순서 번호·유실 대응·종료 과정. 원문에서 「TCP 3way-handshake」에 배치된 그림 또는 화면이다.
TCP 패킷 교환 · 유실 시나리오 실제 확인 (6)원본 크기로 보기 ↗
  • 수업 원본 자료 · 연결 수립·순서 번호·유실 대응·종료 과정. 원문에서 「유실 시나리오 실제 확인」에 배치된 그림 또는 화면이다.
실습 화면 묶음 14 1장
TCP 패킷 생성과 상태 관찰 · hping3원본 크기로 보기 ↗
  • 학습 원본 · TCP 패킷 생성과 상태 관찰의 hping3에 수록된 화면·도식이다.
실습 화면 묶음 15 1장
TCP 패킷 생성과 상태 관찰 · hping3원본 크기로 보기 ↗
  • 학습 원본 · TCP 패킷 생성과 상태 관찰의 hping3에 수록된 화면·도식이다.
실습 화면 묶음 16 1장
TCP 패킷 생성과 상태 관찰 · hping3원본 크기로 보기 ↗
  • 학습 원본 · TCP 패킷 생성과 상태 관찰의 hping3에 수록된 화면·도식이다.
동작·명령 참고 문서

07흐름 제어와 혼잡 제어는 제한하는 대상이 다르다

  • 수신자가 광고하는 는 수신 버퍼에 받아들일 여유를 반영한다. 송신자 내부의 는 네트워크 혼잡을 제어하는 상태다.
    • 송신 중이지만 확인받지 못한 데이터는 대체로 두 제한 중 작은 값 안에 있어야 한다.
    • 상대가 큰 Window를 주어도 가 작으면 전송량이 작고, 네트워크가 한가해도 수신 응용이 읽지 않아 가 0이면 새 데이터 전송이 제약된다.
  • Zero Window가 나타나면 수신 버퍼·응용 처리 지연이 핵심이다. 송신자는 윈도가 다시 열리는지 알아내기 위한 persist 동작을 수행한다.
    • Window Update를 캡처에서 놓치면 상대가 계속 막힌 것처럼 보일 수 있다.
    • 이 현상은 패킷 손실을 혼잡으로 판단해 를 줄이는 동작과 구별된다.
  • 전통적인 혼잡 제어 설명에서 slow start는 를 받으며 를 빠르게 증가시키고, ssthresh 이후 congestion avoidance는 더 완만하게 증가시킨다. 타임아웃이나 손실 신호는 전송량 감소의 계기가 된다.
    • Reno 계열의 이 설명을 모든 현재 알고리즘의 정확한 성장 공식으로 일반화하지 않는다.
    • 운영체제별 CUBIC 등 실제 알고리즘과 초기 윈도 정책에 따라 수치가 달라진다.
원리 심화

08송신 큐·미확인 범위·수신 윈도우의 관계

  • 일반적인 데이터 전송에서 는 가장 오래된 미확인 순서 번호이고 는 다음 전송 번호다. 래핑과 제어 비트 소비를 제외한 예에서 두 값의 차이는 전송했으나 누적 확인되지 않은 바이트 범위다.
  • 새 데이터는 수신 윈도우 와 혼잡 윈도우 의 제한을 동시에 받는다. 단순 상태 예에서는 min(,)에서 아직 전송 중인 양을 빼 남은 여유를 구한다.
  • =1000, =5000, =6000, =4500이면 미확인 범위는 4000바이트, 새 데이터 여유는 500바이트다. 응용 송신 버퍼에 데이터가 많아도 한꺼번에 모두 내보내지 않는다.
  • 유효한 누적 =3000을 받으면 1000~2999의 2000바이트가 확인된다. 송신자는 해당 재전송 자료를 해제할 수 있지만 새 송신량은 갱신된 윈도우·혼잡 제어 상태를 다시 적용한다.
  • 상대가 =0을 광고하면 수신 버퍼가 현재 새 데이터를 받을 수 없다는 뜻이다. 연결 종료 신호는 아니며 윈도우 재개 통지가 유실돼 교착되지 않도록 zero-window probing이 사용된다.

09RTO와 빠른 재전송이 손실에 대응하는 방식

  • 는 단순히 고정된 1초 타이머가 아니다. 표준 알고리즘은 평활 인 와 변동 폭 를 유지하고, +max(시계 정밀도,4×)를 기초로 기다릴 시간을 계산한다.
    • 타임아웃이 나면 가장 오래된 미확인 데이터를 재전송하고 를 배수로 늘려 반복 전송이 혼잡을 악화시키지 않도록 한다.
    • 정확한 최솟값 등은 구현 정책을 구별한다.
  • 이미 재전송한 데이터의 는 최초 전송과 재전송 중 어느 것의 응답인지 모호하다. Karn 알고리즘은 이런 애매한 표본을 배제하며 Timestamp처럼 모호성을 제거할 수 있는 경우를 구분한다.
    • 빠른 재전송은 전통적인 알고리즘에서 세 개의 중복 를 손실 신호로 삼는다.
    • 여기서 세 개는 첫 를 포함한 총 세 개라는 뜻이 아니다.
    • , 재정렬, 현대 손실 검출이 개입하면 캡처에 나타나는 조건이 달라질 수 있다.
예제로 추적

10두 RTT 표본으로 SRTT·RTTVAR·RTO 계산

  1. 재전송되지 않은 데이터에서 표본 200ms와 260ms를 순서대로 얻은 가상 예다. 시계 정밀도 G=10ms, α=1/8, β=1/4, K=4를 사용한다.
  2. =200ms, =100ms로 초기화한다. 계산 =200+max(10,4×100)=600ms이며 RFC 6298의 권고 하한을 적용하면 1초가 된다.
  3. 두 번째 표본의 차이는 |200−260|=60ms다. 이전 를 사용해 =0.75×100+0.25×60=90ms를 먼저 계산한다.
  4. =0.875×200+0.125×260=207.5ms다. 새 계산 =207.5+max(10,4×90)=567.5ms이며 같은 하한 조건에서는 1초를 유지한다.
  5. 재전송 뒤의 는 어느 전송에 대한 응답인지 모호하므로 원칙적으로 표본에서 제외한다. 타임스탬프 등으로 모호성을 해소하는 경우와 운영체제별 타이머 구현은 구분한다.

11정상 종료·반폐쇄·TIME_WAIT

  • 은 한 방향의 송신 종료이므로 반대 방향 데이터는 계속 올 수 있다. 도 순서 공간 1을 소비한다.
  • 과 가 한 세그먼트에 합쳐져 항상 네 패킷으로 보이지는 않는다. 양쪽이 거의 동시에 닫으면 CLOSING 같은 다른 상태 경로도 가능하다.
  • 최종 재전송과 오래된 세그먼트 처리에 필요한 상태다. 표준 설명은 2×MSL을 사용하지만 실제 OS의 시간을 모든 장비에 고정 적용하지 않는다.
  • 상대가 종료한 연결을 로컬 응용이 아직 닫지 않은 상태인지 살핀다.
  1. 먼저 닫는 쪽이 을 보내고 FIN_WAIT_1이 된다.
  2. 상대가 을 하면 능동 종료자는 FIN_WAIT_2로 이동한다. 상대는 CLOSE_WAIT에서 응용의 남은 송신·종료를 기다린다.
  3. 상대 응용도 종료하면 을 보내고 LAST_ACK이 된다.
  4. 먼저 닫은 쪽은 상대 에 하고 TIME_WAIT을 거친다. 상대는 최종 를 받으면 종료한다.

12SSH 캡처를 다시 계산하는 방법

  • 캡처에서는 의 raw 번호, 데이터의 Seq/, +, 재전송과 의 순서 공간 소비를 연결한다. 학습할 핵심은 플래그 이름 암기보다 ‘이번 세그먼트의 Seq+데이터 길이+/ 소비량’과 다음 가 맞는지를 계산하는 것이다.
    • 플래그가 있어도 데이터가 포함될 수 있으며 만으로 응용 출력 시점을 확정할 수 없다.
  • 아래는 실제 장치 출력이 아니라 번호 계산을 재현한 예시다. 재전송으로 보이는 같은 범위가 왜 다시 왔는지 판단할 때는 캡처 위치와 양방향 수집 누락도 고려한다.
    • 호스트 송신 캡처의 잘못된 체크섬 표시는 NIC가 나중에 계산하는 offload 결과일 수 있고, 큰 조각도 segmentation offload 전에 관찰한 데이터일 수 있다.
text
방향    Seq   Ack   Len  Flags
C → S   1000  0     0    SYN
S → C   5000  1001  0    SYN,ACK
C → S   1001  5001  100  ACK
S → C   5001  1101  0    ACK
C → S   1101  5001  0    FIN,ACK
S → C   5001  1102  0    ACK

Wireshark 표시 필터:
tcp.stream eq 0
tcp.analysis.retransmission || tcp.analysis.duplicate_ack
tcp.window_size == 0

계산용 합성 흐름과 조회 필터. stream 번호는 현재 캡처에 맞춰 선택한다.

검증·예외

13누적 ACK와 SACK로 누락·재정렬을 구분하기

  • 수신자가 1000~1499를 받은 뒤 2000~2499를 먼저 받으면 누적 는 1500에 머문다. 뒤쪽 자료가 도착했어도 연속 수신 범위의 공백을 건너뛰어 =2500으로 올리지 않는다.
  • 가 협상됐다면 [2000,2500) 블록으로 따로 받은 구간을 알릴 수 있다. 왼쪽은 첫 바이트, 오른쪽은 마지막 바이트 다음 번호이며 누적 를 대체하지 않는다.
  • 1500~1999가 도착하면 앞서 보관한 구간과 연결되어 가 2500으로 진행한다. 최초 공백이 손실이었는지 단순 지연·재정렬이었는지는 송수신 시각과 재전송 기록을 추가로 봐야 한다.
  • Duplicate ·Retransmission 표시는 캡처에 보이는 순서에 대한 분석이다. 수집 지점에서 한 세그먼트를 놓쳤다면 실제 네트워크 손실과 다른 경고가 생길 수 있다.
  • =2500은 수신 쪽에서 그 이전 바이트를 연속 수신했다는 의미다. 응용 프로그램이 이미 읽었거나 파일에 저장했고 업무 처리를 완료했다는 증거는 아니다.
READ · OBSERVE · CONNECT

함께 보는 학습 자료

아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.

패킷 예제

RFC 9293 §3.5·Figure 6: 연결 설정

양쪽 상태와 Seq·를 같은 시간축에서 읽어 이 순서 공간을 소비하는 이유를 확인한다.

읽으면서 확인할 것
  • Figure 6의 ·/· 순서
  • 와 의 차이
  • 재전송·동시 연결의 별도 분기
학습 확인

이해했는지 확인하기

  • SYN부터 응용 데이터까지 어느 단계에서 멈췄는가?
  • ACK 번호와 데이터 길이의 관계를 설명할 수 있는가?
  • 흐름 제어·혼잡 제어·재전송을 서로 구분하는가?

함께 확인할 공식 자료