
어릴 때 인터넷을 사용한다, 인터넷 검색을 한다.
이 정도로만 사용했던 인터넷이라는 단어를 자세히 들여다보자니 신기하다는 생각이 든다.
인터넷, 웹이라고 불리우는 세상은 클릭과 Enter로 모든 것이 해결되는 것 같지만,
실상은 요청하는 자와 응답하는 자가 데이터를 주고 받는 세상이다.
인터넷, 웹의 세계에 대해 자세히 알아보자.

인터넷 프로토콜은 이론적 참조 모델인 OSI 7계층과
실제 인터넷 구현에 사용되는 TCP/IP 4계층으로 나뉜다.
여기서는 TCP/IP 4계층에 대해 알아본다.
다양한 데이터 전송 방법이 있지만 오늘날에는 대부분 HTTP를 사용한다.
애플리케이션 계층(Application layer)에서는 HTTP Message를 생성한다.
응용 프로그램과 운영체제의 네트워크 기능을 쉽겨 연결하기 위해
Socket Library를 사용하기 때문에 개발자는 쉽게 애플리케이션 개발이 가능하다.
전송 계층(Transport Layer)에서는 TCP Segment를 생성한다.
TCP Segment는 헤더와 데이터 섹션으로 구분할 수 있으며
헤더에는 PORT 번호와 같은 전송을 위한 정보가 포함되고,
데이터 섹션에는 애플리케이션 계층에서 생성한 HTTP Message를 포함한다.
인터넷 계층(Internet Layer)에서는 IP Packet을 생성한다.
IP Packet도 마찬가지로 헤더와 데이터 섹션으로 구분할 수 있으며,
헤더에는 IP 주소를 포함하여 데이터 전송을 위한 다양한 정보가 포함되고,
데이터 섹션에는 전송 계층에서 생성한 TCP Segment를 포함한다.
네트워크 인터페이스(접근) 계층에서는 Ethernet 프레임을 생성한다.
Ethernet 프레임도 헤더와 데이터 섹션으로 구분할 수 있으며
헤더에는 MAC 주소와 같은 다양한 정보가 포함되어 있고,
데이터 섹션에는 인터넷 계층에서 생성한 IP Packet을 포함한다.
컴퓨터를 설치하면서 꽂았던 LAN 카드를 통하여 스위치, 라우터를 거쳐 데이터가 전송된다.

IP 주소에는 출발 IP와 도착 IP에 대한 정보가 있으며
출발지부터 도착지 사이의 수많은 Node가 있어도 IP정보를 통해 올바르게 다음 Node로 안내한다.
IP 숫자 형식은 000.000.000.000과 같은 숫자 형식으로 표현되는데,
기억하기 어려울 뿐만 아니라 변경될 수 있기 때문에 더욱 사용이 어렵다.
그래서 등장한 것이 바로 DNS이다.
DNS란 기억하기 어려운 IP를 좀 더 쉽게 사용하기 위해 이름을 붙여주는 것을 의미한다.
예를 들어 000.000.000.000이라는 숫자 형식 대신,
google.com이라는 이름을 부여하는 것이 바로 DNS다!
사용자가 google.com이라는 주소를 입력하면,
DNS 서버에 자동으로 google.com이라는 DNS 이름의 IP를 요청하게 되고,
DNS 서버는 google.com이 가지고 있는 IP를 반환하여 해당 IP로 접속할 수 있게 된다.

IP 통신은 다음과 같은 문제점을 가지고 있다.
IP Protocol은 IP가 잘못되었거나, 네트워크가 연결되지 않은 상태여도 데이터를 전송한다.
전송하지 않아도 될 상황에서 데이터를 전송하여 비효율이 발생한다.
데이터는 네트워크 환경과 유실될 수 있다는 점을 고려해 packet 단위로 나누어 전송된다.
예를 들어 데이터가 100이어서 100을 한번에 보냈을 때 데이터가 유실되면
다시 데이터를 100만큼이나 다시 보내야 한다.
하지만 100을 1로 나누어 100개를 보냈을 때, 1개만 데이터가 유실된다면
99는 이미 보낸 상태로 1개만 다시 보내면 되기 때문에 더 효율적으로 상황에 대처할 수 있다.
하지만 IP Protocol은 데이터의 유실과 순서를 보장하지 않는다.
일부 데이터가 보내지지 않을 수 있고, 보낸 데이터의 순서가 뒤바뀔 수 있다.
IP Protocol은 어떤 IP 주소로부터 데이터가 전송되었는지는 알 수 있지만,
해당 IP 주소의 어떤 응용 프로그램으로부터 데이터가 전송되었는지는 알 수 없다.

TCP(Transmission Control Protocol)는 전송 제어 통신 규칙으로
IP Protocol이 가진 문제점을 해결한다.
TCP Protocol은 네트워크 연결이 되어있는 상태에서만 데이터를 전송한다.
첫째로 발신자가 수신자에게 연결을 요청하고
둘째로 수신자가 발신자의 연결 요청을 수락함과 동시에 수신자가 발신자에게 연결을 요청하며
셋째로 발신자가 수신자의 연결 요청을 수락한다.
이후 연결이 된 상태에서 데이터가 전송되기 때문에 3-way handshaking이라고 한다.
TCP Protocol에서는 데이터 packet에 순서 번호를 포함시켜 순서를 보장한다.
또한 타임아웃 발생 시 잘못된 데이터 전송을 감지하여 재전송을 하기 때문에 손실을 방지한다.
IP Protocol과는 달리 데이터 전송의 신뢰성을 확보한다.
TCP Protocol의 헤더에는 PORT 정보가 포함되어 있다.
PORT 번호를 통하여 동일한 IP 주소에서도 프로그램을 구분할 수 있다.

TCP Protocol은 안정적인 대신 매우 무거운 전송 방식으로 네트워크 연결에 시간 소모가 크다.
데이터 전송 속도를 더욱 빠르게 하기 위하여
IP Protocol의 심각한 문제점을 일부 보완함과 동시에
필요한 기능만을 커스터마이징할 수 있는 UDP가 등장한다.

UDP Protocol은 데이터 신뢰를 보장하기 위한 오류 발생 여부인 checksum과
프로그램을 구분하기 위한 PORT 번호만을 포함한다.
마치 백지와 같은 상태로 개발자가 추가해서 통신을 제어할 수 있다.
예를 들어 데이터 전송 상황에서 오류가 발생한 경우 checksum을 통해 확인할 수 있고,
재요청하거나 다른 조치를 취하는 것은 애플리케이션 계층에서 커스터마이징이 가능하다.
UDP Protocol은 매우 단순하고 빠르다는 장점이 있다.
참고로 PORT 번호 중 0 ~ 1023은 잘 알려져 있는 번호로 사용하지 않는 것이 좋다.

URI(Uniform Resource Identifier)는 통합 규칙 자원 구분자로
웹의 자원을 가리키는 주소이다.
즉, 데이터를 식별하고 접근하게 하는 문자열이라고 할 수 있다.
URI는 자원의 위치인 URL과 자원의 이름인 URN으로 나뉘는데,
URL의 보편화로 URN은 거의 사용하지 않아 사실상 URI와 URL이 같다고 보면 된다.
우리가 인터넷, 웹에서 무언가를 클릭하여 해당 페이지로 이동하거나
또는 이동을 위해 직접 입력하는 주소가 바로 URL인 것이다.
URL은 하나의 주소같아 보이지만 그 내부는 다양한 요소로 이루어져 있다.
scheme://[userinfo@]host[:port][/path][?query][#fragment]
Protocol 규칙이 작성되는 자리이다.
대부분 https를 사용하는데, https는 http에 보안이 추가된 프로토콜이다.
URL에 사용자 정보를 포함해서 전달할 수 자리이다.
거의 사용하지 않는다.
IP 주소 또는 DNS 주소가 작성되는 자리이다.
Protocol에 부여된 번호를 입력하는 자리이다.
프로토콜 설정 시 자동으로 부여되기 때문에 보통 생략한다.
Resource, 데이터의 경로를 입력하는 자리이다.
'/'를 사용하여 계층 구조를 표시한다.
query parameter 또는 query string이라고도 한다. '?'로 시작한다.
key=value 형태로 작성되며, '&'를 사용하여 여러 query를 표현할 수 있다.
'#'로 시작한다. 웹 페이지 내 특정 위치를 지정할 수 있다.
서버에 전송되지 않고 클라이언트 측에서만 동작한다.

인터넷 프로코톨 TCP/IP 4계층과 각 구성의 정보를 바탕으로
데이터를 전송하는 과정은 아래와 같다.
1. DNS로 IP를 요청한다. // 애플리케이션 계층 시작
2. DNS가 IP를 반환한다.
3. 반환 받은 IP를 도착 IP로 설정하여 HTTP Message를 생성한다.
4. 웹 브라우저가 Socket API를 통해 운영체제에 전달한다.
5. 운영체제가 TCP Segment, IP Packet, Ethernet Frame을 만들어
네트워크 인터페이스 드라이버로 전송하고 드라이버는 네트워크 인터페이스 카드로 전달한다.
6. 네트워크 장비(스위치, 라우터 등)를 통해 목적지까지 전달한다.

개발자가 다루어야 할 HTTP Message를 이해하기 위해서는
먼저 웹 계층에서 데이터가 전송되는 과정을 이해하고 웹 자체를 이해해야 한다.
IP와 DNS, TCP와 UDP 그리고 URL에 대해 이해하고
HTTP Message 통신 과정을 복합적으로 생각해보자.