tcp TIME-WAIT의 실제 이점과 프로덕션 환경에 미치는 영향

tcp TIME-WAIT의 실제 이점과 프로덕션 환경에 미치는 영향

일부 이론

나는 TCP TIME-WAIT(여기그리고거기2 x MSL) 그리고 내가 읽은 것은 "연결 테이블"에서 연결을 잠시 동안 유지하는 (최대 세그먼트 수명) 으로 설정된 값이라는 것입니다 ."동일한 튜플과의 연결을 생성하기 전에 해당 튜플의 이전 화신에 속한 모든 패킷은 종료됩니다.".

연결이 존재하거나 더 이상 존재하지 않는 동안 수신된 세그먼트(특정 상황의 SYN 제외)는 TIME-WAIT폐기되므로 연결을 즉시 닫는 것은 어떨까요?

Q1: 이전 연결의 세그먼트를 처리하는 데 필요한 처리량이 적고 동일한 튜플에 새 연결을 생성하는 데 필요한 처리량이 적기 때문입니까 TIME-WAIT(즉, 성능상의 이점이 있습니까)?

위의 설명이 유효하지 않은 경우, 내가 TIME-WAIT유용하다고 생각하는 유일한 이유는 클라이언트가 동일한 튜플의 이전 연결에 대한 나머지 세그먼트를 보내기 전에 연결에 대한 를 보내는 경우입니다. SYN이 경우 수신자는 연결했지만 잘못된 세그먼트가 발생하여 종료해야 합니다.

Q2: 이 분석이 맞나요?
Q3: TIME-WAIT를 사용하면 다른 이점도 있나요?

몇 가지 연습

제가 관리하고 있는 프로덕션 서버에서 무닌 그래프를 살펴보았습니다. 다음은 하나입니다. 여기에 이미지 설명을 입력하세요

보시다시피 에는 TIME-WAIT보다 더 많은 연결이 있습니다 ESTABLISHED. 대부분의 경우 약 2배, 어떤 경우에는 4배 더 많습니다.

Q4: 이것이 성능에 영향을 미치나요?
Q5: 그렇다면 TIME-WAIT가치를 줄이는 것이 현명/권장됩니까(그리고 어떻게 해야 합니까)?
TIME-WAITQ6: 이 / ESTABLISHED연결 비율은 정상인가요 ? 악의적인 연결 시도와 관련이 있을 수 있습니까?

답변1

간단히 말해서, 걱정하지 마십시오 TIME_WAIT. 오버헤드가 거의 없으며 일반적으로 문제가 발생하지 않습니다.

net.ipv4.tcp_tw_reuse = 1사용량이 많은 서버에서는 포트가 고갈될 수 있으며, 이 경우 커널이 필요에 따라 아직 남아 있는 이전 포트를 재사용할 수 있도록 하는 sysctl 옵션이 있습니다 TIME_WAIT.

TIME_WAIT는 TCP 사양의 일부이며 아직 전송 중인 패킷을 포착하기 위해 존재합니다(모든 연결이 신뢰할 수 있는 것은 아니며 이것이 TCP의 목표 해결 목표라는 점을 기억하세요). 대부분의 현대적인 용도에서는 시간 초과 값이 매우 높을 수 있지만 일반적으로 netstat의 출력 이외의 다른 항목에는 간섭하지 않습니다.

소켓을 직접 제어하고 있고 데이터를 기다리고 있지 않다고 확신하는 경우(예: 최종 보낸 사람이거나 응답에 관심이 없는 경우) 옵션을 설정한 후 소켓을 닫을 수 있습니다 SO_NOLINGER. 와의 연결을 종료 RST하고 즉시 소켓을 삭제합니다.

귀하의 질문은 다음과 같습니다.

Q1,Q2,Q3: 링크가 불안정할 수 있기 때문에 "만일의 경우"에 늦은 패킷을 수집하기 위해 존재합니다. 이는 사양의 일부이며 패킷 손실을 방지하므로 조정해도 실질적인 이점은 없습니다.

질문4: 아니오

Q5: 걱정하지 마십시오. 필요한 경우 이러한 소켓을 강제로 재사용할 수 있습니다.

Q5: TIME_WAIT그리고 ESTABLISHED상관 관계가 없습니다. 단기간 연결이 많을수록 그 비율은 더 커집니다. 악의적인 원인으로 인해 발생할 수 있지만 "과도한 네트워크 활동"과 같은 지표는 아닙니다.

답변2

TIME_WAIT와 관련된 제한된 경험에서 얻은 답변:

1/2/3) 이것을 보세요그래서 질문그리고이 페이지TIME_WAIT에 대한 좋은 설명을 보려면 연결의 모든 TCP 패킷이 제대로 수신되는지 확인하는 것은 성능 문제보다는 서비스 품질에 더 가깝습니다.

4/5) TIME_WAIT와 관련된 한 가지 성능 문제는 매우 바쁜 서버에서 TIME_WAIT 상태에 너무 많은 연결이 있으면 결국 사용 가능한 연결이 부족해질 수 있다는 것입니다. 이 문제가 발생하는 경우 TIME_WAIT 값을 줄여볼 수 있지만 이는 "내가 뭘 하고 있는지 알고 있습니다" 조정 범주에 속할 수 있습니다. 보다이 SO 질문몇 가지 자세한 내용을 알아보세요.

6) TIME_WAIT의 기본값은 약 240초(또는 패킷 MSL인 120초의 두 배)여야 합니다. 따라서 설정된 연결/대기 연결의 비율은 들어오는 연결 속도와 연결이 열려 있는 기간에 따라 달라집니다. 예를 들어, 사용량이 많은 서버 몇 개를 확인했는데 비율 범위는 1.3~400이었습니다. 서버와 서버에서 수신하는 트래픽을 기준으로 모두 정상으로 간주했습니다.

관련 정보