kakaoChannel: false
<body>
<div class="notion-page-content padding">
	<div id="darass" 
	    data-project-key="MGxNT547E7u0i1i466" 
	    data-dark-mode="false"
	    data-primary-color="#10DF99"
	    data-show-sort-option="true"
	    data-allow-social-login="true"
	    data-show-logo="true"
			style="flex-shrink:0;flex-grow:1;display:flex;align-items:center;flex-direction:column;color:rgb(55, 53, 47);padding-top:5px;padding-bottom:var(--page-content-padding-bottom);margin:0 auto;"
	    >
	    <script type="text/javascript" defer>
	        (function () {
	        var $document = document;
	
	        var $script = $document.createElement("script");
	        $script.src = "<https://reply-module.darass.co.kr/embed.js>";
	        $script.defer = true;
	
	        $document.head.appendChild($script);
	        })();
					if (window.matchMedia("(min-width: 400px)").matches) {
						  document.getElementById("darass").style.maxWidth = "730px";
					} else {
						  document.getElementById("darass").style.maxWidth = "400px";
					}
	    </script>
	</div>
</div>
</body>

⬅️ 이전 글 : TCP 성능

➡️ 다음 글 : 없음

이번 포스팅에서는 **HTTP 완벽가이드네트워킹과 웹 성능 최적화 기법, 리눅스 커널 이야기와이어샤크를 활용한 실전 패킷 분석** 책을 활용하였습니다.

1. TIME_WAIT 소켓의 문제점과 대안

패킷 유실에 따른 비정상적인 통신흐름이 발생할 수 있다. 가령, 아래 그림과 같이 마지막 ACK가 중간에 유실될 경우 FIN에 대한 ACK를 받지 못했기에 LAST-ACK상태이고, SYN 요청에 대해 RST를 보낸다.

반면, TIME_WAIT이 있을 경우에는 이상을 감지하여 한번 더 FIN 패킷을 요청한다.

active closer(먼저 연결을 끊는) 쪽에서 TIME_WAIT 소켓이 생성된다.

TIME_WAIT 상태란 무엇인가

TIME_WAIT 소켓이 많아지면, 로컬의 포트 고갈에 따른 애플리케이션 타임아웃, 잦은 TCP connection 생성/해제로 인해 서비스의 응답속도가 낮아진다. (TIME_WAIT 소켓의 기본 타임아웃은 1분이다.)

1) 클라이언트 입장

커널 파라미터(tcp_tw_reuse)를 사용하여 TIME_WAIT 소켓을 재사용할 수 있다. 하지만 불필요한 TCP 3way handshake가  일어날 수 있으므로 요청할 때마다 소켓을 새로 연결하는 방식(Connectionless)가 아닌, 미리 **소켓을 열어놓고 처리하는 방식(Connection Pool)**으로 해결할 수 있다.

2) 서버 입장