본 포스팅은 널널한 개발자님의 네트워크 강의를 보고 정리한 내용입니다.
우리가 사용하는 PC는 크게 3가지 구성으로 나눌 수 있습니다. 일반적인 어플리케이션이 동작하는 user레벨, 운영체제 등이 동작하는 kernal레벨, 그리고 H/W입니다.
TCP/IP 와 같은 네트워크 계층 역시 이러한 구성의 어딘가에 존재합니다. 이를 나눠보면 다음과 같습니다.
process가 kernal 레벨의 TCP 등과 소통할 수 있게 해주는 socket이 있습니다.
또한 각각의 계층에 있는 대상들을 식별하기 위한 개념들이 존재합니다. 이들은 식별자로서 동작합니다.
네트워크에선 저런 식별자를 통해 데이터를 어디로 전송해야 하는지 판단하고 통신하게 됩니다.
Host란 쉽게 말하면 인터넷에 연결되어 있는 pc를 말합니다.
그런데 사실, 네트워크에 연결된 컴퓨터는 host만 있는 것은 아닙니다. 네트워크에 연결된 컴퓨터는 크게 2가지 종류로 나눌 수 있습니다.
네트워크에 연결된 컴퓨터는 peer, server, client와 같이 Network를 이용하는 이용주체가 있습니다. 이들은 End-point라고도 불리우며 이들이 바로 Host입니다.
반면 네트워크 그 자체를 이루는 Router, F/W, IPS와 같은 컴퓨터들이 있습니다. 이들은 Switch 라고 불립니다.
또한 Network는 Internet을 의미합니다. Internet은 정확하지는 않지만 라우터와 DNS의 집합으로 볼 수 있습니다.
우리나라의 행정체계를 생각해봅시다. 개인은 각자를 식별하는 주민등록번호를 갖고 있습니다. 이들은 유니크한 개념으로 번호를 통해 개인을 식별할 수 있도록 도와주죠. 마찬가지로 ip주소는 host를 구별할 수 있도록 도와줍니다.
이런 IP주소는 IPv4(32bit)와 IPv6(128bit)가 있습니다. 이 중 실질적으로 사용하는 개념은 IPv4입니다. IPv4는 32bit로 가능한 경우의 수는 2^32으로 대략 43억개 정도입니다. 이는 현실에 존재하는 Host를 감당하기에 터무니없이 작은 수죠.
이러한 주소의 고갈을 막기 위해 각 라우터가 브로드캐스팅하는 로컬 네트워크 영역에 공인 IP 대역을 호스트가 필요한 만큼만 할당하려고 했습니다.
이를 위해 로컬 네트워크 내부에서 접속한 호스트의 IP 대역을 외부 네트워크와 명확하게 구분할 수 있는 수단을 표준화 하였고 이것을 서브넷 마스크 라고 부릅니다.
IPv4가 192.168.60.14 라고 해봅시다. IP주소는 8bit씩 끊어져 있고 이들은 각각 0~255의 값을 가질 수 있습니다.
IP주소는 크게 Network Id와 Host Id로 나뉘어집니다. 이를 IP에서 표시하기 위해 192.168.60.14/24 또는 서브넷 마스크: 255.255.255.0 등으로 표시합니다.
24는 앞의 24자리가 네트워크 아이디를 나타낸다는 의미입니다. 서브넷 마스크의 255.255.255.0 역시 이진수로 바꾸면 앞의 24bit가 1인 값이 나옵니다.
즉 24는 Network Id의 길이를 나타내는 것이죠. 24인경우 Host Id = 32-24 = 8이 됩니다.
192.168.60.14
255.255.255.0
이들의 논리곱은 다음과 같습니다.
192.168.60.0
이것이 바로 네트워크 아이디 입니다. 192.168.60.0 네트워크에 포함된 호스트들은 네트워크 아이디인 24자리를 제외한 나머지 8자리에서 정해야 합니다.
즉, 0~255를 이용해 정하게 되며 이 중 네트워크 주소와 브로드캐스트 주소는 제외하여 1~254까지 사용하게 됩니다.
정리하자면 다음과 같습니다.
Port 번호를 개발자의 입장에서 해석하면 Process 식별자 입니다. 이들은 데이터 통신시 어떤 프로세스로 데이터가 전달되어야 하는지 식별하도록 해줍니다.
user모드에 3개의 프로세스가 있다고 가정해보겠습니다.
통신으로 인해 들어온 데이터는 H/W부터 process까지 decapsulation을 진행하며 전달됩니다. 이때 TCP 단계에서 데이터를 어떤 프로세스에게 전달해야 하는지 식별할 수 있도록 하는 것이 port 번호입니다.
각각의 프로세스는 서로 다른 번호를 갖고 있어야 합니다. 같은 포트 번호는 같은 프로세스를 의미하기 때문이죠. 따라서 이들의 값은 고유합니다.
그렇다면 Port 번호는 얼마나 존재할 수 있을까요? Port 번호는 일반적으로 16bit로 표현합니다. 이는 즉 2^16 = 0 ~ 65535 까지의 경우의 수가 나오게 됩니다.
이 중 0번과 65535번은 사용할 수 없습니다. 따라서 프로세스를 구별하는 Port 번호는 1 ~ 65534 까지의 값을 갖습니다.
Network를 고속도로로 생각해봅시다. Switch는 교차로에 해당하며 Switching은 경로를 선택하는 것을 의미합니다.
선택이라는 것은 많은 경우의 수 중 한가지를 택하는 일이죠. 운전하는 경우를 확인해봅시다. 우리는 목적지에 도착하기 위해 교차로에서 길을 선택해야 합니다. 이때 우리는 이정표를 확인합니다.
이런 이정표는 경로 선택의 근거가 되는 것이죠. 네트워크에서도 이는 마찬가지 입니다. 교차로에 해당하는 개념은 보통 L3 Router이며 Router는 라우팅 테이블을 이용해 경로를 설정합니다.
즉, 이를 이용해 목적지까지 패킷을 운반할 수 있는 것이죠. 그런데 서울에서 부산을 갈 때
이런 식으로 이동할 수 있습니다. 둘은 서로 다른 경로지만 둘 다 원하는 목적지에 도착할 수 있습니다. 하지만 상식적으로 1번 경로보다 2번 경로가 더 최적화 된 경로라고 알 수 있죠.
라우터에서도 마찬가지 입니다. 경로를 선택할 때 목적지까지 최적화 된 경로로 데이터를 운반해야 합니다. 이를 위해 라우터는 주변의 다른 라우터들과 계속 소통하며 라우팅 테이블을 계속 최적화 된 상태로 유지하게 됩니다.
User mode의 process가 TCP에 접근하기 위해 socket을 사용한다고 했습니다. socket이란 본질이 file입니다. 따라서 file I/O가 필요합니다.
파일의 특징이 무엇일까요? 바로 Stream이라는 것입니다. Stream의 특징은 무엇을까요? 바로 길이가 일정하지 않다는 것입니다.
파일을 생성하여 1줄을 쓰면 1줄의 길이가 될 것이고 1000줄을 쓰면 1000의 줄이 되기 때문이죠. 이처럼 user mode에서 socket에 I/O하는 데이터는 Stream 형식으로 길이가 일정하지 않습니다.
하지만 TCP, IP 등에서 사용할 수 있는 데이터의 크기는 한계가 있죠. 따라서 Stream 데이터를 일정 크기로 조각내서 내려보내게 됩니다.
이때 이렇게 조각내는 과정을 Segmentation이라고 합니다. 그리고 일정 크기로 잘린 조각을 Segment라고 하며 TCP에서 사용하는 데이터 단위가 됩니다. 그리고 일정 길이를 바로 MSS (Maximum Segment Size)라고 합니다.
이 MSS는 IP계층에서 사용하는 Packet이라는 데이터 단위의 크기로 결정되며 Packet의 최대 크기는 MTU (Maximum Transmission Unit)이라고 불리며 일반적으로 1500 byte입니다.
<출처>