최근에 어떤 외국 사이트에 접속하다가 타임아웃이 발생했다. 분명 운영 중인 사이트일 테고 외국에 있어서 느린 게 당연한데 왜 타임아웃을 발생시킬까 생각했다. 그냥 응답이 올 때까지 기다리면 되지 않나?
알고 보니 서버에서 타임아웃을 발생시키는 건 공격을 방지하기 위한 조치도 있었다. 서버에 타임아웃 설정이 없으면 TCP 3-way handshake 과정을 생각할 때, 클라이언트가 SYN 패킷을 보내고 서버가 SYN-ACK 패킷을 보내면 클라이언트는 ACK 패킷을 보내야 한다. 그런데 클라이언트가 ACK 패킷을 보내지 않으면 서버는 해당 연결을 계속 유지하게 된다. 이 경우 서버는 자원을 낭비하게 되고, 많은 클라이언트가 이런 식으로 연결을 시도하면 서버는 과부하에 걸릴 수 있다. 이걸 SYN flood 공격이라고도 한다.
그럼 클라이언트는 왜 타임아웃을 발생시키는 걸까? 가령 외국 사이트에서는 응답이 느릴 수 있는데 그게 올 때까지 기다리면 되는 거 아니냐는 말이다. 하지만 클라이언트 측에서도 타임아웃을 설정하는 이유는 여러 가지가 있다.
먼저 사용자 경험이다. 나는 해당 사이트가 동작중인 걸 알긴 했지만 무한 대기가 좋을 리는 없다. 그리고 나처럼 외국 사이트에 접속하는 경우뿐 아니라 서버와의 연결에서도 이런 상황이 발생할 수 있는데 이런 경우 클라이언트의 대기가 길어지는 건 자원의 낭비로도 이어질 수 있다.
https://shutcoding.tistory.com/entry/각종-타임아웃timeout설명과-설정-팁
이외에도 생각 못 했던 부분인데, 자동차 관련 네트워크의 경우에도 이 타임아웃이 매우 중요하다고 한다. 목숨이 걸린 상황이니까 듣고 나면 당연하다고 납득이 가는데 이런 부분은 생각하지 못했다.
https://habana4.tistory.com/entry/자동차-네트워크-오류-타임아웃-시간-지연-원인-영향-해결책