Connetion TimeOut과 Read TimeOut
Connetion Timeout은 Service측으로 Connection을 맺길 원하지만, Server의 장애 상황으로 Connection조차 맺어지지 못할 때 발생하는 timeOut 이다. Client와 Server가 연결될 떄 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을수립한다. 이 과정을 3-way-Handshake라고 한다. 즉, Connetion Timeout이란 3-way Handshake가 정상적으로 수행되어 서버에 연결되기까지 소요된 시간이다.
Read TimeOut은 연결을 완료한 후 요청을 보냈는데 예상 응답시간을 넘어도 응답이 돌아오지 않아 발생하는 timeout이다.
RTO와 RTT
RTT는 재시도 하는 시간을 말하는데, 상대방의 응답이 RTO을 넘어간다면 내가 보낸 패킷이 유실 됐다고 판단하고 다시 시도하는 시간이다.
한 번 서로 요청과 응답을 완료됐다면 그 통신 시간을 RTT라고 한다.
RTO는 RTT를 기준으로 동적으로 결정 된다. 하지만 맨 처음 연결에는 RTT가 얼마나 걸릴지 모르니 기본값이 정해져 있는데 이걸 InitRTO라고 한다.
Connection timeout이 발생하는 과정
Connection timeout에서 Init RTO를 사용하는 두 가지 경우다. A서버는 A서버가 보낸 SYN가 유실되도,
B가 보낸 SNK+ACK가 유실되도 응답을 못 받은건 마찬가지다. 즉, 한번도 연결이 성공한적이 없으니 InitRTO를 기준으로 재시도 한다.
Read timeout이 발생하는 과정
Read timeout은 Connect를 하면서 서로 통신에 걸리는 시간을 알았으니 Connection timeout보다 재시도하는 시간이 빠르다. 하지만 RTO_MIN은 200ms니 RTT가 RTO_MIN보다 짧아도 RTO는 최소 RTO_MIN 만큼은 기다린다.
총 정리
Connection time는 3-way Handshake가 정상적으로 수행되어 서버에 연결되기까지 소요된 시간
Read time는 RTO 보다 중요한것은 Server에서 요청을 처리하는데 걸리는 시간
RTT(Round Trip Time) 패킷이 목적지에 도달하고 나서 해당 패킷에 대한 응답이 출발지로 다시 돌아오기까지의 시간
RTO(Retransmission Time) 재전송 타임아웃시간, RTO를 넘은 시간에도 응답이 오지 않으면 재전송을 하기 위해 설정하는 시간
InitRTO 첫 통신에 응답을 받지 못하면 RTT를 알 수 없기 때문에 RTO를 설정할 수 없다.
Script
아직 까지는 실제로 경험한적이 없지만 개발자는 통신상에 이런 상황이 발생할 수 있는 부분을 미리 인지하고 있어야 하며 시뮬레이션을 해봐야 한다. Connection timeout과 Read timeout의 재시도 시간과 횟수는 정답이 없으므로 적절한 시간을 찾아서 적용하는것이 좋은거 같다.
참고 자료
https://choiseonjae.github.io/difference/ConnectionTimeout-ReadTimeout
https://velog.io/@byeongju/ConnectionTimeout%EA%B3%BC-ReadTimeout%EC%9D%80-%EC%96%B4%EB%96%A4-%EA%B0%92%EC%9D%B4-%EC%A0%81%EC%A0%88%ED%95%A0%EA%B9%8C
https://blog.naver.com/kon_pig/222584554067