Connection

ClassBinu·2024년 7월 21일

F-lab

목록 보기
63/65

HTTP Connection

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Connection

connection은 헤더임.
현재 전송 완료 후 네트워크 접속 유지 여부 제어.(연결 관리)
만약 전송된 값이 keep-alive면 연결은 지속되고, 동일 서버에 대한 후속 요청 수행 가능

# 서버가 연결 열린 상태로 유지하는 것
# http/1.0에서 기본 값
Connection: keep-alive

# 서버가 연결 닫으려는 것
# http/1.1에서 기본 값
Connection: close 

http는 tcp위에서 동작하니까 connection은 즉 tcp 연결을 의미한다.
만약 keep-alive라면 TCP 연결을 개방(Open)상태로 유지한다.
그럼 http 요청/응답이 완료된 후 tcp 연결이 끊어지지 않고, 동일 tcp연결을 재사용할 수 있다.
장점: 핸드셰이크 안해도 됨

clsoe는 http 요청-응답이 끝나면 TCP 연결을 Close함.
장점: TCP를 연결 놓는 것 자체가 리소스 소모하는 것. 대기하는데 빌표한 리소스 절약. 만약 일회성인 통신인 경우 계속 열어놓을 필요가 없음.

참고로 HTTP/2에서는 단일 TCP 연결에서 여러 요청 응답을 동시에 처리하는 멀티플렉싱을 지원. 그래서 HTTP/2에서는 Connection 헤더가 필요 자체가 없음.

그럼 언제 종료될지 어떻게 정함?

Keep-Alive 헤더가 있음.

Keep-Alive: timeout=5, max=100

timeout=5는 5초 뒤 아무런 데이터 교환 없이 유지되면 종료되어야 함.
max는 서버는 한 연결에서 처리할 수 있는 최대 처리 수, 이거에 도달하면 서버는 연결을 종료할 수 있음.

한 쪽에서 Connectoin: close를 보내면 연결 종료 요청할 수 있음.

그리고 오류가 나서 TCP 연결이 끊어지면 자동으로 연결 종료

클라이언트가 정하나?

클라이언트가 요청하고 서버는 수용 여부를 결정함.
또는 서버가 자체 설정이나 현재 부하에 따라 클라이언틔 요청을 조정하거나 무시할 수도 있음.
또는 서버도 Keep-Alive 옵션을 포함해서 클라이언트에게 자신의 연결 정책을 알릴 수 있음.

브라우저가 keep-alive로 보내고 서버가 수용하면 브라우저는 tcp연결을 열어줌.

서버가 close를 응답하면 브라우저는 응답 처리 후 tcp 연결 종료

"연결을 해제한다"는 표현은 네트워크 프로그래밍에서 TCP/IP 소켓 연결을 종료하고 관련 리소스를 해제하는 것을 의미
소켓을 닫는 것은 운영 체제에게 해당 소켓과 연결된 자원을 해제하도록 요청하는 것을 의미합니다. 이 작업은 다음과 같은 효과를 가져옵니다:

근데 어차피 동일 엔드포인트에 요청 한 번만 하지 않아?

아님.웹 페이지를 로드할 때, 브라우저는 HTML 문서 뿐만 아니라 스타일시트(CSS), 자바스크립트 파일(JS), 이미지 등 여러 리소스를 요청. 이러한 리소스들은 대부분 같은 도메인에서 호스팅되고 있으므로, Connection: keep-alive를 사용하면 다음의 이점이 있습니다:

속도 개선: TCP 연결을 매번 새로 설정할 필요 없이 이미 열려 있는 연결을 재사용함으로써, 연결 설정에 필요한 시간(핸드셰이크 시간)을 절약할 수 있습니다.
오버헤드 감소: TCP 연결과 해제는 서버와 네트워크에 부하를 주는 작업입니다. 연결을 유지함으로써 이러한 부하를 줄일 수 있습니다.

그리고 폴링 방식에서 유리함. 왜냐면 주기적으로 클라이언트가 서버에 요청을 보내야 하는데, alive한 상태가 아니면 매번 핸드셰이크를 해야 함.

DB Connection

우선 DBMS는 애플리케이션이다. 그니까 여기에 맞는 전용 프로토콜이 있는 것.
DBMS마다 자체 프로토콜이 있다.

DB 커넥션은 기본적으로 다음 절차를 따른다.
1. 연결 개발
2. 연결 사용
3. 연결 종료

Connection Pooling
데이터베이스 연결은 매우 리소스를 많이 사용하는 작업이므로, 효율적인 연결 관리가 필요합니다. 이를 위해 커넥션 풀링 기법이 널리 사용됩니다.

즉, 미리 정의된 연결을 풀에 저장하고 필요할 때 마다 재사용한다.
매번 새로운 연결이 아니라, 재사용함으로써 연결 초기화(핸드셰이크)를 절약할 수 있음.

"커넥션"이라는 용어는 주로 데이터베이스 서버와 애플리케이션 서버(또는 백엔드 서버) 사이의 연결을 의미

max (최대 커넥션 수): 기본적으로 10개의 커넥션을 풀에서 유지합니다.
idleTimeoutMillis (비활성 커넥션 타임아웃): 비활성 커넥션이 풀에서 제거되기까지의 시간은 기본적으로 10,000밀리초 (10초) 입니다.
connectionTimeoutMillis (커넥션 타임아웃): 새 커넥션의 생성이 타임아웃될 때까지 기다리는 최대 시간은 기본적으로 30,000밀리초 (30초) 입니다.

https://github.com/brianc/node-postgres/blob/master/packages/pg-pool/index.js

0개의 댓글