HTTP 통신은 대부분 TCP 커넥션을 통해 이루어 진다.
응용 계층에서 만들어진 HTTP 메세지는 전송 계층에서 일정 길이의 TCP 세그먼트로 나뉘어 인터넷 계층으로 보내진다.
인터넷 계층에서는 TCP 세그먼트를 IP 데이터그램에 담는다.
TCP 커넥션은 <발신지 IP, 발신지 포트, 수신지 IP, 수신지 포트> 네가지로 식별한다.
HTTP 요청 처리 과정은 위 사진과 같다.
1. DNS를 이용해 해당 서버의 IP 주소를 찾는다.
2. 해당 서버 TCP 연결을 맺는다.(3-way handshake)
3. 맺어진 TCP 연결을 통해 HTTP 요청을 한다.
4. 요청을 받은 서버는 요청을 처리하고 맺어진 TCP 연결을 통해 응답한다.
5. TCP 연결을 끊는다.(4-way handshake)
3-way handshake
2-way handshake가 아니라 3-way handshake인 이유!!!
TCP/IP 통신은 양방향성이기 때문에 클라이언트가 서버에게 존재를 알리고 패킷을 받을수있다는 것을 증명하듯이, 클라이언트도 패킷을 잘 받았다는 것을 증명해야 한다.
4-way handshake
순차적인 방식은 매 트랜잭션마다 새로운 TCP 커넥셕을 만들고 요청을 보내고 응답을 받고 연결을 끊고 다시 새로운 TCP 연결을 맺기 때문에 시간 낭비가 크다.
병렬 방식은 커넥션을 한번에 여러개 만들어 커넥션을 수립하는 지연 시간을 줄일 수 있다.
하지만 이 방식은 네트워크 대역폭이 작을 때는 성능 상의 장점은 거의 없고 다수의 커넥션은 메모리를 많이 소모하므로 다른 문제를 일으킬 수 있다.
지속 방식은 각 트랜잭션 마다 새로운 커넥션을 만들지 않고 만들어져있던 커넥션에 지속적으로 요청과 응답을 하기 때문에 커넥션 지연 시간을 줄이고 TCP 느린 시작에서도 자유롭다.
파이프라인을 사용한 지속 방식은 기존의 지속 방식 처럼 응답이 올때까지 다음 요청을 멈추는 것이 아니라 요청을 응답과 상관없이 차례대로 보낸다.