본문 바로가기

Computer/0x03 네트워크

TCP 헤더구조 분석

TCP 헤더구조 분석




번 시간에는 TCP 에 대한 개요와 함께 헤더구조를 분석 해 보겠습니다.

TCP란? Transmission Control Protocol 의 약어 입니다. 전송 제어 프로토콜을 말합니다.





[ Transport Layer ] 


- Application 계층에서 세션과 Datagram 통신 서비스를 제공 합니다.

- End - to - End (종단간연결)간 통신 데이터 무결성에 대한 역할을 담당 합니다.

- TCP와 UDP가 존재 합니다.


- 응용프로세스 간의 가상 회선을 생성 합니다.

- Transport Layer 에서는 Application Layer 와 Port 번호를 이용해서 통신을 합니다. 

FTP에 의한 데이터를 전달 받은 서버의 트랜스포트 레이어 에서는 포트21 번으로 해당 데이터를 전달 합니다.



* 응용프로세스와 포트의 관계에 대해서 살펴 보겠습니다.



(1) 클라이언트에서 동적으로 포트를 할당하여 하위 계층으로 Encapsulation 을 진행후에

데이터를 전송 합니다.


(2) 서버의 각 계층에서 Decapsulation이 일어나며 포트번호가

일치하는 실제 응용 프로세서와 접속하여 데이터 전송에 관련된 작업을 처리 합니다.



[ TCP Port Number ]


- 1024 이하의 Port Address는 Well-Known Port Address 라고 하며,

이미 특정 서비스로 정의 되어 있는 주소 입니다.


- Port Address 는 1 ~ 65535 까지 할당 가능 합니다.


- TCP & UDP : DNS (53번 포트)


- FTP (TCP 21번 포트)

- TELNET (TCP 23번 포트)

- SMTP (TCP 25번 포트)


- TFTP (UDP 69번 포트)

- SNMP (UDP 161번 포트)

- RIP (UDP 520 번 포트)



[ TCP의 특징 ]


- 전이중(Full Duplex) 서비스: TCP 데이터는 양방향으로 동시에 전송 합니다.

- 신뢰성: TCP 헤더는 데이터의 송수신 여부를 여러가지 제어 기능을 통해서 오류를 

확인하고 발생한 경우에는 재전송을 요구하거나 취소하는 메커니즘이 존재 합니다.


- 스트림 데이터 서비스: 데이터 송수신 시 버퍼 기능을 이용하여 Byte 단위로 처리 합니다.

- 연결지향: 3-Way Handshaking 을 통해서 연결을 맺고 난 후 실제 Data를 전송 합니다.



TCP Header 구조분석




- 음... 뭔가 엄청나게 복잡해 보이죠? 첫인상은 정말 이게 뭔지... 난해하기 짝이 없습니다.
그러나 "생소함은 어려움이 아니다" 라는 말이 있듯이 사실 알고보면 정말 쉽고 별거 아닙니다. 
코끼리를 먹기 위해서는 여러 덩어리(?)로 나누어서 소화 시켜야 하듯이 나누고 쪼개서 조금씩 
소화 하시길 바랍니다. 


(1) Source Port Addres
- 발신지 포트 주소로 16Bit 입니다.
- 송신 호스트 응용 프로세스가 사용하는 번호 입니다.


(2) Destination Port Address 
- 목적지 포트 주소로 16Bit 입니다.
- 수신 호스트 응용 프로세스가 사용하는 번호 입니다.


(3) Sequence Number 
- 순차 번호로 32Bit 입니다.
- 신뢰성 있는 데이터 전송을 위해서 모든 Byte 마다 일련번호를 설정 합니다.
- 교환하고자 하는 초기순차 번호(Initial Sequence Number)


(4) Acknowledgement Number
- 응답 번호로 32Bit 입니다.
- 세그먼트에 실린 데이터의 마지막 Byte 의 순차 번호에 1을 더한 값입니다.


(5) Header Length (헤더길이)
- 헤더 길이로 4Bit 입니다.
- 헤더의 길이가 20~60Byte 이므로 5 ~ 12 사이의 값을 가집니다.


(6) Reserver 
- 예약된 필드로 6Bit 입니다.
- 차후를 대비해서 남겨둔 필드 입니다.


(7) Control
- 제어 필드로 6Bit 입니다.
- 각 필드 흐름제어, 종료, 데이터 전송 모드용으로 사용 합니다.



(8) Window Size
- 윈도우 크기로 16Bit 입니다.
- 응답 확인을 받기 전에는 보낼 수 있는 데이터의 양을 설정하는 필드 입니다.
- 윈도우 크기가 16Bit 이므로 최대 65535Byte 의 값을 가질 수 있습니다.


(9) Checksum
- 검사합 값으로 16Bit 입니다.
- 각 TCP 세그먼트의 변형 여부를 확인 합니다.


(10) Urgent Pointer
- 긴급 포인터로서 16Bit 입니다.
- 세그먼트가 긴급 데이터를 포함하고 있을 경우에 사용되는 필드 입니다.
- 제어 플래그가 1로 설정 시에 16Bit 필드 값과 순차 번호를 더하면 긴급 데이터
번호(위치)를 알 수 있습니다.



(11) Option
- 옵션 필드로서 최대 40Byte 길이까지 사용 가능합니다.
- 1Byte 옵션과 다중 Byte 옵션이 제공 합니다.
- 1Byte 옵션:
End of option: 옵션을 사용하지 않음을 명시 합니다.
No Operation: 패킷을 작동 시키지 않습니다.

-> 최대 세그먼트 크기(MSS): Maxium Segment Size로서 목적지에서 수신할 수 있는
최대 세그먼트 크기를 의미 합니다.
-> 윈도우 확장 인자(Windows Scale Factor): 기본 헤더의 윈도우 크기(65535)로는 
데이터 전송이 비효율적일 경우에 사용 합니다.
-> Timestamp

[ 6개의 플래그(Flags) ]

URG: 급하다
FIN: 끝내자
SYN: 할말있어
ACK: 알았어
RST: 초기화 하자
PSH: 이것부터 처리해줘

* TCP헤더의 크기는 20 ~ 60byte 입니다.

* Data size 만큼 시퀀스 Number 가 증가 합니다.

* Maximum Segment size (헤더 + 데이터)

Q. TCP가 왜 신뢰성이 있을까요?
A. 재전송 메커니즘을 갖고 있기 떄문 입니다.

재전송 메커니즘 이란, 시퀀스넘버와 에크넘버의 숫자가 맞지 않으면 재전송
하는 것을 말합니다.