2-way handshake를 사용하지 않는 이유?
3-way handshake에 대해 알아보다 문득 2-way를 사용하지 않는 이유가 궁금해졌는데,
이에 내가 알아본 바를 간략하게 정리해보려고 한다.
- 위 그림처럼 timeout이 발생하면 isn이 어긋나게 된다
구글에 2-way handshake를 검색하면 바로 나오는 그림인데, 뭔가 그럴듯해 보인다.
그러나 아무리 눈을 씻고 찾아봐도 2-way에 대한 ieee 표준은 찾아볼 수가 없으니...
따라서 저 그림도 표준은 아닐 것이고, 실제로 서버가 ACK+SYN을 보내면 해결되는 문제다.
- 신뢰할 수 없다
호스트의 입장에서 연결을 신뢰하려면 아래 사항이 모두 확인되어야 한다.
(1) 상대방에게 패킷을 전달할 수 있다.
(2) 상대방으로부터 패킷을 전달받을 수 있다.
그러나 2-way에서는 일부만 확인된다.
클라이언트는 서버의 ACK를 통해 (1)과 (2)를 모두 확인할 수 있다.
하지만, 서버는 클라이언트의 SYN을 통해 (2)를 확인할 수 있어도 자신의 ACK로는 (1)을 확인할 수 없다.
따라서 이는 신뢰할 수 없는 연결이라고 할 수 있다.
인터넷에서 찾은 내용인데, 개인적으로 가장 마음에 들었다.
물론 엄밀한 증명은 아닐 테지만... 상식적으로 이해하기 쉬운 내용이므로!
- 공격에 취약하다
2-way에서 서버는 SYN을 받자마자 커넥션을 수립하는데, 이를 악용하여 DOS 공격을 행할 수도 있다는 것이다.
그런데... 3-way에서도 SYN flood가 가능하지 않나?
딱히 2-way만의 문제점은 아닌 듯한데, 근본적으로 커넥션의 수립이 너무 쉽다는 것은 문제로 삼을 수 있겠다.
이미 수많은 연구자들이 거쳐간 길일텐데...
그럼에도 2-way를 사용하지 않는 데에는 다 이유가 있을 것이니, 그러려니 하고 넘어가고 싶다. ㅠㅠ