SVN, ACK
- SYN(synchronize sequence numbers) - 연결 확인을 보내는 무작위의 숫자 값
- ACK(acknowledgements) - Client 혹은 Server로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK
3-way hand shake
연결하고자 하는 두 장치 간의 논리적 접속을 성립하기 위해 사용하는 연결 확인 방식으로, 3번의 확인 과정을 거친다고 해서 3-way handshake라고 부른다.
3-way hand shake 흐름
- 먼저 Open 한 클라이언트가 SYN를 보내고 SYN_SENT 상태로 대기한다.
- 서버는 SYN-RECEIVED 상태로 바꾸고 SYN과 응답 ACK를 보낸다.
- SYN과 응답 ACK를 받은 클라이언트는 ESTABLISHED 상태로 변경하고 서버에게 응답 ACK)를 보낸다.
- 응답 ACK를 받은 서버는 ESTABLISHED 상태로 변경한다.
3-way hand shake 상태 설명
- CLOSED : 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
- LISTEN : 포트가 열린 상태로 연결 요청 대기 중
- SYN-SENT : SYN을 요청한 상태
- SYN-RECEIVED :SYN 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED :연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.
4-way hand shake
3-way handshake와 반대로 가상 회선 연결을 해제할 때 주고 받는 확인작업이다. 이 역시 4번의 확인과정을 거친다고 하여 4-way hand shake라고 부른다.
4-way hand shake 흐름
- 먼저 close를 실행한 클라이언트가 FIN을 보내고 FIN-WAIT-1 상태로 대기한다.
- 서버는 CLOSE-WAIT으로 바꾸고 응답 ACK를 전달한다. 동시에 해당 포트에 연결되어 있는 애플리케이션에게 close를 요청한다.
- ACK를 받은 클라이언트는 상태를 FIN-WAIT-2로 변경한다.
- close 요청을 받은 서버 애플리케이션은 종료 프로세스를 진행하고 FIN을 클라이언트로 보내 LAST_ACK 상태로 바꾼다.
- FIN을 받은 클라이언트는 ACK를 서버에 다시 전송하고 TIME-WAIT으로 상태를 바꾼다.
- TIME-WAIT에서 일정 시간이 지나면 CLOSE 된다. ACK를 받은 서버도 포트를 CLOSED로 닫는다.
※ TIME-WAIT : 먼저 연결을 끊는 쪽에서 생성되는 소켓으로, 혹시 모를 전송 실패에 대비하기 위해 존재하는 소켓이며,
TIME-WAIT이 없다면, 패킷의 손실이 발생하거나 통신자 간 연결 해제가 제대로 되지 않을 수 있다.
4-way hand shake 상태 설명
- ESTABLISHED : 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.
- FIN-WAIT-1 : 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다.
- FIN-WAIT-2 : 자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다린다.
- CLOSE-WAIT : 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알린다.
- LAST-ACK : COLSE-WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태.
- TIME-WAIT :모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이 한다.
- CLOSED : 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
참고 문서 및 링크