# 应用层

## Introduction

* Application: communicating, distributed processes
  * running in network hosts in **"user space"**
  * exchange messages to implement app, e.g., email,
* Application-layer protocols
  * one **"piece"** of an app
  * define messages exchanged by apps and actions taken
  * user services provided by lower layer protocols
* 每个应用层协议都是为了解决某一类应用问题，需要通过位于不同主机中的多个**应用进程之间的通信和协同工作**来完成的。
* 应用层的具体内容就是**规定应用进程在通信时所遵循的协议**。
* 应用层的许多协议都是基于C/S方式。客户(client)和服务器(server)都是指通信中所涉及的两个应用进程。
  * 与C/S相比，还有一种不区分C/S的方式——P2P(Peer2Peer)，如迅雷下载，每个客户端同时也是服务端，相互之间请求和发送数据&#x20;
* **客户服务器方式所描述的是进程之间服务和被服务的关系**。
* 客户是服务请求方，服务器是服务提供方。

### 应用层术语

* A **process** is a program that is running **within a host**.
* **Within the same host**, two processes communicate with **inter-process** communication defined by the **OS**.  &#x20;
  * pipe
  * FIFO
  * Message Queue
  * Semaphore
  * Shared Memory
  * Socket
* Processes running in **different hosts** communicate with an **application-layer protocol**
* A **user agent** is an interface between the user and the network application.
  * Web: browser
  * E-mail: mail reader
  * streaming audio/video: media player

### API: application programming interface

* defines interface between **application** and **transport** layer
* socket: Internet API
  * two processes communicate by sending data into socket, reading data out of socket&#x20;
* Q: how does a process "identify" the other process with which it wants to communicate?
  * IP address of host running other process
  * "port number" - allows receiving host to determine to which local process the message should be delivered
  * connect type

### Transport service requirements

* Data loss
  * some apps (e.g. audio) can tolerate some loss
  * other apps (e.g., file transfer, telnet) require 100% reliable data transfer&#x20;
* Timing
  * some apps (e.g., Internet telephony, interactive games) require low delay to be "effective"
  * other apps ("elastic apps") make use of whatever bandwidth they get
* Bandwidth
  * some apps (e.g., multimedia) require minimum amount of bandwidth to be “effective”&#x20;

### Services provided by Internet transport protocols

|                                  TCP                                 |                               UDP                              |
| :------------------------------------------------------------------: | :------------------------------------------------------------: |
|  <p>connection-oriented<br>setup required between client, server</p> |               No Connection Needed, send directly              |
| <p>reliable transport between <br> sending and receiving process</p> | unreliable data transfer between sending and receiving process |
|             flow control: sender won’t overwhelm receiver            |                         No Flow Control                        |
|      congestion control: throttle sender when network overloaded     |                      No Congestion Control                     |
|                No timing, minimum bandwidth guarantee                |             No timing, minimum bandwidth guarantee             |

### Internet Apps

|       Application      |   Data loss   |                Bandwidth                |  Time Sensitive |         Application layer protocol        | Underlying transport protocol |   |
| :--------------------: | :-----------: | :-------------------------------------: | :-------------: | :---------------------------------------: | :---------------------------: | - |
|      file transfer     |    no loss    |                 elastic                 |        no       |               ftp \[RFC 959]              |              TCP              |   |
|         e-mail         |    no loss    |                 elastic                 |        no       |              smtp \[RFC 821]              |              TCP              |   |
|      Web documents     | loss-tolerant |                 elastic                 |        no       |              http \[RFC 2068]             |              TCP              |   |
|  real-time audio/video | loss-tolerant | <p>audio: 5Kb-1Mb<br>video:10Kb-5Mb</p> | yes, 100’s msec | <p>proprietary<br>(e.g. RealNetworks)</p> |            TCP/UDP            |   |
|   stored audio/video   | loss-tolerant | <p>audio: 5Kb-1Mb<br>video:10Kb-5Mb</p> |  yes, few secs  | <p>proprietary<br>(e.g. RealNetworks)</p> |            TCP/UDP            |   |
|    interactive games   | loss-tolerant |               few Kbps up               | yes, 100’s msec |                                           |                               |   |
|     financial apps     |    no loss    |                 elastic                 |    yes and no   |                                           |                               |   |
| remote terminal access |    no loss    |                 elastic                 |        no       |             telnet \[RFC 854]             |              TCP              |   |
|   remote file server   | loss-tolerant |                 elastic                 |        no       |                    NSF                    |            TCP/UDP            |   |

### 多个应用进程使用系统调用的机制

![](https://i.niupic.com/images/2020/05/14/7RSG.png)

* 当某个应用进程启动系统调用时，控制权就从应用进程传递给了系统调用接口
* 此接口再将控制权传递给计算机的操作系统。操作系统将此调用转给某个内部过程，并执行所请求的操作。
* 内部过程一旦执行完毕，控制权就又通过系统调用接口返回给应用进程。系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口，即应用编程接口 API。

## Socket 套接字

### Socket 简介

* 1982 - Berkeley Software Distributions 操作系统引入了sockets 作为本地进程之间通信的接口
* 1986 - Berkeley 扩展了socket 接口使之支持UNIX 下的TCP/IP 通信
* 是一种特殊的文件描述符 (everything in Unix is a file)
* 网络应用 (FTP, Telnet, etc) 都依赖这一接口
* 面向连接 (Transmission Control Protocol - TCP/IP)
* 无连接 (User Datagram Protocol -UDP 和 Internetwork Packet Exchange - IPX)
* process sends/receives messages to/from its socket
* socket analogous to door
  * sending process shoves message out door
  * sending process relies on transport infrastructure on other side of door to deliver message to socket at receiving process

    ![](https://i.niupic.com/images/2020/05/14/7RSM.png)

### Socket 连接分类

* Socket: 面向连接并发服务器

  ![](https://i.niupic.com/images/2020/05/14/7RSN.png)

  * 服务器端： &#x20;

    ![](https://i.niupic.com/images/2020/05/14/7RSO.png)
* Socket:无连接循环服务器

  ![](https://i.niupic.com/images/2020/05/14/7RSS.png)

## 万维网与HTTP

* 万维网是**分布式超媒体(hypermedia)系统**，它是超文本(hypertext) 系统的扩充。
* **一个超文本由多个信息源链接成**。利用一个链接可使用户找到另一个文档。这些文档可以位于世界上任何一个接在互联网上的超文本系统中。**超文本是万维网的基础**。
* **超媒体与超文本的区别是文档内容不同**。超文本文档仅包含文本信息，而超媒体文档还包含其他表示方式的信息，如图形、图像、声音、动画，甚至活动视频图像。

  ![](https://i.niupic.com/images/2020/05/14/7RST.png) &#x20;

### 互联网专业术语(jargon)

* Web page:
  * consists of “objects”
  * addressed by a URL
* Most Web pages consist of:
  * base HTML page, and
  * several referenced objects.
* URL has two components:
  * host name
  * path name
  * URL: 由以冒号隔开的两大部分组成，并且在 URL 中的字符**对大写或小写没有要求**。
    * 一般组成：`<协议>://<主机>:<端口>/<路径>`
    * e.g. [http://www.someSchool.edu/somDept/pic.jpg](http://www.someschool.edu/somDept/pic.jpg)
    * 路径：若再省略文件的<路径>项，则 URL 就指到互联网上的某个主页 (home page)，缺省经常是index.html，default.html etc.
    * 现在有些浏览器为了方便用户，在输入URL时，可以把最前面的"[http://"甚至把主机名最前面的"www"省略，然后浏览器替用户把省略的字符添上。](http://xn--""www",-mw3k5n994a1yeta049ehtsjkyvfbma056rja27ir66fjddiszv5vrkat6cja431fqa258aka9605az40cix3cwqyf)
* User agent for Web is called a browser:
  * MS Internet Explorer
  * Netscape Communicator
* Server for Web is called Web server:
  * Apache (public domain)
  * MS Internet Information Server

### the http protocol

* http: hypertext transfer protocol
* Web's application layer protocol
* client/server model
  * client: browser that requests, receives, "displays" Web objects
  * server: Web server sends objects in response to requests
* http1.0: RFC 1945
  * 非坚持型，非流水线方式
  * 客户在收到前一个响应后才能发出下一个请求。这比非持续连接的两倍 RTT 的开销节省了建立 TCP 连接所需的一个 RTT 时间。但服务器在发送完一个对象后，其 TCP 连接就处于空闲状态，浪费了服务器资源。
* http1.1: RFC 2068
  * 坚持型，流水线方式
  * 客户在收到 HTTP 的响应报文之前就能够接着发送新的请求报文。一个接一个的请求报文到达服务器后，服务器就可连续发回响应报文。使用流水线方式时，客户访问所有的对象只需花费一个 RTT时间，使 TCP 连接中的空闲时间减少，提高了下载文档效率。

    ![](https://i.niupic.com/images/2020/05/15/7RUw.png) &#x20;
* http: **TCP transport service**
  * client initiates TCP connection (creates socket) to server, port 80
  * server accepts TCP connection from client
  * http messages (application layer protocol messages) exchanged between browser (http client) and Web server (http server)
  * TCP connection closed
* http is "**stateless**"
  * server maintains no information about past client requests
* Protocols that maintain “state” are complex!
  * past history (state) must be maintained
  * if server/client crashes, their views of “state” may be inconsistent, must be reconciled

### 万维网的工作过程

![](https://i.niupic.com/images/2020/05/15/7RUx.png)

### 统一资源定位符 URL

* 资源定位符 URL 是对可以从互联网上得到的资源的位置和访问方法的一种简洁表示。
* URL 给资源的位置提供一种抽象的识别方法，并用这种方法给资源定位。
* 只要能够对资源定位，系统就可以对资源进行各种操作，如存取、更新、替换和查找其属性。
* URL 相当于一个文件名在网络范围的扩展。因此 URL 是与互联网相连的机器上的任何可访问对象的一个指针。
* URI：**不局限于互联网资源**，可以作为所有资源的标识符，现有的RFC已用URI代替URL。

#### 浏览器输入URL后的流程

1\) 浏览器分析超链指向页面的 URL。 2) 浏览器向 DNS 请求解析 [www.buaa.edu.cn](http://www.buaa.edu.cn) 的 IP 地址。 3) 域名系统 DNS 解析出北航服务器的 IP 地址。 4) 浏览器与服务器建立 TCP 连接 5) 浏览器发出取文件命令： GET /buaa/index.htm。 6) 服务器给出响应，把文件 index.htm 发给浏览器。 7) TCP 连接释放。 8) 浏览器显示index.htm 中的所有文本。

### 超文本传送协议 HTTP

#### HTTP 的操作过程

* 为了使超文本的链接能够高效率地完成，需要用 HTTP 协议来传送一切必须的信息。 &#x20;
* 从层次的角度看，HTTP 是面向事务的(transaction-oriented)应用层协议，它是万维网上能够可靠地交换文件（包括文本、声音、图像等各种多媒体文件）的重要基础
* http example 1. http server at host [www.someSchool.edu](http://www.someSchool.edu) waiting for TCP connection at port 80. 2. http client **initiates TCP connection** to http server (process) at [www.someSchool.edu](http://www.someSchool.edu).
  * Port 80 is default for http server. &#x20;
    1. http server accept the connection and notify client&#x20;
    2. http client sends http request message (containing URL) into **TCP connection socket**
    3. http server receives request message, forms response message containing requested object (someDepartment/home.index), sends message **into socket**
    4. http server closes TCP connection.&#x20;
    5. http client receives response message containing html file, displays html. Parsing html file, finds 10 referenced jpeg objects
    6. repeat steps above for 10 jpeg objects

       ![](https://i.niupic.com/images/2020/05/16/7SbK.png)

#### HTTP的请求报文结构

![](https://i.niupic.com/images/2020/05/16/7SbL.png) 报文由三个部分组成，即**开始行、首部行和实体主体**。在请求报文中，开始行就是请求行。

#### HTTP 请求报文的一些方法

|    方法   |         意义         |
| :-----: | :----------------: |
|  OPTION |      请求一些选项的信息     |
|   GET   |   请求读取由 URL所标志的信息  |
|   HEAD  | 请求读取由 URL所标志的信息的首部 |
|   POST  |   给服务器添加信息（例如，注释）  |
|   PUT   |   在指明的 URL下存储一个文档  |
|  DELETE |   删除指明的 URL所标志的资源  |
|  TRACE  |    用来进行环回测试的请求报文   |
| CONNECT |       用于代理服务器      |

#### HTTP 的 Request 和 Response

![](https://i.niupic.com/images/2020/05/16/7SbM.png) ![](https://i.niupic.com/images/2020/05/16/7SbN.png)

#### http response status codes

* 200 OK
  * request succeeded, requested object later in this message
* 301 Moved Permanently
  * requested object moved, new location specified later in this message (Location:)
* 400 Bad Request
  * request message not understood by server
* 404 Not Found
  * requested document not found on this server
* 505 HTTP Version Not Supported

#### User-server interaction: authentication

* Authentication goal: control access to server documents
  * stateless: client must present authorization in each request&#x20;
  * authorization: typically name, password
    * authorization: header line in request、
    * if no authorization presented, server refuses access, sends&#x20;
      * WWW authenticate: header line in response

        ![](https://i.niupic.com/images/2020/05/16/7SbP.png)&#x20;
* Browser caches name & password so that user does not have to repeatedly enter it.

#### User-server interaction: cookies

* server sends "cookie" to client in response mst
  * Set-cookie: 1678453
* client presents cookie in later requests
  * cookie: 1678453
* server matches presented cookie with server-stored info
  * authentication
  * remembering user preferences, previous choices

    ![](https://i.niupic.com/images/2020/05/16/7SbQ.png) &#x20;
* Cookie 是网站服务器为用户产生一个**唯一的识别码**
* Cookies: keeping "state" ![](https://i.niupic.com/images/2020/05/16/7Sc5.png)

#### User-server interaction: conditional GET

* Goal: don’t send object if client has up-to-date stored (cached) version
* client: specify date of cached copy in http request
  * If-modified-since:&#x20;
* server: response contains no object if cached copy up-todate:&#x20;
  * HTTP/1.0 304 Not Modified

    ![](https://i.niupic.com/images/2020/05/16/7Sc6.png)

#### Web Caches (proxy server)

* Goal: satisfy client request without involving origin server
* user sets browser: Web accesses via web cache
* client sends all http requests to web cache
  * if object at web cache, web cache immediately returns object in http response
  * else requests object from origin server, then returns http response to client

    ![](https://i.niupic.com/images/2020/05/16/7Sc9.png) &#x20;

#### Why Web Caching?

* Assume: cache is "close" to client (e.g., in same network)&#x20;
  * smaller response time: cache "closer" to client&#x20;
  * decrease traffic to distant servers
    * link out of institutional/local ISP network often bottleneck&#x20;

      ![](https://i.niupic.com/images/2020/05/16/7Scb.png)

## FTP

* 文件传送协议 FTP (File Transfer Protocol) 是互联网上使用得最广泛的文件传送协议。 &#x20;
* FTP 提供交互式的访问，允许客户指明文件的类型与格式，并允许文件具有存取权限。 &#x20;
* FTP 屏蔽了各计算机系统的细节，因而适合于在异构网络中任意计算机之间传送文件。 &#x20;
* RFC 959 很早就成为了互联网的正式标准。 &#x20;

### FTP 的基本工作原理

* 网络环境下复制文件的复杂性:  &#x20;
  * 计算机存储数据的格式不同。&#x20;
  * 文件的目录结构和文件命名的规定不同。&#x20;
  * 对于相同的文件存取功能，操作系统使用的命令不同。 &#x20;
  * 访问控制方法不同。
  * FTP 的主要功能是**减少或消除在不同操作系统下处理文件的不兼容性**。

![](https://i.niupic.com/images/2020/04/14/7pr1.png)

* transfer file to/from remote host
* client/server model      &#x20;
  * client: side that initiates transfer (either to/from remote)
  * server: remote host&#x20;
* ftp: RFC 959
  * ftp server: port 21
* ftp: **separate control data connections**
  * ftp client contacts ftp server at port 21, specifying **TCP as transport protocol**  &#x20;
  * two parallel TCP connections opened: &#x20;
    * **control**: exchange commands, responses between client, server. &#x20;
      * in band: 数据传输和控制在同一个频段
      * out of band: 数据传输和控制在不同线传输或在同一线的不同频道
    * **data**: file data to/from server
  * ftp server **maintains "state"**: current directory, earlier authentication
* ftp commands, responses &#x20;
  * Sample **commands** &#x20;
    * sent as ASCII text over control channel
    * USER username
    * PASS password
    * LIST return list of file in current directory
    * RETR(Retrieve) filename retrieves (gets) file
    * STOR(store) filename stores (puts) file onto remote host
  * Sample **return codes**
    * status code and phrase (as in http)
    * **331** Username OK, password required
    * **125** data connection already open; transfer starting
    * **425** Can’t open data connection
    * **452** Error writing file
* Typical FTP Session

  ![](https://i.niupic.com/images/2020/04/14/7pr3.png)

### 控制连接与数据连接

|  连接类型 |                   控制连接                   |             数据连接             |
| :---: | :--------------------------------------: | :--------------------------: |
|   定义  | 是建立在用户协议解释器和服务器协议解释器之间**用于交换命令与应答的通信链路** |    在控制连接作用下**实现的全双工的数据传输**   |
|   作用  |            为数据连接使用TCP建立一条命令链路            |            进行数据传输            |
|  使用条件 |               发送命令和接收应答时使用               |          下载和上传数据时使用          |
| 使用端口号 |       <p>服务器:21 <br> 客户机:>1023</p>       | <p>服务器:20 <br> 客户机:>1023</p> |

二者关系:

* **控制连接在前，数据连接在后;**
* **控制连接关闭，数据连接也关闭;**&#x20;
* **数据连接关闭，控制连接仍然可以使用。**

## Electronic Mail

* Three major components:
  * **user agents**
    * a.k.a. "mail reader"
    * composing, editing, reading

      mail messages
    * e.g., Eudora, Outlook, elm, Netscape Messenger
    * outgoing, incoming messages stored on server
  * **mail servers**
  * simple mail transfer protocol: smtp

    ![](https://i.niupic.com/images/2020/04/14/7pr4.png) &#x20;

### smtp \[RFC 821]

* uses tcp to reliably transfer email msg from client to server, port 25
* direct transfer: sending server to receiving server
* three phases of transfer&#x20;
  * handshaking (greeting)&#x20;
  * transfer of messages&#x20;
  * closure
* command/response interaction&#x20;
  * commands: ASCII text
  * response: status code and phrase
* messages must be in 7-bit ASCII

### try smtp interaction for yourself

* telnet servername 25
* see 220 reply from server
* enter HELO, MAIL FROM, RCPT TO, DATA, QUIT commands
* above lets you send email without using email client (reader)

e.g.

```bash
S: 220 hamburger.edu
C: HELO crepes.fr
S: 250 Hello crepes.fr, pleased to meet you
C: MAIL FROM: <alice@crepes.fr>
S: 250 alice@crepes.fr... Sender ok
C: RCPT TO: <bob@hamburger.edu>
S: 250 bob@hamburger.edu ... Recipient ok
C: DATA
S: 354 Enter mail, end with "." on a line by itself C: Do you like ketchup?  
C: How about pickles?  
C: .
S: 250 Message accepted for delivery
C: QUIT
S: 221 hamburger.edu closing connection
```

### smtp 总结

* smtp uses **persistent connections**
* smtp requires that message (header & body) be in 7-bit ascii
* certain character strings are not permitted in message (e.g., CRLF. CRLF). Thus message has to be encoded (usually into either base-64 or quoted printable)
* smtp server uses CRLF.CRLF to determine end of message
* **Comparison with http**
  * http: **pull** while email: **push**
  * **both** have ASCII command/response interaction, status codes
  * http: each object is encapsulated in its **own response message** while smtp: multiple objects message sent in **a multipart message** &#x20;

### Mail message format

* smtp: protocol for exchanging email msgs
* RFC 822: standard for text message format:
  * header lines, e.g.,&#x20;
    * To:
    * From:
    * Subject:
    * **different** from smtp commands!
  * body
    * the “message”, ASCII characters only&#x20;

#### multimedia extensions

* MIME: multimedia mail extension, RFC 2045, 2056
* additional lines in msg header declare MIME content type&#x20;
* 用base64编码 ![](https://i.niupic.com/images/2020/04/14/7pr5.png)
* MIME Content-Type 类型及子类型

|       内容类型      |                 子类型举例                |      说明     |
| :-------------: | :----------------------------------: | :---------: |
|     text(文本)    |         plain, html, xml, css        |   不同格式的文本   |
|    image(图像)    |            gif, jpeg, tiff           |  不同格式的静止图像  |
|    audio(音频)    |           basic, mpeg, mp4           |    可听见的声音   |
|    video(视频)    |         mpeg, mp4, quicktime         |   不同格式的影片   |
|    model(模型)    |                 vrml                 |     3D模型    |
| application(应用) |  octet-stream, pdf, javascript, zip  | 不同应用程序产生的数据 |
|   message(报文)   |             http, rfc822             |    封装的报文    |
|  multipart(多部分) | mixed, alternative, parallel, digest |   多种类型的组合   |

* Multipart Type Example

  ```bash
  From: alice@crepes.fr
  To: bob@hamburger.edu
  Subject: Picture of yummy crepe.
  MIME-Version: 1.0
  Content-Type: multipart/mixed; boundary=98766789
  --98766789
  Content-Transfer-Encoding: quoted-printable Content-Type: text/plain
  Dear Bob,
  Please find a picture of a crepe. --98766789 Content-Transfer-Encoding: base64 Content-Type: image/jpeg
  base64 encoded data ..... ......................... ......base64 encoded data --98766789--
  ```

### Mail access protocols

![](https://i.niupic.com/images/2020/04/14/7pr7.png)

* **SMTP**: delivery/storage to receiver’s server&#x20;
* mail access protocol: retrieval from server
  * **POP**: Post Office Protocol \[RFC 1939]: authorization, **download only**
  * **IMAP**: Internet Mail Access Protocol \[RFC 1730]: more features, including manipulation of stored msgs on server
  * **HTTP**: gmail, Hotmail, Yahoo! Mail, etc.

### POP3 (more) and IMAP

* IMAP
  * keeps all messages in one place: at server
  * allows user to organize messages in folders
  * keeps user state across sessions:
    * names of folders and mappings between message IDs and folder name
* more about POP3
  * previous example uses POP3 “download and delete” mode
    * Bob cannot re-read e-mail if he changes client
  * POP3 “download-and- keep”: copies of messages on different clients
  * POP3 is stateless across sessions
  * POP3 protocol &#x20;
    * **authorization phase**&#x20;
      * client commands:
        * user: declare username&#x20;
        * pass: password &#x20;
      * server responses&#x20;
        * +OK
        * -ERR
      * ![](https://i.niupic.com/images/2020/04/14/7pz7.png)
    * transaction phase, client:&#x20;
      * list: list message numbers &#x20;
      * retr: retrieve message by number&#x20;
      * dele: delete &#x20;
      * quit&#x20;
      * ![](https://i.niupic.com/images/2020/04/14/7pz8.png) &#x20;

#### 电子邮件系统

![](https://i.niupic.com/images/2020/04/14/7pz9.png)

## 协议自动配置

* 为了将软件协议做成通用的和便于移植，协议软件的编写者把协议软件参数化，在软件协议运行之前，必须给每一个参数赋值。 &#x20;
* 主机需要配置的项目

  1\) IP 地址

  2\) 子网掩码

  3\) 默认路由器的 IP 地址

  4\) 域名服务器的 IP 地址
* 这些信息通常存储在一个**配置文件**中，计算机在**引导过程中**可以对这个文件进行存取。

### 动态主机配置协议 DHCP

* 互联网广泛使用的**动态主机配置协议** DHCP (Dynamic Host Configuration Protocol) 提供了**即插即用连网** (plug-and-play networking) 的机制。 &#x20;
* 这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与。 &#x20;

### DHCP 使用客户-服务器方式

* 需要 IP 地址的主机在启动时就向 DHCP 服务器广播发送**发现报文(DHCPDISCOVER)**，这时该主机就成为 DHCP 客户。
* 本地网络上所有主机都能收到此广播报文，但只有 DHCP 服务器才回答此广播报文。
* DHCP 服务器先在其数据库中查找该计算机的配置信息。若找到，则返回找到的信息。若找不到，则从服务器的 IP 地址池(address pool) 中取一个地址分配给该计算机。DHCP 服务器的回答报文叫做**提供报文(DHCPOFFER)**。

### DHCP 中继代理(relay agent)

* 并不是每个网络上都有 DHCP 服务器，这样会使 DHCP 服务器的数量太多。现在是每一个网络至少有一个 DHCP 中继代理，它配置了 DHCP 服务器的 IP 地址信息。 &#x20;
* 当 DHCP 中继代理收到主机发送的发现报文后，就以单播方式向 DHCP 服务器转发此报文，并等待其回答。收到 DHCP 服务器回答的提供报文后，DHCP 中继代理再将此提供报文发回给主机。 &#x20;

**DHCP 中继代理 以单播方式转发发现报文** ![](https://i.niupic.com/images/2020/04/14/7pA6.png)

#### 租用期 (lease period)

* DHCP 服务器分配给 DHCP 客户的 IP 地址的临时的，因此 DHCP 客户只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP 协议称这段时间为租用期。
* 租用期的数值应由 DHCP 服务器自己决定。
* DHCP 客户也可在自己发送的报文中(例如:发现报文)提出对租用期的要求。 &#x20;

#### DHCP 协议的工作过程

![](https://i.niupic.com/images/2020/04/14/7pAl.jpg)\
1\. DHCP 服务器被动打开UDP端口 67，等待客户端\
2\. DHCP 客户从 UDP 端口 68 发送 DHCP 发现报文

## DNS(Domain Name System)

* 许多应用层软件经常直接使用**域名系统**DNS (Domain Name System)，但计算机的用户只是间接而不是直接使用域名系统。
* 互联网采用层次结构的命名树作为主机的名字，并使用**分布式**的域名系统 DNS。
* 名字到 IP 地址的解析是由若干个域名服务器程序完成的。域名服务器程序在专设的结点上运行，运行该程序的机器称为**域名服务器**。
* 域名服务器
  * 一个服务器所负责管辖的(或有权限的)范围叫做区 (zone)。
  * 各单位根据具体情况来划分自己管辖范围的区。
  * 每一个区设置相应的权限域名服务器，**用来保存该区中的所有主机的域名到 IP 地址的映射**。
  * DNS 服务器的管辖范围不是以“域”为单位，而是以“区”为单位。
  * 区的不同划分方法举例
    * ![](https://i.niupic.com/images/2020/05/11/7MQk.png)
* DNS概述
  * 域名系统是一个典型的客户/服务器交互系统；
  * 域名系统是一个多层次的、基于域的命名系统，并使用分布式数据库实现这种命名机制

### 互联网的域名结构

* 互联网采用了层次**树状结构**的命名方法。
* 任何一个连接在互联网上的主机或路由器，都有一个唯一的层次结构的名字，即域名。
* 域名的结构由标号序列组成，各标号之间用点隔开：
  * … . 三级域名 . 二级域名 . 顶级域名
* 各标号分别代表不同级别的域名。&#x20;

![](https://i.niupic.com/images/2020/05/11/7MNj.png)

* 树状结构的DNS域名服务器 ![](https://i.niupic.com/images/2020/05/11/7MQT.png)
* 域名只是个逻辑概念，并不代表计算机所在的物理地点
* 变长的域名和使用有助记忆的字符串，是为了便于人来使用。而IP地址是定长的32位二进制数字则非常便于机器进行处理。
* 域名中的“点”和点分十进制IP地址中的“点”并无一一对应的关系。

### 根域名服务器

* 根域名服务器是**最高层次的域名服务器**，也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP地址。
* **不管是哪一个本地域名服务器，若要对互联网上任何一个域名进行解析，只要自己无法解析，就首先求助于根域名服务器**。
* 在互联网上共有 13 个不同 IP 地址的根域名服务器，它们的名字是用一个英文字母命名，从 a 一直到 m(前 13 个字母)。
* 根域名服务器共有 13 套装置
  * 根域名服务器共有 13 套**装置**，不是 13 个机器
  * 这些根域名服务器相应的域名分别是：
    * a.rootservers.net
    * b.rootservers.net
    * …
    * m.rootservers.net
  * 到2016年2月，全世界已经在 588 个地点安装了根域名服务器，使世界上大部分 DNS 域名服务器都能**就近**找到一个根域名服务器。
* 根域名服务器并**不直接把域名直接转换成 IP 地址**。
* 在使用迭代查询时，根域名服务器**把下一步应当找的顶级域名服务器的 IP 地址告诉本地域名服务器**。

### 顶级域名服务器

* 顶级域名服务器(即 TLD 服务器)负责管理在该顶级域名服务器注册的所有**二级域名**。
* 当收到 DNS 查询请求时，就给出相应的回答(可能是最后的结果，也可能是下一步应当找的域名服务器的 IP 地址)。
* 分类：
  * 国家顶级域名 nTLD
    * 如: .cn 表示中国，.us表示美国，.uk 表示英国，等等。
  * 通用顶级域名 gTLD
    * 最早的通用顶级域名是：
      * .com (公司和企业)
      * .net (网络服务机构)
      * .org (非赢利性组织)
      * .edu (美国专用的教育机构)
      * .gov (美国专用的政府部门)
      * .mil (美国专用的军事部门)
      * .int (国际组织)
    * 新增的通用顶级域名：
      * .aero (航空运输企业)
      * .biz (公司和企业)
      * .cat (加泰隆人的语言和文化团体)
      * .coop (合作团体)
      * .info (各种情况)
      * .jobs (人力资源管理者)
      * .mobi (移动产品与服务的用户和提供者)
      * .museum (博物馆)
      * .name (个人)
      * .pro (有证书的专业人员)
      * .travel (旅游业)&#x20;
  * 基础结构域名(infrastructure domain)
    * 这种顶级域名只有一个，即 arpa，用于反向域名解析，因此又称为反向域名

![](https://i.niupic.com/images/2020/05/11/7MOg.png)

### 权限域名服务器

* Authoritative name server，用来保存该区中所有主机的域名到IP地址的映射。
* 负责一个区的域名服务器。&#x20;
* 当一个权限域名服务器还不能给出最后的查询回答时，就会告诉发出查询请求的 DNS 客户，下一步应当找哪一个权限域名服务器。 &#x20;

### 本地域名服务器

* 本地域名服务器对域名系统非常重要&#x20;
* 当一个主机发出 DNS 查询请求时，这个查询请求报文就发送给本地域名服务器
* 每一个互联网服务提供者 ISP，或一个大学，甚至一个大学里的系，都可以拥有一个本地域名服务器，
* 这种域名服务器有时也称为**默认域名服务器**。

### 提高域名服务器的可靠性

* DNS 域名服务器都把数据复制到几个域 名服务器来保存，其中的一个是主域名

  服务器，其他的是辅助域名服务器。 \* 当主域名服务器出故障时，辅助域名服

  务器可以保证 DNS 的查询工作不会中断。
* 主域名服务器定期把数据复制到辅助域

  名服务器中，而更改数据只能在主域名

  服务器中进行。这样就保证了数据的一 致性。

### 域名的解析过程

* **主机向本地域名服务器的查询**一般都是采用**递归查询**。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址，那么本地域名服务器就以 DNS 客户的身份，向其他根域名服务器继续发出查询请求报文。
* **本地域名服务器向根域名服务器的查询**通常是采用**迭代查询**。当根域名服务器收到本地域名服务器的迭代查询请求报文时，要么给出所要查询的 IP 地址，要么告诉本地域名服务器: “你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。 &#x20;

#### 本地域名服务器采用迭代查询

* 从请求主机到本地DNS的查询是递归的，其余的查询是迭代的(recursive query)
  * 本地域名服务器采用迭代查询
    * 迭代：始终本地域名服务器去询问

      ![](https://i.niupic.com/images/2020/05/11/7Nbr.png) &#x20;
  * 本地域名服务器采用递归查询(少用)
    * 递归：本地域名服务器只询问根域名服务器，让根域名服务器代替自己去询问

      ![](https://i.niupic.com/images/2020/05/11/7NcC.png)
* 名字的高速缓存
  * 每个域名服务器都维护一个高速缓存，存放最近用过的名字以及从何处获得名字映射信息的记录。
  * 可大大减轻根域名服务器的负荷，使互联网上的DNS 查询请求和回答报文的数量大为减少。
  * 为保持高速缓存中的内容正确，域名服务器应为每项内容设置计时器，并处理超过合理时间的项

    (例如，每个项目只存放两天)。
  * 当权限域名服务器回答一个查询请求时，在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销，而减少此时间值可提高域名转换的准确性。

### 域名服务

#### 资源记录(RR)

* 在**DNS的数据库中**用资源记录来表示**主机和子域**的信息，当应用程序进行域名解析时，得到的便是域名所对应的资源记录。
* 资源记录是一个五元式
  * Domain\_name | Time\_to\_live | Type | Class | Value

    ![](https://i.niupic.com/images/2020/05/14/7RQ6.png)

#### DNS 协议和数据

* DNS protocol : query and reply messages, both with same message format

  ![](https://i.niupic.com/images/2020/05/14/7RQq.png)
* 会话标识(2字节)：是DNS报文的ID标识，**对于请求报文和其对应的应答报文，这个字段是相同的**，通过它可以区分DNS应答报文是哪个请求的响应
* 标志(2字节) ![](https://i.niupic.com/images/2020/05/14/7RQs.png)

  |     Flag     |                     Meaning                    |
  | :----------: | :--------------------------------------------: |
  |   QR(1bit)   |                查询/响应标志，0为查询，1为响应               |
  | opcode(4bit) |           0表示标准查询，1表示反向查询，2表示服务器状态请求           |
  |   AA(1bit)   |                     表示授权回答                     |
  |   TC(1bit)   |                     表示可截断的                     |
  |   RD(1bit)   |                     表示期望递归                     |
  |   RA(1bit)   |                     表示可用递归                     |
  |  rcode(4bit) | 表示返回码，0表示没有差错，3表示名字差错，2表示服务器错误(Server Failure) |
* 数量字段(总共8字节)：
  * Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。
    * Questions表示查询问题区域节的数量
    * Answers表示回答区域的数量
      * Authoritative nameservers 表示授权区域的数量
    * Additional records 表示附加区域的数量
* 正文部分
  * Queries

    ![](https://i.niupic.com/images/2020/05/14/7RQt.png)

    * 查询名：长度不固定，且不使用填充字节，一般该字段表示的就是需要查询的域名(如果是反向查询，则为IP，反向查询即由IP地址反查域名)，一般的格式如下图所示。

      ![](https://i.niupic.com/images/2020/05/14/7RQF.png)
    * 查询类型

      |  类型 |  助记符  |      说明     |
      | :-: | :---: | :---------: |
      |  1  |   A   | 由域名获得IPv4地址 |
      |  2  |   NS  |   查询域名服务器   |
      |  5  | CNAME |    查询规范名称   |
      |  6  |  SOA  |     开始授权    |
      |  11 |  WKS  |     熟知服务    |
      |  12 |  PTR  |  把IP地址转换成域名 |
      |  13 | HINFO |     主机信息    |
      |  15 |   MX  |     邮件交换    |
      |  28 |  AAAA | 由域名获得IPv6地址 |
      | 252 |  AXFR |   传送整个区的请求  |
      | 255 |  ANY  |   对所有记录的请求  |
    * 查询类：通常为1，表明是Internet数据
  * RR&#x20;
    * 资源记录区域（包括回答区域，授权区域和附加区域）,该区域有三个，但格式都是一样的。

      ![](https://i.niupic.com/images/2020/05/14/7RQJ.png)
    * 域名（2字节或不定长）：它的格式和Queries区域的查询名字字段是一样的。
      * 有一点不同就是，当报文中域名**重复出现**的时候，该字段使用**2个字节的偏移指针**来表示。比如，在资源记录中，域名通常是查询问题部分的域名的重复，因此用2字节的指针来表示。
      * 具体格式是最前面的**两个高位是 11，用于识别指针**。其余的14位从DNS报文的开始处计数（从0开始），指出该报文中的相应字节数。一个典型的例子，C00C(1100000000001100，12正好是头部的长度，其正好指向Queries区域的查询名字字段)。
    * 查询类型：表明资源纪录的类型，见1.2节的查询类型表格所示&#x20;
    * 查询类：对于Internet信息，总是IN
    * 生存时间（TTL）：以秒为单位，表示的是资源记录的生命周期，一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间，它同时也可以表明该资源记录的稳定程度，**极为稳定的信息会被分配一个很大的值**（比如86400，这是一天的秒数）。
    * 资源数据：该字段是一个可变长字段，表示按照查询段的要求返回的相关资源记录的数据。可以是Address（表明查询报文想要的回应是一个IP地址）或者CNAME（表明查询报文想要的回应是一个规范主机名）等。
    * **简单网络管理协议 SNMP**
* 网络管理包括对硬件、软件和人力的使用、综合与协调，以便对网络资源进行监视、测试、配置、分析、评价和控制，这样就能以合理的价格满足网络的一些需求，如实时运行性能，服务质量等。**网络管理常简称为网管**。
* 网络管理**并不是**指对网络进行**行政上的管理**。

### 网络管理的一般模型

![](https://i.niupic.com/images/2020/05/14/7RQO.png)\
需要注意的地方：

* 监控的叫做**客户端Client** 或 **agent**
* 被检控的叫做**服务端Server** 或 **Manager**

### 网络管理模型中的主要构件

* 管理站也常称为网络运行中心 NOC (Network Operations Center)，是网络管理系统的核心。&#x20;
* 管理程序在运行时就成为管理进程。
* 管理站（硬件）或管理程序（软件）都可称为管理者(manager)。
* **Manager 不是指人而是指机器或软件**。
* **网络管理员(administrator) 指的是人**。
* 大型网络往往实行多级管理，因而有多个管理者，而一个管理者一般只管理本地网络的设备。

### SNMP 技术术语

* **SNMP**：Simple Network Management Protocol(简单网络管理协议)，是一个标准的用于管理基于IP网络上设备的协议。
* **MIB**：Management Information Base(管理信息库)，定义代理进程中所有可被查询和修改的参数。
  * ![](https://i.niupic.com/images/2020/05/14/7RSa.png)
  * UDP样例：

    ![](https://i.niupic.com/images/2020/05/14/7RSc.png)
* **SMI**：Structure of Management Information(管理信息结构)，SMI定义了SNMP中使用到的ASN.1类型、语法，并定义了SNMP中使用到的类型、宏、符号等。SMI用于后续协议的描述和MIB的定义。每个版本的SNMP都可能定义自己的SMI。主要功能：
  * 被管对象应怎样命名；
  * 用来存储被管对象的数据类型有哪些种；
  * 在网络上传送的管理数据应如何编码。
  * SMI 规定所有被管对象必须在命名树上：

    ![](https://i.niupic.com/images/2020/05/14/7RS4.png)
* **ASN.1**：Abstract Syntax Notation One(抽象语法定义)。用于定义语法的正式语言，在SNMP中定义SNMP的协议数据单元PDU和管理对象MIB的格式。SNMP只使用了ASN.1中的一部分，而且使用ASN.1的语言特性定义了一些自定义类型和类型宏 ，这些组成了SMI。  &#x20;
  * SMI 标准指明了所有的 MIB 变量必须使用抽象语法记法 1（ASN.1）来定义。
  * ASN.1 的记法很严格，它使得**数据的含义不存在任何可能的二义性**。
  * SMI 把数据类型分为两大类：**简单类型和结构化类型**。&#x20;
* **PDU**： Protocol Data Unit(协议数据单元)，它是网络中传送的数据包。每一种SNMP操作，物理上都对应一个PDU。
* **NMS**： Network Management System，网络管理系统，又名网络管理站，简称“管理站”。它是SNMP的总控机，提供统一的用户界面访问支持SNMP的设备，一般提供UI界面，并有统计、分析等功能，是网管系统的总控制台。NMS是网络管理操作的发起者。
* **Agent**： 是SNMP的访问代理，简称“代理”，为设备提供SNMP能力，负责设备与NMS的通信。
* **Proxy**： 代理服务器，对实现不同协议的设备进行协议转换，使非IP协议的设备也能被管理。
* **Trap**： 是由设备主动发出的报警数据，用于提示重要的状态的改变。
* **BER**： Basic Encoding Rule，基本编码规格。描述如何将ASN.1类型的值编码为字符串的方法。它是ASN.1标准的一部分。
  * BER编码将数据分成TLV三部分，T为Tag的缩写，是类型标识；L为Length的缩写，标识类型的长度；V为Value的缩写，标识数据内容。
  * 按照TLV的顺序对数据进行编码，生成字节流。
  * SNMP使用BER将SNMP的操作请求和应答编码后进行传输，并用于接收端进行解码。

### SNMP Feature

#### SNMP Naming

* 问题：如何对互联网上所有可能的对象精准命名？
* 答案：ISO Object Identifier tree
  * hierarchical naming of all objects
  * each branch point has name, number

    ![](https://i.niupic.com/images/2020/05/14/7RSd.png)

    ![](https://i.niupic.com/images/2020/05/14/7RSe.png)

#### SNMP Protocol

两种方式传递MIB信息： ![](https://i.niupic.com/images/2020/05/14/7RSf.png)

* 信息类型：

  |                      Message Type                     |                               Function                               |
  | :---------------------------------------------------: | :------------------------------------------------------------------: |
  | <p>GetRequest<br>GetNextRequest<br>GetBulkRequest</p> | <p>Mgr-to-agent: "get me data"<br>(instance,next in list, block)</p> |
  |                     InformRequest                     |                     Mgr-to-Mgr: here’s MIB value                     |
  |                       SetRequest                      |                      Mgr-to-agent: set MIB value                     |
  |                        Response                       |               Agent-to-mgr: value, response to Request               |
  |                          Trap                         |           Agent-to-mgr: inform manager of exceptional event          |
* 消息类型

  ![](https://i.niupic.com/images/2020/05/14/7RSh.png)

#### SNMP security and administration

* encryption:&#x20;
  * DES-encrypt SNMP message
* authentication: compute, send MIC(m,k):&#x20;
  * compute hash (MIC) over message (m), secret shared key (k)
* protection against playback:&#x20;
  * use nonce
* view-based access control
  * SNMP entity maintains database of access rights, policies for various users
  * database itself accessible as managed object!

#### Presentation 表示方法

不同的主机之间存储的方式可能不同，如对于同一个数据结构和数据的存储：

```cpp
struct {
    char code;
    int x;
} test;
test.x = 256;
test.code = 'a';
```

![](https://i.niupic.com/images/2020/05/14/7RSA.png)

* 解决方案：
  1. Translate local-host format to host-independent format
  2. Transmit data in host-independent format
  3. Translate host-independent format to remote-host format

**TLV Encoding**

* Idea: transmitted data is self-identifying
  * T: data type, one of ASN.1-defined types
  * L: length of data in **bytes**
  * V: value of data, encoded according to ASN.1 standard

| Tag Value |        Type       |
| :-------: | :---------------: |
|     1     |      Boolean      |
|     2     |      Integer      |
|     3     |     BitString     |
|     4     |    OctetString    |
|     5     |        Null       |
|     6     | Object Identifier |
|     9     |        Real       |

...

e.g. 例如，INTEGER 15，其 T 字段是02，INTEGER 类型要用 4 字节编码。最后得出 TLV 编码为 `02 04 00 00 00 0F`。 又如 IPAddress 192.1.2.3，其 T 字段是 40，V 字段需要 4 字节表示，因此得出 IPAddress 192.1.2.3 的 TLV 编码是 `40 04 C0 01 02 03`。

![](https://i.niupic.com/images/2020/05/14/7RSB.png)

## Practice

> 若用户1和用户2之间发送和接收电子邮件的过程如图所示，则图中(1)(2)(3)阶段分别使用的应用层协议可以是( )。\
> A.SMTP,SMTP,SMTP B.POP3,SMTP,POP3\
> C.POP3,SMTP,SMTP D.SMTP,SMTP,POP3\
> ![](https://i.niupic.com/images/2020/04/14/7pzc.png)

(1) 是用户代理向邮箱服务器发送邮件-->SMTP (2) 是邮箱服务器向邮箱服务器发送邮件-->SMTP (3) 是涌向服务器向用户代理发送邮件-->POP3\
选D

> 下列关于SMTP协议的叙述中，正确的是( )。 1. 只支持传输7比特ASCII码内容 2. 支持在邮件服务器之间发送邮件 3. 支持从用户代理向邮件服务器发送邮件 4. 支持从邮件服务器向用户代理发送邮件 A.1，2，3 B.1，2，4 C.1，3，4 D.2，3，4\
> 显然4是POP，故选A

> 如果本地域名服务器无缓存，当采用**递归方法**解析另一网络某主机域名时，用户主机、本地域名服务器发送的域名请求消息数分别为（）。 A.一条，一条 B.一条，多条 C.多条，一条 D.多条，多条 递归方法每个主机和服务器发一条，故选A。

## Reference

1. [DNS协议详解及报文格式分析](https://www.cnblogs.com/davidwang456/articles/10660051.html)
