[정리] 3 Way-Handshake
3 Way-Handshake 란, 전송제어 프로토콜(TCP)에서 통신을 하는 장치간 서로 연결이 잘 되어있는지 확인하는 과정/방식이다. 더 쉽게 말해서 송수신자(데이터를 주고 받는 2사람이라고 생각하면 쉬울 것 같다)사이에 연결을 확인하는 과정이다.
3 way handshake에 대해 먼저 알아보기 전에 3 way handshake를 사요하는 TCP 프로토콜에 대해 알아야합니다.
TCP 프로토콜은 연결지향적이다. 이는 상대방이 내 신호를 받을 수 있는지 확인하고 전송을 하는 것을 의미합니다. 이때 내 신호를 받을 수 있는 지 확인하는 것이 3 way handshake입니다.
만약 TCP 프로토콜에 대해 자세히 알고 싶거나, 이해가 안된다면, 밑의 게시글이 좀 더 자세히 적혀있습니다!
그러면 이제 3 way handshake에 대해 자세히 알아보도록 하겠습니다.
3 way handshake는 client[나] / server사이에서 이루어집니다.
3 way handshake를 검색해보면 위의 그림을 많이 불 수 있습니다. 하지만, 처음 저 그림을 보면 잘 이해하지 못합니다. 저 그림을 결론은
1단계 : 들려?
2단계 : 응 들려! 너도 들려?
3단계 : 응 들려!
이 단계를 의미합니다. [저는 3단계를 요청내용을 전송한다고 잘못알았다는... 슬픈사실이.... ㅠㅜ] 그럼 여기서 SYN은 '들려?'라는 말을 의미하고 ACK는 그 대답을 의미한다는 것을 알 수 있습니다.
그럼 더 자세히 알아볼까요?
1 단계 : 들려?
클라이언트가 연결요청 메시지(SYN)을 전송합니다. 클라이언트는 Synchronize Sequence Number(SYN)라는 임의의 랜덤 숫자를 함께 전송합니다.
2 단계 : 응 들려! 너도 들려?
서버가 요청을 수락하며, 클라이언트에게도 들리냐는 연결요청 메시지를 전송합니다. 그 메시지에는 Acknowledgement number(ACK)를 포함하고 있으며, 이 번호는 받은 Synchronize Sequence Number(SYN)보다 +1한 값을 가집니다. 이 번호를 전송함으로써, 잘 들린다는 것을 알려줍니다.
그리고 클라이언트에게 전송이 잘되냐고 물어봅니다. 동일하게 Sequence Number을 전송합니다
3단계 : 응 들려!
클라이언트가 그 질문이 잘들린다고 Acknowledgement number(ACK)에 받은 Sequence number +1해서 전송합니다
Q. 왜 2 way handshake는 안될까?
A. TCP는 양방향 연결이기 때문에 클라이언트가 서버에게 존재를 알리고 서버에서도 클라이언트에게 존재를 알리고 대답을 얻어야된다. 그렇기 때문에 총 4단계가 필요하며, 축약한 것이 3단계이다 [1 단계. 클라이언트가 서버에게 존재를 알린다. 2단계. 서버가 클라이언트의 존재를 알았다고 대답을 하면서 클라이언트에게 내 존재를 알린다. 3단계. 클라이언트가 서버의 존재를 알았다고 대답을 한다.] 그렇기 때문에 2 way로는 부족하다.
Q. 왜 랜덤한 수를 SYN으로 전송하는 걸까?
이전에는 연결을 맺을 때 사용하는 포트르 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용했습니다. 따라서 두 통신 호스트(클라이언트/서버)가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재했습니다. 서버측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 number가 전송된다면, 이전의 connection으로부터 오는 패킷으로 인식할 수 있습니다. 이러한 가능성을 줄이기위해 난수로 SYN를 설정합니다.
참고 자료
https://sleepyeyes.tistory.com/4
https://gmlwjd9405.github.io/2018/09/19/tcp-connection.html
https://asfirstalways.tistory.com/356