안녕, 리뷰어. 나는 뫙대🛠️
CS에 대한 개념이 0에 수렴해 공부를 시작합니다. 네트워크 공부는 '혼자 공부하는 네트워크'를 기반으로 합니다. 이번 글에서는 전송 계층의 TCP에 대해 다룹니다. 글을 읽기 전에 연결형・신뢰성 통신을 기억하세요.
- 저자
- 강민철
- 출판
- 한빛미디어
- 출판일
- 2024.04.12
TCP(Transmission Control Protocol)
신뢰할 수 있는 통신을 위한 연결형 프로토콜. 회선 교환 방식과 유사
스테이트풀stateful 프로토콜. 연결형・신뢰성 통신을 유지하기 위해 상태를 유지하고 활용

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

- 확인 응답 번호 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 상태
통신 단계
(연결 전) → 연결 수립 → 데이터 송수신 → 연결 종료
연결 전
- CLOSED: 연결이 없는 상태
- LISTEN(passive open): 연결 대기 상태. Passive Open 호스트는 LISTEN 상태 유지
- Active Open 호스트(e.g. client)가 Passive Open 호스트(e.g. server)에게 SYN 세그먼트를 보내면 3-way handshake 시작

연결 수립 - 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 세그먼트들이 교차하는 상황에 나타나는 상태

신뢰성 보장 기능
연결 정보 없이는 데이터의 순서나 수신 보장 등 신뢰성 보장 불가능 → ESTABLISHED 상태(데이터 송수신 과정)에서 본격적으로 활성화
- 오류 제어
재전송
- 오류 검출
① 중복된 ACK 세그먼트 수신 ② 재전송 타이머의 카운트다운이 끝난 타임아웃 발생 - 재전송 기법: ARQ(Automatic Repeat Request)
- Stop-and-Wait ARQ: ACK 세그먼트 수신 전까지 대기
- 단순한 구조와 높은 신뢰성 보장
- 네트워크 이용 효율(대역폭 활용률) 낮음 → 성능 저하
- Go-Back-N ARQ: 여러 세그먼트들을 파이프라이닝 방식으로 전송
- 오류 발생 세그먼트 이후의 모든 세그먼트 재전송
- 오류 발생 이후의 정상 수신된 세그먼트도 폐기 → 낭비 발생
- 누적 확인 응답(CACK, Cumulative Acknowledgment)
- Selective Repeat ARQ: 여러 세그먼트들을 파이프라이닝 방식으로 전송. 오류 세그먼트만 선택적으로 재전송
- TCP 세그먼트 헤더의 옵션 필드의 SACK Permitted로 Selective Repeat ARG 지원 여부 확인
- 재전송 최소화 → 높은 효율. 양쪽 호스트의 세그먼트 상태 추적 필요 → 구현 복잡
- 개별 확인 응답(SACK, Selective Acknowledgment)
- Stop-and-Wait ARQ: ACK 세그먼트 수신 전까지 대기
- 오류 검출
- 흐름 제어 🔗파이프라이닝
수신 버퍼의 크기는 한정되기 때문에 버퍼 오버플로가 발생하지 않도록 수신자의 처리 속도를 고려해 전송량 조절
- 슬라이딩 윈도우
파이프라이닝 방식을 효율적으로 구현하기 위한 메커니즘. ACK 수신에 따라 윈도우 범위를 슬라이딩
- 윈도우 범위: 전송 가능한 순서 번호 범위. 윈도우 크기에 따라 결정됨
- 윈도우 크기: 한 번에 전송할 수 있는 데이터의 최대량 → min(RWND, CWND)
- 슬라이딩 윈도우
- 혼잡 제어
많은 트래픽으로 패킷 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황을 제어하기 위해 전송량 조절
→ 세 번의 중복 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 세그먼트를 수신했다면 재전송 타이머가 만료되기 전이라도 해당 세그먼트를 곧바로 재전송하는 기능
- AIMD(Additive Increase/Multiplicative Decrease): 기본적
- 혼잡 윈도우(CWND, Congestion WiNDow)
후기: 통신 단계와 TCP 상태를 매치하며 이해하는 데 생각보다 시간이 걸렸다. 메커니즘을 직접 그려본 게 도움이 됐다. 공유 받은 영상도 TCP 통신 과정을 이해하는데 정말 많은 도움이 됐다. 덕분에 책에서는 자세히 다루지 않아 넘어간 용어와 역할을 파악할 수 있었다. 완전히 이해했다,는 아니지만 살 붙이기까지는 했다. 와이어샤크로 실습하면 완전히 이해할 수 있지 않을까. 그럼에도 계속해서 추가적인 공부는 필요할 것 같다.
1. 스테이트풀과 스테이트리스를 좀 더에 해당하는 다른 프로토콜도 찾아봐야 겠다. HTTP가 스테이트리스에 해당한다니 응용 계층에서 더 알아보도록 하겠다.
2. TCP의 신뢰성 부분에서는 깊이 있게 들어간다면 보안과 관련이 있다. 최근에 보안 이슈가 터진만큼 조금 더 공부해서 나쁠 건 없을 듯.
🤔 연결 수립은 세 단계인데, 연결 종료는 네 단계로 구분한 이유가 뭘까. 상태와 관련이 있는 것 같다.
참고
'CS > 네트워크' 카테고리의 다른 글
| [혼자 공부하는 네트워크] 05 응용 계층 - DNS (0) | 2025.05.19 |
|---|---|
| [혼자 공부하는 네트워크] 04 전송 계층 - UDP (0) | 2025.05.13 |
| [혼자 공부하는 네트워크] 03 네트워크 계층 - IP 주소 (2) | 2025.05.10 |
| [혼자 공부하는 네트워크] 03 네트워크 계층 - IP와 라우터 (0) | 2025.05.10 |
| [혼자 공부하는 네트워크] 02 물리 계층과 데이터 링크 계층 (2) | 2025.04.28 |
