[HTTP 완벽 가이드] 1. HTTP: 웹의 기초 - 4장 커넥션 관리

yoon Y·2022년 10월 26일
0

TCP/IP란?

지구상의 컴퓨터와 네트워크 장비(인터넷)에서 널리 쓰이고 있는 패킷 교환 프로토콜들의 계층화된 집합.
전 세계 모든 HTTP통신은 TCP/IP를 통해 이루어진다.
세계 어디서든 클라이언트와 서버는 TCP/IP커넥션을 맺을 수 있다.

  • HTTP커넥션은 몇몇 사용 규칙을 제외하고는 TCP커넥션에 불과하다.
  • 커넥션 후에 주고받는 메세지들은 손실/손상/순서변경되지 않고 안전하게 전달된다.

TCP커넥션 생성 과정

커넥션 생성 과정

  1. 브라우저가 url에서 호스트 명를 추출한다.
  2. DNS로 호스트 명에 해당하는 ip주소를 요청한다.
  3. url에서 포트번호를 추출한다.
  4. 브라우저가 추출된 값들로 TCP커넥션을 생성한다. (쓰리웨이 핸드쉐이킹)
  5. 요청-응답을 한다.
  6. 브라우저 커넥션을 끊는다.

데이터 전송 과정

TCP는 IP패킷이라는 작은 조각을 통해 데이터를 전달한다.
HTTP메서지를 전송할 때 현재 연결된 TCP커넥션을 통해 메세지 데이터의 내용을 순서대로 보낸다.

  • 애플리케이션 계층 - HTTP메세지가 생성된다.
  • 전송 계층 - TCP는 세크먼트라는 단위로 데이터 스트림을 잘게 나눈다.
  • 네트워크 계층 - 세크먼트를 IP패킷이라고 불리는 봉투에 담아 인터넷을 통해 데이터를 전달한다.
  • 네트워크 계층 - IP패킷은 특정 IP주소에서 다른 IP주소로 전달된다.

이 모든 것은 TCP/IP소프트웨어에 의해 처리되며 과정은 프로그래머에게 보이지 않는다.

패킷 구성

IP패킷헤더: 발신지/목적지 IP주소 
 ㄴTCP세크먼트 헤더: 발신지/목적지 포트 번호, 데이터 순서 번호
  ㄴTCP데이터 조각: http메세지

TCP커넥션 유지하기

커넥션 구성 요소

포트 번호 당 1개의 TCP커넥션을 가질 수 있다. 포트 번호를 통해 여러 개의 커넥션을 유지한다.

  • IP주소 - 해당 컴퓨터에 연결 / 포트 번호 - 해당 프로그램으로 연결
  • <발신지 IP주소, 발신지 포트, 수신지 IP주소, 수신지 포트> 네 가지 값으로 고유한 커넥션을 생성한다.
  • 커넥션의 4개지 요소는 다른 커넥션과 같을 수 없다.

TCP 소켓 프로그래밍

운영체제는 TCP커넥션의 생성과 관련한 여러 기능을 제공하는데 그 중 소켓 API가 있다.
소켓 API를 사용하면 TCP종단(endpoint) 데이터 구조(소켓)를 생성하고, 원격 서버의 TCP종단에 생성한 데이터 구조를 연결하여 데이터 스트림을 읽고 쓸 수 있다. 즉 통신하는 장치들 간의 통신을 위한 통로를 구축하는 것.

HTTP트랜잭션 수행 시의 소켓 API사용 과정
서버와 클라이언트 각각 소켓을 생성하고 서로의 소켓을 연결한 후에 데이터를 주고받는다.
HTTP는 단방향 무상태 통신이어야 하므로, 한번의 요청 - 응답 후에 연결을 끊는다.
(HTTP외에 다른 프로토콜은 연결을 끊지않고 상호작용을 계속할 수 있다.)


TCP의 성능에 대한 고려

HTTP는 TCP바로 위에 있는 계층이기 때문에 HTTP트랜잭션의 성능은 그 아래 계층인 TCP성능에 영향을 받는다.
트랜잭션을 처리하는 시간은 TCP커넥션을 설정하고, 메세지를 전송하는 시간에 비하면 상당히 짧다.
너무 많은 데이터를 내려받거나 복잡하고 동적인 자원들을 실행하지 않는 한, 대부분의 HTTP지연은 TCP네트워크 지연(핸드셰이킹, 메세지 전송) 때문에 발생한다.

이런 TCP네트워크 지연은 하드웨어 성능, 네트워크와 서버의 전송 속도, 요청과 응답 메세지의 크기, 클라이언트와 서버 간의 거리에 따라 크게 달라진다. 또한 TCP프로토콜의 기술적인 복잡성도 큰 영향을 끼친다.

다음은 가장 일반적인 TCP관련 지연들이다.

1. TCP커넥션 핸드셰이크 지연

새로운 TCP커넥션을 열 때면, TCP소프트웨어는 커넥션을 맺기 위한 조건을 맞추기 위해 연속으로 IP패킷을 교환한다. 작은 크기의 데이터 전송을 할 때에, 이런 패킷 교환은 HTTP성능을 크게 저하시킬 수 있다.

3번에 걸쳐 SYN또는 ACK플래그가 포함된 패킷을 주고받는 3way handshaking을 통해 커넥션이 생성된다.
1. 클라이언트가 서버에게 SYN패킷 전송
2. 서버가 클라이언트에게 SYN+ACK패킷 전송
3. 클라이언트가 서버에게 데이터와 함께 ACK패킷 전송

성능에 영향을 미치는 이유

  • HTTP프로그래머는 이 패킷들을 보지 못한다. HTTP프로그래머가 보는 것은 새로운 커넥션 생성 시 발생하는 지연 뿐.
  • HTTP트랜잭션이 아주 큰 데이터를 주고 받지 않는 평범한 경우에는 3way handshaking이 눈에 띄는 지연을 발생시킨다.
  • 커넥션 생성 시에 주고 받는 패킷에는 데이터가 들어가지 않지만, 실제 데이터를 주고 받는 패킷과 크기가 똑같다.
    전송할 데이터의 크기에 상관없이 항상 같은 지연 시간이 들 것이다.
  • 전송할 데이터의 크기가 작은 HTTP트랜잭션은 50% 이상의 시간을 TCP를 구성하는데 쓰게되는 것.

2. 확인응답 지연

인터넷 자체가 패킷 전송을 완벽히 보장하지는 않기 때문에 TCP는 성공적인 데이터 전송을 보장하기 위해 자체적인 확인 체계를 가진다.

각 TCP세그먼트는 순번화 데이터 무결성 체크섬을 가진다.
수신자가 세그먼트를 온전히 받으면 작은 확인응답 패킷을 송신자에게 반환한다.
특정 시간 안에 확인응답 메세지를 받지 못하면 데이터를 다시 전송한다.

효율적인 확인응답 전송을 위한 확인응답 지연 알고리즘

  • 확인응답은 크기가 작기 때문에 TCP는 같은 방향으로 송출되는 데이터 패킷에 확인응답을 편승시키므로써 네트워크를 좀 더 효율적으로 사용한다.
  • 편승되는 경우를 늘리기 위해 TCP스택은 확인응답 지연 알고리즘을 구현한다.
  • 송출할 확인 응답을 특정 시간 동안 버퍼에 저장해두고, 편승시킬 패킷을 찾는다.
  • 만약 일정 시간 안에 편승 패킷을 찾지 못하면 확인 응답은 별도 패킷을 만들어 전송된다.

확인응답 지연 알고리즘이 효과적이지 않은 HTTP동작 방식

  • HTTP는 요청과 응답 두 가지 형식으로만 이루어지기 때문에 확인 응답이 송출 데이터 패킷에 편승할 기회를 감소시킨다.
  • 해당 방향으로 송출될 패킷이 많지 않은 상태에서 일정 시간동안 편승시킬 패킷찾는 불필요한 과정을 거치기 때문에 확인응답 지연 알고리즘으로 인한 지연이 자주 발생한다.
profile
#프론트엔드

0개의 댓글