Connection timeout
은 TCP 3 way handshake
에서 발생하며 예상한 시간까지 제대로 연결을 못해 발생하는 timeout이다.
Read timeout
은 연결을 완료한 후 요청을 보냈는데 예상 응답시간을 넘어도 응답이 돌아오지 않아 발생하는 timeout이다.
RTO
는 재시도 하는 시간을 말하는데, 상대방의 응답이 RTO을 넘어간다면 내가 보낸 패킷이 유실 됐다고 판단하고 다시 시도하는 시간이다.
한 번 서로 요청과 응답을 완료됐다면 그 통신 시간을 RTT
라고 한다.
RTO는 RTT를 기준으로 동적으로 결정 된다. 하지만 맨 처음 연결에는 RTT가 얼마나 걸릴지 모르니 기본값이 정해져 있는데 이걸 InitRTO
라고 한다. 리눅스는 1초로 설정돼있다.
Connection timeout에서
InitRTO
를 사용하는 두 가지 경우다. A서버는 A서버가 보낸 SYN가 유실되도, B가 보낸 SNK+ACK가 유실되도 응답을 못 받은건 마찬가지다. 즉, 한번도 연결이 성공한적이 없으니 InitRTO를 기준으로 재시도 한다.
Read timeout은 Connect를 하면서 서로 통신에 걸리는 시간을 알았으니 Connection timeout보다 재시도하는 시간이 빠르다. 하지만
RTO_MIN
은 200ms니 RTT가 RTO_MIN보다 짧아도 RTO는 최소 RTO_MIN만큼은 기다린다.
한 줄평 : Connection timeout과 Read timeout의 재시도 시간과 횟수는 정답이 없으므로 적절한 시간을 찾아서 적용해야한다.