본문 바로가기

서버

[네트워크] TCP/IP, HTTP 커넥션

728x90

/* TCP 커넥션부터 HTTP 요청/응답 */

 

/* TCP */

TCP는 IP 패킷이라고 불리는 작은 조각을 통해 데이터를 전송한다. HTTP 는 애플리케이션 계층으로 최상위 계층이다. TCP는 전송계층이다. HTTP는 애플리케이션 계층 바로 아래, TCP가 속한 전송계층이 있지만. HTTPS 애플리케이션 계층 바로 아래에는 SSL이 속한 보안 계층이 있고 그 밑에 전송 계층이 존재한다. 

 

각 TCP 세그먼트는 하나의 IP에서 다른 IP로 IP패킷에 담겨 전달된다. 전달하기 위해서는 TCP 커넥션이 필요한데, 이는 네 가지 값으로 식별한다.

 

<발신지 IP 주소, 발신지 포트, 수신자 IP 주소, 수신자 포트>

/* TCP 커넥션 설정 과정 -  3 Way Handshake*/

 

  1. SYN 패킷 전송: 클라이언트가 서버에 커넥션 연결 요청을 보낸다.
  2. SYN-ACK 패킷 수신: 커넥션 매개변수를 산출하고, SYN, ACK 플래그를 포함한 TCP 패킷을 클라이언트에게 보낸다.
  3. 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