HTTP 완전 가이드 – 4장 TCP 연결 관리

  • by

TCP 연결의 작동 방식

TCP 스트림은 세그먼트로 분할되고 IP 패킷을 통해 전송된다.


HTTP 스택

HTTP 메시지를 전송하려면 TCP 연결을 통해 데이터를 전송합니다.

TCP는 세그먼트라는 단위로 HTTP 데이터를 세분화하고 세그먼트를 IP 패킷으로 래핑하여 전송합니다.


패킷 구조도

이 패킷에는 대상 및 대상 IP 주소 크기의 포트 번호와 같은 데이터의 순서와 무결성을 확인하는 값이 포함됩니다.

HTTP 트랜잭션 지연


단일 요청 응답 간의 지연 시간 프로세스

위의 그림을 보면 처리 프로세스의 실행 시간이 상당히 짧으며 대부분의 처리 시간은 연결 및 요청 응답에 실행됩니다.

이해합니다.

요약하면 대부분의 HTTP 지연은 TCP 네트워크 지연이것이 원인입니다.

TCP 네트워크 지연의 원인 1. 3-way 핸드셰이크

TCP 연결은 보안 연결을 보장하기 위해 3웨이 핸드셰이크라고 하는 실행 프로세스를 거칩니다.

1. SYN 패킷 포워딩

2. SYN+ACK 패킷 전달

3. ACK 패킷 포워딩

작은 크기의 HTTP 트랜잭션은 50% 이상의 시간이 TCP를 구성하는 데 사용됩니다.

TCP 네트워크 지연의 원인 2. 확인 응답 지연

TCP는 성공적인 데이터 전송을 보장하기 위해 고유한 확인 방법을 가지고 있습니다.

각 세그먼트의 수신자는 세그먼트를 수신하면 확인 응답 패킷을 송신자에게 반환한다.

확인 응답은 크기가 작고 같은 방향으로 전송되는 데이터 패킷으로 함께 전송됩니다.

같은 방향으로 데이터 패킷이 오지 않으면 일정 시간 후에 패킷을 만들어 전송합니다.

HTTP는 요청과 응답의 두 가지 방법으로 동작하기 때문에 데이터 패킷에 확인 응답이 올 가능성이 적다.

따라서, 확인 응답에 의한 지연이 많이 발생한다.

TCP 네트워크 지연의 원인 3. 느린 시작

TCP 연결은 처음에는 연결의 최대 속도를 제한하고 점점 속도 제한을 높여갑니다.

TCP 네트워크 지연 요인 4. 네이글 알고리즘

TCP 스택에서 어떤 크기의 데이터를 전송할 수 있습니다.

그러나 TCP 세그먼트는 작은 크기의 데이터를 포함하는 많은 패킷을 전송하면 효율성이 떨어집니다.

네이블 알고리즘은 패킷을 전송하기 전에 많은 양의 TCP 데이터를 하나의 덩어리로 결합하는 알고리즘입니다.

네이글 알고리즘은 패킷이 일정한 크기가 아니면 전송하지 않습니다.

결론적으로, 네이글 알고리즘은 HTTP와의 궁합이 나쁘다.

네이블 알고리즘을 비활성화하려면 TCP_NODELAY 매개 변수 값을 설정하고 비활성화할 수 있습니다.

네이블 알고리즘을 비활성화하면 작은 크기의 패킷이 많이 발생하지 않도록 큰 크기의 데이터 모음을 만들어야합니다.

TIME_WAIT 누적 및 포트 고갈

TCP 연결은 연결이 끊어지면 IP 주소와 포트 번호를 기록하여 일정 시간 동안 동일한 연결을 생성하지 않습니다.

성능 측정시에 이러한 정보가 적층되어 포트가 부족해지는 경우가 있어, 이것을 포트 고갈이라고 하며, 이것에 의해 원래의 성능보다 나쁘게 측정할 수 있다.

HTTP 연결 성능 ​​향상 기술

1. 병렬 연결

  • HTTP를 사용하면 클라이언트가 여러 연결을 설정하여 여러 HTTP 트랜잭션을 병렬로 처리할 수 있습니다.

  • 병렬 연결은 항상 빠르지 않습니다.

    • 네트워크 대역폭이 좁으면 병렬 처리가 느려질 수 있음
  • 연결이 너무 많으면 서버 성능이 저하되므로 연결 수를 적절히 제한해야 합니다.

  • 여담인데, 언제나 빨리 로드되어 있지 않아도, 유저는 보다 빠르다고 느낀다고 한다.

2. 지속 연결

  • 처리가 완료된 후에도 접속을 유지하고 재활용하는 방식을 말한다.

  • HTTP 1.0에서는 지속적인 연결에 keep-alive를 사용합니다.

  • HTTP 1.1에서 설계는 향상된 지속적인 연결을 사용합니다.

  • 헤더에 Connection:Keep-Alive를 지정하여 TCP 연결을 유지합니다.

  • 지속적인 접속은 프록시를 거쳐 문제를 발생시킬 여지가 있으므로 주의해야 한다.

3. 파이프라인 연결

  • 지속 연결을 활용하는 방법
  • 요청을 파이프라인화하여 연속적으로 두 번째 및 세 번째 요청을 처리하는 방법입니다.