TCP와 HTTP, HTTPS
TCP (Transmission Control Protocol)
-
레벨: OSI 모델의 전송 계층(Transport Layer)에서 작동하는 프로토콜
-
목적: 데이터의 안전한 전송을 보장하기 위해 연결 지향적이며 오류 복구와 흐름 제어 기능을 제 공
-
특징
- 3-way handshake를 사용하여 연결을 설정
- 패킷의 손실이나 순서 변경 등의 문제가 발생할 경우, 복구 메커니즘을 제공
- 흐름 제어(송신 측과 수신 측의 데이터 처리 속도 차이를 조절)를 통해 네트워크의 혼잡을 관리
- 혼잡 제어(네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지)
-
함수 호출 순서 (BSD socket API)
서버
socket()
: 소켓 생성bind()
: 소켓을 특정 IP 주소와 포트 번호에 바인딩listen()
: 바인딩된 소켓을 사용하여 연결 요청을 기다리기 시작하며 서버는 이 상태에서 클라이언트의 연결 요청을 기다림accept()
: 클라이언트의 연결 요청을 받아들이고, 새로운 소켓을 반환하며 이 소켓을 통해 클라이언트와 통신recv()/send()
: 데이터 수신 및 전송close()
: 소켓 종료
클라이언트
socket()
: 소켓 생성connect()
: 서버의 특정 IP 주소와 포트 번호로 연결 요청send()/recv()
: 데이터 전송 및 수신close()
: 소켓 종료
서버는 listen() 호출 이후부터 연결요청 대기 큐를 만들어 놓고, 그 이후에 클라이언트가 연결 요청을 할 수 있다. 이때 서버가 바로 accept()를 호출할 수 있는데, 연결되기 전까지 호출된 위치에서 블로킹 상태에 놓이게 된다.
HTTP (HyperText Transfer Protocol)
- 레벨: 응용 계층(Application Layer)에서 작동하는 프로토콜
- 목적: 웹 브라우저와 웹 서버 간의 정보 교환을 위해 설계
- 특징
- 상태가 없는(stateless) 프로토콜이며 각 요청은 독립적으로 처리
- GET, POST, PUT, DELETE 등의 메서드를 사용하여 웹 리소스를 요청하거나 조작
- 암호화되지 않은 텍스트 형식으로 데이터를 전송하므로 중간에서 데이터를 가로채기가 쉬움
TCP vs HTTPS
계층적 차이
- TCP: 전송 계층에서 작동하고 네트워크의 두 노드 간에 데이터의 안정적인 전송을 보장하기 위한 프로토콜
- HTTP: 응용 계층에서 작동하며 웹 서버와 클라이언트 간에 웹 리소스를 교환하기 위한 프로토콜
목적
- TCP: 데이터의 순서, 에러 검출 및 복구, 흐름 제어 등을 통해 두 노드 간의 안정적인 연결을 제공하는 것이 주 목적
- HTTP: 웹 서버에 웹 페이지나 이미지, 스크립트 등의 웹 리소스 요청 및 해당 리소스의 전송이 주 목적
데이터 형식
- TCP: 바이트 스트림 형식의 데이터
- HTTP: 텍스트 기반의 헤더와 바디를 가진 메시지 형태의 데이터를 전송
상태 유지
- TCP: 상태를 유지, 한 번 연결이 설정되면, 연결이 종료될 때까지 데이터 교환
- HTTP: 기본적으로 상태를 유지하지 않는 프로토콜이며 각 요청은 독립적, 그러나 쿠키, 세션 등의 메커니즘을 통해 상태를 유지할 수 있습니다. 다만, HTTP/1.1에서
Connection:keep-alive
를 HTTP Request 및 Response에 포함하지 않아도 기본적으로 모든 connection이 keep-alive 상태로 HTTP 요청과 응답을 한 TCP 연결을 통해 처리할 수 있으며 이는 매번 연결을 새로 설정하는 것보다 효율적이기 때문에 많은 웹 트래픽에서 활용
TCP Keep-Alive
vs HTTP Keep-Alive
서로 연결된 두 시스템 사이에서 만약 한 쪽의 시스템이 다운되면 다른 한 쪽의 시스템은 다운된 시스템이 정상적으로 동작을 하는 줄 알고 계속 TCP 소켓을 열어둔 상태로 유지하게 됩니다. 이렇게 한쪽 호스트의 연결이 끊어졌음에도 불구하고 연결이 되어 있는 줄 알고 계속 살아 있는 세션을 "유령 세션"이라고도 합니다. 만약, 데이터를 송수신중에 한쪽이 비정상적으로 종료가 되었다면 다른 한쪽은 보낸 Packet에 대한 ACK가 오지 않아, timeout이 난 packet을 지속적으로 네트워크로 보내게 됩니다. TCP의 keep-alive는 일정한 시간 간격으로 payload가 없는(0 or 1 byte) 데이터를 전송하여 커넥션이 살아있나 확인하게 됩니다. 만약 커넥션이 살아있다면, keep-alive ack를 보낸 쪽에서 데이터를 처리할 가능성이나 추후에 데이터를 보낼 가능성을 염두해 두고 소켓을 닫지 않은 상태로 볼 수 있거나 보낼 데이터를 처리 중일 수 있으므로, 미리 설정된 일정 시간만큼만 TCP 세션을 연장하게 됩니다. 만약, keep-alive에 대한 ACK가 오지 않고 죽어있다면 TCP 세션을 종료하게 됩니다.
- HTTP Keep-Alive는 HTTP 프로토콜의 기능으로, 단일 TCP 연결을 유지하여 여러 HTTP 요청/응답을 처리하는 것입니다. 기본적으로 HTTP 연결은 각 요청 후에 닫힙니다. 하지만 Keep-Alive를 활성화하면 하나의 연결을 유지하고 여러 요청을 처리할 수 있습니다. 이는 웹페이지 로드 시간을 줄이고 서버의 CPU 및 메모리 사용량을 감소시킵니다.
- TCP Keep-Alive는 TCP 연결을 유지하거나 연결이 닫혀 있는지 확인하는 메커니즘입니다. TCP 계층에서 운영체제에 의해 관리되며 연결이 활성화되어 있는지 주기적으로 확인하고 연결이 닫혀 있는 경우에는 연결을 다시 설정하려고 시도합니다.
따라서 HTTP Keep-Alive는 HTTP 연결을 유지하여 여러 요청을 처리하는 반면, TCP Keep-Alive는 TCP 연결을 활성 상태로 유지하거나 닫힌 상태인지 확인합니다.
HTTPS (HyperText Transfer Protocol Secure)
- 레벨: 응용 계층(Application Layer)에서 작동하지만, 보안 계층(SSL/TLS)을 사용하여 데이터를 암호화
- 목적: HTTP의 기능을 그대로 유지하면서 전송되는 데이터를 보호하기 위해 설계
- 특징
- SSL (Secure Sockets Layer)또는 그 후속인 TLS(Transport Layer Security)를 사용하여 데이터를 암호화
- 중간자 공격(Man-in-the-Middle Attack)과 같은 네트워크 위협으로부터 데이터를 보호
- 웹 브라우저 주소 표시줄에 '패드락' 아이콘(주소 표시줄에 보이는 작은 자물쇠 모양) 또는 'https://'로 시작하는 URL을 통해 사용자에게 안전한 연결을 나타낸다.
TCP는 데이터의 안전한 전송을 보장하는 데 중점을 둔 프로토콜이며, HTTP와 HTTPS는 웹 상의 리소스를 요청하고 전송하는 데 사용되는 프로토콜입니다. HTTPS는 HTTP에 보안 계층을 추가하여 데이터의 안정성을 향상시킵니다.
3-way handshaking이란?
TCP 소켓은 연결과정 중에 총 3번의 대화를 주고 받는다.
- 클라이언트는 서버에 접속 요청하는 SYN(M) 패킷을 보냄
- 서버는 클라이언트 요청인 SYN(M)을 받고, 클라이언트에게 요청을 수락한다는 ACK(M+1)와 SYN(N)이 설정된 패킷을 발송
- 클라이언트는 서버의 수락 응답인 ACK(M+1)와 SYN(N) 패킷을 받고, ACK(N+1)를 서버로 보내면 연결이 성립
- 클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송
- 서버는 클라이언트의 요청(FIN)을 받고, 알겠다는 확인 메시지로 ACK를 보내며 이후 데이터를 모두 보낼 때까지 잠깐 TIME_OUT이 됨
- 데이터를 모두 보내고 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN플래그를 전송
- 클라이언트는 FIN 메시지를 확인했다는 ACK를 보냄
- 클라이언트의 ACK 메시지를 받은 서버는 소켓 연결을 close함
- 클라이언트는 아직 서버로부터 받지 못한 데이터가 있을 것을 대비해서, 일정 시간동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거침 (TIME_WAIT)