본문 바로가기
CS/네트워크

[혼자 공부하는 네트워크] 04 전송 계층 - TCP

by 박뫙대 2025. 5. 13.

안녕, 리뷰어. 나는 뫙대🛠️ 

CS에 대한 개념이 0에 수렴해 공부를 시작합니다. 네트워크 공부는 '혼자 공부하는 네트워크'를 기반으로 합니다. 이번 글에서는 전송 계층의 TCP에 대해 다룹니다. 글을 읽기 전에 연결형신뢰성 통신을 기억하세요.

 
혼자 공부하는 네트워크
『혼자 공부하는 네트워크』는 개발자의 필수 지식인 네트워크를 기본부터 제대로 학습할 수 있도록 돕는 입문서입니다. 다수의 네트워크 전공 서적들을 면밀히 분석하고, 방대한 컴퓨터 네트워크 이론 중에서 핵심 내용만 선별해서 담았습니다. 도서 제목 그대로 혼자 공부하는 초보자를 위해 쉬운 비유와 입문자 맞춤형 예시를 통해 재미있는 학습을 유도하고, 핵심 키워드와 네트워크 계층별 설명으로 쉽게 이해할 수 있도록 했으며, 한눈에 쏙 들어오는 친근한 일러스트를
저자
강민철
출판
한빛미디어
출판일
2024.04.12

TCP(Transmission Control Protocol)

신뢰할 수 있는 통신을 위한 연결형 프로토콜. 회선 교환 방식과 유사

스테이트풀stateful 프로토콜. 연결형・신뢰성 통신을 유지하기 위해 상태를 유지하고 활용

TCP 세그먼트 구조

  • 송신지/수신지 포트
  • 순서 번호 i.e. 시퀀스 번호: 세그먼트의 올바른 순서 보장 번호 🔗신뢰성
    • 순서 번호 = ISN + 송신한 바이트 수
      ISN(Initial Sequence Number)는 
      MSS* 단위로 쪼개진 세그먼트 중 SYN 플래그가 1로 설정된 세그먼트에 무작위 값 부여
      * Maximum Segement Size로, TCP로 전송할 수 있는 최대 페이로드 크기

TCP MSS

  • 확인 응답 번호 i.e. ACK 번호: 상대 호스트가 보낸 세그먼트에 대한 응답. 순서 번호 명시 🔗신뢰성
  • 제어 비트 i.e. 플래그 비트: 기본 8비트 부가 정보
    → CWR, ECE, URG, ACK, PSH, RST, SYN, FIN
    • ACK(acknowledgment): 승인
    • SYN(synchronize): 연결 요청
    • FIN(finish): 연결 종료 요청
  • 윈도우: 수신 윈도우(RWND, Receiver WiNDow)*의 크기 🔗흐름 제어
    * 윈도우는 송신 호스트가 파이프라이닝할 수 있는 최대량. 데이터의 범위 지정
    파이프라이닝pipelining

    ACK 세그먼트 없이 여러 세그먼트를 연속해서 보내는 방식

통신 단계에 따른 TCP 상태

통신 단계

(연결 전) → 연결 수립 → 데이터 송수신 → 연결 종료

TCP state transition diagram

연결 전

  • CLOSED: 연결이 없는 상태
  • LISTEN(passive open): 연결 대기 상태. Passive Open 호스트는 LISTEN 상태 유지
    • Active Open 호스트(e.g. client)가 Passive Open 호스트(e.g. server)에게 SYN 세그먼트를 보내면 3-way handshake 시작

TCP states corresponding to normal connection establishment and termination

연결 수립 - 3-WAY HANDSHAKE

송수신 방향 연결 요청 주체 상태 세그먼트 세그먼트 정보
A → B active open SYN-SENT SYN 세그먼트 ISN(A)
1로 설정된 SYN 비트
B → A passive open SYN-RECEIVED SYN+ACK 세그먼트 ISN(B)
ISN(A)+1
1로 설정된 SYN+ACK 비트
A → B active open ESTABLISHED ACK 세그먼트 ISN(A)+1
ISN(B)+1
1로 설정된 ACK 비트
- passive open ESTABLISHED - -

데이터 송수신

  • ESTABLISHED: 연결 확립 상태. 데이터 송수신 과정에서는 이 상태 유지

연결 종료 - 4-WAY HANDSHAKE

송수신 방향 연결 요청 주체 상태 세그먼트 세그먼트 정보
A → B active close FIN-WAIT-1 FIN 세그먼트(x) 1로 설정된 FIN 비트
B → A passive close CLOSE-WAIT ACK 세그먼트 x+1
1로 설정된 ACK 비트
- active close FIN-WAIT-2 - -
B → A passive close LAST-ACK FIN 세그먼트(y) 1로 설정된 FIN 비트
A → B active close TIME-WAIT* ACK 세그먼트 y+1
1로 설정된 ACK 비트
- - CLOSED - -

* TIME-WAIT는 재전송 가능성 때문에 일정 시간 유지

  • CLOSING: 동시에 연결을 종료하려 할 때, FIN 세그먼트들이 교차하는 상황에 나타나는 상태

TCP 상태 확인

신뢰성 보장 기능

연결 정보 없이는 데이터의 순서나 수신 보장 등 신뢰성 보장 불가능  ESTABLISHED 상태(데이터 송수신 과정)에서 본격적으로 활성화

  1. 오류 제어
    재전송
    • 오류 검출
      중복된 ACK 세그먼트 수신 ② 재전송 타이머의 카운트다운이 끝난 타임아웃 발생
    • 재전송 기법: ARQ(Automatic Repeat Request)
      1. Stop-and-Wait ARQ: ACK 세그먼트 수신 전까지 대기
        • 단순한 구조와 높은 신뢰성 보장
        • 네트워크 이용 효율(대역폭 활용률) 낮음 → 성능 저하
      2. Go-Back-N ARQ: 여러 세그먼트들을 파이프라이닝 방식으로 전송
        • 오류 발생 세그먼트 이후의 모든 세그먼트 재전송
        • 오류 발생 이후의 정상 수신된 세그먼트도 폐기 → 낭비 발생
        • 누적 확인 응답(CACK, Cumulative Acknowledgment)
      3. Selective Repeat ARQ: 여러 세그먼트들을 파이프라이닝 방식으로 전송. 오류 세그먼트만 선택적으로 재전송
        • TCP 세그먼트 헤더의 옵션 필드의 SACK Permitted로 Selective Repeat ARG 지원 여부 확인
        • 재전송 최소화 → 높은 효율. 양쪽 호스트의 세그먼트 상태 추적 필요 → 구현 복잡 
        • 개별 확인 응답(SACK, Selective Acknowledgment)
  2. 흐름 제어 🔗파이프라이닝
    수신 버퍼의 크기는 한정되기 때문에 버퍼 오버플로가 발생하지 않도록 수신자의 처리 속도를 고려해 전송량 조절
    • 슬라이딩 윈도우
      파이프라이닝 방식을 효율적으로 구현하기 위한 메커니즘. ACK 수신에 따라 윈도우 범위를 슬라이딩
      • 윈도우 범위: 전송 가능한 순서 번호 범위. 윈도우 크기에 따라 결정됨
      • 윈도우 크기: 한 번에 전송할 수 있는 데이터의 최대량 → min(RWND, CWND)
  3. 혼잡 제어
    많은 트래픽으로 패킷 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황을 제어하기 위해 전송량 조절
    → 세 번의 중복 ACK 세그먼트를 수신했을 때 혼잡으로 간주
      • 혼잡 윈도우(CWND, Congestion WiNDow)
        혼잡 없이 전송할 수 있는 데이터의 최대량 → min(RWND, CWND)
      • 혼잡 제어 알고리즘

        상황 분류 방법
        타임아웃 발생 CWND=1MSS, SSTHRESH=CWND/2 →  느린 시작 재개
        CWND >= SSTHRESH 느린 시작 종료. CWND/=2 → 혼잡 회피 수행
        세 번의 중복 ACK 발생 빠른 재전송 후 빠른 회복 수행
        • AIMD(Additive Increase/Multiplicative Decrease): 기본적
          혼잡이 감지되지 않는다면 RTT마다 1씩 증가(선형적 증가), 혼잡이 감지된다면 절반으로 감소
        • 느린 시작 알고리즘
          1부터 시작. 문제없이 수신된 ACK 세그먼트 하나당 1씩 증가(지수적 증가). 임계치(SSTHRESH, Slow Start THRESHold) 有 → 활용 초기 전송 속도를 빠르게 확보 가능
        • 혼잡 회피 알고리즘
          RTT마다 1MSS씩 증가(선형적 증가)
        • 빠른 회복 알고리즘
          느린 시작은 건너뛰고 혼잡 회피를 수행 → 빠른 전송률 회복. 빠른 재전송*이 함께 수행
          * 세 번의 중복 ACK 세그먼트를 수신했다면 재전송 타이머가 만료되기 전이라도 해당 세그먼트를 곧바로 재전송하는 기능
    명시적 혼잡 알림(ECN, Explicit Congestion Notification)

    선택적 기능. 연결 수립 과정에서 양쪽 호스트가 CWR+ECE 세그먼트를 통해 ECN 지원 여부 확인

    참조. RFC3168 추가. RTP over UDP에서의 ECN 적용 RFC6679


후기: 통신 단계와 TCP 상태를 매치하며 이해하는 데 생각보다 시간이 걸렸다. 메커니즘을 직접 그려본 게 도움이 됐다. 공유 받은 영상도 TCP 통신 과정을 이해하는데 정말 많은 도움이 됐다. 덕분에 책에서는 자세히 다루지 않아 넘어간 용어와 역할을 파악할 수 있었다. 완전히 이해했다,는 아니지만 살 붙이기까지는 했다. 와이어샤크로 실습하면 완전히 이해할 수 있지 않을까. 그럼에도 계속해서 추가적인 공부는 필요할 것 같다.

1. 스테이트풀과 스테이트리스를 좀 더에 해당하는 다른 프로토콜도 찾아봐야 겠다. HTTP가 스테이트리스에 해당한다니 응용 계층에서 더 알아보도록 하겠다.

2. TCP의 신뢰성 부분에서는 깊이 있게 들어간다면 보안과 관련이 있다. 최근에 보안 이슈가 터진만큼 조금 더 공부해서 나쁠 건 없을 듯.

 

🤔 연결 수립은 세 단계인데, 연결 종료는 네 단계로 구분한 이유가 뭘까. 상태와 관련이 있는 것 같다.

 

참고

https://flylib.com/books/en/3.223.1.188/1/

https://seongonion.tistory.com/74