지구상의 컴퓨터와 네트워크 장비(인터넷)에서 널리 쓰이고 있는 패킷 교환 프로토콜들의 계층화된 집합.
전 세계 모든 HTTP통신은 TCP/IP를 통해 이루어진다.
세계 어디서든 클라이언트와 서버는 TCP/IP커넥션을 맺을 수 있다.
TCP는 IP패킷이라는 작은 조각을 통해 데이터를 전달한다.
HTTP메서지를 전송할 때 현재 연결된 TCP커넥션을 통해 메세지 데이터의 내용을 순서대로 보낸다.
애플리케이션 계층
- HTTP메세지가 생성된다.전송 계층
- TCP는 세크먼트라는 단위로 데이터 스트림을 잘게 나눈다.네트워크 계층
- 세크먼트를 IP패킷이라고 불리는 봉투에 담아 인터넷을 통해 데이터를 전달한다.네트워크 계층
- IP패킷은 특정 IP주소에서 다른 IP주소로 전달된다.이 모든 것은 TCP/IP소프트웨어에 의해 처리되며 과정은 프로그래머에게 보이지 않는다.
IP패킷헤더: 발신지/목적지 IP주소
ㄴTCP세크먼트 헤더: 발신지/목적지 포트 번호, 데이터 순서 번호
ㄴTCP데이터 조각: http메세지
포트 번호 당 1개의 TCP커넥션을 가질 수 있다. 포트 번호를 통해 여러 개의 커넥션을 유지한다.
운영체제는 TCP커넥션의 생성과 관련한 여러 기능을 제공하는데 그 중 소켓 API가 있다.
소켓 API를 사용하면 TCP종단(endpoint) 데이터 구조(소켓)를 생성하고, 원격 서버의 TCP종단에 생성한 데이터 구조를 연결하여 데이터 스트림을 읽고 쓸 수 있다. 즉 통신하는 장치들 간의 통신을 위한 통로를 구축하는 것.
HTTP트랜잭션 수행 시의 소켓 API사용 과정
서버와 클라이언트 각각 소켓을 생성하고 서로의 소켓을 연결한 후에 데이터를 주고받는다.
HTTP는 단방향 무상태 통신이어야 하므로, 한번의 요청 - 응답 후에 연결을 끊는다.
(HTTP외에 다른 프로토콜은 연결을 끊지않고 상호작용을 계속할 수 있다.)
HTTP는 TCP바로 위에 있는 계층이기 때문에 HTTP트랜잭션의 성능은 그 아래 계층인 TCP성능에 영향을 받는다.
트랜잭션을 처리하는 시간은 TCP커넥션을 설정하고, 메세지를 전송하는 시간에 비하면 상당히 짧다.
너무 많은 데이터를 내려받거나 복잡하고 동적인 자원들을 실행하지 않는 한, 대부분의 HTTP지연은 TCP네트워크 지연(핸드셰이킹, 메세지 전송) 때문에 발생한다.
이런 TCP네트워크 지연은 하드웨어 성능, 네트워크와 서버의 전송 속도, 요청과 응답 메세지의 크기, 클라이언트와 서버 간의 거리에 따라 크게 달라진다. 또한 TCP프로토콜의 기술적인 복잡성도 큰 영향을 끼친다.
다음은 가장 일반적인 TCP관련 지연들이다.
새로운 TCP커넥션을 열 때면, TCP소프트웨어는 커넥션을 맺기 위한 조건을 맞추기 위해 연속으로 IP패킷을 교환한다. 작은 크기의 데이터 전송을 할 때에, 이런 패킷 교환은 HTTP성능을 크게 저하시킬 수 있다.
3번에 걸쳐 SYN또는 ACK플래그가 포함된 패킷을 주고받는 3way handshaking을 통해 커넥션이 생성된다.
1. 클라이언트가 서버에게 SYN패킷 전송
2. 서버가 클라이언트에게 SYN+ACK패킷 전송
3. 클라이언트가 서버에게 데이터와 함께 ACK패킷 전송
성능에 영향을 미치는 이유
인터넷 자체가 패킷 전송을 완벽히 보장하지는 않기 때문에 TCP는 성공적인 데이터 전송을 보장하기 위해 자체적인 확인 체계를 가진다.
각 TCP세그먼트는 순번화 데이터 무결성 체크섬을 가진다.
수신자가 세그먼트를 온전히 받으면 작은 확인응답 패킷을 송신자에게 반환한다.
특정 시간 안에 확인응답 메세지를 받지 못하면 데이터를 다시 전송한다.
효율적인 확인응답 전송을 위한 확인응답 지연 알고리즘
확인응답 지연 알고리즘이 효과적이지 않은 HTTP동작 방식