복잡한 인터넷 망에서 요청을 주고 받을 때는 규칙이 있어야 한다. 이러한 규칙을 IP라고 하는데
데이터는 전달할 때 패킷 통신 단위로 전달을 하는데, 클라이언 IP에서 출발하여 서버 IP에 도착할 때 까지 서로 노드끼리 이동하다 최종 목적지에 도착한다. 이때 패킷에는 출발지 IP 주소, 목적지 IP 주소, 전송 데이터가 들어있다.
패킷을 받을 대상이 없거나 불능 상태에 있더라고 무조건 패킷을 전송하게 된다.
패킷이 중간에 유실되어도 어떤 패킷이 유실되었는지 알려주거나 유실된 패킷을 방지할 수단이 없고, 패킷의 순서 보장도 어렵다.
예를 들어 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 여러개일 경우 IP 프로토콜은 서버 IP 만 가지고 있으므로 어떤 프로그램에 요청을 하는건지 구분하기 어렵다.
이 세가지의 한계점을 해결하기 위해 생긴 기술이 바로 TCP/UDP이다.
각각 Transfer Control Protocol/User Datagram Protocol의 약자로, 인터넷 프로토콜 4계층중 세 번째 계층인 전송 계층이다. IP 계층 위에서 보완해주는 용도라고 생각하면 된다.
IP 프로토콜에서 중간에 패킷이 손실되고 순서가 상이한 문제들을 TCP 프로토콜이 해결해준다. 예를들어 'Hello World' 라는 메시지를 보낼때 SOCKET 라이브러리를 통해서 OS 계층에서 TCP정보를 감싼다. 그 밑에 IP 패킷이 생성되면서 IP와 관련된 정보도 있고 그안에 TCP와 관련된 정보가 있다. 이 메시지를 랜카드를 통해서 나갈때 Ethernet frame을 포함해서 나가게 된다.
TCP/IP 패킷은 기존에 출발지 IP, 목적지 IP, 데이터만을 담고 있던 IP 패킷에 TCP 세그먼트를 추가하여 IP 패킷의 한계점을 보완한다. 패킷은 수화물을 뜻하는 패키지와 덩어리를 뜻하는 버킷을 합친말인데, 데이터를 넣는 박스같은 것을 뜻한다. TCP/IP 패킷은 출발지 및 목적지 정보 뿐만 아니라, 출발지와 목적지 port, 전송 제어 순서, 검증 정보 등의 추가적인 내용을 담는다 따라서, IP에서 해결되지 않던 문제들을 TCP세그먼트가 해결하게 된다.
연결 지향, 데이터 전달 보증, 순서 보장
클라이언트와 서버가 서로 연결이 가능한 상태인지 확인하는 절차를 거치고 연결하기 때문에 신뢰성을 높인다. 또한, 데이터 누락을 알 수 있게 해주기 때문에 데이터 전달이 보증된다. 마지막으로, TCP 패킷에는 순서와 관련된 정보가 추가되기 때문에, 패킷의 순서를 보장해준다.
TCP/IP 프로토콜을 이용해 통신을 하기 전, 정확한 전송을 보장하기 위해 상대 컴퓨터와 사전에 연결이 잘 되는지 확인하는 과정이다. 참고로 TCP 연결은 전용 랜선 직접 연결이 아닌 논리적인 연결이므로 클라이언트와 서버를 연결하는 수많은 서버들은 제외하고, 논리적으로 연결되었다고 간주하는 방식이다.
UDP의 경우 TCP에 비해 기능이 거의 없는 프로토콜이다. UPP는 비연결성, 비신뢰성 전송 프로토콜로, 3 way handshake 과정도 없고 데이터 전달 및 순서가 보장이 안 된다. IP 프로토콜과 비슷한 기능을 하지만 다른 점은 PORT가 추가되었다는 것이다. 정확히 PORT와 체크섬이라는 속성이 추가된 프로토콜이다.
PORT: 포트는 컴퓨터의 세부주소로 하나의 컴퓨터로 노래도 들으면서 웹서핑과 게임을 할 수 있는데 이때 내 pc는 하나의 IP를 가지고 있기 때문에 어떤게 게임 패킷인지 노래패킷인지 구분하기 어려운데 이걸 구분해주는 것이 포트이다.
체크섬: 체크섬은 메세지가 제대로 왔는지 검증해주는 데이터를 말한다.
UDP의 장점은 내가 원하는 기능을 추가해서 커스텀할 수 있다는 장점이다. 원래 데이터를 빠르게 전송하는 용도로 사용한다.
도메인 네임 시스템의 약자로 ip 주소에 도메인 이름을 등록할 수 있게 해준다. ip 주소는 외우기도 어렵고 변경될 수 있기 때문에 dns를 통해 전화번호 부 같은 서버를 제공해서 쉬운 도메인을 등록 할 수 있다.
GET / HTTP/2
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
HTTP/2 200 OK
Content-Type: text/html; charset=UTF-8
Cache-Control: private, max-age=0
Date: Mon, 26 Aug 2024 12:00:00 GMT
Expires: -1
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Google</title>
...
</head>
<body>
...
</body>
</html>
GET /css/main.css HTTP/2
Host: www.google.com
Referer: https://www.google.com/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/css,*/*;q=0.1
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
POST /search?q=example HTTP/2
Host: www.google.com
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: application/json, text/javascript, */*; q=0.01
Referer: https://www.google.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: 1P_JAR=2024-08-26-12; NID=511=example...
Connection: keep-alive
q=example&source=hp
HTTP/2 200 OK
Content-Type: application/json; charset=UTF-8
Cache-Control: private, max-age=0
Date: Mon, 26 Aug 2024 12:00:01 GMT
Expires: -1
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
{
"results": [
{
"title": "Example Domain",
"link": "https://example.com/",
"snippet": "Example Domain. This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking ..."
},
...
]
}
이 과정에서 주목할 점