TCP header

2022. 4. 5. 11:55Network

# TCP -> 4계층 프로토컬에 해당하며 헤더의 길이는 기본 20바이트 옵션까지 포함하면 최대 60바이트로 구성되어있음.  

HEADER DATA

 

와이어샤크로 TCP헤더 패킷을 잡은 모습

 

- Source port(16bits) 

출발지 포트번호[번호는 처음 세그먼트를 전송하는 측에서 임의의 번호를 사용하므로 랜덤일 수 있음]

 

- Destination port(16bits)

목적지 포트번호

ex) 웹에 접근 -> 80번 port, ftp -> 21번, ssh -> 22번 

 

- Sequence number(32bits)

데이터들의 순서들을 의미하며 2^32인 4,294,967,296까지의 수를 포함하기 때문에 데이터순서값이 중복될 확률 낮음.

시퀀스 번호는 양쪽의 TCP 소프트웨어가 전송된 데이터의 양을 추적하고 잘못된 순서로 수신된 경우 데이터를 올바른 순서로 되돌리고 전송 중 손실된 데이터를 요청하는 데 도움을 줌. 보내는 데이터 1바이트마다 시퀀스 번호를 1씩 증가시키는데 2^32인 4,294,967,296를 넘어가게 되면 다시 0부터 시작함

 

- Acknowledgement number(32bits)

송신자가 보낸 데이터를 수신하여 오류가 없으면 시퀀스 번호를 1증가하여 정확한 데이터의 수신 확인을 알려줌

Ack number == Sequence number + 데이터길이 ex) SYN = 100 -> AN = 100 + 1

 

-  Offsets(4bits)[=HLEN]

Offsets의 끝 = 데이터가 시작되는 위치를 보여줌

옵션필드 값이 고정되어있지 않기 때문에 이 필드가 필요함

 

- Reserved(6bits)

미래에 사용하기 위해 남겨둔 예비 필드로 0으로 채워져야 함

-> 0|0|0

 

- TCP flags(8bits)

CWR : 혼잡 윈도우 크기의 감소

ECN : 혼잡을 알려줌

URG : 긴급 포인터이고 이 비트가 설정되면 데이터는 다른 데이터보다 우선적으로 처리됨

ACK : 승인에 사용됨

PSH : 푸시 기능 역할을 하고 데이터가 즉시 전송되어야 하며 전체 TCP 세그먼트를 채울 때까지 기다리기를 원하지 않는다는 것을 애플리케이션에 알려줌

RST : 이것은 연결을 재설정을 하고 수신하면 즉시 연결을 종료해야 함 이것은 복구할 수 없는 오류가 있고 TCP 연결을 완료하는 일반적인 방법이 아닌 경우에만 사용됨

SYN : 상대방과 연결을 생성하고 초기 시퀀스 번호를 설정하는 데 사용됨. 즉 동기화를 시작하고 가장 중요한 플래그

3WHS통신시 Syn플래그값이 설정된 모습

FIN : 종료 비트로 TCP 연결을 종료하는 데 사용됨. TCP는 전이중이므로 양 당사자는 연결을 종료하기 위해 FIN 비트를 사용하고 연결을 종료하는 일반적인 방법임

 

- Window(16bits)

한번에 전송할 수 있는 데이터의 양을 의미하는 값을 담음[2^16->65535]. 만약 windowsize가 3000이라면 한번에 3000이상의 크기의 데이터를 보낼 수 없음. 

tcp전송속도가 느려 나온 보안책.
흐름제어 = 데이터 전송량을 제어함[송신자와수신자와 협의해가면서] 

패킷을 보면 이렇게 2개씩 묶어서 보내는 것을 확인

3WHS과정때 처음 등장하며 데이터를 받는쪽의 h/w용량에 따라 os가 알아서 결정을 시켜줌. 

 

- Checksum(16bits)

TCP헤더가 정상인지 확인하고 전송할 데이터를 16비트씩 쪼개어서 차례대로 더한다음 계산함

초과된 값은 16비트로 세팅된 값 뒤에 둔 다음  2의 비트로 변환하여 1의 보수로 변경함

ex) (16비트는 길어서 8비트로 예시) 10000010 + 10000100 -> 110000101

오버된 값 1을 떼어내서 다시 더함 -> 10000101 +1 = 10000111 -> 1의 보수로 변경 -> 01111000

 

- Urgent Pointer(16bits)

긴급하게 처리해야하는 데이터들을 포함함

1이라면 포인터가 가르키고 있는 데이터를 우선적으로 처리함

 

- Options

선택사항이며 TCP기능을 확장시키고 싶을때 사용함

고정적이지 않고 옵션 선택사항들에 따라 이 필드의 크기가 바뀜

 

type 0  no more options

 

type 1  no operation

 

type 3  (WSCALE,Window Scale factor 또는 WSOPT) : 3 바이트
TCP 헤더 내 윈도우 크기 필드 값을 윈도우 스케일 옵션 값(비트) 만큼 시프트하여 크기 스케일을 변환시킴 

type 4  (SACK Permitted,Selective Acknowledgment Permitted) : 2 바이트
선택 확인응답(SACK) 옵션 허용
여러 패킷 중 손실된 패킷 만 선택적으로 재전송하기 위한 TCP 연결 설정 시의 협상 옵션

type 5  (Selective Acknowledgment Data) : 가변
선택 확인응답(SACK) 옵션 데이터
수신측에서 손실되어 재전송을 원하는 불연속적인 세그먼트 블록을 명시하기 위함

type 8  (Timestamp) : 10 바이트
타임스탬프 옵션

type 28 (UTO, User Timeout) : 4 바이트
사용자 타임아웃

type 29 (TCP-AO) : 가변
인증 옵션

 

# TCP연결관리

1. 3WHS과정[서버/클라이언트 초기화]

- 클라이언트 연결요구 -> 서버 측 응답 및 연결요구 -> 서버 연결 요구에 대한 클라이언트 쪽의 최종응답 

 

구글과 첫 통신시 3WHS패킷

1번에 SYN플래그 값이1과 SYN넘버가 767로 서버로 전달. 

서버는 ACK넘버에 데이터길이 1[default]을 더해 768과 응답플래그 ack값 1을 보내 응답을 함. 동시에 새로운 SYN넘버와 SYN 플래그값을 1로해 받을 준비됐냐는 요청을함. 

마지막으로 클라이언트는 서버에 응답하기 위해 ACK=1, SYN넘버 + 1인 ACK넘버 값을 보내서 응답함. 이때 클라이언트는 서버에 다시 질문을 할 필요가 없으므로 Seq=0, SYN넘버를 전에받은 ACK넘버를 그대로 사용함. 

2. TCP 데이터 전송과정

3WSH 과정이 끝난다음 송, 수신지 간의 통신이 가능하면 4번부터 송신지는 데이터[HTTP]를 요청할 수 있음. 5번에 수신지는 데이터를 잘 받았다고 TCP를 통해 송신지에게 알려줘야됨. 응답일 뿐 5번에서도 역시 데이터는 들어가있지 않음. 6, 7번부터는 본격적으로 송신지의 데이터를 전달함. 

 

3.TCP연결종료[=4WHS]

 

1번은 송신지와 수신지의 통신이 종료될때 송신지는 수신지에게 FIN플래값을 던져 종료의 신호를 알림 

이때 FIN_WAIT가 송신자쪽에서 나타남.

2번은 수신자쪽은 FIN플래그 응답을 받고 송신지쪽에 데이터를 주기위해 할당했던 프로세스를 종료하는 단계로 들어감.

이떄 송신자에게 알아들었다고 응답을 줄면서 종료가 되었으면 LAST_ACK단계로 들어가 FIN플래그를 줌.

6번에서 TIME_WAIT가 나타나는데 FIN플래그를 받는 송신자가 바로 Virtual line을 안끊고  7번이 되야 C -> S의 Virtual line이 끊긴다. 즉 먼저 S->C Virtual line이 끊기도 그다음 C -> S라인이 끊긴다.[이유는 만약 송신지 측에서 먼저 끊었는데 수신자가 ack를 받지 못한 경우라면 수신자는 계속 FIN플래그를 보내 작업종료가 안됨]. 

즉 TIME_WAIT를 통해 일정시간 기다림을 통해 수신지에서 ack를 받지못해 다시 FIN을 보내는 경우를 고려하여 통신의 확실한 종료를 위한 것으로 보임. 

'Network' 카테고리의 다른 글

DNS  (0) 2022.04.08
Udp header  (0) 2022.04.06
Ipv6 header  (0) 2022.04.04
IPv4 header  (0) 2022.04.04
Proxy  (0) 2022.03.27