본문 바로가기

개발 노트/네트워크

[프로토콜] TCP 통신

반응형

❏ TCP 통신


❍ TCP 연결 : 3-Way Handshaking (세션 연결)

(1) SYN : Sequence Number에는 클라이언트의 초기 순서 번호(100)를 넣고, Acknowledgment Number에는 0을 넣고, FlagSYN bit1로 설정하여 전송합니다.


(2) SYN+ACK : Sequence Number에는 서버의 초기 순서 번호(200)를 넣고, Acknowledgment Number에는 클라이언트의 초기 순서 번호(100) + 1 = (101)”의 값을 넣고, FlagSYNACK bit 모두 1로 설정하여 전송합니다.


(3) ACK : Sequence Number에는 서버의 Acknowledgment Number(101)를 넣고, Acknowledgment Nubmer에는 서버의 초기 순서 번호(200) + 1 = (201)”의 값을 넣고 FlagACK bit1로 설정하여 전송합니다.


 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와 같은 확인번호를 넣고, FlagFIN, ACK bit1로 설정하여 전송합니다. 클라이언트는 FIN_WAIT_1상태로 대기합니다.

(2) ACK : 서버는 Acknowledgement NumberSequence Number에 넣고 Acknowledgement Number에는 다음에 받을 순서번호 즉, “(1)에서 받은 Sqequence Number + 1”의 값을 넣고, Flag ACK bit1로 설정하여 전송합니다. 이 단계가 정상적으로 끝나면 서버는 해당 포트를 CLOSE_WAIT으로 바꾸고 클라이언트에서 서버방향으로의 연결은 종료됩니다. 그와 동시에 Server에서는 해당 포트에 연결되어 있는 Application에게 Close()를 요청합니다. 클라이언트는 ACK를 받고 FIN_WAIT_2로 상태를 변경합니다.

(3) FIN+ACK : (1)의 확인 번호를 Sequence Number에 넣고 Acknowledgement Number에는 다음에 받을 순서 번호 즉”(1)에서 받은 Sequence Number + 1”의 값을 넣고, FlagFIN, ACK bit1로 설정하여 전송합니다. Close() 요청을 받은 Application은 종료 프로세스를 진행시켜 최종적으로 Close()가 되고 서버는 자신의 상태를 LAST_ACK 상태로 바꿉니다.

(4) ACK : FIN_WAIT_2에서 서버가 연결을 종료했다는 신호를 기다리다가 FIN, ACK를 받으면 클라이언트는 Sequence Number에는 (3)Acknowledgement Number를 넣고 Acknowledgement Number에는 다음에 받을 순서번호 즉, “(3)에서 받은 Sequence Number + 1”의 값을 넣고, FlagACK bit1로 설정하여 전송합니다. 클라이언트는 TIME_WAIT 상태로 바꾼 후 일정 시간이 지나면 COLSED 상태가 됩니다. 최종적으로 ACK를 받은 서버는 자신의 포트도 CLOSED로 닫아 남아있던 서버에서 클라이언트 방향으로의 연결이 종료되어 클라이언트와 서버간의 모든 TCP 연결이 종료됩니다.


반응형