HTTP의 지연은 TCP 통신을 하면서 발생하는 네트워크 지연으로 대부분 발생한다.
HTTP와 TCP의 상관 관계는 아래의 그림으로 대체하며 자세한 설명은 생략.
(이 부분은 추후 포스팅 예정)
TCP 성능 저하 원인 1 - TCP connection handshake 지연
클라이언트의 요청을 서버가 처리하여 응답하는 과정에서 요청을 실질적으로 처리하는 매우 짧다.
그에 비해 요청과 응답을 handshake 하는 과정에서 대부분의 지연이 발생을 한다.
Connection을 맺을 때, TCP handshake 과정은 위의 그림과 같이 syn / syn+ack / ack / HTTP Get 의 순서로 진행된다.
따라서 실질적인 데이터를 전달하고 처리하는 시간 외에 connection을 맺고 끊을 때, 많은 지연이 발생을 한다.
TCP 성능 최적화 방법 - TCP piggyback
** 일반/사전적인 용어에서 piggyback 이란?
1) 철도 수송에서 열차 위에 화물 차량을 실어서 철도 구간을 이동 후 화물 차량으로 이어서 운송하는 형태.
2) 영미권 표현으로는 '업어준다'라는 표현으로 'give me a piggyback ride' 와 같이 말하면 '나 좀 업어줘'와 같이 해석할 수 있다.
다시 돌아와서 TCP 네트워크에서 piggyback이란 TCP syn에 대한 syn+ack을 데이터 패킷에 업혀서 보내는것을 말한다.
이런식으로 syn+ack이란 별도의 패킷을 생성하지 않고 데이터 패킷이 송출될 때, 그 패킷 안에 삽입하여 전송하는 방식이다.
TCP 성능 최적화 방법 - TCP slow start
slow start 프로세스의 설계는 1988 이후로 수정되지 않았다.
slow start 매커니즘은 congestion 환경에서 window size를 정하기 위해서 사용된다.
congestion window size를 결정하기 위해서 slow start가 사용되며 초기값인 MSS(Maximum Segment Size)가 사용된다.
MSS는 한 세그먼트에 최대로 보낼수 있는 세그먼트 사이즈를 의미하며, 아래와 같이 정의된다.
MSS = MTU - (IP헤더길이 + IP옵션길이) - (TCP헤더길이 + TCP옵션길이)
이더넷 표준인 MTU의 기본 값은 1500bytes 이므로 TCP(20bytes)와 IP헤더(20bytes) 값을 제외하면 1460bytes가 MSS이다.
Slow start는 아래와 같은 매커니즘으로 동작한다.
아래의 그림과 같이 초기 cwnd(congestion window)는 1(MSS)로 시작한다.
cwnd는 receiver의 ack에 +1을 하게되며, RTT(Round Trip Time)가 증가할 때마다 2배로 증가한다.
위 과정을 거쳐서 cwnd가 threshold에 도달하면 Additive Increase와 Multiplicative Decrease를 거치게 된다.
TCP 성능 최적화 방법 - tcp_nodelay / tcp_nagle_limit
TCP 구현에서 사용되는 Nagle 알고리즘은 구현 형태의 의해서 패킷 전송을 지연시킨다.
TCP Nagle 알고리즘은 John Nagle이 정의한 알고리즘으로 TCP 응답을 수행하기까지 더 많은 데이터를 번들로 묶어서 MSS(Maximum Segment Size) 까지 데이터를 모아서 전송시킨다.
따라서 tcp_nodelay 옵션을 사용하거나 tcp_nagle_limit 옵션 값을 조정하여 TCP Nagle 알고리즘으로 인한 지연을 해소할 수 있다.
TCP 성능 최적화 방법 - tcp time_wait
TCP connection을 terminate 하게 되면 커넥션의 IP와 Port 정보를 메모리에 기록한다.
이 기록된 정보는 같은 IP와 Port를 사용하는 새로운 TCP 커넥션이 일정 시간 생성되지 않도록 하기위해 기록이 된다.
tcp_wait은 해당 기록을 사용하여 TCP 세그먼트의 MSL(Maximum Segment Lifttime) x 2 의 시간 동안 유지된다.
따라서 이전 커넥션과 관련된 새로운 커넥션에 이전에 사용된 IP와 Port가 삽입되는것을 막아준다.
'💾 공대 라이프 > L4_L7 네트워크' 카테고리의 다른 글
HTTPS 의 등장 배경과 특징(SSL/TLS/암호화/복호화/대칭키/공개키) (0) | 2023.01.23 |
---|---|
HTTP/2.0 의 특징과 등장 배경 (0) | 2023.01.21 |
HTTP 커넥션 관리(HTTP Parallel connection/Persistent Connection/Pipelined Connection) (0) | 2023.01.21 |
HTTP 웹의 기초 / MIME / URL / URI / HTTP 1.0 / HTTP 1.1 / HTTP 2.0 (0) | 2023.01.19 |
Ubuntu 20.x.x 버전에 구버전 secureCRT로 SSH 접속하는 방법 (0) | 2023.01.18 |
댓글