3-way handshake : 클라이언트가 서버에게 SYN 패킷을 보내고, 서버가 이에 대한 응답으로 SYN-ACK 패킷을 보내며, 클라이언트가 이에 대한 확인 응답으로 ACK 패킷을 보내는 과정
4-way handshake : 양쪽 모두가 FIN 패킷을 보내고, 상대방의 FIN에 대한 ACK를 보내는 과정
플래그 정보
- SYN(SYnchronize sequence Numbers)
- 연결 설정, 연결 확인을 보내는 무작위 숫자 값
- ACK(ACKnowledgement)
- 응답 확인, 클라이언트 혹은 서버로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK 값
- FIN(FINish)
- 연결 해제, 세션 연결을 종료시킬 때 사용
- 더이상 전송할 데이터가 없음을 의미
| 3-way handshake 연결 흐름
1. 클라이언트가 SYN을 보내고 SYN_SENT 상태로 대기
2. 서버는 SYN-RECEIVED 상태로 바꾸고 SYN과 ACK를 보냄
3. SYN과 ACK를 받은 클라이언트는 ESTABLISHED 상태로 변경하고 서버한테 ACK를 보냄
4. ACK를 받은 서버는 ESTABLISHED 상태로 변경
포트 상태 정보
- CLOSED
- 연결 없음, 연결 수립 시작 하기 전 기본 상태
- LISTEN
- 포트가 열린 상태로 연결 요청 대기 중
- SYN_SENT
- SYN을 요청한 상태
- SYN_RECEIVED
- SYN 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED
- 연결됨, 연결 수립이 완료된 상태, 서로 데이터 교환 가능
| 4-way handshake 연결 흐름
1. close 실행한 클라이언트가 FIN을 보내고 FIN-WAIT-1 상태로 대기
2. 서버는 CLOSE_WAIT 상태로 변경하고 ACK를 전달,
동시에 해당 포트에 연결되어 있는 애플리케이션에게 close 요청
3. ACK을 받은 클라이언트는 FIN_WAIT-2로 상태 변경
4. close 요청을 받은 서버 애플리케이션은 종료 프로세스를 진행,
그리고 FIN을 클라이언트로 보내고 LAST-ACK 상태로 변경
5. FIN을 받은 클라이언트는 ACK을 서버에 전달하고 TIME-WAIT 상태로 변경
6. 일정 시간이 지나면 CLOSED 상태로 변경, ACK을 받은 서버도 포트를 CLOSED 상태로 변경하고 닫음
포트 상태 정보
- ESTABLISHED
- 연결됨, 연결 수립이 완료된 상태, 서로 데이터 교환 가능
- FIN-WAIT-1
- 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다림
- FIN-WAIT-2
- 자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다림
- CLOSE-WAIT
- 상대방의 FIN을 받은 상태, 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알림
- LAST-ACK
- CLOSE-WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태
- TIME-WAIT
- 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태
- 먼저 연결을 끊는 쪽에서 생성되는 소켓
- 혹시 모를 전송 실패에 대비하기 위해 존재
- CLOSED
- 연결 없음, 연결 수립 시작 하기 전 기본 상태
참고