정글 TIL 29(02.25) "네트워크 "

김동준·2024년 2월 25일
2

진심

목록 보기
4/15

짧은 글쓰기

학교를 올라가다 걸린 "총장명의 학사를 취득할 수 있다"는 원격 교육 홍보 현수막을 보며 항상 생각한다. 여기 학생들은 저런게 있다는 것을 알고는 있을까? 이 학교의 입학 사정관에게 "저 이 대학에서 원격 교육 들어서 총장명의 학사도 있어요"라고 말하면 그들은 인정할까?

크래프톤 정글도 마찬가지일 것이다. 정글은 사회에서 그저 흔한 부트캠프 그 이상도 이하도 아닐 것이다. 막상 취업 때는 자기소개서에 적을 한 줄. 그렇다면 앞으로 정글에서의 4개월을 어떻게 보내야 할지에 대한 나의 생각을 적어본다.
1. 전공생이라는 타이틀에 부끄럽지 않은 최소한을 갖추어야 한다.
학부에서 보낸 허송세월을 메꾸려면 4개월은 짧디 짧은 시간이다. 그렇지만 최선을 다 해서 이 과정을 수료하면, 전공생으로서 컴퓨터에 대해 어느정도는 "안다"라고 말할 수 있을 것이다. 기억하자. 사회에서 바라보는 전공생의 기준은 높고 나는 그 기준에 못 미친다.
2. 내가 배워야 할 것은 앞으로 주어진 시간에 더 압축적으로 배울 수 있는 공부 방법과 태도다. 어려운 OS 공부를 하면서 한 시간에 배워나가는 양(output)을 늘리는 방법을 고민하고 시도해야 나만의 공부법을 찾을 수 있을 것이다. 그러기 위해서는 공부에 대한 태도를 바꿔야 한다. 글을 한글자 한글자 머리에 읽히는 것이 아닌, 추상화를 그리고 정리해야 한다. 유기적인 흐름을 읽고 많은 내용 중 무엇이 필요하고, 필요하지 않은지를 걸러야 한다.
3. 앞으로 내가 어떤 사람이 될지를 결정해야 한다. 인생을 바꾸기엔 6개월은 짧은 시간이다. 그렇지만 3년은 충분하다고 생각한다. 나는 지금 2개월 동안 앞으로의 2년 10개월의 디딤판을 둔 것이다. 전공 4년을 6개월로 커버할 수는 없겠지만, 앞으로의 3년을 더해 7년은 3년으로 커버할 수 있지 않을까 싶다. 지금처럼 꾸준히, 남들보다 두 배만 더 하자. 두 배의 시간은 당연한 것이고, 그 시간만큼의 성과를 낼 수 있을 공부법을 알아내야 한다.

Chapt. 11 네트워크 프로그래밍

Intro

모든 네트워크 응용(Application)들은 동일한 기본적인 프로그래밍 모델에 기초하고 있으며, 이들은 비슷한 논리 구조를 가지면서 동일한 프로그래밍 인터페이스를 사용합니다.

네트워크 응용은 이미 배운 개념들을 활용합니다. 프로세스, 시그널, 바이트 순서, 메모리 매핑, 동적 저장장치 할당 등 모두 중요한 역할을 합니다.

여러분은 기본적으로 클라이언트-서버 프로그래밍 모델과 인터넷이 제공하는 서비스를 사용하는 클라이언트-서버 프로그램을 작성하는 방법을 이해할 필요가 있습니다.

아래의 클라이언트, 서버, 요청, 네트워크 등은 우리가 기존에 알던 그 개념으로 이해하시면 됩니다.
serve는 넘기다는 뜻입니다. 여기에 -er 접미사를 붙여 넘기는 사람(주체)가 있다면 client(고객)처럼 받는 사람이 있겠죠. 한마디로 주는 이와 받는 이의 관계로 이루어진 것이 서버라는 추상화입니다.
다른 예로, network라고 하면 연결된 망을 뜻하잖아요? SNS은 아래의 그림처럼 사람을 하나의 점으로 생각하고, 그들을 선으로 이은 것이 Social Network Service가 되는 것이죠.

한마디로, IT 전문용어이니 새로 배운다고 생각하면 될 것도 안됩니다. 기존의 알던 그 개념 그대로 차용해서 이해하면 됩니다.

11.1 클라이언트-서버 프로그래밍 모델

모든 네트워크 응용 프로그램은 클라이언트-서버 모델에 기초하고 있습니다. 이 모델을 사용해서 응용은 한 개의 서버(server, 주는 사람) 프로세스와 한 개 이상의 클라이언트(client, 고객) 프로세스로 구성됩니다. 서버는 일부 리소스를 관리하고, 이 리소스를 조작해서 클라이언트를 위한 일부 서비스를 제공합니다.

웹 서버는 디스크 파일들을 관리하고, 클라이언트를 대신해서 이들을 가져오고 실행합니다.
FTP 서버는 클라이언트를 위해 저장하고 읽어오는 디스크 파일들을 관리합니다.

클라이언트-서버 모델에서 근본적인 연산은 트랜잭션(transaction, 거래)이며 네 단계로 구성됩니다.
1. 클라이언트가 서비스를 필요로 할 때, 클라이언트는 한 개의 요청(request)을 서버에 보내는 것으로 트랜잭션을 개시합니다.
2. 서버는 요청을 받은 뒤 해석하여 자신의 자원들을 적절한 방법으로 조작합니다.
3. 서버는 응답을 클라이언트로 보내고, 그 이후에 다음 요청을 기다립니다.
4. 클라이언트는 응답을 받고 이것을 처리합니다.

클라이언트와 서버는 프로세스(과정)이며, 이 컨텍스트에서 종종 불린 것처럼 머신이나 호스트는 아니라는 것이 중요합니다.

11.2 네트워크

클라이언트와 서버는 종종 별도의 호스트에서 돌아가며, 컴퓨터 네트워크의 하드웨어 및 소프트웨어 자원을 사용해서 통신합니다. 이 장에서의 목표는 프로그래머의 관점에서 쓸 수 있는 개념 모델을 이해하는 것입니다.

호스트에게 네트워크는 그저 또 다른 I/O 디바이스입니다. 네트워크에서 수신한 데이터는 I/O와 메모리 버스를 거쳐서 어댑터에서 메모리로, 대개 DMA 전송으로 복사됩니다.

이더넷 세그먼트(Ethernet Segment)는 몇 개의 전선(net)들과 ```허브라고 부르는 작은 상자로 구성됩니다.
대개 방이나 빌딩의 층과 같이 작은 지역에 설치하며, 한쪽 끝은 호스트의 어댑터에, 다른 끝은 허브의 포트에 연결됩니다.
허브는 각 포트에서 수신한 모든 비트를 종속적으로 다른 모든 포트로 복사합니다. 그래서 모든 호스트는 모든 비트로 데이터를 볼 수 있습니다.
각 전선은 100 Mb/s나 1 Gb/s의 대역폭을 가집니다.

각 이더넷 어댑터는 비휘발성 메모리에 저장된 전체적으로 고유한 48비트 주소를 가집니다. 호스트는 프레임이라고 부르는 비트들을 세그먼트의 다른 호스트에 보낼 수 있습니다.

브릿지형 이더넷은 전선들과 브릿지라는 작은 상자들로 이루어집니다.
더 큰 LAN을 구성할 수 있으며 전체 빌딩이나 캠퍼스 규모로 설치될 수 있습니다.
브릿지-브릿지선은 1 Gb/s 대역폭을, 네 개의 허브-브릿지 선은 100 Mb/s 대역폭을 가집니다.

브릿지는 우수한 분산 알고리즘을 사용해서 이들은 자동으로 어떤 호스트가 어떤 포트에서 도달 가능한지 장기간에 걸쳐 학습하고, 그 후 필요한 경우 선택적으로 하나의 포트에서 다른 포트로 프레임을 복사합니다.

예를 들어 호스트 A가 같은 세그먼트에 있는 호스트 B로 한 프레임을 전송하려면,
브릿지 X는 이 프레임이 입력 포트에 도달할 때 이 프레임을 버려서 다른 세그먼트에서의 대역폭을 절약합니다.
하지만 만일 호스트 A가 다른 세그먼트의 호스트 C로 프레임을 전송한다면 브릿지 X는 이 프레임을 브릿지 Y에 연결된 포트로만 복사하고, 이것은 호스트 C의 세그먼트에 연결된 포트로만 이 프레임을 복사하게 됩니다.

계층 구조의 상부에서 다수의 비호환성 LAN들은 라우터라고 부르는 특별한 컴퓨터에 의해서 연결될 수 있으며, 라우터는 네트워크 간 연결을 구성합니다.
각 라우터들은 이들이 연결되는 각 네트워크에 대해 어댑터를 가지고 있습니다. 라우터는 point-to-point 전화 연결을 할 수 있으며, 이들은 WAN(Wide-Area Network)라고 부르는 네트워크의 사례입니다.

Internet의 중요한 특성은 이것들이 매우 다르고 비호환적인 기술을 갖는 여러 가지 LAN과 WAN들로 이루어져 있다는 점입니다. 어떻게 어떤 소스(Source, 출발)호스트가 모든 비호환적인 네트워크들을 지나서 데이터 비트를 다른 목적지 호스트로 전송할 수 있을까요?

이는 프로토콜 소프트웨어의 계층으로 해결합니다. 이 소프트웨어는 어떻게 호스트들과 라우터들이 데이터를 전송하기 위해서 협력하는지를 결정하는 프로토콜을 구현한 것입니다. 이 프로토콜은 두 가지 기본 기능을 제공합니다.(OSI 7 layer를 떠올리세요!)

  • 명명법(Naming Scheme). 서로 다른 LAN 기술은 주소를 호스트에 할당하는 서로 다른 비호환성을 갖는 방법을 사용합니다. 각 호스트는 자신을 유일하게 식별하는 internet 주소 최소한 한개가 할당합니다.
  • 전달기법(delivery mechanism). 서로 다른 네트워킹 기술은 서로 다른 비호환성을 갖는 비트 인코딩 방법과 프레임 내에 이들을 패키징하는 방법을 가지고 있습니다. internet 프로토콜은 데이터 비트를 패킷이라고 부르는 비연속적인 단위로 묶는 통일된 방법으로 정의해서 이 차이점을 줄입니다. 패킷은 패킷 크기와 소스 및 목적지 호스트 주소를 포함하는 헤더와 소스 호스트가 보낸 데이터 비트를 포함하는 데이터로 구성됩니다.

호스트와 라우터가 호환성이 없는 LAN을 통해서 데이터를 전송하기 위해 internet 프로토콜을 어떻게 사용하는지에 관한 예제를 보여줍니다.

예를 들어, 호스트 A에서 돌아가는 호스트 A에서 돌아가는 LAN1에 연결된 클라이언트는 LAN2에 연결된 호스트 B에서 돌고 있는 서버로 일련의 데이터 바이트를 보내는 단계를 가정해 봅시다.
1. 호스트 A의 클라이언트는 클라이언트의 가상 주소 공간에서 커널 버퍼로 데이터를 복사하는 시스템 콜을 호출합니다.
2. 호스트 A의 프로토콜 소프트웨어internet 헤더와 LAN1 프레임 헤더에 호스트 B와 라우터의 주소를 담긴 데이터에 추가해서 LAN1 프레임을 생성합니다. LAN1 프레임의 데이터가 internet 패킷이고 그 데이터는 실제 사용자 데이터인데, 이것이 캡슐화(encapsulation)고 internetwoking의 근본적인 통찰 중 하나입니다.
3. LAN1 어댑터는 이 프레임을 네트워크로 복사합니다.
4. 프레임이 라우터에 도달하면 라우터의 LAN1 어댑터는 전선에서 이것을 읽어 프레임 프로토콜 소프트웨어로 전달합니다.
5. 라우터는 internet 패킷 헤더에서 목적지 internet 주소를 가져와 패킷을 전달할 곳을 결정합니다. 이 경우 LAN2의 라우팅 테이블에서의 인덱스를 활용합니다. 라우터는 이전 LAN1 프레임 헤더를 벗겨내고 호스트 B의 주소를 갖는 새로운 LAN2 프레임 헤더를 앞에 붙여서 어댑터로 전달합니다.
6. 라우터의 LAN2 어댑터는 이 프레임을 네트워크로 복사합니다.
7. 이 프레임이 호스트 B에 도착하면 어댑터는 이 프레임을 전선에서 읽어 들이고 프로토콜 소프트웨어로 전달합니다.
8. 마지막으로 B의 프로토콜 소프트웨어 패킷 헤더와 프레임 헤더를 벗겨내고 데이터를 서버가 이 데이터를 읽는 시스템 콜을 호출할 때 서버의 가상 주소공간으로 복사합니다.

11.3 글로벌 IP 인터넷

각 인터넷 호스트는 TCP/IP 프로토콜(Transmission Control Protocol/Internet Protocol)을 구현한 소프트웨어를 실행합니다.
인터넷 클라이언트와 서버는 소켓 인터페이스와 Unix I/O 함수들의 혼합을 사용해서 통신합니다.

TCP/IP는 실제로는 프로토콜의 집합으로, 각각 서로 다른 기능을 제공합니다. 예를 들어, IP는 기본 명명법과 데이터그램이라고 하는 패킷을 한 인터넷 호스트에서 다른 호스트로 보낼 수 있는 전달 메커니즘을 제공합니다.

UDP(Unreliable Datagram Protocol)는 IP를 다소 확장해서 데이터그램이 호스트에서 호스트로 가는 대신, 프로세스에서 프로세스로 전송될 수 있습니다. TCP는 IP 위에 구현한 복잡한 프로토콜로 프로세스들 간에 안전한 완전 양방향 연결을 제공합니다.

프로그래머의 관점에서, 인터넷을 다음과 같은 특징을 갖는 전 세계적인 호스트의 집합으로 생각할 수 있습니다.

  • 호스트의 집합은 32비트 IP 주소 집합에 매핑됩니다.
  • IP 주소의 집합은 인터넷 도메인 네임(Internet Domain Name)이라고 부르는 식별자의 집합에 매핑됩니다.
  • 하나의 인터넷 호스트의 프로세스는 연결을 통해 다른 인터넷 호스트의 프로세스와 통신할 수 있습니다.

11.3.1 IP 주소

IP주소는 비부호형 32비트 정수입니다.

인터넷 호스트들이 서로 다른 호스트 바이트 순서를 가질 수 있기 때문에 TCP/IP는 네트워크 패킷 헤더에 포함되는 IP 주소 같은 모든 정수형 데이터 아이템에 대해서 통일된 네트워크 바이트 순서(빅 엔디안 바이트 순서)를 정의합니다.

#include <arpa/inet.h>
unit32_t htonl(uint32_t hostlong);		// host->network long타입
unit16_t htons(uint16_t hostshort);
					Returns value in network byte order
uint32_t ntohl(uint32_t netlong); 		// network->host long타입
uint16_t ntohs(uint16_t netshort);
					Returns value in host byte order

IP주소는 대개 사람들에게 dotted-decimal 표기라고 하는 형식으로 제시됩니다.

11.3.2 인터넷 도메인 이름(Internet Domain Name)

크기가 큰 정수(IP)는 사람들이 기억하기 어려워서 인터넷에서는 도메인 이름들의 집합을 IP 주소 집합에 매핑하는 메커니즘과 함께 친숙한 별도의 도메인 이름 집합을 정의합니다.

11.3.3 인터넷 연결

인터넷 클라이언트와 서버는 연결(connection)을 통해서 바이트 스트림을 주고받는 방식으로 통신합니다. 이 연결은 두 개의 프로세스를 연결한다는 점에서 point-to-point 연결입니다. 데이터가 동시에 양방향으로 흐를 수 있다는 점에서 이것은 완전양방향(full-duplex)입니다. 또한 소스 프로세스가 보낸 바이트 스트림이 결국은 보낸 것과 동일한 순서로 목적지 프로세스에 수신된다는 의미에서 안정적입니다.

소켓(socket)은 연결의 종단점입니다. 각 소켓은 인터넷 주소와 16비트 정수 포트로 이루어진 소켓 주소를 가지며, address : port로 나타냅니다. 클라이언트의 소켓 주소 내의 포트는 클라이언트가 연결 요청을 할 때 커널이 자동으로 할당하며, 이것은 단기(ephemeral) 포트라고 합니다. 그러나 서버의 소켓 주소에 있는 포트는 대개 영구적으로 이 서비스에 연결되는 잘 알려진 포트입니다. 예를 들어, 웹 서버는 대개 포트 80을 사용하고, 이메일 서버는 포트 25를 사용합니다.

연결은 두 개의 종단점이 소켓 주소에 의해 유일하게 식별됩니다. 이 두 개의 소켓 주소는 소켓 쌍이라고 알려져 있으며 tuple로 나타납니다.

11.4 소켓 인터페이스

소켓 인터페이스는 네트워크 응용을 만들기 위한 Unix I/O 함수들과 함께 사용되는 함수들의 집합이다.

11.4.1 소켓 주소 구조체

갑작스런 마무리

11.4장까지 쓰다가 말았습니다. 그 이유는 벨로그에 글을 쓰는 것보다 더 효율적인 방법을 찾아냈으며, 제가 알고자하는 질문에 대한 답을 찾았기 때문에 벨로그에 더 적을 필요가(정확히 말하면 시간상 여유가 없어서..) 없었기 때문입니다.
짧게만 정리하자면 제가 알고자 했던 "지금 우리는 무얼 배우고, 무얼 하는가?"에 대한 답을 적어놨습니다.

TIL 30 이동하기

profile
고민하고 고뇌하는 개발자 (점심, 저녁 메뉴를)

0개의 댓글