카테고리 없음

tcp handshaking

nullbyte 2025. 1. 26. 16:00

핸드셰이크 (Handshake) 란?

서버와 클라이언트가 통신하기 전 약속을 맺는것

 

 

통신을 하기 위한 과정 (TCP 3 way handshake)

1. 클라이언트는 서버에게 통신을 하기 위해 SYN 패킷을 보낸다

2. 이를 받은 서버는 SYN + ACK 패킷을 보낸다 이때 SYN패킷을 보내는 이유는

서버도 클라이언트에게 연결 확립을 위해 데이터 전송 허가를 받기 위함이다

3. 클라이언트는 서버에게 ACK 패킷을 보냄으로써 연결을 확립한다

 

통신을 종료하기 위해 (TCP 4 way handshake)

1. 클라이언트는 서버에게 FIN 패킷을 보낸다

2. 서버는 이를 받고 ACK 패킷을 보낸다

3. 또한 서버도 연결종료 요청 FIN 패킷을 보낸다

4. 클라이언트도 서버에게 ACK 패킷을 보냄으로써 연결을 종료한다

 

wireshark로 3 way handshake 캡쳐


이때 궁금한 점이 생긴다

3 way handshake는 SYN + ACK 패킷을 묶어 보내지만 4 way에서 서버는 ACK 패킷과 FIN 패킷을 두 번에 걸쳐

따로 보낸다.

굳이 패킷을 분리하는 이유가 있을까?

 

결과적으로 4 way 에서 패킷을 나누는 이유는 연결 해제중 아직 전송되고 있을지 모를 데이터를 확인하기 위해 딜레이를 주기 위해서이다

 

만약 서버에서 전송할 데이터가 남아있다면 서버에선 클라로 FIN 패킷을 못 보내기에 합쳐서 가는게 좋지 않다고 한다

서버가 데이터를 완전히 전송한 후 서버가 FIN 까지 보내고 클라가 ACK를 보내 연결을 종료하는 것이다

 

그렇게에 서버가 클라이언트로 보내는 잔여 데이터 전송시간이 길어질수록

FIN이 가는게 늦어짐 -> 타임아웃으로 이어진다