TCP 헤더
: TCP 세그먼트의 앞부분에 붙는 제어 정보들
개요
- 애플리케이션 계층에서 전송한 데이터는 트랜스포트 계층으로 전달됨
→ 트랜스포트 계층에서는 이 데이터에 사용할 프로토콜의 헤더를 붙임(TCP를 이용하기 때문에 TCP 헤더가 붙음)
⇒ 이 데이터가 세그먼트
TCP 구성
Source Port: 송신 측의 포트
Destination Port: 수신 측의 포트
- 둘 다 16비트로 구성
- 2¹⁶ = 65536 ⇒ 0 ~ 65535번 포트까지 사용 가능
- 2¹⁶ = 65536 ⇒ 0 ~ 65535번 포트까지 사용 가능
Sequence Number: 해당 데이터의 일련 번호
- 데이터를 보낼 때 번호를 붙임(seq)
- "내가 지금부터 보낼 데이터의 위치”를 의미
- 이 번호가 있어서 데이터의 순서가 뒤바뀌어 도착해도 원래 순서대로 복원할 수 있고, 데이터 누락 여부도 확인 가능함
- 처음 보낼 땐 난수로 결정되고, 그 다음부터는 현재 Sequence Number + 내가 보낸 데이터 크기 + 1
- ex) 초기 Sequence Number가 10000이고, 보낸 데이터가 500바이트면
→ 다음 Sequence Number는 10501 (10000 + 500 + 1)
- ex) 초기 Sequence Number가 10000이고, 보낸 데이터가 500바이트면
- 32비트로 구성
Acknowledgement Number: 자신이 다음에 받아야 할 상대의 Sequence Number를 의미
- 수신자가 송신자에게 보내는 응답
→ "나는 이 번호 이전까지 다 받았고, 다음엔 이 번호부터 보내줘"라는 의미 - ACK = 받은 데이터의 Sequence Number + 받은 데이터 크기 + 1
- ex) 상대방이 보낸 데이터의 Sequence Number가 20000이고, 데이터 크기가 1000이면
→ Acknowledgement Number는 21001 (20000 + 1000 + 1)
Sequence Number와 Acknowledgement Number의 동작 예시
- 3 way handshake로 커넥션을 이미 만든 상황
- 사용자가 Sequence Number 1000과 500바이트 크기의 데이터를 전송함
- Acknowledgement Number는 3 way handshake를 진행할 때 받은 Sequence Number에 데이터 크기를 더한 값을 사용하지만, 여기선 단순화를 위해 0으로 가정함
- 케이틀린은 응답으로
- 200바이트 크기의 데이터를 보냄
- Sequence Number는 난수로 5000으로 설정됨
- Acknowledgement Number는 1501 (1000 + 500 + 1)로 설정해 사용자에게 다음 순서를 알려줌
→ 사용자가 보낸 데이터의 Sequence Number 1000에 데이터 크기 500와 1을 더함
- 사용자는 케이틀린의 데이터를 받고 응답으로
- Sequence Number는 1501인 데이터를 준비하고
- Acknowledgement Number는 5201 (5000 + 200 + 1)이라고 알림
→ 케이틀린에게 받은 Sequence Number 5000에 데이터 크기 200와 1을 더함
- 사용자가 Sequence Number 1000과 500바이트 크기의 데이터를 전송함
⇒ 이렇게 서로의 Sequence Number와 Acknowledgement Number를 사용해 데이터의 신뢰성을 보장함
Data Offset: 현재 TCP 데이터가 TCP 세그먼트의 앞에서 얼마나 떨어져 있는지를 4바이트 단위로 나타냄
- TCP 헤더의 크기를 의미
⇒ TCP Segment = TCP Header + TCP Data - TCP 헤더의 기본값은 20바이트이므로 Data Offset의기본값은 5
- 4비트로 구성
Reserved: 앞으로 필요할 때를 대비해 남겨둔 필드
- 현재는 사용되지 않음
- 3비트로 구성
Control Flags: 연결 상태나 제어 목적을 나타내는 TCP 헤더 안에 있는 6개의 플래그 비트
- 각 비트는 0 또는 1로 설정됨
- 총 9비트로 구성
NS (None Sum) |
악의적인 데이터를 은폐하는 걸 방지하기 위한 필드 | 아직 실험 단계, 잘 쓰이지 않음 |
CWR (Congestion Window Reduced) |
혼잡 제어 시 사용되는 필드 | 혼잡 제어용 |
ECE (ECN Echo) |
혼잡 제어 시 사용되는 필드 | 혼잡 제어용 |
URG (Urgent Flag) |
긴급하게 처리해야 하는 데이터를 나타낼 때 사용하는 필드 | 거의 안 쓰임 |
ACK (Acknowledgement Flag) |
받은 데이터에 대한 응답 표시 | 1이면 데이터를 잘 받았다는 뜻 |
PSH (Push Flag) |
데이터를 즉시 상위 계층으로 전달 요청하는 필드 | 1이면 즉시 전달, 0이면 버퍼링을 허용 |
RST (Reset Flag) |
연결을 강제로 종료 요청하는 필드 | 1이면 이미 연결된 커넥션을 강제로 끊는다는 뜻 |
SYN (Synchronize) |
커넥션을 생성할 때 사용 | 연결 시작용 |
FIN (Fin Flag) |
더 이상 데이터가 없어서 연결 종료를 요청하는 필드 | 정상 종료용, 1이면 연결을 끊고 싶다는 의미 |
Window Size: TCP의 흐름제어인 슬라이딩 윈도우를 사용할 때 사용
- 흐름 제어에 사용됨
- 수신 측이 수용 가능한 버퍼 크기를 보냄
- 16비트로 구성
Checksum: 전송 중 오류가 있는지 확인하기 위한 필드
- 흐름 제어에 사용됨
- TCP의 흐름제어인 슬라이딩 윈도우를 사용할 때 사용
- 16비트로 구성
Urgent Pointer: 데이터 중 긴급한 데이터가 어디까지 있는지를 가리킴
- URG 플래그가 1일 경우 사용됨
- 수신 측은 이 포인터를 참고해서 긴급 데이터를 우선 처리함
- 이 포인터가 가리키는 데이터를 우선 처리할지는 애플리케이션 구현에 따라 다름
→ 애플리케이션을 만든 개발자 마음
- 이 포인터가 가리키는 데이터를 우선 처리할지는 애플리케이션 구현에 따라 다름
Options: TCP의 기능을 확장할 때 사용
- 크기가 정해져있지 않고 가변적임
- 데이터 오프셋(DO)필드를 이용해 실제 헤더의 크기를 계산할 수 있음
- 최대 40바이트까지 가능함