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 | 세션 연결을 종료시킬 때 사용 |
RST | Reset을 하는 과정이며, 양방향에서 동시에 발생 |
PSH | |
URG | 말 그대로 Urgent하게 전달해야할 데이터를 의미 |
첫번째 세그먼트 (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의 값을 설명해보자면, 다음과 같다.
Wireshark로 실제 패킷을 살펴보면, 다음과 같다.
Flag : SYN / Sequence Number : 2972208465, Acknowledge Number : 0
Flag : SYN, ACK / SYN : 2702533053, ACK : 2972208466
Flag : ACK / SYN : 2972208466, ACK : 2702533054
첫번째 세그먼트 (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로 변화.
조금 이해하기 쉽게 각 과정에서 전달되는 값을 설명해보자면, 다음과 같다.