간단히 말하면 인터넷망을 통해서 통신을 하게 되는데, 인터넷망이 단순하지는 않다.
인터넷망에 해저 광케이블, 인공위성 등등... 수많은 종류의 노드(네트워크를 중간에서 연결해 주는 서버)들이 존재하고 이를 통해 통신을 하게 된다.
그럼 어떤 규칙에 따라 통신이 이루어 질까? 바로 IP를 이해해야 한다.
복잡한 인터넷망에서 미국에 있는 친구에게 메시지를 보낸다고 하자. 그럼 최소한의 규칙이 필요한데 그게 바로 IP 주소라는 것을 통해 가능하다.
지정한 IP Address에 패킷(Packet)이라는 통신 단위로 데이터를 전달한다.
패킷에는 출발지 IP, 목적지 IP, 기타 옵션 등의 정보가 담겨 있다.
친구에게 보낼 메시지에 패킷 정보를 씌워 인터넷망에 던지게 되면, 목적지 IP에 도착 가능한 서버(노드)들을 찾아 이동하여 메세지가 도착하게 된다. 요청과 응답 두 가지 모두 같은 방식으로 동작한다.
하지만 인터넷망이 복잡하기 때문에 요청과 응답이 서로 같은 노드를 타고 이동하는 것은 아니다.
비연결성
패킷을 받을 대상이 존재하지 않거나, 서비스 불능 상태여도 패킷을 전송한다. 대상 서버가 활성화돼있는지를 모르는 상태여도 무조건 패킷을 전송한다는 의미.
비신뢰성
중간에 서버(노드)에 문제가 생겨 패킷이 유실되어도 알 수 없다. 또한 패킷 1, 2를 순서대로 전송하고 목적지에서도 순서대로 받고 싶지만, 이를 보장할 수 없다. 패킷이 어떤 노드를 선택해서 가냐에 따라 순서는 달라질 수 있기 때문이다.
프로그램 구분
같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이라면 어느 곳에서 보내고자 하는 패킷인지를 구별할 수 없다.
위의 문제들을 해결해 주는 것이 바로 TCP 프로토콜이다.
IP의 한계에서 발생한 문제점 들은 TCP(전송 제어 프로토콜) 정보를 생성하여 메시지(데이터), IP 패킷과 결합시켜 보내주게 되면 해결된다.
TCP 정보에는 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보.. 등이 포함된다.
연결 지향 - TCP 3 way handshake
SYN: 접속요청 메세지 , ACK: 요청수락 메세지.
클라이언트에서 서버로 SYN 메세지를 보내면,
서버에서 클라이언트로 SYN + ACK 메세지를 보낸다
그러면 클라이언트에서 ACK를 보낸다
위 과정을 통해 클라이언트와 서버가 논리적인 연결이 되었다 보고 데이터 전송을 시작한다
데이터 전달 보증
IP와는 달리 TCP에서는 데이터를 전송하고 서버가 받으면 잘 받았다는 메시지를 보내주게 된다. 이를 통해 메시지를 받지 못하면 데이터가 유실된 것이라 인지할 수 있다.
순서 보장
PORT를 통해 어플리케이션을 구분
PC에서 게임, 화상 통화, 웹 브라우저 요청 3가지를 하고 있다고 하자. 그럼 패킷들을 보내고 받을 때 어떤 어플리케이션에 필요한 패킷인지는 PORT를 통해 구분한다.
IP는 서버를 찾는 것이고, 서버 안에서 돌아가는 애플리케이션을 구분하는 것은 PORT이다.
IP가 아파트 단지라고 하면 PORT는 몇 동 몇 호 라고 비유할 수 있다.
DNS
IP는 기억하기가 어렵고, 변경이 될 수 있다. 때문에 연락처와 비슷한 기능을 하는 DNS를 사용한다. Domain Name System의 줄임말이며 도메인 명을 IP 주소로 변환 시켜준다.
TCP의 특징들인 3-way-handshake, 데이터 전달 보증, 순서 보장들이 하나도 없다. 기능이 거의 없기 때문에 하얀 도화지에 비유된다. IP 패킷과 거의 비슷하나 PORT와 체크섬 정도만 추가된다.
그럼 이건 어디에 쓸까? TCP는 기능은 많지만 여러 정보가 담기다 보니 데이터의 크기도 커지고, 때문에 전송 속도도 빠르게 만들기 어려워 최적화에 어려움이 있다. 때문에 최적화를 위해서 UDP를 이용하는데 최근에는 많이 연구되고 쓰이고 있다.
통합 자원 식별자로써 인터넷에 있는 자원을 나타내는 유일한 주소다. URI의 하위 개념으로는 URL, URN이 있다.
URL(Uniform Resource Location)
일반적으로 우리가 웹 브라우저에서 적는 주소를 말하며 네트워크 상에서 리소스가 어디에 있는지 알려주기 위한 규약이다.
URN(Uniform Resource Name)
리소스의 이름을 부여하여 찾는 방법이지만, 실제로 URN 이름만으로 찾을 수 있는 방법이 보편화되지 않았다.
때문에 URI와 URL을 같은 의미로 봐도 무방하다.
https://www.google.com/search?q=hello&hl=ko 이 URL을 분석해 보자면
scheme://host[:port][path][?query]로 이루어져 있다
웹 브라우저에서 https://www.google.com:443/search?q=hello&hl=ko를 검색한다고 하자.