❏ TCP 통신
❍ TCP 연결 : 3-Way Handshaking (세션 연결)
(1) SYN : Sequence Number에는 클라이언트의 초기 순서 번호(100)를 넣고, Acknowledgment Number에는 0을 넣고, Flag는 SYN bit를 1로 설정하여 전송합니다.
(2) SYN+ACK : Sequence Number에는 서버의 초기 순서 번호(200)를 넣고, Acknowledgment Number에는 “클라이언트의 초기 순서 번호(100) + 1 = (101)”의 값을 넣고, Flag는 SYN과 ACK bit 모두 1로 설정하여 전송합니다.
(3) ACK : Sequence Number에는 서버의 Acknowledgment Number(101)를 넣고, Acknowledgment Nubmer에는 “서버의 초기 순서 번호(200) + 1 = (201)”의 값을 넣고 Flag는 ACK bit를 1로 설정하여 전송합니다.
❍ TCP 데이터 전송
(1) 클라이언트 PC에서 Sequence Number(102), Acknowledgement Number(201)인 패킷을 보냅니다.
(2) 서버에서는 Sequence Number(102) 패킷을 잘 받았으니
그 다음 것을 보내라는 뜻의
Acknowledgement Number(103)인 패킷을 전송합니다.
(3) 클라이언트 PC에서도 역시 Sequence Number(201) 패킷을 잘 받았으니 그 다음 것을 보내라는 뜻의 Acknowledgement Number(202)인 패킷을 전송합니다.
❍ TCP 연결 해제 : 4-Way Handshaking
(1) FIN+ACK : 데이터 전송을 끝내려는 클라이언트는 Sequence Number에는 전송하는 세그먼트의 순서번호를 넣고, Acknowledgement Number에는 마지막으로 서버에 전송했던 ACK와 같은 확인번호를 넣고, Flag는 FIN, ACK bit를 1로 설정하여 전송합니다. 클라이언트는 FIN_WAIT_1상태로 대기합니다.
(2) ACK : 서버는 Acknowledgement Number를 Sequence Number에 넣고 Acknowledgement Number에는 다음에 받을 순서번호 즉, “(1)에서 받은 Sqequence Number + 1”의 값을 넣고, Flag 는 ACK bit를 1로 설정하여 전송합니다. 이 단계가 정상적으로 끝나면 서버는 해당 포트를 CLOSE_WAIT으로 바꾸고 클라이언트에서 서버방향으로의 연결은 종료됩니다. 그와 동시에 Server에서는 해당 포트에 연결되어 있는 Application에게 Close()를 요청합니다. 클라이언트는 ACK를 받고 FIN_WAIT_2로 상태를 변경합니다.
(3) FIN+ACK : (1)의 확인 번호를 Sequence Number에 넣고 Acknowledgement Number에는 다음에 받을 순서 번호 즉”(1)에서 받은 Sequence Number + 1”의 값을 넣고, Flag는 FIN, ACK bit를 1로 설정하여 전송합니다. Close() 요청을 받은 Application은 종료 프로세스를 진행시켜 최종적으로 Close()가 되고 서버는 자신의 상태를 LAST_ACK 상태로 바꿉니다.
(4) ACK : FIN_WAIT_2에서 서버가 연결을 종료했다는 신호를 기다리다가 FIN, ACK를 받으면 클라이언트는 Sequence Number에는 (3)의 Acknowledgement Number를 넣고 Acknowledgement Number에는 다음에 받을 순서번호 즉, “(3)에서 받은 Sequence Number + 1”의 값을 넣고, Flag는 ACK bit를 1로 설정하여 전송합니다. 클라이언트는 TIME_WAIT 상태로 바꾼 후 일정 시간이 지나면 COLSED 상태가 됩니다. 최종적으로 ACK를 받은 서버는 자신의 포트도 CLOSED로 닫아 남아있던 서버에서 클라이언트 방향으로의 연결이 종료되어 클라이언트와 서버간의 모든 TCP 연결이 종료됩니다.
'개발 노트 > 네트워크' 카테고리의 다른 글
[프로토콜] IP Header (0) | 2018.11.05 |
---|---|
[프로토콜] UDP Header / UDP 동작 (0) | 2018.10.30 |
[프로토콜] TCP 프로토콜 동작 방식 (0) | 2018.10.27 |
[프로토콜] TCP Checksum (TCP 체크섬) (0) | 2018.10.25 |
[프로토콜] TCP Header (0) | 2018.10.24 |