TCP Header, Handshake

0

네트워크

목록 보기
3/8

Transmission Control Protocol


IP에서 언급한 것 처럼, 계층이 올라갈수록 패킷은 뒤에 추가가 되어 전달된다.
즉, IP의 "Data"에 TCP의 부분이 들어가 있는 것을 확인할 수 있다.
그럼 게시글에서는 헤더에 대해서 살펴보고, Handshake과정을 살펴보자..

Source Port : 발신지 포트 주소
Destination Port : 수신지 포트 주소
Sequence Number : Byte를 단위로 "신뢰성","흐름제어"를 위한 번호들이다.
Acknowledgement Number : 수신하기를 기다리는 번호 = > 마지막 수신 번호 + 1
Header Length : TCP "Header" 길이
Flag bits : (URG, ACK, PSH, RST, SYN, FIN)
Window size : 흐름제어를 위해 사용하는 16bit.
Checksum : 오류 검사
Urgent Pointer : TCP 세그먼트에 포함된 긴급 데이터의 마지막 byte에 대한 일련 번호.
Option : 최대 40byte까지 구성됨.

Flag설명
SYN세션을 연결할 때 가장 처음 전송되는 플래그
ACK상대방으로부터 패킷을 받았음을 의미하는 플래그
FIN세션 연결을 종료시킬 때 사용
RSTReset을 하는 과정이며, 양방향에서 동시에 발생
PSH
URG말 그대로 Urgent하게 전달해야할 데이터를 의미

Handshake

  1. 3 - way
    연결을 "시작"할 때 이루어진다.

첫번째 세그먼트 (Client)
TCP 제어 플래그 : SYN 플래그 = 1
TCP 헤더 필드 : Synchronize Sequence Number(SYN)는 임의로 정해져 전송된다.
이때, Client는 SYN_SENT 상태로 변화됨.

두번째 세그먼트 (Server)
TCP 제어 플래그 : SYN 플래그 = 1, ACK 플래그 = 1.
TCP 헤더 필드 : SYN 역시 임의로 정해진다. 다만 ACK는 송신자(수신된)의 Sequence Number + 1.
이때, Server는 SYN_RECEIVE로 변화됨.

세번째 세그먼트 (Client)
TCP 제어 플래그 : ACK 플래그 = 1
TCP 헤더 필드 : SYN : 2번째 세그먼트의 ACK + 1(=Client가 송신한 SYN +1), ACK Number : 수신한 SYN Number + 1 (Server가 전송한 SYN + 1)
이때, Client는 ESTABLISHED로 변화됨. 그 후, Server에서는 ACK를 받은 후 마찬가지로 ESTABLISHED로 변화함.

이 3 - way에서는 ISN(초기 순서 번호), 수신 Window 크기, 옵션 정보 들이 교환된다.

조금 이해하기 쉽게 각 과정에서 전달되는 SYN과 ACK의 값을 설명해보자면, 다음과 같다.

  1. 가 => 나 | SYN(A), ACK(0) 전달, SYN Flag = 1
  2. 나 => 가 | SYN(B), ACK(A+1) 전달, SYN Flag = 1, ACK Flag = 1
  3. 가 => 나 | SYN(A+1), ACK(B+1) 전달, ACK Flag = 1
  • 이번에 다시 보면서 안 건데, 3번째 패킷에서 SYN 플래그가 없어도 값은 전달이 된다.

Wireshark로 실제 패킷을 살펴보면, 다음과 같다.

Flag : SYN / Sequence Number : 2972208465, Acknowledge Number : 0

Flag : SYN, ACK / SYN : 2702533053, ACK : 2972208466

Flag : ACK / SYN : 2972208466, ACK : 2702533054

  1. 4 - way
    이건 3 - way랑 반대로, 연결을 "끊을 때" 한다.

첫번째 세그먼트 (Client)
TCP 제어 플래그 : FIN = 1
TCP 헤더 필드 : SYN = K (연결의 마지막 순서 번호 + 1), ACK = 0
이 때, Client는 Close함수 호출

두번째 세그먼트 (Server)
TCP 제어 플래그 : ACK = 1, FIN = 1
TCP 헤더 필드 : SYN은 임의로 정해져 전송(L이라고 표현), ACK = K + 1
이 때, Server는 Close-Wait로 변화

세번째 세그먼트 (Server)
TCP 제어 플래그 : ACK = 1,FIN = 1
TCP 헤더 필드 : SYN = L, ACK = K+1
이 때, Client는 Time-Wait로 변화

네번째 세그먼트 (Client)
TCP 제어 플래그 : ACK = 1
TCP 헤더 필드 : SYN = K, ACK = L + 1
이 때, 서버는 Closed로 변화.

조금 이해하기 쉽게 각 과정에서 전달되는 값을 설명해보자면, 다음과 같다.

  1. 가 => 나 | SYN(A), ACK(0) 전달, FIN Flag = 1
  2. 나 => 가 | SYN(B), ACK(A+1) 전달, ACK Flag = 1, FIN Flag = 1
  3. 가 => 나 | SYN(B), ACK(A+1) 전달, ACK Flag = 1, FIN Flag = 1
  4. 나 => 가 | SYN(A), ACK(B+1) 전달, ACK Flag = 1
  • FIN 은 Flag만 전달될 뿐이다.

http://www.ktword.co.kr/test/view/view.php?m_temp1=1889

0개의 댓글