- 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 수강하면서 정리한 내용입니다.

예를 들어 클라이언트가 한국에 있고 서버가 미국에 있다면 한국에 있는 클라이언트가 'Hello, world'라는 메시지를 보내야 하는데 중간에 노드라고 하는 서버들을 걸쳐서 미국에 있는 서버에게 안전하게 메시지를 도착해야 한다.
어떤 규칙으로 미국에 있는 서버에게 안전하게 도착할 수 있는지 이해 하려면 먼저 IP(인터넷 프로토콜)에 대해서 알아야 한다.



비연결성
패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송한다.
비신뢰성
서버들이 전달하는 사이에서 중간 노드가 사라지거나 꺼져있으면 패킷이 소실된다.

메시지를 한 번 보낼때 1,500byte가 넘으면 끊어서 보내는데 패킷들이 다른 노드를 타서 순서대로 안 올 수 있다.
프로그램 구분IP 프로토콜의 문제점을 TCP 프로토콜이 해결해준다.
애플리케이션 계층 - HTTP, FTP
전송 계층 - TCP, UDP
인터넷 계층 - IP
네트워크 인터페이스 계층


연결지향 - TCP 3 way handshake (가상 연결)
SYN(Synchronization:동기화) : 접속 요청
ACK(Acknowledgement:승인) : 요청 수락
그리고 TCP 연결이 되었다고 연결이 된게 아니라(물리적인 연결) 개념적 연결이다.
데이터 전달 보증
메시지에 TCP 프로토콜이 포함되어 있으면 메시지를 전송할 때 서버에서 잘 받았다고 다시 보낸다.
클라이언트가 메시지를 잘 전달 됐는지 안됐는지 알 수 있다.
순서 보장
메시지가 1,500byte가 넘어 패킷을 1번, 2번, 3번 순서로 나눠서 보냈다. 서버에서 1번, 3번, 2번 순서로 도착을 하면 내부적으로 최적화하는 로직에 따라서 2번부터 다시 보내라고 클라이언트에 보낸다. 그래서 순서가 보장이 된다.
신뢰할 수 있는 프로토콜
TCP 정보 안에는 전송 제어, 순서, 검증 정보가 있어서 TCP 프로토콜이 신뢰할 수 있는 프로토콜이라고 한다.
현재는 대부분 TCP 사용
TCP는 3 way handshake 하는데 시간이 오래 걸리고, 데이터 양도 크고, 최적화 할수가 없다. 즉, 손을 댈 수가 없다.
반면에 UDP는 하얀 백지이기 때문에 단순하고 빠르고, 기능 확장이 가능하다.

클라이언트에서 게임도 하고 화상통화도 하고 웹 브라우저도 하고 있으면 여러 개의 서버랑 통신해야한다. 클라이언트 IP에서 패킷이 오는데 이 패킷이 게임에서 온 패킷인지 화상통화에서 온 패킷인지 알 수가 없다.
반대로도 마찬가지이다. 이러한 문제를 어떻게 구분할 수 있을까?


IP : 목적지 서버를 찾는 용도
PORT : 서버 안에서 돌아가는 애플리케이션을 구분하는 용도

같은 IP 내에서 프로세스를 구분하는 게 PORT 이다.
위 예시처럼 각각 클라이언트와 서버 안에 맞는 PORT 번호를 찾아서 연결하면 된다. 여기서 패킷을 보낼 때 IP와 PORT를 포함해서 보낸다.



IP의 기억, 변경 문제를 해결할 수 있다.
도메인을 사기 위해서 DNS 서버에 도메인을 등록을 할 수 있다. 클라이언트가 DNS 서버에다가 도메인에 맞는 IP를 달라고 요청하면 DNS 서버가 응답하고 클라이언트는 서버에 도메인으로 접속할 수 있다. 나중에 IP가 변경되면 DNS 서버에 등록된 도메인에 IP를 변경할 수 있다.