TCP(Transfer Control Protocol)헤더의 구조
<----------- IP Datagram -----------> | ||
<---- TCP Segment ----> | ||
IP Header 20 bytes |
TCP Header 20 bytes |
TCP Data |
0 15 16 31
16bit source port |
16bit destination port | |||||||||
32bit sequence number | ||||||||||
32bit acknowledgement number |
20 bytes | |||||||||
4bit header length |
reserved 6bit |
URG |
ACK |
PSH |
RST |
SYN |
FIN |
16bit window size | ||
16bit checksum |
16bit urgent pointer | |||||||||
option (거의 사용 않함) | ||||||||||
data |
16bit source port, 16bit destination port: 출발지와 도착지의 서비스포트 번호.
TCP의 다중화를 지원해주는 부분이다. 하나의 IP를 가진 호스트에서 여러 개의 포트를 사용하여 복수 개의 서비스가 가능하도록 한 것이다.
32bit sequence number: 처음 연결을 시도할 때 시스템에서 임의로 생성한다. 이 값은 전송량을 내포하고 있으며, 받은 쪽에서 이 값을 이용하여 재조립을 한다. 이 값과 더불어 32bit acknowledgement number 값의 계산과정, 패킷 전송시와 재조립시에 사용한다.
-32bit sequence number, 32bit acknowledgement number: sequence number는 처음에 연결을 시도할 때 시스템에 의해서 임의의 숫자로 초기화 된다. 임의의 숫자를 1000이라고 가정하고 이때 연결을 시작하기 위해서 SYN패킷을 대상 호스트로 전송하는 과정을 수행한다. 패킷을 받은 호스트는 잘 받았으면 SYN/ACK플래그를 설정해서 보낸다. 이때 sequence number와 acknowledgement number의 값은 3000과 1001로 각각 설정된다. sequence number는 각 시스템에서 임의로 설정한다고 하였다. 받은 쪽 역시 임의의 값(여기서는 3000이라고 가정)을 설정하고, 이전에 받았던 sequence number에서 1을 더한 값을 acknowledgement number로 설정한다. 마지막으로 다시 패킷을 잘 받았다고 ACK패킷을 전송할 때는 수신한 패킷의 acknowledgement number의 값이 sequence number값이 된다. 수신한 패킷의 sequence number의 값에 1을 더한 값이 acknowledgement number이 된다.
-데이터 전송시의 계산: sequence number, acknowledgement number은 위와 같다. 실제 데이터가 전송될 때에는 전송된 데이터의 크기만큼 sequence number의 값이 증가되어 전송된다. 물론 acknowledgement number의 값은 여기에 1을 더한 값이 된다. 초기화 과정에서 sequence number의 값이 변화가 없는 이유는 전송되는 데이터가 없기 때문이다. 전송되는 데이터는 수신한 패킷의 windows field의 값만큼 전송하게 되므로, 수신한 패킷은 acknowledgement number+window size로 계산하면 된다. 재조립의 과정역시 sequence number에 의해서 이루어 진다. 이 값은 데이터의 번호표 같은 역할을 수행하게 된다. 번호 순서대로 나열하고 데이터가 빠졌거나 문제가 발생하면 재전송을 요구하게 된다.
4bit header length: TCP헤더의 길이 값을 말한다. 기본적인 값은 20이다. 옵션이 사용될 경우 값의 크기는 변경된다. 옵션의 값은 반드시 32비트씩 사용되어야 한다. 만약 맞지 않을 경우 Padding이라 하여 0으로 그 값을 채워야 한다.
reserved 6bit: 현재 사용되지 않으며, 예약되어 있는 비트이다. 일반적으로 개발자들이 특벼한 용도의 값이나, 설정용으로 사용되기도 한다.
URG플래그: 긴급상황이 발생했을 경우 사용하는 플래그이다. 데이터를 전송하는 중간에 [ctrl+c]를 눌러서 취소하고 싶다고 가정하자. 현재 보내는 컴퓨터의 데이터를 전송하기 위해서 버퍼에 데이터를 넣고 있다고 하자. 버퍼는 모두 채워지지 않으면 대이터가 전송되지 않는다. 이때 취소버튼을 눌렀다면, 긴급하게 데이터는 전송되어야 한다. 그래서 보낼 데이터에 URG 플래그를 설정하고, 데이터를 바로 전송하기 위해서 PSH플래그도 같이 설정한다. 버퍼에 데이터가 차지 않으면 모두 찰 때까지 기다리게 되는데, PSH플래그가 설정되면 그 즉스 데이터를 전송하게 된다.
받는쪽에서는 데이터를 받았을때 URG패킷이 설정되어 있다면, 16-Urgent Pointer 값을 확인한다. 이 값은 긴급하게 처리할 정보가 있는 위치를 가리키는 포인터 값이다. 만약 이 값이 없다면 들어온 데이터를 하나씩 모두 처리한 후에 처리되므로, 불필요한 작업을 수행하게 된다. 이런 작업을 모두 제거하기 위해서 이 포인터 값이 필요하다.
ACK플래그: 데이터 전송시에 자주 보이는 플래그이다. 데이터가 제대로 전송되었다고 알려주는 패킷이다. TCP는 데이터를 전송하기 위해서 connection을 만드는 과정을 거치고, 안전한 데이터 전송을 위해서 데이터 전송 후 수신 확인 과정을 거친다. 만약 데이터를 전송하는 과정에서 ACK플래그를 받지 못하면 일정시간동안 기다리다 데이터를 재전송하게 된다. 즉 데이터가 제대로 도달하지 못했다고 판단하고 재전송을 하게 되는 것이다. 예를들어 DATA가 보내어졌다면 받은쪽에서는 ACK가 와야하지만 오지 않을 경우 못받았다고 생각하고 다시 DATA를 보낸다.
이런방식을 PAR(Positive Acknowledgement with Re-transmission)이라고 부른다.
PSH플래그: 위에서 설명했듯이 버퍼가 다 차지 않았더라도 이 플래그가 1이되면 바로 보낸다.
RST플래그: 재설정을 요구하는 플래그이다. RESET이라고 생각하자. 만약 세션을 연결하지 않았거나, 이상한 패킷이 도착되면 잘못 전송하였다고 알려주기 위해서 이 플래그를 설정하여 패킷을 전송하기도 한다.
SYN플래그: TCP의 특징 중 하나인 연결지향성을 나타내는 대표적인 플래그이다. TCP는 데이터 전송이 이루어지기 전에 세션을 생성하기 위해서 반드시 3-Way handshaking과정을 거친다. 이과정은 상대방에 대한 확인 과정이며, 데이터를 주고받기 위한 초기화 과정이기도 하다. SYN플래그는 이 과정을 하자고 제의하는 플래그이다. 만약 이 플래그를 받았고 문제가 없다면 SYN/ACK플래그를 상대방에게 전송해 준다. SYN/ACK플래그를 받으면 잘 받았다고 알리기 위해서 ACK플래그를 설정한 패킷을 전송하게 된다.
FIN플래그: 세션을 종료하고자 할 때 사용하는 플래그이다. 모든 과정이 완료되면 종료하겠다고 FIN플래그를 설정한 패킷을 전송하게 된다. 잘 받았으며 우리도 종료할 준비를 하겠다는 뜻으로 FIN/ACK플래그를 전송하게 된다. 이 패킷을 수신하면 수신했다는 ACK플래그를 설정한 패킷을 전송한 후에 자체 종료를 시작하게 된다.
16bit window size: 패킷 송수신시 네트워크 상황이나, 자신의 상황을 고려하여 받을 수 있는 최대의 버퍼크기를 말한다. 슬라이딩 윈도우라는 개념이 여기에서 사용된다. 현재 얼마만큼의 크기를 전송했고 얼마만큼의 크기를 전송할테니까 준비하라고 하는 값이다. 네트워크상태에 영향을 받으며 전송 중간에도 계속적으로 변하고, 최악의 경우 1로 설정될 수도 있다. 이때를 SWS(silly window syndrome)상태라고 한다.
16bit checksum: 데이터의 무결성을 보장해주는 값이다. 무결성 검사에서 잘못되었다고 판단되면 이 패킷에 대해서 재전송 요구를 하게 된다.
16bit urgent pointer: 위에서 URG 플래그를 설명하면서 언급하였다. 긴급처리해야 할 데이터가 존재하는 곳의 위치에 대한 포인터 값을 가진다.
'Network' 카테고리의 다른 글
IMS (IP Multimedia Subsystem) (0) | 2008.04.30 |
---|---|
OSI 7 Layer - 1 계층 (Physical layer) (0) | 2008.04.28 |
Baseband, Narrowband, Broadband (0) | 2008.04.28 |
UDP 헤더 구조 (0) | 2008.04.28 |
ICMP 패킷의 구조 (0) | 2008.04.28 |