TCP는 신뢰할 수 있는 데이터 전송을 보장한다. 따라서 통신하기 전후로 두 호스트 간에 연결을 성립하고 해제하는 handshake 과정을 진행한다.
3 way handshake - 연결 성립
(데이터 전송 전)
- SYN
- 클라이언트가 서버로 연결을 원한다는 SYN(동기화 시퀀스 번호)와 함께 세그먼트를 전송
- SYN + ACK
- ACK(Acknowledgement)는 수신한 세그먼트의 응답
- SYN은 세그먼트를 시작할 가능성이 있는 시퀀스 번호
- 요청을 받은 서버는 SYN-ACK 신호 비트 세트로 클라이언트 요청에 응답한다.
- ACK
- 클라이언트는 서버의 응답을 확인했다는 ACK를 보낸다.
⇒ 연결 성립
4 way handshake - 연결 해제
(모든 통신이 끝난 후)
- 클라이언트에서 FINFIN_WAIT_1 상태에 있는 동안 클라이언트는 서버로부터 ACK를 가진 세그먼트가 오길 기다림
- 클라이언트는 FIN 비트가 1로 설정된 TCP 세그먼트를 서버에 보낸다. 이때 FIN_WAIT_1 상태로 들어간다.
- 서버에서 ACK
- 클라이언트로부터 FIN 비트 세그먼트를 수신 > 서버는 즉시 수신확인(ACK)을 클라이언트에게 보낸다. 이때 CLOSE_WAIT 상태로 들어간다.
- 클라이언트 대기FIN_WAIT_2 상태에 있는 동안 클라이언트는 서버로부터 FIN 비트가 1로 설정된 세그먼트가 들어오길 기다림
- 클라이언트가 FIN_WAIT_1 상태에서 서버의 ACK 세그먼트를 수신 > 클라이언트가 FIN_WAIT_2 상태로 들어간다.
- 서버에서 FIN
- ACK 세그먼트를 보낸 후, 일정 시간이 지나면 서버는 FIN 비트 세그먼트를 클라이언트로 보낸다.
- 클라이언트로 부터 ACK대기 시간이 끝나면 클라이언트의 모든 리소스가 해제된다.
- 클라이언트가 서버로부터 FIN 비트 세그먼트 수신 > 해당 세그먼트를 승인하고(= 서버로 ACK 보냄) TIME_WAIT 상태에 들어간다. TIME_WAIT 상태에서는 ACK가 손실된 경우 클라이언트가 다시 ACK를 보낼 수 있다. ****
⇒ 연결 해제
'CS' 카테고리의 다른 글
[Java] EOF까지 입력 받기 (0) | 2023.06.26 |
---|---|
[Java] BufferedReader, BufferedWriter 사용하기 (0) | 2023.06.26 |
[CS 스터디] Network - OSI 7 계층 모델 (0) | 2023.06.22 |
[이슈] Postman 실행 안됨 (0) | 2023.06.22 |
IntelliJ 단축키 정리 (0) | 2023.05.19 |