인터넷이 인터넷이라 인터넷이라 답하였는데..., 무엇이 인터넷이냐 하시면...
인터넷이 뭔가요? 라고 물으면 사실 뭐라고 딱 정리해서 말하기가 어렵다. 우리 삶에 너무 침투해 있기에 그냥 인터넷이 인터넷이지! 이런 생각 밖에는... 하지만 인터뷰에서 누가 "인터넷을 설명해보세요." 하면 "인터넷, 우리가 맨날 쓰는 그거요!" 라고 할 순 없으니, 쿠로쓰(James W. Kurose: Computer Networking - A Top-Down Approach의 저자) 교수님의 말을 빌려보자.
인터넷을 설명하려 할때, 두 가지 관점으로 답을 할 수 있다.
첫 번째는 nuts and bolts 관점, 두 번째는 인터넷을 서비스를 제공할 수 있게끔 도와주는 infrastructure로 보는 관점. 먼저 첫 번째 관점부터 보자.
본 글에서는 전문용어(jargon)과 주요 문장은 그냥 영어 그대로 썼다. 중간중간 영어 용어를 소리나는대로 적은 부분도 있다.
인터넷은 네트워크인데, 전세계의 computing devices 를 연결하는 네트워크다. (Internet is a computer network that interconnects billions of computing devices throughout the world)
이런 computing device들은 초기에는 데스크탑 컴퓨터, 서버 컴퓨터들이었고, 이제는 스마트폰, 태블릿, 자동차, 스마트 냉장고 등등 많은 것들이 computing device가 됐다. 그리고 이런 디바이스들을 인터넷 용어로 host 혹은 end system 이라고 한다 (당신의 폰, 랩탑, 인터넷과 연결된 자동차, 네이버 데이터 센터에 있는 서버 컴퓨터 등등이 모두 호스트다!). 앞으로는 host와 end system을 혼용해서 사용하겠다.
그럼 이런 호스트들은 어떻게 서로 연결되어 네트워크를 이루는가? 바로 communication link 와 packet switch 들로 연결된다.
Communication link 는 물리적으로 디바이스들을 연결해줄 수 있는 여러 종류의 선들을 의미한다. 우리가 일반적으로 케이블이라고 하는 것들이다 (집에서 볼 수 있는 인터넷 연결 케이블, 땅속에 묻혀있을 광케이블 등등). 그거 외에도 여러 종류가 있는데, 예를 들어 coaxial cable, copper wire, optical fiber, radio spectrum 등이 있다. 그리고 물론 링크의 종류마다 데이터를 전달하는 속도가 다를 것이다. 이 속도를 transmission rate 라고 하고, 단위는 bits/second (초당 얼마나 많은 비트가 이동하는가) 이다.
A 호스트에서 B 호스트로 어떤 정보를 링크를 통해서 전달한다고 하자. 그럼 먼저 보낼 데이터를 작은 조각으로 나누고 각 조각 앞에 header bytes 를 붙여야한다. 헤더가 붙은 작은 조각의 데이터를 packet 이라고 한다. 그리고 이 페켓들이 B에 도착하면 다시 assemble 되어 원래의 데이터로 돌아간다. 우리는 앞으로 계속 이 페켓의 관점으로 데이터가 어떻게 이동하는지 살펴볼 것이다.
Packet switch 는 중간중간에 있는 포인트 같은 애들로 페켓을 정보가 들어오는 communication link에서 정보를 보내줄 communication link로 전달해준다 (한국에서 아르헨티나로 직접 연결되는 한 줄의 링크가 있을 수는 없으니!).
페켓 스위치에는 여러 종류가 있는데, 중요한 것은 router 와 link-layer switch 다. 링크 레이어 스위치는 주로 access network (end system들과 직접 연결된 네트워크, 쉽게 생각해서 집 네트워크) 에서 사용되고, 라우터는 network core (access network와 반대로 전체 네트워크에서 엔드 시스템들과 직접 연결되지 않은 안쪽 부분의 네트워크)에서 주로 사용된다. 출발지점부터 여러 링크와 페켓 스위치를 순서대로 거쳐 도착지에 도달하는 순서를 route 혹은 path 라고 한다.
그럼 이렇게 호스트들이 연결될 수 있도록하는 링크, 페켓 스위치 등의 인프라는 누가 제공하는가? 인터넷을 사용할 수 있게끔 해주는 엔티티들을 Internet Service Provider (ISP) 라고 한다. SKT 같은 회사가 만든 네트워크를 생각해도 좋다. 지역 단위로 네트워크를 제공하는 ISP를 lower-tier ISP 라고 하고 이런 lower-tier 들은 국가, 국제적 단위의 upper-tier ISP 에 연결된다. Upper-tier ISP 들은 high-speed router와 fiber-optic link를 통해 직접적으로 연결된다.
그럼 인터넷을 이루는 조각들을 알아보았는데, 그럼 정보를 보낼 때 아무렇게나 막 보낼 수 있을까? 물론 아니다. end system, packet switches 등의 인터넷 구성요소들은 protocol 에 따라 정보를 보내고 받는다. 인터넷에서 가장 중요한 두 가지 프로토콜은 Transmission Control Protocol (TCP) 와 Internet Protocol (IP) 이다. 그래서 인터넷의 pricipal protocols를 TCP/IP 라고 한다.
IP 프로토콜은 페켓의 라우터와 호스트들 사이에서 주고 받아질때, 어떤 format이 되어야 하는지를 정한 규칙이다. 이런 포로토콜을 누구나 따라야 서로 정보를 교환할 수 있기에, Internet standard 가 IETF (Internet Engineering Task Force) 라는 단체에 의해서 정해졌다. 이런 스탠다드 도큐멘트들은 requests for comments (RFCs) 라고 하는데, 원래 '이게 네트워크와 우리가 따라야할 프로토콜에 대한 내 아이디언데, 코멘트를 달아주세요' 하는 문서로 시작되었다가 standard 가 된 것들이다. 약 9000 개의 RFC 들이 있고 (굉장히 테크니컬하여 나같은 초보자는 접근하기 어렵다), TCP, IP, HTTP, SMTP 등 여러 프로토콜과 커뮤니케이션 링크에 대하여 정의하고 있다. WiFi 와 Ethernet 에 대해서는 IEEE 802 LAN Standard Committee 가 그 standard를 정의하고 있으니 참고하시라.
인터넷은 어플리케이션들에게 서비스를 제공하는 인프라다 (Internet is an infrastructure that provides services to applications) 라고도 할 수 있다. 이메일, 웹서핑, 핸드폰의 여러 앱들처럼 엔드 시스템들이 서로 정보를 주고 받아야하는 일명 인터넷 어플리케이션 혹은 distributed application 에게 서비스를 제공하는 인프라로 인터넷을 바라보는 것이다.
이런 관점으로 인터넷을 정의할때, 한 가지 생각해볼 것이 있다. 인터넷을 사용하는 어떤 앱이 있다고 해보자. 개발자는 이 앱을 사용자의 기기 즉 엔드 시스템 위에서 돌아가도록 자바든 파이썬이든 어떤 프로그래밍 언어를 이용해서 만들었을 것이다. 그런데 내 스마트폰에서 돌아가고 있는 이 앱은 어떻게 다른 스마트폰에서 돌아가고 있는 앱과 정보를 주고 받으라고 인터넷에게 요청을 하고있는 것인가? 이 인터넷이라는 인프라에게 어떻게 지시를 해야 한 기기에서 돌아가고 있는 프로그램에서 생성된 정보를 다른 기기에서 돌아가고 있는 프로그램에게 전달할 것인가?
인터넷과 연결된 호스트들은 socket interface 라는 것이 있어서, 이를 통해 인터넷 인프라에게 이 기기의 프로그램의 정보를 다른 기기의 프로그램에게 전달해달라고 구체적으로 요청할 수 있다. 이 인터넷 소켓 인터페이스는 프로그램의 정보를 원하는 위치로 보내기 위한 일련의 규칙들이다. 이는 마치 인터넷이 우체국이고, 우편물을 보내려면 우리가 우체국이 알아들을 수 있도록, 우편물을 봉투에 담고, 출발지와 도착지 정보를 적고, 포장하고, 오른쪽 상단에 스탬프를 찍고, 우편함에 넣고 하는 일련의 과정을 따르는 것과 같다. 그리고 우체국은 우편물을 전달하는 것 외에도 다양한 서비스를 제공한다. 예를 들어, express delivery, reception confirmation 같은 것들이 있다. 이와 마찬가지로 우리고 인터넷 어플리케이션을 만들 때 인터넷이 제공하는 어떤 서비스를 사용할지 선택할 수 있다. 이에 대해서는 나중에 더 살펴보자.
인터넷이 대략 무엇인지 감이 잡혔다면, 각각의 구성 요소와 인터넷이 동작하게끔 하는 규칙들은 무엇인지 조금 더 구체적으로 살펴볼 필요가 있다. 먼저 정보를 주고 받기 위한 규칙 혹은 약속이라고 할 수 있는 프로토콜을 살펴보자.
네트워크 프로토콜은 사람들이 소통하기 위한 프로토콜과 다를 바가 없다. 사람이라는 주체가 hardware 나 software 가 됐을뿐. 특정 메시지를 내가 보내면 (예를 들어 안녕!), 다른 사람이 어떤 메시지를 보내거나 무시하고 (나도 안녕! 혹은 답 없음), 그 받은 메시지에 대해서 특정 행동을 취하는 것이다 (몇 시야? 혹은 일정 기간 답이 없으니 소통을 포기함). 만약 대화의 두 주체가 서로 다른 프로토콜을 따른다면, 대회가 이뤄지지 않을 것이다. 네트워크에서도 마찬가지다. Communicating entity 들이 서로 다른 프로토콜을 따른다면 태스크를 수행할 수가 없다.
프로토콜의 정식 정의는 다음과 같다:
A protocol defines the format and the order of messages exchanged between two or more communicating entities, as well as the actions taken on the transmission and/or receipt of a message or other event.
: 프로토콜은 둘 이상의 communicating entity 들이 주고 받는 메시지나, 전달 방식, 받은 메시지나 이벤트에 대한 액션의 형식과 순서를 정의한다.
쉽게 말해서 네트워크 프로토콜은 A랑 B가 서로 소통해서 어떤 일을 하고 싶은데, 그때 어떤 메시지를 어떤 순서로 어떻게 주고 받고, 답장으로 특정 메시지나 특정 이벤트를 수신하면 다시 어떤 메시지를 보내고, 어떤 행동을 취할지 정해놓은 규칙들이라고 생각하면 되겠다!
그리고 서로 다른 프로토콜은 서로 다른 태스크를 수행한다는 점을 알아두자. 컴퓨터 네트워킹 과목은 결국 이런 여러가지 네트워크 프로토콜을 공부하는 것과 같다.