필자는 꼭 직접 정리를 해야 머리에 잘 들어오는 타입이라 작성한 네트워크 관련 정리 글
약간의 간소화가 된 부분도 있고 구체적인 설명이 추가된 부분도 존재한다.
컴퓨터 간의 통신은 인터넷을 통해서 이루어진다.
해저 광케이블, 인공위성을 통해 유무선 통신을 구축하고 이를 통해 인터넷에 연결된 컴퓨터를
통해 사람들이 정보를 공유할 수 있는 전 세계적인 정보 공유 시스템인
WWW World Wide Web 이 구축되었다.
인터넷이 통하는 네트워크에서 정보를 송수신하는 통신에 대한 규약을 의미한다.
우리는 복잡한 인터넷 세상에서 데이터를 안전하게 전달하기위해 이러한 규칙을 마련했다.
우선 IP주소를 통해 각 기기 간의 통신을 식별한다.
인터넷으로 통신할 때 보내는 데이터의 단위를 Packet 이라고 한다.

패킷은 이렇게 소스 IP(출발지), 대상 IP(도착지) 를 담고있어
어느 컴퓨터에 데이터를 전송할지 판별이 가능하다.
이 때 데이터는 주기만 하는 것이 아니고 받고 응답한다.
즉, 클라이언트가 서버에 요청을 패킷으로 보내고 요청을 받은 서버는 그에 대한 응답을
다시 클라이언트에 패킷으로 전송한다는 의미이다.
이렇게 단순하게 보았을 때는 IP를 사용하여 데이터 송수신 과정이 해결된 것으로 보인다.
하지만 IP는 단점이 존재한다.
IP 방식의 문제점을 해결해주는 것이 TCP프로토콜이다.
TCP에서는 연결을 설정하기 위해 3-way handshake 기법을 사용한다.
이 기법은 3단계로 진행된다.
설명하기 전에 SYN 과 ACK 에 관해서 알아보도록 하자.
SYN (Synchronize)
목적: SYN 플래그는 연결을 설정하기 위한 요청을 나타낸다.
역할: 클라이언트가 서버에 연결 요청을 보낼 때 사용된다.
이 패킷에는 클라이언트의 초기 순서 번호(Sequence Number)가 포함되어 있어,
클라이언트가 전송할 데이터의 순서를 정하는 데 사용된다.
ACK (Acknowledge)
목적: ACK 플래그는 수신한 데이터에 대한 확인 응답을 나타낸다.
역할: 패킷이 성공적으로 수신되었음을 나타내며, 수신된 패킷의 순서 번호를 알려준다.
이 플래그는 데이터 전송 중에 신뢰성을 확보하는 데 중요한 역할을 합니다.
클라이언트가 서버에 연결 요청을 보낸다.
이 요청은 SYN 플래그가 설정된 패킷으로,
클라이언트는 자신의 초기 순서 번호(Sequence Number)를 포함한다.
서버는 클라이언트의 SYN 패킷을 받고, 연결 요청을 수락한다.
서버는 자신의 초기 순서 번호를 포함한 SYN-ACK 패킷을 클라이언트에게 전송한다.
이 패킷은 클라이언트의 SYN 패킷에 대한 ACK(Acknowledgment) 응답을 포함한다.
클라이언트는 서버의 SYN-ACK 패킷을 받고, 연결이 수립되었음을 확인하기 위해
ACK 패킷을 서버에 전송한다. 이 패킷은 서버의 SYN-ACK 패킷에 대한 응답입니다.
이렇게만 본다면 무조건 TCP 가 좋은 것처럼 보이지만 이는 신뢰성이 보장되는 만큼
연결 과정, 데이터 전송에 많은 시간이 소요된다.
현대에서 많이 사용하는 추세인 UDP 이다. 이는 비연결형, 신뢰성이 없는 프로토콜이지만
속도가 빨라 실시간 통신, 스트리밍 애플리케이션의 요구(실시간성 보장)를 충족한다.
IP방식과 거의 비슷하고 기능이 없고 연결 설정을 안하는 대신 속도가 빠르다.
그렇다면 왜 UDP를 사용할까?
PORT란 현재 전송하는 패킷이 어떤 프로그램에 필요한지 구분할 수 있게 해주는 것이다.

실생활의 예시로는 아파트의 호수 역할을 수행한다.

패킷에는 IP 뿐만 아니라 PORT를 포함한다.
텍스트, 이미지, 파일, HTML, JSON 등 다양한 형태의 데이터는 HTTP를 통해 전송된다.
대부분 HTTP/1.1 (TCP) 를 사용하고 현대에는 HTTP/3(UDP) 의 사용량이 급증하는 추세이다.
HTTP는 처음부터 TCP/IP 위에서 구현되도록 설계되었다.
초창기에는 클라이언트에서 서버에게 HTML을 달라고 HTTP 규격 요청을 보내면
서버가 그에 맞는 HTML을 전송하는 것이 전부였다.
당시 HTTP 구조는 매우 간단했으며 요청 메서드 종류도 GET 한가지 뿐이었다.
응답은 무조건 HTML 파일 그 자체였다.
하지만 웹이 인기를 끌면서 기존 HTTP 사양으로는 사용자들의 요구사항을 충족할 수 없게 되었고
따라서 HTTP의 기본적 구조는 유지하면서 발전시켜왔고 지금의 HTTP가 된 것이다.
즉 쉽게 말하자면 HTTP는 클라이언트와 서버 간 통신을 관리하는 역할을 하며
TCP위에서 동작한다.
그림으로 표현하면 아래처럼 이해할 수 있다.

클라이언트는 서버에 Request를 보내고 Response를 기다린다.
서버는 요청을 처리하고 결과를 Response 한다.
HTTP는 인터넷 상에서 불특정 다수의 통신 환경을 기반으로 설계되었다.
만약 서버에서 다수의 클라이언트와 상태나 연결을 유지해야한다면 많은 리소스가 필요하다.
무상태 (Stateless)
서버는 클라이언트의 상태를 보존하지 않는다.
장점은 Scale Out 수평 확장성이 높으며 요청량이 증가하더라도 서버 증설이 쉽다.
단점은 상태를 보존하지 않으므로 클라이언트가 데이터를 추가적으로 전송해야한다.
로그인은 Cookie, Session, Token으로 Stateful을 구현할 수 있다.
비연결 (Connectionless)
HTTP는 연결을 유지하지 않는다.
장점은 연결을 유지하지 않기 때문에 서버 자원을 효율적으로 사용할 수 있다.
단점은 요청이 추가적으로 오면 TCP위에서 동작하기에 3 way handshake 를 새로 해야하므로
당연하게도 응답 시간이 증가한다.
웹사이트의 정적 자원 모두를 다시 다운로드 해야하는데 이는 캐시, 브라우저 캐싱으로 해결
현재는 HTTP 지속연결로 문제를 해결한다. (Persistent Connections)
요청메시지는 Start Line, Header, Empty Line, Message Body로 구성되어 있다.

위부터 순서대로 이며 각 구성요소에 무엇이 포함되는지 알아보자.
Start Line
GETpath 경로 /event
HTTP Request가 전송되는 대상, 절대 경로(”/”로 시작하는 경로)
Query String(= Query Parameter) 에 해당하는 값도 포함한다.
ex) /search?keyword=sparta
쿼리 문자열은 URL의 ? 이후에 위치하며, 요청 대상 리소스에 추가적인 정보를 전달하는데 사용된다.
1.1Header
Host: spartacodingclub.krfield-name: OWS field-value OWS (OWS : 띄어쓰기 허용) 구조를 가진다.field-name은 대소문자 구분을 하지 않는다.ex) Message Body 내용, 크기, 인증, 브라우저 정보, 서버 정보 등
Empty Line
Message Body
GET /search?keyword=sparta HTTP/1.1
Host: spartacodingclub.kr
Content-Type: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Authorization: Bearer abcdef12345

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85
Date: Tue, 29 Oct 2024 12:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
{
"results": [
{
"title": "Sparta Coding Club",
"url": "https://spartacodingclub.kr"
}
]
}