728x90
/* TCP 커넥션부터 HTTP 요청/응답 */
/* TCP */
TCP는 IP 패킷이라고 불리는 작은 조각을 통해 데이터를 전송한다. HTTP 는 애플리케이션 계층으로 최상위 계층이다. TCP는 전송계층이다. HTTP는 애플리케이션 계층 바로 아래, TCP가 속한 전송계층이 있지만. HTTPS 애플리케이션 계층 바로 아래에는 SSL이 속한 보안 계층이 있고 그 밑에 전송 계층이 존재한다.
각 TCP 세그먼트는 하나의 IP에서 다른 IP로 IP패킷에 담겨 전달된다. 전달하기 위해서는 TCP 커넥션이 필요한데, 이는 네 가지 값으로 식별한다.
<발신지 IP 주소, 발신지 포트, 수신자 IP 주소, 수신자 포트>
/* TCP 커넥션 설정 과정 - 3 Way Handshake*/
- SYN 패킷 전송: 클라이언트가 서버에 커넥션 연결 요청을 보낸다.
- SYN-ACK 패킷 수신: 커넥션 매개변수를 산출하고, SYN, ACK 플래그를 포함한 TCP 패킷을 클라이언트에게 보낸다.
- ACK 패킷 전송: 마지막으로 클라이언트는 커넥션이 잘 맺어졌음을 알리기 위해 서버에게 확인응답 신호를 보낸다.
- 이 3단계 과정을 TCP 3-way handshake라고 하며, 이후에 데이터를 전송할 수 있는 상태가 됩니다.
/* Keep-Alive 커넥션 & 지속 커넥션*/
HTTP 요청이 여러개 있을 때, TCP 커넥션을 생성하고 신호를 보내고 커넥션을 닫고 이 과정을 반복하는 것은 비효율적이다. 이를 극복하기 위해 병렬 커넥션, 지속 커넥션, 파이프라인 커넥션이 있다. 그 중 지속 커넥션은 HTTP/1.0 이하에는 Keep-Alive 커넥션을 사용했다.
하지만 멍청한 (Dumb) 프락시 일 경우에는 Connection:Keep-Alive 커넥션을 인지를 하지 못한다. 그래서 클라이언트의 Keep-Alive 요청을 그대로 서버로 보내고 서버가 연결을 끊을 때까지 다른 요청을 받지 않는다.
이런 경우를 막기 위해 Proxy-Connection 헤더가 증가했다.
HTTP/1.1+ 부터는 지속커넥션이 등장했다. HTTP 요청을 보낼 시 디폴트가 지속커넥션이다. 여기서 요청의 끊고 맺음은 브라우저가 결정한다. (우아한 커넥션)
728x90
'서버' 카테고리의 다른 글
[HTTP] DNS (0) | 2024.10.07 |
---|---|
[HTTP] OSI 7계층 (1) | 2024.09.02 |
[Node.js] 이벤트 루프 (0) | 2024.07.07 |
[Node.js] 무엇인가 (0) | 2024.07.07 |
[서버] RESTful API (0) | 2024.03.30 |