본문 바로가기

리눅스 커널 Linux kernel

9장 네트워킹 - 1

컴퓨터는 통신 프로토콜이라는 하나의 약속을 정해 서로 통신을 하게 됩니다.

네트워크에선 사람들의 이름처럼 구별할 수 있는 고유의 명칭이 필요합니다. 이를 NIC(Network Interface Card)마다 지정되어 있는 IP주소를 통해 표현합니다. 한 컴퓨터에서 다양한 사용자 프로그램들이 한 개의 NIC를 통해 동시에 통신하려는 경우엔 각각의 사용자 태스크를 구분하기 위해 고유의 번호가 필요해집니다. 이를 포트(port) 번호라고 합니다.

통신을 하기 위한 양측은 서로 IP주소와 포트 번호를 알고 있어야 하고 미리 정해진 약속, 즉 프로토콜을 지켜야만이 통신이 가능해집니다.

프로토콜은 계층 구조로 이루어져 있습니다. OSI 7 계층이라고 1학년 때 컴퓨터 개론들을 때, 정보처리 산업기사 공부할 때 들었던 단어를 다시 보게 되네요. 일반적으로 TCP/IP 프로토콜이 많이 사용됩니다.

출처 : jkkang.net

 

 

Figure 1. 계층구조

 

 

가장 상위의 BSD socket층은 사용자 태스크에게 소켓이라는 객체를 제공합니다. 통신을 하려는 태스크는 각자의 소켓을 가지고 파일시스템 인터페이스를 통해 일관된 구조로 통신을 하게 됩니다.

여기서 소켓 인터페이스의 대표적인 것으로는

위의 표와 같은 것들이 있고, 연결이 설정되면 이후 send(), recv(), read(), write()으로 데이터 전송이 가능해집니다.

BSD socket 층에서는 프로토콜 패밀리를 선택할 수 있습니다. 리눅스에서 지원하는 대표적인 것으로는 INET(TCP/IP 프로토콜 지원), UNIX(유닉스 도메인), IPX, APPLETALK 등이 있습니다.

 

이 중에서 INET을 선택하게 되면, Figure1의 INET socket 층으로 내려가게 됩니다. 여기서 사용자는 socket의 유형을 스트림, 데이터그램, Raw, Reliable Delivered Messages 등에서 선택할 수 있습니다. 일반적으로 스트림(TCP), 데이터그램(UDP)를 많이 사용합니다.

스트림은 연결지향의 신뢰성을 보장합니다. 전송 데이터의 정확한 수신을 확인합니다.

데이터그램의 경우 비연결 지향으로 전송 데이터의 도착 여부 조차 알 수 없습니다.

Figure1계층구조 그림에서 TCP를 선택하면 TCP 층으로 내려가고, UDP를 선택하면 UDP 층으로 내려갑니다.

 

이 층을 지나면 IP층으로 내려가게 됩니다. IP층에선 IP 주소를 사용해 통신을 합니다. 자신의 IP 주소와 목적지 IP 주소를 이용해 패킷을 만듭니다. 또한 IP 층에선 에러 처리를 위한 체크섬, 데이터가 너무 클 경우 단편화, 다른 호스트로 재 전송 등을 수행합니다. 여기에 더하여 라우팅 정보와 목적지 IP를 보고 해당 네트워크 드라이버에게 패킷을 전송하며, 전송할 때 정책에 따라 패킷의 흐름을 제어하는 등의 부가적인 기능을 수행합니다.

 

IP계층 아래에는 PPP, SLIP 또는 이더넷과 같은 데이터 링크 층이 존재합니다. 대표적인 데이터링크 층 디바이스로는 이더넷이 있는데 이더넷에는 많은 호스트가 하나의 케이블에 동시에 접속할 수 있으므로 이를 구분하기 위해 MAC 주소를 갖습니다. IP주소는 단지 개념적인 주소일 뿐이고 고유한 물리적 주소를 가지고 있는 것은 이더넷 디바이스로 리눅스는 이 IP주소를 이더넷 주소로 변환하기 위해 ARP를 사용합니다.

 

전달될 데이터는 Figure1 계층구조를 내려오면서 encapsulation 됩니다. TCP/IP와 이더넷 층을 중심으로 데이터 전달과 encapsulation을 표현하면 아래의 그림과 같습니다.

Figure 2 데이터 가공

Figure2는 밑에서부터 보면 이해가 쉽습니다. Figure1계층 구조는 위에서 아래로 내려오는 단계로 생각하면 됩니다. 사용자가 응용프로그램에게 전송할 데이터를 보내면 (application data의 user data) 응용 프로그램은 제어에 필요한 데이터를 헤더에 추가합니다. (application header : telnet, ftp, Web Browser 등) 이 데이터가 TCP 층으로 전달되면 TCP 층에선 포트번호(ftp:21, telnet:23, www:80 등)와 메시지에 일련번호(SEQ), 응답번호(ACK)가 있어서 신뢰성 있는 데이터 전달을 지원합니다.

메시지가 IP층으로 전달되면 IP 층에서는 자신의 헤더를 이 메시지에 추가하여 패킷을 만든다. 패킷의 헤더는 IP 버전을 나타내는 version 필드를 갖는다. TTL필드는 이 패킷이 목적지에 도달하기 위해 최대 몇 번이나 재 전달될 수 있는지를 나타내는 필드입니다. Transport 필드는 IP의 상위 층이 무엇인지 나타내며 패킷을 받았을 때 어느 층으로 올려주어야 하는지를 의미합니다. checksum은 IP 헤더에 대한 체크섬 값을 가지며 전송 시 에러 발생 여부를 파악할 때 이용됩니다. 또한 보내는 호스트의 IP주소와 목적지 호스트의 IP주소 실제 데이터 등으로 구성됩니다.

이더넷 층에선 자신의 헤더를 패킷에 추가하여 프레임을 만든다. 프레임은 보내는 호스트의 이더넷 주소와 네트워크 층의 상위 층이 무엇인지 구별하는 프로토콜 필드 등으로 구성되며 에러 파악을 위한 CRC가 존재한다.