- 이 시리즈는 Computer Networking: A Top-Down Approach(7th Edition)를 읽고 각 챕터의 주요 내용을 요약하고 있습니다.
- 개인 학습 목적으로 작성한 글입니다.
컴퓨터 네트워크는 네트워크 기반 어플리케이션이 있기에 비로소 그 존재 의미가 있다.
이번 장에서는 네트워크 기반 어플리케이션과 관련된 아래의 주제들을 다룬다:
네트워크 어플리케이션 개발이란 결국, 네트워크 상에 존재하는 (역할 별) host가 사용할 프로그램을 개발하는 것
이처럼 application-layer 이하는 신경쓰지 않아도 되는 상황은 네트워크 어플리케이션의 개발과 배포 속도를 빠르게 만든다.
여기서 말하는 어플리케이션이 구조란, 앞서 1.5.1에서 다룬 네트워크 구조(internet 프로토콜)와 별개
- 어플리케이션 개발자 입장에서는 네트워크 구조는 static하게 고정된 환경같은 것.
- 네트워크를 다룰 수 있는 API 셋을 제공받아 사용하게 된다
보통 아래 두 구조 중 하나를 따르는 것이 일반적이다:
이 구조는 아래와 같은 특징을 가진다:
서비스를 담당하는 서버 host가 단 한대일 경우, 해당 서비스의 사용자가 많아짐에 따라 서비스 성능이 힘에 부치게 된다. 이로 인하여 data center를 고안하고, 많은 트래픽을 감당할 수 있는 다수의 가상 서버들을 제공하는 역할을 맡는다(1.3.3에서 다룬 이야기 참조).
p2p 구조 하에서는 각 peer가 client이면서 동시에 server 역할도 맡는다. 따라서 서비스 성능 확장이 용이하며(self-scalability), 비용 효율적이다. 다만, 이러한 탈중앙적(decentralized) 특성으로 인하여 보안, 성능, 안정성 측면에서 극복이 필요한 과제들도 존재한다.
단일 운영체제 안에서 실행 중인 프로그램을 보통 프로세스(process)라 부른다.
- 이 책에서는 IPC(interprocess communication)가 아닌, 서로 다른 (또한 각기 서로 다른 운영체제를 사용하는) host 에서 실행중인 프로세스들 간의 통신을 다룬다.
message
: 두 프로세스가 네트워크를 통하여 서로 교환하는 데이터의 단위.
한 네트워크 어플리케이션은 서로 message를 주고 받는 여러 쌍의 process 세트로 구성된다. 한 쌍의 프로세스들은 각각 client와 server의 역할을 맡는다.
여기서 다루고 있는 프로세스 간 통신은 네트워크를 경유하여 이루어진다. 이때 메세지를 송/수신하는 프로세스는 네트워크와 상호작용할 때 반드시 socket이라는 인터페이스를 거쳐야 한다.
socket이라는 인터페이스 창구의 존재 덕분에, 네트워크 관련 기능이 필요할 때 구현에 대한 신경쓸 것 없이 맘편하게 이용하기만 하면 된다. socket의 특징은 아래와 같다:
프로세스 간에 네트워크 통신을 하려면 서로의 위치 형식을 규정해야 한다.
process에서 송신된 message는 socket을 통하여 네트워크로 전달된다. socket을 통하여 L4 이후로 전달된 데이터를 목적지까지 전달하는 transport-layer 프로토콜은 그 특성과 한계에 따라 종류가 다양하다.
마치, 여행을 떠날 때 이용가능한 운송 수단이 비행기, 열차, 자동차, 도보 등 다양한 것처럼...
어떤 프로토콜을 사용해야 할까? 만들고자 하는 어플리케이션 특성에 가장 부합하는 것을 선정해야 한다. 데이터 전송 안정성, throughput, timing, security 측면에서 검토할 수 있다.
앞서 1.4.2에서 다룬 것처럼 packet은 유실될 수 있다(router buffer overflow, 일부 bit의 유실 등). 따라서, 전송된 데이터의 무결(integrity)함이 어플리케이션 차원에서 중요하다면 이를 보장할 수 있어야 하며, 이를 reliable data transfer 를 제공한다고 말한다.
packet loss가 발생해도 무방한 어플리케이션을 두고 loss-tolerant 하다고 부른다. ex. 영상 스트리밍 서비스의 경우, 약간의 튐(glitch) 정도는 넘어갈 수 있다.
throughput은 앞서 1.4.4에서 다룬 바 있다. 어플리케이션 사용시 형성되는 session들은 네트워크 대역폭을 다같이 공유하게 되므로, throughput 또한 그때그때 달라진다. 따라서, 일정 수준 이상의 throughput 이 유지되어야 한다면 이를 보장할 수 있어야 하며, 이를 guaranteed available throughput 을 제공한다고 말한다.
ex. 인터넷 전화 서비스에서 음성 인코딩이 32kbps로 이루어진다면, 이 대역폭은 최소한으로 보장되어야 서비스가 정상 서빙될 수 있다
throughout과 유사하게, 데이터 송/수신의 최대 지연 시간 보장이 중요하다면 이를 보장해야 한다. ex. 실시간 화상 회의 솔루션
종단간 암/복호화, 데이터 무결성 검사, 종단 인증 등의 서비스를 제공할 수 있다.
인터넷(일반적으로 TCP/IP 네트워크)는 아래의 2개 Transport 프로토콜을 제공한다.
TCP 서비스 모델은 아래의 특징을 가진다:
Securing TCP
- TCP 자체에는 보안 서비스가 포함되지 않으므로, 민감 정보를 전송할 경우 보안 위험에 노출될 수 있다.
- 그래서 오늘날에는 TCP 연결시 SSL을 함께 적용하는 것이 보통이다. 암/복호화, 데이터 무결성 검증, 종단 인증 등 프로세스 종단간 보안 서비스가 적용된다.
- SSL은 transport-layer 프로토콜이 아닌, application-layer 수준의 프로토콜이다. 즉, 어떤 어플리케이션에서 SSL을 사용하고자 한다면 이를 어플리케이션 코드 단에서 적용해야 한다. 기존 socket API와 유사한 시그니처이지만, SSL-socket API를 사용하여 비즈니스 로직을 구현하는 식으로.
앞서, 프로세스들은 socket을 통하여 서로 message를 교환한다고 배웠다. 그렇다면 이 message는 어떤 구조를 가지고 있을까? message의 구조(structure)을 정의하는 것이 application-layer protocol 의 역할이다.
대부분의 application-layer 프로토콜은 RFC 표준이다. 따라서 해당 규격을 준수한다면, 브라우저 또는 프로그램 종류와 무관하게 서로 message를 주고 받을 수 있게 된다. 물론, 공개되지 않고 독자적으로 사용되는 규격도 존재한다.
- "It is important to distinguish between network applications and application-layer protocols. An application-layer protocol is only one piece of a network application."
- 하나의 서비스를 완성하는 데에는 다양한 구성 요소가 필요하며, 프로토콜은 그 중 하나(하지만 아주 중요한)에 불과하다. 또한, 그러한 프로토콜은 그 쓰임과 특성에 따라 매우 다양하게 존재한다.
- 2.1.5의 가장 마지막 단락 참조
매일마다 다양한 인터넷 어플리케이션 서비스가 등장한다. 이걸 다 다룰 수는 없고, 그 중에서 가장 주류에 해당하고 또 중요한 것만 다룬다.
사람들이 주목한 인터넷의 특성은 on-demand 이다. 기성 라디오 / TV와 같은 수동적이고 일정이 정해진 서비스가 아니라, 사용자가 원할 때 사용할 수 있다는 점이 가장 큰 매력이다. 또한 저렴한 비용으로 누구나 컨텐츠 제공자가 될 수 있으며, 오감을 자극하는 다양한 유형의 컨텐츠를 주고받을 수 있다.
본격적인 논의에 앞서 Web에서 사용하는 주요 용어들을 정리한다.
object
: Web page
(또는 document
)를 구성하는 다양한 요소file
: HTML, 이미지, 코드(js, java applet), 영상 등. file은 URL을 통하여 다루어진다.base HTML file
과 다양한 object로 이루어진다. 이때 base HTML file은 URL을 통하여 다른 object를 참조(가져와 사용)한다.URL
: 해당 URL이 가리키는 object를 소유하는 server의 hostname
와 해당 object의 path
(경로)로 이루어진다.http://velog.io/@cadenzah/computer-network-02
velog.io
는 hostname, /@cadenzah/computer-network-02
는 path를 가리킨다.Web browser
: Web 이라는 맥락에서 보통 client 역할을 맡는 프로세스(아닐 수도 있다). client와 browser를 앞으로 혼용하여 사용Web server
: Web 이라는 맥락에서 server 역할을 맡는 프로세스. URL로 요청 가능한 Web object를 소유한다.HTTP는 TCP를 기반으로 동작한다.
HTTP는 기본적으로 stateless(무상태) 프로토콜이며, 이를 바탕으로 web server는 성능이 닿는 한 무수한 서로 다른 요청을 받아내야 한다.
한번 형성된 TCP 연결을 재사용해야할까? 아니면 매번 새로운 연결을 맺어야 할까? 각각의 특성이 존재한다. HTTP는 기본적으로 persistent(지속 연결) 방식으로 동작하지만, 어플리케이션 상황에 따라 후자를 선택할 수도 있다.
여기서는 고려하지 않았지만, 모던 브라우저는 통신의 병렬화 정도(degree of parallelism)를 제어할 수 있다. 대부분의 경우, 각 요청에 대하여 순차적으로(serial) 연결을 맺고 끊는 것이 아닌, 5~10개의 연결을 병렬로 맺고 동시에 자원을 받아오며 이를 통하여 전체적인 응답 시간을 줄인다.
round-trip time(RTT)
- 한 packet이 client의 요청으로 출발하여 server에서 응답받아 다시 client로 돌아오기까지의 시간
- propagation delay, queuing delay, packet-processing delay 가 모두 포함된다
- HTML 파일을 요청한 client(browser) 입장에서의 총 RTT는 p130을 참조
non-persistent connection 은 매 요청마다 새 연결을 맺어야 하는데, 여기에는 아래와 같은 단점이 있다:
HTTP 1.1은 persistent connection을 사용하여, 동일 client-server 요청이라면 이미 맺어진 연결을 재사용한다. 즉, 여러 연속적인 요청이 가능해진 것(pipeline).
HTTP 메시지는 요청 / 응답 두개 형식으로 나뉘며, 각각에 대한 명세가 별도로 존재한다.
# 아래는 예시
GET /@cadenzah/posts HTTP/1.1
Host: https://velog.io
Connection: close
User-agent: Mozilla/5.0
Accept-language: en
method
, URL
, HTTP version
header
의 마지막은 CR/LF 만으로 이루어진 줄POST
요청에서 사용되는 본문 데이터.?key=value
).# 아래는 예시
HTTP/1.1 200 OK
Connection: close
Date: Fri, 29 Apr 2022 19:12:42 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Fri, 29 Apr 2022 19:12:42 GMT
Content-Length: 2135
Content-Type: text/HTML
(data data data ......)
HTTP version
, status code
, status message
Date
는 응답이 전달된 시각을 나타내지만, Last-Modified
는 해당 데이터가 생성 또는 수정된 마지막 시간을 나타낸다. 후자는 cache
시 참조되므로 매우 중요.Content-Type
에 명시된 것을 우선하여 식별한다.header
의 마지막은 CR/LF 만으로 이루어진 줄telnet
명령어를 사용하면 메시지를 직접 구성하여 HTTP 요청을 보내고 응답을 확인해볼 수 있다. (Press the carriage return twice after typing the last line).HTTP 서버는 무상태(stateless)가 기본이지만, 때에 따라 state가 필요할 때가 있다. 이를 위하여 HTTP는 cookie라는 기능을 표준에 도입하였다. cookie
는 한 웹 사이트(서버)가 각 사용자를 추적할 수 있도록 해준다.
cookie는 아래 4개 요소로 구성됨으로서 완성된다:
Set-cookie
headercookie
header흔한 웹 사이트에서 사용자 별로 Cookie를 삽입시키고, 이후 그 cookie를 활용하는 예시는 p137을 참조.
- "Note that the cookie file already has an entry for eBay(과거에 방문 이력이 있는, cookie를 사용하는 또다른 사이트), since Susan has visited that site in the past. As Susan continues to browse the Amazon site(이번에 처음 방문하는, cookie를 사용하는 사이트), each time she requests a Web page, her browser consults her cookie file, extracts her identification number for this site, and puts a cookie header line that includes the identification number in the HTTP request."
- "During the subsequent sessions, the browser passes a cookie header to the server, thereby identifying the user to the server. Cookies can thus be used to create a user session layer on top of stateless HTTP."
물론, 이러한 cookie는 사용자 맞춤 정보 제공이면서 동시에 사생활 침해이기도 하다. 이에 대한 논란은 현재도 존재.
HTTP 네트워크 관점에서 Web cache는 Proxy 서버를 뜻하며, 이 proxy는 한 HTTP 요청이 향하던 본래(origin)의 web server를 대신하여 요청 내용을 client에 반환한다. proxy는 origin이 가지고 있는 여러 자원들의 사본(copy)을 가지고 있어, 이러한 cache가 가능하다. proxy가 origin을 cache하는 양상은 Figure 2.11 참조.
cache의 사용으로 응답시간을 줄일 수는 있으나, cache가 최신이 아닌(stale) 이슈도 해결해야 한다. 이를 해결하는 것이 HTTP의 conditional GET이며, 이를 위하여 IF-Modified-Since
header를 활용한다. 요청 대상이 변경되었을 때에만 origin에 요청하여 최신 데이터를 반환하게 된다.
e-mail은 아래의 3개 주요 요소로 구성된다.
이번 절에서는 송신자 Alice, 수신자 BoB 을 예시로 e-mail 시스템을 설명한다. e-mail이 인터넷 상에서 오고가는 큰 그림은 Figure 2.14를 참조.
mail agent
와 mail server
를 실행한다.outgoing queue
에 적재되어 대기되었다가, 적절한 때에 송신된다. 이 메시지는 수신자의 mail server 상의 mailbox
로 전송된다.mailbox
에 요청하여, 수신한 메시지를 불러와 메일로 구성한다.authentication
)을 거쳐야 한다.위와 같은 일련의 규칙은 SMTP로 정의된다. SMTP 역시 다른 application-layer protocol과 마찬가지로 TCP 기반으로 작동한다. SMTP를 실행하는 프로세스는 client이자 server이다.
SMTP는 HTTP보다 오래된 표준이다. 지금까지도 두루 쓰이는 유용한 기술이지만, 오래된 만큼 낡은 특징들도 존재한다. 예를 들어, mail message는 반드시 7-bit ASCII로 작성해야 한다 - 메일에 삽입되는 멀티미디어 컨텐츠까지도.
Figure 2.15는 mail이 전달될 때의 상황을 설명하고 있는데, 앞서 Figure 2.14를 설명할 때와 동일하므로 생략.
몇 가지 특징이 존재한다:
SMTP handshaking 시 주고 받는 message의 구체적인 예시는 p147의 crepes.fr
와 hamburger.edu
간의 메일 송수신 예시를 살펴보자.
HELO
, MAIL FROM
, RCPT TO
, DATA
, QUIT
등의 명령어가 사용됨QUIT
으로 종료telnet
을 사용하여 SMTP server와 TCP 연결을 맺고 나면, 위 명령어를 사용하여 SMTP 통신을 시작할 수 있다 (25 port 사용)한 host에서 또다른 host로 파일(resource 또는 mail message)을 보내기 위한 protocol이라는 점, 또한 persistent connection을 사용한다는 점은 공통점이다. 그 밖에는?
Content-type
headerAlice의 mail server에서 Bob의 mail server로 메일이 전송되고 나면, Bob은 어떻게 메일을 열람할 수 있을까? 과거엔 이랬다:
mail reader
프로그램(user agent)을 실행하여 메일 내용을 열람오늘날에는 아래와 같은 특징을 가지도록 운영된다:
여기서 user agent는 mail server로부터 어떻게 자신의 앞으로 온 메일을 가져올 수 있을까? 앞서 다룬 SMTP는 mail을 전송하는 용도이어서, user agent가 mail server로부터 mail을 받아오기 위한 protocol이 필요해진다. 이러한 목적으로 POP3, IMAP, HTTP 등을 사용할 수 있다.
- SMTP is used to transfer mail from the sender’s mail server to the recipient’s mail server; SMTP is also used to transfer mail from the sender’s user agent to the sender’s mail server.
- A mail access protocol, such as POP3, is used to transfer mail from the recipient’s mail server to the recipient’s user agent.
- Figure 2.16 참조
telnet
)시 POP3 통신이 바로 실행. 인증 성공 후에는 계속 transaction을 보낼 수 있다.인터넷 상에서는, 인터넷에 연결된 각 host들을 어떻게 식별할까? 다양한 방법들이 존재한다.
...Although each of these identifiers can be used to identify people, within a given context one identifier may be more appropriate than another. ...
hostname
: 사람이 읽을 수 있는 형식의(mnemonic) 식별자 ex. www.velog.io
IP address
: 4Byte 크기 숫자값 식별자로, 해석하는 구조가 명확하게 정해져있다. 각 Byte는 0 ~ 255 사이의 값을 가리키고, 표기할 때에는 .
으로 구분하여 표기한다.DNS(domain name system)는 인터넷의 사용자인 인간과 인터넷 경로 처리를 담당하는 router의 각자 선호에 모두 부합하고자 생겨났다. DNS의 정의는 아래와 같다:
결국 주요 역할은 hostname을 IP 주소로 변환하는 것. 실제 작동시 주요 특징은 아래와 같다:
BIND
(Berkeley Internet Name Domain)를 유닉스 머신에서 사용DNS는 다른 application-layer 프로토콜에서, 사용자가 제공한 hostname의 실제 IP 주소를 얻고자할 때 사용된다. 예시는 p155 하단의 것을 참조. 예시에서 볼 수 있듯 DNS는 인터넷 어플리케이션 동작에 추가적인 지연 요소로 작용하므로, DNS는 요청 결과가 cache되도록 작동한다.
DNS는 또한 아래와 같은 기능들을 제공한다:
canonical
hostname이라 칭한다. 이 별칭을 질의하더라도 원본 hostname을 질의한 것과 동일한 결과를 반환받는다.MX
record에 등록시, 이미 사용중인 hostname을 mail server의 hostname으로도 사용할 수 있다.Client-Server 패러다임 아래에서 DNS는 매우 중요한 네트워크 기능이다
DNS는
- end system 간에 client-server 모델 하에서 통신을 수행
- L4 이하의 transport protocol을 사용하여 통신 수행
한다는 점에서 다른 L5 단의 application-layer protocol과 동일하지만, 그 역할은 다른 protocol과 달리 특별하다. 다른 L5 protocol은 사용자가 직접 이용하는 인터넷 서비스를 담당하는 반면, DNS는 사용자와 인터넷 서비스 모두가 사용하는
hostname - IP
변환 기능을 제공한다. 즉, 인프라성 성격이 짙다는 것.
오늘날 네트워크 요청이 필요한 대부분의 어플리케이션은 내부적으로 DNS 질의를 사용한다. 어플리케이션 입장에서는 DNS의 내부 구현을 신경쓰지 않고 단순 사용하기만 하면 되겠지만, DNS 서비스의 구성, 그리고 (1) 어플리케이션과 DNS 간의 (2) DNS들 간의 통신 과정을 다루는 protocol은 다소 복잡하게 진화해왔다.
Thus, from the perspective of the invoking application in the user’s host, DNS is a black box providing a simple, straightforward translation service. But in fact, the black box that implements the service is complex, consisting of a large number of DNS servers distributed around the globe, ...
단순하게 구성한다면, 세상의 모든 DNS 질의를 단 하나의 DNS server가 처리(centralized design)하면 되겠지만, 그럴 경우 아래와 같은 한계가 있다.
위와 같은 설계는 결국 확장성이 좋지 않다. 따라서 DNS는 확장성을 최우선하여 설계되도록 발전하였다.
www.amazon.com
의 예시DNS 서버는 3개 level로 tier가 분류된다(Figure 2.17 참조).
NS
Record; p161의 cs.umass.edu
예시 참조).top-
) 서버만을 언급했으나, SLD(second-
) 또한 존재 ex. .co.kr
에서 .co
velog.io
로 접근이 가능하게 하려면, .io
를 담당하는 TLD 서버에 쿼리했을 때 velog.io
를 담당하는 authoritative DNS server의 IP 주소가 획득될 수 있도록, velog
도메인에 대한 DNS record 등록이 이루어져야 함위 3개 level에 속하지는 않지만, LAN 및 WAN에 대한 ISP 수준에서 운영하는 local DNS server
도 존재하며, 오늘날 인터넷 접속 환경에서 아주 중요한 역할을 담당한다:
cse.nyu.edu
가 gaia.cs.umass.edu
의 IP 주소를 질의하는 과정 예시)DNS 질의가 이루어지는 방식은 recursive와 iterative 로 두 가지가 존재한다.
recursive
: 질의를 요청한 최초 service를 대신하여, 다른 service가 해당 질의 결과를 받아오는 경우iterative
: 질의를 요청한 최초 service가 다른 service에 forward하지 않고 질의 결과를 받는 경우DNS 질의시 두 방식이 혼재되어 사용되는 것이 보통이다; 최초 host에서 local DNS server로 질의하는 것은 recursive
이나, 이후 local DNS server는 iterative
하게 처리해낸다.
DNS 질의시 caching을 통하여 지연 시간과 DNS 요청 횟수를 모두 절감할 수 있다. 원리는 단순하다. 동일 DNS 질의 요청에 대하여 재활용할 수 있도록, DNS 질의 내용을 서버에 일정 기간 캐싱하는 것이다.
이 전략은 모든 tier DNS server 질의에 적용된다. 예를 들어, local DNS server가 naver.com
에 대한 질의를 하였을 때, root, .com
, naver.com
에 대한 각각의 DNS server record를 모두 cache한다. 따라서 향후 동일 서버에서 github.com
을 질의하더라도 root에 대한 질의는 생략할 수 있다. 각 tier 별 DNS server들도 동일한 전략으로 cache를 수행한다.
여러 유형의 DNS server들이 형성한 DNS 분산 데이터베이스가 보관하는 데이터를 DNS resource record(RR)
라고 부른다. RR은 4개 쌍(tuple)의 형식을 가진다:
(Name, Value, Type, TTL)
TTL(time to live)
: 해당 record가 cache 될 때 유효기간을 지정Type
: Record의 유형. 유형에 따라 Name
과 Value
의 의미가 상이하다.Type=A
→ Name
: hostname / Value
: IP 주소; 일반적인 hostname-IP 대응에 대한 recordType=NS
→ Name
: domain / Value
: hostname of authoritative DNS server; DNS 질의가 계속 이어질 수 있도록 정보 제공Type=CNAME
→ Name
: hostname의 alias / Value
: canonical hostname; alias 지정을 위한 recordType=MX
→ Name
: mail server에 대한 alias / Valuie
: canonical name of mail server; 간편한 메일 도메인을 위한 recordNS
Record의 사용 예시는 p164의 마지막 단락 참조; NS
Record에서 DNS server를 지정시 hostname을 사용한다면, 해당 hostname을 위한 A
Record 또한 추가되어야 한다.
nslookup
명령어를 사용하면 DNS 질의를 직접 사용해볼 수 있다.DNS Record가 DNS server에 어떤 식으로 추가되고 운영/관리될까? 아래 예시를 살펴보자:
registrar
서비스 이용registrar
는 도메인과 DNS 서버 정보를 기반으로, 연관된 TLD server에 A
및 NS
Record가 등록되도록 조치해줌A
Record 또는 이메일 서비스에 대한 MX
Record도 등록하여 정상 작동하도록 설정TBD