- TIME_WAIT 관련하여 간략하게 작성한 글입니다.
- 리눅스 커널 이야기책을 많이 참고 하였습니다.
- 먼저 통신이 시작하기 전 3-way handshake 일어나고 통신을 모두 마친 후에는 연결을 종료하는데 이 과정을 4-way handshake라고 합니다.
- TIME_WAIT는 서버에서 생기는 것이 아닌 먼저 연결을 끊는 쪽에서 생성됩니다.
TIME_WAIT 문제점은?
- Time Wite 많으면 로컬 포트 고갈로 인하여 통신이 불가능 합니다. (OutBound만 IntBound 상관X)
이미지를 보고 설명하면 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 – 링크
- 서버 대수를 늘려 성능을 확장