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 오류복구
‣
➡️ 다음 글 : TCP keep-alive
이번 포스팅에서는 **HTTP 완벽가이드, 네트워킹과 웹 성능 최적화 기법, 리눅스 커널 이야기, 와이어샤크를 활용한 실전 패킷 분석** 책을 활용하였습니다.
Latency가 높은 곳을 찾아보자
TCP의 신뢰성을 보장하기 위한 기능들이 성능과 Trade off되기도 한다. 이에 이번 포스팅에서는 성능을 보완하기 위한 몇가지 조언을 정리해본다.
TCP 네트워크 지연은 하드웨어의 성능, 네트워크와 서버간의 전송속도, 요청과 응답 메시지의 크기, 클라이언트와 서버간의 거리에 따라 달라진다.
어떤 데이터를 전송하든 새로운 TCP connection을 열 때면, TCP 소프트웨어는 connection을 맺기 위한 조건을 맞추기 위해 연속으로 IP packet을 교환한다. 작은 크기의 데이터 전송에 이런 connection이 사용된다면 HTTP 성능을 저하시킬 수 있다.
각 TCP 세그먼트는 순번과 데이터 무결성 체크섬을 가진다. 각 세그먼트의 수신자는 세그먼트를 온전히 받으면 작은 ACK 패킷을 송신자에게 반환한다. 만약 송신자가 특정 시간 안에 ACK 메시지를 받지 못하면 패킷이 파기되었거나 오류가 있는 것으로 판단하고 데이터를 다시 전송한다. ACK는 그 크기가 작기 때문에, TCP는 같은 방향으로 송출되는 데이터 패킷에 ACK를 편승(piggyback)시킨다. (TCP는 송출데이터 패킷과 ACK를 하나로 묶음으로써 네트워크를 좀 더 효율적으로 사용한다.)
ACK 지연은 송출할 ACK를 특정 시간동안 (보통 0.1~0.2초) 버퍼에 저장해두고, ACK를 편승시키기 위한 송출 데이터 패킷을 찾는다. 만약 일정 시간 안에 송출 데이터 패킷을 찾지 못하면 ACK는 별도 패킷을 만들어 전송된다. (HTTP는 오히려 지연의 원인이 되기도 함)