Network(네트워크)
Request 타임아웃(Timeout) 정리
hippo 데브옵스
2022. 6. 27. 01:02
Timeout이란
- 프로그램이 특정한 시간 내에 성공적으로 수행되지 않아서 진행이 자동적으로 중단되는 현상
- 응답을 무한정 기다릴 수 없기 때문에 기다릴 시간을 정해야 함
1. Connection Timeout
클라이언트가 서버와 연결을 맺지 못하는 경우 발생하는 Timeout을 Connection Timeout이라고 함
3-Way Handshake을 정상적으로 수행해야지 클라이언트와 서버가 정상적으로 연결을 맺었다고 말할 수 있음
3-Way Handshake 연결(Connection)에 소요된 시간 → Connection Timeout은 연결을 하는데 소요되는 시간의 임계치
Connection time을 무한으로 설정할 수는 없으니까 일정 시간을 지정하여 무한정 연결을 제한
Connection Timeout 사례 예시
- 히포가 유명맛집을 인터넷에서 검색하고 맛집에 찾아갑니다.
- 맛집에는 이미 많은 사람들이 찾아와 북적이고 대기열도 한가득 있었습니다.
- 성질급한 히포는 “이거하나 먹으려고 이리 오래 기다려야되나?" 라고 생각하고 “10분만 기다려보고 안되면 다른데 가야겠다”라고 결정을 내렸습니다.
- 10분을 기다렸지만 대기열은 줄어들지 않아 히포는 맛집은 들어가보지도 못한채 다음에 와봐야겠다 생각하고 집으로 돌아갔습니다.
- 서버(맛집)자체에 클라이언트(히포)가 어떤 사유로 접근을 실패했을시 적용되는것이 Connection timeout입니다.
- 접근을 시도하는 시간제한이 Connection Timeout이 되는 것입니다.
2. Socket Timeout
- 클라이언트와 서버가 정상적으로 연결된 이후에 발생
- 서버는 클라이언트에게 응답 메세지를 전달할 때, 하나의 메세지를 여러 개의 패킷(packet)으로 나누어 전달
- 각 패킷이 전송될 때 시간 갭이 발생할 수 있는데 시간이 초과된 것 → 서버에서 클라이언트 전달할 때 시간 간격인 Socket Timeout 발생
- 클라이언트가 응답에 대한 패킷을 전달받을 때 시간 차이가 발생 → 발생하는 시간 차이의 임계치가 Socket Timeout
- 전체 연결이 타임아웃이 발생한 것이 아니고 개별 패킷이 타임아웃이 발생
3. ConnectionTimeout과 SocketTimeout의 차이 (웹 브라우저에서 네이버에 접속)
- URL을 호출할 때에는 ConnectionTimeout과 SocketTimeout 설정이 모두 필요
- 두 가지 Timeout을 설정하지 않으면 URL 접속시 무한 대기 가능
- OS 레벨에서 Timeout이 설정되어 있는 경우 그 설정값이 적용됨
3.1. 웹 브라우저가 네이버 서버에 접속하기 위해 서버와 연결
- 연결을 구성하기 위해서 보통 TCP Connection과 동일하게 3-way Handshake 방식으로 수행
- 3-way Handshake를 정상적으로 수행하게 되면 웹 브라우저와 네이버 서버는 연결된 상태가 됨
- 3-way Handshake에 소요된 시간을 Connection에 소요된 시간이라고 함
- ConnectionTimeout은 Connection을 구성하는데 소요되는 시간의 임계치를 의미
3.2. 클라이언트와 서버가 연결된 상태에서 서버는 데이터를 클라이언트로 전송
- 하나의 패킷이 아니라 여러 개의 패킷으로 나눠서 전송
- 여러 패킷을 전솔할 때, 각 패킷이 전송될 때 시간 Gap이 발생 가능
- 패킷이 전송하는 시간의 임계치를 SocketTimeout
3.3. ConnectionTimeout과 SocketTimeout 비교
4. Read Timeout
- Read Timeout도 Socket Timeout과 마찬가지로 서버와 정상적인 연결은 된 이후에 발생
- 서버가 클라이언트의 요청을 받아 처리하는 시간이 길어지게 되는 경우 Read Timeout이 발생 → 요청에 대한 응답이 없어서 발생
- 클라이언트가 특정 시간동안 서버로부터 요청에 대한 응답을 받지 못함
- 주고 받는 데이터의 양이나 네트워크 속도에 따라서 대응을 다름
- 데이터의 양이 크다면 이를 분할해서 받을 수 있도록 API 자체 Spec을 변경하거나 Retry 전략을 사용
- 속도가 느려서 발생하는 상황이라면 전반적으로 네트워크 대역폭 증가를 위한 인프라 작업을 필요
- Read Timeout 사례 예시
- 히포가 대기열을 뚫고 맛집안까지 들어가서 메뉴를 주문하는데까진 성공을 했습니다.
- 근데 워낙에 사람이 많다보니 이번엔 주문한 메뉴가 나오는데 많은 시간이 필요했습니다.
- 주방에서 뭔짓을 하는지 아무리 기다려도 주문한 음식은 나오지가 않습니다.
- 성질급한 히포는 “아오! 그냥 이시간에 딴걸할걸 바빠 죽겠는데” 하고 그냥 가게를 나와버립니다.
- 나중에 히포이가 주문한 음식은 나왔지만 이미 음식을 먹을 사람은 사라지고 없어져, 결국 요리는 버려지게 됩니다.
- client가 server에 접속을 성공 했으나 서버가 로직을 수행하는 시간이 너무 길어 제대로 응답을 못 준상태에서 client가 연결을 해제하는것이 Read timeout입니다.
- client는 해당상황을 오류로 인지(요리가 안나옴)하고 server는 계속 로직(주문된 요리)을 수행하고 있어 성공으로 인지해 양사이드간에 싱크가 맞지 않아 문제가 발생할 확률이 높습니다.