커넥션 관리

SuweonPark·2024년 5월 30일
0

TCP커넥션

전 세계 모든 HTTP 통신은, 지구상의 컴퓨터와 네트워크 장비에서 널리 쓰이고 있는 패킷 교환 네트워크 프로토콜의 계층화된 집합인 TCP/IP를 통해 이루어진다. 세계 어디서든 클라이언트 애플리케이션은 서버 애플리케이션으로 TCP/IP 커넥션을 맺을 수 있다. 일단 커넥션이 맺어지면 클라이언트와 서버 컴퓨터 간에 주고받는 메시지들은 손실 혹은 손상되거나 순서가 바뀌지 않고 안전하게 전달된다.

URL을 입력받은 브라우저는 다음과 같은 단계를 수행한다.
1단계 ~ 3단계에서 URL을 통해 서버의 IP 주소와 포트 번호를 가져온다. 4단계에서 웹 서버가 TCP 커넥션을 맺고 5단계에서는 그 커넥션을 통해서 요청 메시지가 전달된다. 6단계에서 응답을 읽고 7단계에서 커넥션이 끊어진다.

신뢰할 수 있는 데이터 전송 통로인 TCP

TCP 커넥션은 인터넷을 안정적으로 연결해준다. TCP는 HTTP에게 신뢰할 만한 통신 방식을 제공한다. TCP 커넥션의 한쪽에 있는 바이트들은 반대쪽으로 순서에 맞게 정확히 전달된다.

TCP 스트림은 세그먼트로 나뉘어 IP 패킷을 통해 전송된다

TCP는 패킷(혹은 IP 데이터그램)이라고 불리는 작은 조각을 통해 데이터를 전송한다. HTTP는 그림과 같이 'IP, TCP, HTTP'로 구성된 '프로토콜 스택'에서 최상위 계층이다. HTTP에 보안 기능을 더한 HTTPS는 TLS 혹은 SSL이라 불리기도하며 HTTP와 TCP 사이에 있는 암호화 계층이다

HTTP가 메시지를 전송하고자 할 경우, 현재 연결되어 있는 TCP 커넥션을 통해서 메시지 데이터의 내용을 순서대로 보낸다. TCP는 세그먼트라는 단위로 데이터 스트림을 잘게 나누고, 세그먼트를 IP 패킷이라고 불리는 봉투에 담아서 인터넷을 통해 데이터를 전달한다. 이 모든 것은 TCP/IP 소프트웨어에 의해 처리되며, 그 과정은 HTTP프로그래머에게 보이지 않는다.
각 TCP 세그먼트는 하나의 IP 주소에서 다른 IP 주소로 IP 패킷에 담겨 전달된다. 이 IP 패킷들 각각은 다음을 포함한다.

  • IP 패킷 헤더(보통 20바이트)
  • TCP 세그먼트 헤더(보통 20바이트)
  • TCP 데이터 조각(0 혹은 그 이상의 바이트)

IP 헤더는 발신지와 목적지 IP 주소, 크기, 기타 플래그를 가진다. TCP 세그먼트 헤더는 TCP 포트 번호, TCP 제어 플래그, 그리고 데이터의 순서와 무결성을 검사하기 위해 사용되는 숫자 값을 포함한다.

TCP 커넥션 유지하기

컴퓨터는 항상 TCP 커넥션을 여러 개 가지고 있다. TCP는 포트 번호를 통해서 이런 여러 개의 커넥션을 유지한다.
포트 번호는 회사 직원의 내선전화와 같다. 회사의 대표 전화번호는 안내 데스크로 연결되고 내선전화는 해당 직원으로 연결되듯이
IP 주소는 해당 컴퓨터에 연결되고 포트 번호는 해당 애플리케이션으로 연결된다. TCP 커넥션은 네 가지 값으로 식별한다.
<발신지 IP 주소, 발신지 포트, 수신자 IP 주소, 수신지 포트>

어떤 커넥션들은 같은 목적지 포트 번호를 가리킬 수 있다(C와 D 모두 목적지 포트 80을 가리키고 있다). 같은 발신지 IP 주소를 가리키는 커넥션들(B와 C)도 있고 같은 목적지 IP 주소를 가리키는 커넥션들(A와 B, C와 D)도 있다. 하지만 네 가지 커넥션 구성요소를 모두 똑같이 가리키고 있는 커넥션은 있을 수 없다.

TCP 소켓 프로그래밍


소켓 API를 사용하면, TCP 종단 데이터 구조를 생성하고, 원격 서버의 TCP 종단에 그 종단 데이터 구조를 연결하여 데이터 스트림을 읽고 쓸 수 있다. TCP API는, 기본적인 네트워크 프로토콜 핸드셰이킹, 그리고 TCP 데이터 스트림과 IP 패킷 간의 분할 및 재조립에 대한 모든 세부사항을 외부로부터 숨긴다.

그림을 보면 웹 서버는 커넥션을 기다리기 시작한다. 클라이언트는 URL에서 IP주소와 포트 번호를 알아내고 서버에 TCP 커넥션을 생성하기 시작한다, 커넥션 생성은 서버와의 거리, 서버의 부하, 인터넷 혼잡도에 따라서 시간이 걸린다.
일단 커넥션이 맺어지면 클라이언트는 HTTP 요청을 보내고 서버는 그것을 읽는다. 서버가 요청 메시지를 다 받으면, 그 요청을 분석하여 클라이언트가 원하는 동작을 수행하고 클라이언트에게 데이터를 보낸다. 클라이언트는 그것ㅇ르 받아 응답 데이터를 처리한다.

profile
프론트엔드 개발자

0개의 댓글