본 게시글은 그림으로 공부하는 TCP/IP 구조 도서를 참고하였습니다.
전송 계층의 프로토콜, TCP에 대해 알아보자.
TCP란?
- Transmission Control Protocol
- 데이터 전송의 신뢰성을 요구하는 애플리케이션에서 사용된다.
- 애플리케이션 데이터를 송신하기 전에, TCP 커넥션이라는 논리적인 통신로를 만들어, 통신 환경을 정비한 후 통신을 수행한다.
- 송신 파이프
- 수신 파이프
- 송신 측 단말과 수신 측 단말이 2개의 논리적인 파이프를 전이중으로 사용해 송신과 수신을 확인해가며 데이터를 전송한다.
- QUIC 때문에 확실하진 않지만, 2020년 기준 현재 인터넷상의 트래픽의 80% 이상이 TCP로 구성되어 있다.
- IP 헤더의 프로토콜 번호는 '6(0x06)'으로 지정되어 있다.
TCP 패킷 포맷
- 신뢰성을 요구하기 때문에, UDP 보다 다소 복잡한 TCP의 패킷 포맷에 대해 알아보자.
- TCP 의 헤더 길이는 최저 20바이트(160비트)이다.
송신지/수신지 포트 번호
- 애플리케이션의 식별에 사용되는 2바이트 숫자이다.
- 하나의 포트에서, 다양한 IP주소에서의 요청을 받아낼 수 있다.
- 자세한 내용은 포트번호를 참고하자.
시퀀스 번호
- TCP 세그먼트를 올바른 순서로 정렬하기 위해 사용되는 4바이트(32비트)의 필드이다.
- 송신 측 단말은 애플리케이션에게서 받은 데이터의 각 바이트에 초기 시퀀스 번호(ISN)에서 연번을 부여한다.
- 수신 측 단말은 받은 TCP세그먼트의 시퀀스 번호를 확인하고, 번호순으로 정렬해 애플리케이션에 전달한다.
- 3-way handshake 시 무작위 값이 초기 시퀀스 번호로 설정된다.
- TCP 세그먼트를 송신할 때마다 송신한 바이트 수만큼 더해진다.
- 4바이트로 관리할 수 있는 데이터 양(4GB)가 넘어가면, 다시 0으로 돌아가 증가한다.
확인 응답 번호(ACK 번호)
- ACK 번호라고도 불린다.
- 컨트롤 비트의 ACK 과는 다름에 주의하자.
- "다음은 여기서부터 데이터를 주십시오." 라고 상대에게 전달하기 위해 사용하는 4바이트(32비트) 필드이다.
데이터 오프셋
- TCP 헤더의 길이를 나타내는 4"비트" 필드이다.(바이트가 아님에 주의하자.)
- TCP 헤더의 길이를 4바이트로 환산한 값이 들어있다.
- 남은 4비트는 "예약 영역"으로, 추후 확장을 위해 개념만 존재하고, 0으로 채워 넣는다.
컨트롤 비트
- 커넥션의 상태를 제어하는 필드이다.
- 8비트 플래그로 구성되어 있으며, 각 비트가 다음 표와 같은 의미를 나타낸다.
비트 | 플래그 이름 | 설명 | 개요 |
---|---|---|---|
1번째 비트 | CWR | Congestion Window Reduced | ECN‑Echo에 따라, 혼잡 윈도우가 줄어든 것을 알리는 플래그. 명시적으로 혼잡을 알리는 ECN(Explicit Congestion Notification)에서 사용된다. |
2번째 비트 | ECE | ECN‑Echo | 혼잡이 발생했음을 통신 상대에게 알리는 플래그 |
3번째 비트 | URG | Urgent Pointer field significant | 긴급 데이터를 처리해야 함을 나타내는 플래그 |
4번째 비트 | ACK | Acknowledgment field significant | 수신한 데이터에 대한 확인 응답을 나타내는 플래그 |
5번째 비트 | PSH | Push Function | 받은 데이터를 바로 애플리케이션으로 전달하도록 지시하는 플래그 |
6번째 비트 | RST | Reset the connection | 연결을 강제로 재설정(끊기)하는 플래그 |
7번째 비트 | SYN | Synchronize sequence numbers | 연결 설정을 시작하기 위해 시퀀스 번호를 동기화하는 플래그 |
8번째 비트 | FIN | No more data from sender | 더 이상 보낼 데이터가 없음을 알리고 연결을 종료하는 플래그 |
윈도우 사이즈
- 받은 데이터 크기를 알리기 위한 필드이다.
- 아무리 고성능의 단말이라도, 한번에/오류 없이 패킷을 받을 수는 없다.
- 그래서, '이만큼은 받을 수 있다!'라고 알릴 방법이 필요하다.
- 확인 응답을 기다리지 않고 받을 수 있는 데이터 크기를 윈도우 크기로 알린다.
- 2바이트로 구성되며, 최대 65535바이트까지 알릴 수 있다.
- 0이면 더이상 받을 수 없음을 나타낸다.
- 흐름제어 참고
체크섬
- TCP 세그먼트가 손상되지는 않았는지, 정합성을 체크하기 위해 사용하는 2바이트(16비트) 필드이다.
긴급 포인터
- 컨트롤 비트의 URG 플래그가 '1'로 설정되었을 때만 유효한 2바이트(16비트) 필드이다.
- 긴급 데이터가 있을 때, 긴급 데이터를 나타내는 가장 마지막 바이트의 시퀀스 번호가 설정된다.
옵션
- TCP에 관련된 확장 기능을 알리기 위해 사용된다.
- 4바이트 단위로 변화하는 필드이며, 'kind' 값에 따라 정의된 몇가지 옵션을 "옵션 리스트"로 나열하는 형태로 구성되어 있다.
- 대표적인 옵션으로는 다음이 있다.
- 2 - MSS
- 애플리케이션 데이터의 최대 크기를 알린다.
- 4 - SACK Permitted
- Selective ACK에 대응한다.
- 5 - SACK
- Selective ACK에 대응할 때, 이미 수신한 시퀀스 번호를 알린다.
- 34 - TCP Fast Open
- TCP Fast Open에 대응하는 것을 알리고, Cookie 정보를 전달한다.
- 2 - MSS
MSS
- Maximum Segment Size
- TCP 페이로드의 최대 크기를 의미한다.
- 3-way handshake 시, 서로 MSS 값을 교환하게 된다.
- 예시) MTU와의 비교
- MTU
- IP 패킷의 최대 크기이다.
- 인터넷의 경우, 기본값이 1500바이트
- MSS
- TCP 세그먼트에 삽입할 수 있는 애플리케이션 데이터의 최대 크기이다.
- 일반적으로 IPv4 에서는 MTU - 40바이트(IP헤더+TCP헤더)가 된다.
- IPv6에서는 MTU - 60바이트(IP헤더+TCP헤더)가 된다.
- MTU
SACK
- 사라진 TCP 세그먼트만을 재전송하는 기능이다.
- 위 ACK 내용을 보면, TCP 는 애플리케이션 데이터를 어디까지 받아들이는가를 ACK 번호만으로 판단한다.
- 그렇기 때문에 부분벅으로 TCP 세그먼트가 사라지면, 사라진 TCP 세그먼트 이후의 모든 TCP 세그먼트를 재전송해야 한다.
- 해당 비효율을 개선하기 위해 Selective ACK 기능을 사용한다.
- 부분적으로 TCP 세그먼트가 사라진 경우
- '어디서부터 어디까지 받았는가' 라는 범위를 옵션 필드로 알릴 수 있다.
- 예시: SACK 미지원
- 예시: SACK 지원
'CS Repo > 네트워크 - Top-down Approach + @' 카테고리의 다른 글
TCP의 다양한 추가 기능 - TFO, Nagle 알고리즘, 지연 ACK, Early Retransmit, Tail Loss Probe (0) | 2025.04.18 |
---|---|
TCP의 연결과 종료 과정 - 흐름제어, 혼잡제어, 재전송 제어, 3-way handshake, 4-way handshake (0) | 2025.04.18 |
UDP (0) | 2025.04.18 |
포트 번호 (0) | 2025.04.17 |
NAT (0) | 2025.04.17 |