#TCP Header & Handshake

Programming 2017. 11. 2. 11:43

1.  Header

 각각의 칸을 필드(Field)라고 부른다.


Source Port (16bits)

Destination Port (16bits)

Sequence Number (32bits)

Acknowledgement Number (ACK, 32bits)

 Data offset (4bits)

Reserved (6bits)

Control Flags (6bits)

Window Size (16bits)

URG

ACK

PSH

RST

SYN

FIN

Checksum

Urgent Pointer

Options and Padding

 Source Port : 이 필드는 상위 계층1)에 의해 특별히 정해진다. 이 소스 포트 번호와 보내는 쪽의 호스트에 있는 프로세스나 서비스가 1:1로 대응한다. 이에 따라 어느 상위 계층이 송신한 데이터인지 식별할 수 있다.


 Destination Port : 수신 측의 호스트에서 프로세스나 서비스를 식별하는 필드이다. TCP가 데이터를 순서에 맞춰 흘려  보내면 수신 측 호스트는 이 필드 값을 토대로 자신의 상위 계층의 해당 서비스에 데이터를 흘려보낸다.


 Sequence Number & Acknowledgement Number : TCP에 의한 전송은 Sequence Number(이하 SEQ)와 Acknowledgement Number(이하 ACK)를 사용함으로써 신뢰성을 갖는다. TCP에서는 한번에 전송하는 데이터 단위를 세그먼트로 정의한다. 상위 계층에서 보내온 데이터는 크기나 타이밍 관계에서 하나의 패킷으로 정리될 수 없으므로, 몇 개의 세그먼트 단위로 나뉜다. 이 때 전송되는 세그먼트가 전체 데이터의 어느 부분에 해당하는지 알기 위해 SEQ를 사용한다. SEQ는 데이터 전체에 있어 그 세그먼트의 위치(offset)을 가리킨다.

TCP는 세그먼트를 송신해야할 때, 그 세그먼트의 복사본을 전송 큐에 넣고 타이머를 가동한다. 타이머가 만료되기 전, 보낸 데이터에 대한 ACK가 오면 그 세그먼트는 큐에서 삭제된다. 타이머가 만료되기 전에 ACK를 응답받지 못하면 세그먼트는 다시 전송된다.

ACK는 다음 바이트의 SEQ를 나타낸다. TCP에 의한 ACK는 TCP 모듈이 데이터를 받았다는 것만을 보증한다, ACK는 데이터가 TCP의 상위 계층에서 실행 중인 응용 프로그램에 전달된 것을 보장하지는 않으며, end-to-end의 전달만을 책임진다.


 Data Offset : TCP의 헤더길이를 나타낸다. TCP 옵션 필드의 길이가 변할 수 있기 때문에 필요하다. TCP 옵션이 없으면 이 필드의 값은 5워드2)이며, 정수로 설정된다.


 Reserved : 차후에 사용되기 위해 예약된 필드로, 사용하지 않는다면 0으로 설정한다


 Control Flags : Code Bits에 해당하며, 아래의 6개의 플래그로 구성된다

URG(Urgent)

Urgent Pointer 필드의 내용의 실행유무 판단

ACK(Acknowledgement)

Acknowledgement Number 필드가 유효한지 나타냄

PSH(Push)

수신 측에서 수신한 데이터를 응용계층으로 바로 전달할지를 질의

RST(Reset)

복구할 수 없는 오류 때문에 TCP연결을 초기화하기 위해 사용한다. 초기화의 이유로 호스트 크래시 또는 중복 SYN패킹의 지연 등이 있을 수 있다. TCP 세그먼트는 RST가 수신되면 수신자는 즉시 연결을 종료시키는 것으로 응답해야 한다. 초기화를 하면 양쪽이 즉시 연결과 모든 자원을 해제하게 된다.

SYN(Synchronization)

TCP연결의 시작을 나타내기 위해 사용

FIN(Finish)

송신 측의 Byte Stream이 종료되었음을 나타내기 위해 사용


 Windows Size : 해당 세그먼트의 송신 측이 현재 수신하고자 하는 윈도우의 크기로, 기본 단위는 바이트이다. Acknowledgetment Number보다 큰 값이어야 한다. 흐름제어용 윈도우 크기.


 Checksum : 헤더값의 무결성을 보장하기 위해 사용

 Urgent Pointer : URG 플래그가 세트된 세그먼트에서만 유효. 이 필드의 수치는 그 세그먼트 SEQ에서의 상대 위치이며, 이 필드의 수치를 SEQ에 덧붙인 수치까지가 긴급 데이터의 바이트 번호가 된다.


 Option : 세세한 조정 기능을 위해 예약. 모든 옵션은 Checksum의 계산에 포함. 길이는 8의 배수

 Padding : IP Options 필드가 가변이기 때문에, 가로 IP 헤더의 크기를 일정하게 맞추기 위해 사용되는 필드



2. Handshake

 TCP는 장치들 사이에 논리적인 접속을 성립하기 위해 3-way handshake를 사용한다.

 TCP 3-way handshake는 TCP/IP 프로토콜을 이용하여 클라이언트에서 데이터를 전송하기 전, 정확한 전송을 보장하기 위해 서버와 사전에 세션 수립을 하는 과정이다.

Client > Server : TCP SYN

Server > Client : TCP SYN ACK

Client > Server : TCP ACK

- SYN : Synchronize Squence Nmbers

→ 클라이언트/서버에서 각각 생성

- ACK : ACKnowledgement


3-way Handshake의 절차는 다음과 같다.

① 클라이언트는 서버로의 접속을 요청하기 위해 SYN 패킷을 발송 후 서버로부터 ACK패킷을 대기(SYN-SENT)한다.

② 서버는 클라이언트로부터 수신한 SYN 패킷을 확인한 후 클라이언트의 요청을 수락하고, ACK와 SYN패킷을 클라이언트로 발송한 후 클라이언트의 ACK패킷을 대기(SYN-RECEIVED)한다.

③ 서버로부터 ACK와 SYN패킷을 수신한 클라이언트는 서버로 ACK패킷을 발송한 후에 연결을 성립하여 데이터 교환을 시작하는데, 이때 서버의 상태는 ESTABLISHED가 된다.


■ 클라이언트와 서버의 통신을 종료하기 위해서는 4-way handshake를 사용한다.

4-way Handshake의 절차는 다음과 같다.

① 클라이언트가 연결을 종료하겠다는 FIN패킷을 발송하고 서버의 응답을 기다림 (FIN-WAIT-1)

② 서버는 세그먼트A를 확인 후 클라이언트에게 ACK패킷을 발송한 후, 자신의 통신이 끝날 때까지 대기(TIME-WAIT)한다. 이때, 클라이언트는 서버의 FIN패킷을 대기(FIN-WAIT-2)한다.

③ 서버의 통신이 끝나면 클라이언트에게 FIN패킷 발송한다.

④ 클라이언트는 서버에 ACK패킷을 발송한다.

■ 서버에서 FIN패킷을 발송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송 등으로 FIN패킷보다 늦게 도착하는 상황이 발생할 수 있다.

■ 클라이언트가 세션을 종료한 후, 뒤늦게 도착하는 패킷이 있다면 이 패킷은 드랍되고 데이터는 유실된다.

■  이런 현상에 대비하여 클라이언트는 서버로부터 FIN패킷을 수신하더라도 일정시간(디폴트 240초) 동안 세션(session)을 남겨놓고 잉여 패킷을 기다리는 과정을 거치는데, 이 과정을 TIME-WAIT라고 한다.


참고 자료

블로그

http://sawutomaland.tistory.com/entry/TCP-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8-%ED%97%A4%EB%8D%94-%EA%B5%AC%EC%A1%B0


https://www.joinc.co.kr/w/Site/Network_Programing/Documents/IntroTCPIP2


http://mindnet.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-22%ED%8E%B8-TCP-3-WayHandshake-4-WayHandshake


위키피디아

https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

https://ko.wikipedia.org/wiki/%EC%9B%8C%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)



1) HTTP, FTP, SSH 등등

2) word, 32비트 CPU(ARM 등)라면 32비트 (위키피디아, 키워드 ‘워드’)

admin