본문 바로가기
CS/네트워크

[네트워크] TCP 3-way handshake / 4-way handshake

by 0inn 2022. 9. 13.

TCP 3-way handshake란 ?

연결하고자 하는 두 장치 간의 논리적 접속을 성립하기 위해 사용하는 연결 확인 방식으로 3번의 확인 과정을 거친다고 해서 3-way handshake라고 합니다.

 

간단하게 표현하자면 다음과 같습니다.

A → B : 내 말 들려 ?

B A : 잘 들려. 내 말은 들려 ?

A B : 잘 들려.

 

TCP 3 way handshake 방식

SYN (synchronize sequence numbers) 

연결 확인을 위해 보내는 무작위의 숫자값입니다.

 

무작위의 숫자값을 사용하는 이유는 ?

Connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용됩니다.

그러므로 두 통신 호스트가 과거에 사용된 포트 쌍을 사용할 가능성이 존재합니다.

서버 측에서 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 숫자가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 수 있어 이러한 문제 발생 가능성을 줄이기 위해 ISN을 무작위 난수로 사용합니다.

ACK (acknowledgements)

Client 혹은 Server로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK입니다.

ISN(Initial sequence numbers)

Client와 Server가 각각 처음으로 생성한 SYN입니다.

TCP 3-way handshaking 방식

STEP 1

A 클라이언트는 B 서버에 접속을 요청하는 SYN 패킷을 보냅니다.

이 때, A 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN-SENT 상태, B 서버는 Wait for Client 상태입니다.

 

STEP 2

B 서버는 SYN 요청을 받고 A 클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다립니다.

이 때, B 서버는 SYN-RECEIVED 상태가 됩니다.

 

STEP 3

A 클라이언트는 B 서버에게 ACK을 보내고 이후부터는 연결이 이루어지고 데이터가 오가게 됩니다.

이 때, B 서버는 ESTABLISHED 상태가 됩니다.

TCP 4-way handshake란 ?

TCP 3-way handshake와 반대로 가상 회선 연결을 해제할 때 주고 받는 확인작업입니다.

이 역시 4번의 확인과정을 거친다고 하여 4-way handshake라고 부릅니다.

 

간단하게 표현하자면 다음과 같습니다.

A → B : 나는 다 보냈어. 이제 끊자.

B  A : 알겠어. 잠시만 ~

 A : 나도 끊을게.

A  B : 알겠어.

TCP 4-way handshaking 방식

 

 

STEP 1

A 클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송합니다.

이 때, A 클라이언트는 FIN-WAIT 상태가 됩니다.

 

STEP 2

B 서버는 FIN 플래그를 받고, 일단 확인메세지 ACK를 보내고 자신의 통신이 끝날 때까지 기다립니다.

이 때, B 서버는 CLOSE-WAIT 상태입니다.

 

STEP 3

연결을 종료할 준비가 되면 연결해지를 위한 준비가 되었음을 알리기 위해 A 클라이언트에게 FIN 플래그를 전송합니다.

이 때, B 서버는 LAST-ACK 상태입니다.

 

STEP 4

A 클라이언트는 해지준비가 되었다는 ACK를 확인했다는 메세지를 보냅니다.

이 때, A 클라이언트의 상태가 FIN-WAIT에서 TIME-WAIT으로 변경됩니다.

 

그런데 만약 "서버에서 FIN을 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황"이 발생한다면 어떻게 될까요 ?

 

클라이언트에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 이 패킷은 Drop 되고 데이터는 유실될 것입니다.

그래서 클라이언트는 이러한 현상에 대비하여 서버로부터 FIN을 수신하더라고 일정시간(Defualt 240초)동안 세션을 남겨두고 잉여 패킷을 기다리는 과정을 거치게 되는데 이러한 과정을 TIME-WAIT라고 합니다.

일정시간이 지나면 세션을 만료하고 연결을 종료시키며 CLOSE 상태로 변화합니다.

 


참고

https://seongonion.tistory.com/74

https://bangu4.tistory.com/74

 

 

'CS > 네트워크' 카테고리의 다른 글

[네트워크] HTTP vs. HTTPS  (0) 2022.10.18
[네트워크] TCP vs. UDP  (0) 2022.09.08