TIME_WAIT 관련

  • TIME_WAIT 관련하여 간략하게 작성한 글입니다.
  • 리눅스 커널 이야기책을 많이 참고 하였습니다.

https://rhyshan.com/275

  • 먼저 통신이 시작하기 전 3-way handshake 일어나고 통신을 모두 마친 후에는 연결을 종료하는데 이 과정을 4-way handshake라고 합니다.
  • TIME_WAIT는 서버에서 생기는 것이 아닌 먼저 연결을 끊는 쪽에서 생성됩니다.

TIME_WAIT 문제점은?

  • Time Wite 많으면 로컬 포트 고갈로 인하여 통신이 불가능 합니다. (OutBoundIntBound 상관X)

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/tutorial-connect-ec2-instance-to-rds-database.html

이미지를 보고 설명하면 user가 A라는 기사를 본고 싶어 링크를 클릭하였고 그 요청이 서버(EC2) -> DB(RDS) 순으로 데이터를 불러와서 클라이언트한테 보여준다.

이건 In, OuttBound 아닌 InBound의 요청이기 때문에 TIME_WAIT가 많든 적든 상관없는 이유가 고정 포트로 통신을 하기 때문입니다.

  • 포트 주소는 0~65535까지 이유는 포트 주소를 저장하는 공간이 16Bit라서

그럼 반대인 경우는 ?

예로 들어 EC에서 crontab이 동작하여 외부 사이트를 크롤링 하기 위하여 접근한다고 하였을 때에 이런 경우에는 OuttBound 해당되며, TIME_WAIT 많은 경우,

포트 고갈로 통신이 안될 수 있습니다.

내부 통신끼리 포트 고갈이 될 수 있나?

=> 충분히 있을 수 있습니다.

ㄴ내부 통신 모습

해결 방안

1. net.ipv4.tcp_tw_reuse

  • Time Wite 소켓을 재사용 할 수 있게 해주는 설정입니다. – 링크

2. ConnectionPool 방식 사용 – 링크

  • 소켓을 미리 열어 놓고 사용합니다.

3. Keepalive – 링크

  • 한번 맺은 세션을 요청이 끝나더라도 유지해주는 기능

4. Scale-Out – 링크

  • 서버 대수를 늘려 성능을 확장
위로 스크롤