Emacs is a lifestyle :-)
And happy hacking emacs!

深入理解计算机网络

分类: 网络 · 字数: 10673 · ...

本篇为本人学习《计算机网络:自顶向下方法》第六版的知识总结。

1 计算机网络和因特网

1.1 什么是因特网

1.1.1 构成描述

因特网是一个世界范围的计算机网络,它连接了世界上数以亿计的计算设备。这些设备被称为主机或端系统。其中端系统通过 通信链路 (communication link) 和 分组交换机 (package switch) 连接在一起。通信链路和分组交换机统称为网络的路径(route)。

通信链路有不同类型的物理媒介,包括同轴电缆、铜线、光纤和无线电频谱 。不同媒介有不同的传输速率,用比特/秒度量(bit/s或bps)。通信链路的作用是 传输分组数据

主要的分组交换机有路由器和链路层交换机 。分组交换机的作用是 使分组数据朝着目的地转发

1.1.2 服务描述

因特网向应用程序提供了多种服务,应用程序一般选择其中一种向终端用户提供服务,比如电子邮件、web冲浪、即时通讯等。这些程序因为涉及到多终端间的数据交换,被称为分布式应用程序。应用程序 不关心网络内部的数据传输及分组交换的细节 。它关心的是如何使用因特网服务实现终端间的数据交换。这种应用程序必须遵守的发送和接收数据的标准就是 应用程序编程接口(API)

1.1.3 协议

协议定义了在两个或多个通信实体间交换的报文格式和次序,以及报文发送和/或接收一条报文或其它事件所采取的动作。

1.2 网络边缘

1.2.1 接入网

家庭接入:DSL、电缆、FTTH、拨号和卫星 / 企业(和家庭)接入:以太网和WiFi / 广域无线接入:3G和LTE

1.2.2 物理媒介

双绞铜线、同轴电缆、光纤、陆地无线电信道、卫星无线电信道

1.3 网络核心

网络核心是由端系统的分组交换机和通信链路构成的网状网络。

1.3.1 分组交换

交换机在向输出链路传输一个分组前必须接收到整个分组。这就是交换机的 存储转发机制 。该机制导致了 存储转发时延

分组交换机与多条链路相连,每条链路都有一个输出缓存。当某条输出链路正在工作时,同条链路到达的分组就要排队,产生 排队时延 。当缓存占满时,继续到达的分组就会丢失,称为 丢包

源端在数据分组时会在每个分组的首部包含目的地的IP地址。分组达到路由器后,路由器根据ip地址搜索其 转发表转发表记录了目的地址和输出链路的映射 ,路由器据此将分组导向合适的输出链路。

至于,路由器的转发表是如何生成的,路由器如何选择路由最佳路径,这些都由 路由选择协议 决定。

1.3.2 电路交换

电路交换原理

分组交换与电路交换对比

1.3.3 网络的网络

今天的因特网是一个网络的网络,由十多个第一层ISP和若干不同层次的区域ISP组成。普通用户作为接入ISP向与其相连的区域IPS付费,底层次ISP向较高层次ISP付费,形成了庞大的 层次结构 。除了以上的层次结构,客户ISP付费可以通过 存在点(PoP) 与提供商ISP直接连接,以获取高速链路;相同层次的邻近ISP可以 对等(peer) ,对等网络间不结算流量费用;第三方公司可以创建 网络交换点(IXP) , 多个ISP在IXP中共同对等。特别地,如今的 内容提供商(如谷歌) 一般拥有专用网络,这种专用网络可以绕过高层ISP,与低层ISP对等或直接与接入ISP相连。以上就是如今的因特网的大概样貌。

1.4 分组交换中的时延、丢包和吞吐量

1.4.1 分组交换中的时延

  • 处理时延:检查分组首部和决定将该分组导向何处所需要的时间,还包括检查比特级别的差错的时间。
  • 排队时延:分组在链路上等待传输时排队的时间。
  • 传输时延:将分组的所有比特推到链路所需的时间,受传输速率影响。
  • 传播时延:分组从链路起点到另一台路由器传播所需的时间,受传播速率影响,传播速率取决于链路的物理媒介。

以上四种时延加一起来叫做 节点总时延 。传输时延和传播时延比较 :传输时延是将是将分组推出到链路的时间,是分组长度和传输速率的函数,与路由器间距离无关。传播时延是一个比特从一台路由器到另一台路由器传播用的时间,是路由器间距离的函数,与分组长度和链路传输速率无关。

1.4.2 排队时延和丢包

四种时延中,排队时延是最复杂和有趣的情况 ,因此有大量的论文和专著研究它。接下来根据自己的理解阐述排队时延的相关问题:

首先,我们应该承认这样的事实:当比特到达队列的速率大于从队列推出比特的速率时,一定会产生排队。当比特到达队列的速率小于从队列推出比特的速率时,也不一定不会产生排队,因为多个分组可能同时到达。接下来,用数值计算来量化这一过程。

我们用a(单位:分组/秒)表示分组到达队列的平均速率。用R(单位:b/s)表示从队列推出比特的速率,也就是传输速率。假设每个分组都是由L比特组成的,那么比特到达队列的平均速率为 La bps 。我们将两种速率的比值 La/R 称为 流量强度 。我们用它来表征时延的统计量。

当 La/R > 1 时,排队将无限增加,排队时延趋于无穷大。这和堵车是一个道理,发车的速率小于车到达的速率,车队就会越堵越长。

当 La/R ≤ 1 时,此时分组到达的时间间隔将影响排队情况。假设每 L/R 秒到达一个分组,则不会排队;假设每 (L/R)/N 秒到达N个分组,则第一个分组不用排队,后面分组都要排队且排队时延为 (n-1)L/R 。

实际情况是,达到队列的过程是随机,不存在周期性。此时 La/R 不能全面表征时延的统计量。此时考虑 La/R = 0 时,平均排队时延接近0;La / R接近1时 平均排队时延趋于无穷大。据此,不难画出流量强度与平均排队时延的关系图。形状类似一个从接近原点处开始的斜率不断增大的弧线,接近1时的斜率趋于正无穷。

以上情形是假设队列能容纳无穷多分组的理想状态。我们前面说到输出链路的缓存是有限的,因此当缓存满时,继续到达的队列就会被丢弃。

1.4.3 计算机网络中的吞吐量

吞吐量指单位时间内通过网络的数据流量。吞吐量的大小取决于瓶颈链路的传输速率。

1.5 协议层次及其服务模型

1.5.1 分层的体系结构

分层体系结构的好处是:只要一层向上提供的服务不变,改变该层的实现对整个系统不会有影响。为了结构化的管理网络协议,网络设计者以分层的方式组织协议以及实现这些协议的网络硬件和软件。各层的所有协议被称为 协议栈 。因特网协议栈有5个层次:

应用层: 包含网络应用程序和应用层协议,如:HTTP、SMPT、FTP、DNS等。位于应用层的信息分组称为报文。

运输层: 在应用程序端点间传输应用层报文,有两个运输协议:TCP和UDP。位于运输层的分组称为报文段。

网络层: 将网络层的数据报从一台主机移到另一台主机,包括著名的IP协议。位于网络层的分组称为数据报。

链路层: 将分组从一个节点(主机或路由器)一定到链路上的下一个节点,链路层协议包括:以太网、WiFi、电缆接入网的DOCSIC。位于链路层的分组称为帧。

物理层: 将帧中的一个个比特从一个节点移到下一个节点,物理层的协议与物理媒介相关。物理层处理的是比特。

OSI提出的7层模型中的 表示层 和 会话层 留给应用程序开发者处理,顾不在网络协议的5层模型中。

1.5.2 封装

在每一层,分组有两部分字段构成:首部字段和来自上一层的分组。应用层将报文传给运输层,运输层附上附加信息(运输层首部信息),两者共同构成运输层报文段。运输层首部信息可以被接收端的运输层使用。这些首部信息包括:向应用程序交付的信息和差错检测位信息等。运输层将报文段传递给网络层,网络层在增加源和目的端系统的地址等网络层首部信息,产生数据报。接下来传递给链路层,链路层增加自己的首部信息,产生链路层帧。

2 应用层

网络应用是计算机网络存在的理由。

2.1 应用层协议原理

2.1.1 网络应用程序体系结构

有两种主流的体系结构: 客户-服务器体系结构对等(P2P)体系结构

客户服务器体系结构: 总是打开的主机称为服务器,向服务器请求服务的主机称为客户。客户之间不直接通信,客户通过向服务器发送请求,服务器处理后返回请求对象作为响应。当客户请求很多时,单台服务器不堪其负,便出现了配备大量主机的数据中心。

P2P体系结构: 不必通过专门的服务器,对等客户机之间直接通信。P2P结构的自拓展性是它最大的优势,即随着用户和服务量的增加,系统整体的资源和服务能力也在同步扩充。然而P2P应用也面临着诸多挑战:对ISP不友好,安全性无法保证等。

2.1.2 进程通信

多个端系统间的程序通过进程进行通信,进程通信的方式是交换报文。我们称,发起通信的进程为客户进程,等待联系的进程为服务器进程。因此,进程通常是成对出现的。两个进程间通过称为 套接字 的软件接口向网络发送报文和从网络接收报文。由于套接字是建立网络应用程序的可编程接口,因此也称为 应用程序编程接口(API) 。为了向另一台主机上的特定进程发送分组,需要定义两种信息: 主机地址(ip地址)接收进程的标识符(端口号)

2.1.3 可供应用程序使用的运输服务

套接字是应用程序进程与运输层协议之间的接口。由于运输层提供了不止一种协议,所以在开发应用时需要根据服务需求选择其中一种协议。那么该如何选择呢?主要考虑四个方面: 可靠数据传输吞吐量定时安全性

可靠数据传输: 前面提到分组在网络中传输时可能会丢失。对于某些应用来说,这种丢失是可以允许的,如交谈式音视频服务。但对于像电子邮件、文件传输、远程访问以及金融应用等这样的应用,数据丢失会产生灾难性的后果。对于此类应用,我们 需要运输层协议提供一种确保从应用程序一端发送的数据正确、完全的交付给应用程序的另一端的服务

吞吐量: 可用吞吐量指发送进程能够像接收进程交付比特的速率。由于多个会话会共享一条网络路径的带宽,所以可用吞吐量是个随时间不断变化的值。但是某些应用(如网络电话)对数据的传输速率有一定的要求, 因此需要运输层协议以某种特定的速率提供确保的可用吞吐量 。对吞吐量有要求的应用称为 带宽敏感的应用 ,此外称为 弹性应用

定时: 对交互式实时应用程序,总是要求时延越低越好,这要求运输层协议提供定时保证。

安全性: 对于需要加密保护的数据,运输层协议要提供一系列的加密解密服务,还包括数据完整性和端点鉴别。

2.1.4 因特网提供的运输服务

TCP/IP网络为应用程序提供了两个运输层协议: UDP和TCP 。在开发应用时要根据应用特点选择其中一种。不同协议为应用程序提供了不同的服务集合。

TCP服务: TCP协议主要提供了两种服务: 面向连接的服务可靠的数据传输服务

面向连接的服务: 在建立TCP连接之前,让客户与服务器交换运输层控制信息(握手);握手之后便建立了一个连接双方可以同时收发报文的连接;通信结束时需要拆除连接。可靠数据传输: TCP可以无差别,按适当顺序交付所有发送的数据,字节没有丢失和冗余。此外,TCP还有拥塞控制机制,后面会详细介绍。

UDP服务: UDP提供无连接,不可靠的数据传输服务。

运输服务不提供的服务: 运输层协议不提供对吞吐量和定时的保证,但是不影响运行时间敏感和带宽敏感的应用。

2.1.5 应用层协议

应用层协议定义了运行在不同端系统上的应用程序如何相互传递报文,具体地说它定义了:

  • 交换的报文类型,例如请求报文和相应报文。
  • 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的。
  • 字段的语义,即这些字段中包含的信息的含义。
  • 一个进程何时以及如何发送报文,对报文响应的规则

应用层协议是网络应用中相当重要的一部分,其中遵循RFC规范的,称为公共域协议。不遵循RFC的协议叫专用域应用层协议。

2.2 Web和HTTP

2.2.1 HTTP概况

Web的应用层协议是 超文本传输协议(HTTP) 。HTTP由两个程序实现: 一个客户程序和一个服务器程序。它们分别运行在客户端和服务器端,通过HTTP报文会话。HTTP使用TCP作为运输层协议。HTTP服务器不保存关于客户的信息,所以所HTTP是一个 无状态协议

2.2.2 非持续连接和持续连接

客户和服务器的交互是通过TCP进行的。 当每一个请求-响应对都经过一个单独的TCP连接发送,称为非持续连接当所有的请求-响应都通过相同的TCP连接发送称为持续连接 。HTTP默认使用持续连接,也可以通过配置使用非持续连接。

采用非持续连接的HTTP: 每个TCP连接只传送一个请求报文和响应报文。首次连接请求web页面文本,接着依次请求web页面中包含的资源文件。浏览器可以设置并行TCP连接的数量缩减整个请求的时间。

采用持续连接的HTTP: 非持续连接有一些缺点:首先,必须为每一个请求对象建立和维护一个全新的连接,这给服务器带来了严重的负担;第二,每一个对象都要经受两倍RTT的交付时延(一个创建TCP连接,一个请求和接收对象)。持续连接可以保证在一个TCP上持续请求web页面对象,不必等待流水线的回答;当连接经过一段时间间隔未被使用时,则关闭该连接;HTTP默认使用带流水线的持续连接。

2.2.3 HTTP报文格式

HTTP请求报文:

GET /somedir/page.html HTTP/1.1
HOST: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

请求报文的第一行叫请求行,余下的叫首部行。请求行的三个字段为: 请求方法、URL、HTTP版本 。方法字段包括: GET、POST、HEAD、PUT和DELETE。URL就是请求对象的标识。HTTP版本是自解释的。 HOST是请求对象所在的主机Connection表明是否使用持续连接 ,close表示非持续。 User-agent是用户代理,即浏览器类型Accept-language表示希望接收的语言类型 。除了以上的请求行和首部行外,请求报文还包括“实体主体”,用于存储POST请求包含的字段。

HEAD方法一般用于调试跟踪,只响应报文,不返回对象。PUT方法常与Web发行工具联合使用,可以上传对象到web服务器目录。DELETE方法可以删除Web服务器上的对象。

HTTP响应报文:

HTTP/1.1 200 OK
Connection: close <!-- 发送完报文后关闭TCP连接 -->
Date: Tue, 09 Aug 2011 25:44:04 GMT
Server: Apache/2.2.3 (Centos)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html

(data data data ....)

响应报文由三个状态组成:一个初始状态行,六个首部行,一个实体体。

响应报文的状态码:

  • 200 OK: 请求成功
  • 301 Moved Permanently: 请求对象被永久转移,新的url在Location首部行中。
  • 400 Bad Request: 通用差错,请求不能被服务器理解。
  • 404 Not Found: 被请求的文档不再服务器上。
  • 505 HTTP Version Not Supported: 服务器不支持请求报文使用的HTTP协议版本。

以上的HTTP请求报文和响应报文只是基本的格式,实际应用中还包含很多被浏览器、web服务器和web缓存服务器插入的首部行。

2.2.4 用户与服务器的交互:cookie

Cookie作用: 标识用户,记录和跟踪用户状态信息。在无状态的HTTP连接上建立一个用户会话层。

Cookie原理: 用户初次访问web站点时,web站点为该用户生成一个唯一识别码并存入数据库;web站点向用户返回一个包含Set-cookie的响应报文,Set-cookie的值就是识别码;浏览器收到响应报文后,将Set-cookie的值和站点主机名写入本地的cookie文件中;当用户再次访问该web站点时,浏览器读取本地cookie,在请求报文的首部行设置Cookie;服务器通过收到的报文的Cookie识别访问的用户,继续记录用户的行为。

2.2.5 Web缓存

Web缓存器又叫代理服务器,它会在自己的存储空间中保存最近请求过的对象副本。

使用Web缓存的两个主要原因: 1.极大地减少客户请求的响应时间 2.极大地减少一个机构的接入链路到因特网的通信量,降低了费用。

Web缓存的原理:

  1. 首先浏览器需要配置Web缓存。
  2. 当用户使用浏览器向初始服务器发起一个对象请求时,浏览器先向自己的web缓存器发送一个HTTP请求。
  3. Web缓存器收到请求,检查本地是否存储了该对象的副本。有,则向浏览器返回该对象。
  4. 如果没有请求对象的副本,web缓存器向初始服务器发送对该对象的HTTP请求,初始服务器返回对象。
  5. Web缓存器接收到对象后,在本地保存一份副本,并将副本返回给客户浏览器。

目前使用较多的"内容分发网络"(CDN)就是通过在全球各地安装Web缓存器,使用户可以访问最近的web缓存以提高访问速度。

考虑一种情况: 当初始服务器中的对象发生改动时,用户访问服务器就可能会得到web缓存中的旧的对象副本。那么如何保存web缓存中的对象永远是最新的呢?使用"条件GET方法"。

Web缓存向服务器请求对象后获得的响应报文中有一个"Last-Modified"字段,存储对象最后修改的时间。当过一段时间后,用户再次通过缓存访问该对象时,web缓存器会发送一个条件GET执行最新检查。例:

GET /fruit/kiwi.gif HTTP/1/.1
HOST: www.exotiquecuisine.com
If-Modified-Since: Web, 7 Seq 2011 09:23:24

值得注意的是'If-Modified-Since'的时间和上文提到的'Last-Modified'一致。该条件GET报文告诉服务器:被请求的只有在指定的日期之后被修改过,才发送该对象以更新副本。

2.3 文件传输协议: FTP

和HTTP一样,FTP是运行在TCP上的文件传输协议。与HTTP不同的是,FTP使用两个并行的TCP连接来传输文件: 控制连接 和 数据连接。

控制连接: 用于在两主机间传输控制信息,褥用户标识、口令、改变远程目录的命令、存放、获取文件的命令等。数据连接: 用于发送实际的文件。

FTP这种使用独立的控制连接,我们可以称FTP的控制信息是 带外 传送的。而HTTP在同一TCP连接中发送文件和首部行,我们称为 带内 发送控制信息。

FTP的数据连接是非持续的,即每传输一个文件都要建新的数据连接。而控制连接贯穿整个用户会话期间。

2.4 因特网中的电子邮件

电子邮件是一种异步通信媒介,是当今因特网上最重要和实用的应用程序之一。电子邮件系统有三个主要组成部分: 用户代理(user agent)、邮件服务器(mail server)和简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)

用户代理就是用于收发邮件的应用程序。邮件服务器是电子邮件系统的核心,邮件服务器用于处理邮件的交换。SMTP是电子邮件主要的应用层协议,它使用TCP的可靠数据传输,从发送发的邮件服务器向接收方的邮件服务器发送邮件。

2.4.1 SMTP

SMTP是电子邮件应用的核心,它的问世比HTTP早的多。电子邮件的流行离不开SMTP众多出色的性质,但它同时也具有某种陈旧的特性。比如,SMTP限制所有邮件报文体部分只能采用简单的7比特ASCII表示。这种限制意味着需要在二进制的多媒体数据和ASCII码之间转换,着实有些麻烦。

SMTP发送邮件的过程: (Alice to Bob)

  1. Alice使用她的邮件代理程序撰写了邮件并提供了Bob的邮件地址,指示用户代理发送邮件。
  2. Alice的用户代理把报文发送给她的邮件服务器,放在报文队列中。
  3. Alice的邮件服务器上的SMTP客户端发现队列中的报文,建立一个到Bob的邮件服务器上的SMTP服务器的TCP连接。
  4. 经过SMTP握手后,发送报文。
  5. Bob邮件服务器的SMTP接收报文并放到Bob的邮箱中。
  6. Bob使用用户代理阅读邮件。

以上过程表明:SMTP一般不使用中间服务器;如果Bob的邮件服务器没有在线,报文会暂时存储在Alice的邮件服务器中并等在新的尝试。

2.4.2 与HTTP的对比

相同:

  1. 两个协议都用于从一台主机向另一台主机传送文件
  2. 两个协议都使用持续连接

区别:

  1. HTTP是拉协议(从想接收文件的主机发起),SMTP是推协议(从想发送文件的主机发起)。
  2. SMTP要求每个报文使用7比特的ASCII码格式,HTTP不受这种限制。
  3. 对于既包含文本又包含多媒体文件的文档,HTTP把每个对象封装在自己的HTTP的响应报文中(每个对象有单独的response),而SMTP将所有报文对象放在一个报文之中。

2.4.3 邮件报文格式和MIME

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型是对SMTP的协议的拓展,它可以将用户输入的非ASCII格式的进行编码解码。

MIME由首部行和报文体两部分组成。首部行和报文体之间用空行分隔。首部行必须包含'From'和'To', 还有一些可选首部行,如'Subject','Date'等。例:

From: "hello" <hello@xxx.com>
To:<world@xxx.com>
Subject:hello world
Date:Mon,9 Oct 2006 16:51:34 +0800
MIME-Version:1.0
Content-Type:multipart/mixed;boundary=lines

--lines
Hello world

-lines
Content-Type:image/gif
Content-Transfer-Encoding: base64

... images ...
--lines

2.4.4 邮件访问协议(POP3和IMAP)

SMTP是一个推协议,即将电子邮件由一台主机推到另一台主机。那么接收方的邮件用户代理如何取回服务器上的邮件呢?这就需要邮件访问协议。目前流行的邮件访问协议包括:Post Office Protocol-version 3(POP3)、Internet Mail Access Protocol(IMAP)和HTTP。

总结电子邮件的一些协议:1.将邮件从发送方的用户代理传送到发送方的邮件服务器用SMTP; 2.将邮件从发送方的邮件服务器传送到接收方的邮件服务器也用SMTP; 3.将邮件从接收方的邮件服务器传送到接收方的用户代理用 邮件访问协议

POP3

POP3是一个极为简单的邮件访问协议。它按照三个阶段工作:授权(authorization)、事务处理及更新。授权阶段,用户代理发送用户名和口令鉴别用户; 事务处理阶段,用户代理取回报文同时对报文做删除标记、取消删除标记及获取邮件统计信息; 更新阶段,结束POP3会话,邮件服务器删除被标记为删除的报文。

使用POP3的用户代理可以配置“下载并删除”和“下载并保留”两种方式,下载指从服务器下载邮件报文到本地,删除和保留指删除或保留服务器上的邮件报文。在授权阶段后,用户代理使用四个命令: list、retr、dele和quit。处理quit命令后进入更新阶段。

IMAP

POP3协议的简单意味着功能的单一,它只能将邮件下载到本地然后组织到不同的文件夹中。然而大多数时候,我们希望在任何设备中都能随时访问远程服务器,创建远程文件夹并为不同类型的报文指派文件夹。这就需要一个更为复杂的邮件访问协议: IMAP。

IMAP服务器将每个报文和一个文件夹联系起来。IMAP协议允许用户创建、移动、查询邮件。与POP3不同,IMAP维护了会话的用户状态信息。另外,IMAP还允许用户代理获取报文组件,比如只读取报文首部,这在低带宽连接下非常有用,可以避免取回邮箱中的所有邮件,避免取回包含音视频的大邮件等。

基于Web的电子邮件

基于Web的电子邮件,用户代理就是浏览器。使用这种方式,用户将邮件报文从浏览器发送到邮件服务器使用的是HTTP而不是SMTP;邮件报文从邮件服务器发送到浏览器使用的也是HTTP而不是POP3或IMAP。

除此之外,邮件服务器与邮件服务器之间的报文交换使用的仍是SMTP。

2.5 DNS: 因特网的目录服务

因特网上的主机可以使用多种方式进行标识,常用的有主机名和IP地址这两种。主机名方便人们记忆,IP地址方便路由器处理。

2.5.1 DNS提供的服务

域名系统(DNS)提供了从主机名到IP地址的目录转换服务。DNS包括:一个由分层的DNS服务器实现的分布式数据库 和 一个使得主机能够查询分布式数据库的应用层协议。DNS协议运行于UDP之上,使用53号端口。

除了域名解析外,DNS还提供的重要服务: 主机别名、邮件服务器别名、负载分配。

2.5.2 DNS工作机理概述

DNS的设计方案非常复杂,是因特网上实现分布式数据库的精彩范例。

分布式、层次数据库

DNS以层次方式组织在全世界范围内的服务器。大致来说,它们有三种类型:根DNS服务器、顶级域(TLD)DNS服务器(负责顶级域名以及国家顶级域名)和权威DNS服务器(提供主机名到ip地址的映射)。

本地DNS服务器不属于DNS的层次结构,它的作用是代理请求并转发到DNS的层次结构中。

DNS解析的过程:

  • 假设主机 cis.poly.edu 想访问主机 gaia.cs.umass.edu。请求主机的本地DNS服务器是dns.poly.edu, 目标主机的权威DNS服务器是dns.umass.edu。
  • 当访问目标主机时,主机cis.poly.edu向本地DNS服务器发送一个查询报文,该报文包含目标主机名 gaia.cs.umass.edu。
  • 本地DNS服务器转发报文到根DNS服务器,根DNS根据edu返回负责edu的TLD服务器。
  • 本地DNS服务器再次向得到的TLD服务器发送报文,TLD服务器根据umass.edu返回负责解析umass.edu的权威DNS服务器dns.umass.edu。
  • 本地DNS服务器再次向得到的权威DNS服务器发送报文,权威DNS返回最终的ip地址。

DNS缓存

前面提到过Web缓存,在DNS中也运用了缓存技术,原理类似。即,本地DNS服务器将得到的ip地址与域名的映射关系保存在自己的服务器中。当处于同一本地DNS服务器服务范围内的主机再次访问相同的网站时,直接返回缓存的ip,无需经过DNS层级结构。同样,本地DNS每隔一段时间会丢弃缓存,避免与上游的信息不对称。

2.5.3 DNS记录和报文

DNS服务器存储的资源记录(RR)提供了主机到ip地址的映射。RR是一个四元组: (Name, Value, Type, TTL)。

TTL是记录的生命周期,它决定了RR从当前缓存删除的时间。Name和Value的值取决于Type:

  • Type = A, 则Name是主机名,Value是主机名对应的IP地址。它提供了标准的主机名到IP地址的映射。
  • Type = NS, 则Name是一个域, Value是个知道如何获取该域中主机IP地址的权威DNS服务器的主机名。它用于沿着查询链来路由DNS查询。
  • Type = CNAME, 则Name为别名, Value是别名对应的规范主机名。流行的 Github Pages 就是使用域名作为别名来访问github.io。
  • Type = MX, 则Name为别名, Value是别名对应的邮件服务器的规范主机名。

2.6 P2P应用

3 运输层

3.1 概述和运输层服务

运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信。通过逻辑通信,运行不同进程的主机就好像直接相连一样。因特网有两种运输层协议:TCP和UDP。

3.1.1 运输层和网络层的关系

网络层提供主机之间的逻辑通信。运输层为运行在不同主机上的进程间提供逻辑通信。

运输层协议只工作在端系统中;计算机网络可以安排多种运输层协议,每种协议为应用程序提供不同的服务模型;运输协议能够提供的服务往往受制于底层网络层协议的服务模型;然而即使底层网络协议不能在网络层提供相应的服务,运输层协议也能提供某些服务,如报文加密,可靠传输等。

3.1.2 因特网运输层概述

TCP/IP网络为应用层提供了两种截然不同的传输层协议:UDP(用户数据报协议,提供不可靠、无连接的服务)和TCP(传输控制协议,提供可靠的、面向连接的服务)。UDP和TCP的分组一般称为报文段。

UDP为运输层提高进程到进程的 数据交付差错检查 。TCP除了提供以上两种服务,还提供 可靠数据传输 (通过使用流量控制、序号、确认和定时器确保正确的、按序的交付数据) 和 拥塞控制 (防止任何一条TCP连接用过多的流量来淹没通信主机间的链路和交换设备,力求每条连接平等共享网络链路带宽)。

3.2 多路复用与多路分解

运输层的多路复用和多路分解就是将网络层提供的主机到主机的交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。

当主机上同时运行多个进程时,运输层如何将数据交付给对应的进程呢?使用 套接字 。一个进程有一个或多个套接字,每个套接字都有唯一的标识符。进程与网络之间的数据传递都需要通过之间套接字。

在接收端,运输层接收到报文段后检查接收套接字,然后将报文段定向到该套接字。这种, 将运输层报文段交付到正确套接字的工作称为多路分解

在发送端, 从不同的套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,从而将报文段传递到网络层,所有这些工作称为多路复用

前面说到套接字有唯一的标识符,这种标识符就是我们熟知的“端口号”。端口号是一个16比特的数,大小在0~65535之间。其中0~1023属于周知端口号,它们被应用于特定类型的协议。比如HTTP的80端口,FTP的21端口等。

3.2.1 无连接的多路复用和多路分解

一个UDP套接字由一个二元组(目的IP地址、目的端口号)来标识。因此两个具有不用源IP和/或源端口的UDP报文,如果有相同的目的IP地址和目的端口号,那么这两个报文段将通过的套接字被定向到相同的进程。

3.2.2 面向连接的多路复用和多路分解

一个TCP套接字由一个四元组(源IP地址、源端口号、目的IP地址、目的端口号)标识。与UDP不同的是,来自不同源IP和/或源端口号的TCP,即使有相同的目的IP和目的端口号也会被定向到不同的套接字。

3.2.3 Web服务器与TCP

如今的高性能web服务器通常只有一个进程,但是为每个新的客户连接创建一个具有新连接套接字的新线程(轻量级的子进程)。

如果使用持续HTTP,在连接持续期间,使用同一个连接套接字交换HTTP报文。如果使用非持续HTTP,为每一对请求/响应都创建一个新的套接字并在随后关闭。

3.3 无连接运输:UDP

UDP只做了运输协议能够做的最少的工作。除了复用/分解和少量的差错检测外,它几乎没有对IP增加别的东西。

有许多应用更适合使用UDP,而不是TCP,原因有以下几点:

  1. 关于何时、发送什么数据的应用层控制更为精细。对于实时应用通常要求最小的发送速率,不希望过分的延迟报文段的传送,且能容忍一些数据的丢失,因此TCP模型不适合。
  2. 无需连接建立。TCP在开始数据传输前要经过三次握手,而UDP不需要任何准备即可进行数据传输。因此UDP不会引入建立连接的时延,这就是DNS使用UDP的主要原因。
  3. 无连接状态。TCP需要维护接收和发送缓存、拥塞控制参数以及序号与确认序号参数这些连接状态。而UDP没有这些开销,因此一般能支持更多的活跃用户。
  4. 分组首部开销小。TCP报文段有20字节的首部开销,UDP只有8字节。

电子邮件、远程终端访问、web文件传输运行在TCP之上。RIP路由选择表更新、网络管理数据(SNMP)、DNS运行在UDP上。TCP和UDP都用于多媒体应用。

3.3.1 UDP报文段结构

源端口号(2字节) 目的端口号(2字节)
长度(2字节) 检验和(2字节)
应用数据(报文)  

3.3.2 UDP检验和

UDP检验和提供差错检测功能,检测UDP报文段从源移动到目的地时,其中的比特是否发生变化。

检验和的计算:在发送方,将UDP报文中所有16比特的和进行反码运算。如果求和过程中遇到任何溢出都要回卷(将溢出的部分加到尾部)。

检验和的验证:在接收方,将UDP的所有16比特与检验和相加。如果得到的结果为16个1则无差错,否则有差错。

端到端原则:应该尽可能地避免将应用层的部分功能放在网络的核心实现。将应用程序特定功能从网络核心移出并仅在网络核心处提供通用的系统服务。所以将差错检测放在端系统中处理是一个很不错的设计。

3.4 可靠数据传输(rdt)原理

前面提到UDP提供了基本的差错检测,但是对差错恢复无能为力。如何实现完全可靠的数据传输协议是计算机网络最为重要的问题。

3.4.1 构造可靠数据传输协议

我们将从最简单的情况开始探讨,一步步构建更为复杂、可靠的数据传输协议。

1.经完全可靠信道的可靠数据传输: rdt 1.0

经由完全可靠的信道不会出现任何差错,无需差错检测,无需接收方反馈。

2.经具有比特差错的可靠数据传输: rdt 2.0

  • 由于分组在底层信道中比特可能受损,所以rdt 2.0需要引入 差错检测
  • 接收方通过计算得知比特是否出现差错,并 发送反馈 回发送方,这种反馈包括两种“肯定确认”(ACK)和“否定确认”(NAK)。
  • 发送方根据收到的反馈决定下一步动作。如果收到ACK则发送新的分组,如果收到NAK则 重传 上一个分组。
  • 值得注意的是:当发送方在等待接收方的反馈时,不能从上层获得更多的数据。因此2.0被称为停等协议。

此时2.0看起来可以使用了,但还有一个致命的缺陷:反馈的ACK或NAK分组也可能受损。

解决这个问题的办法有两种:

  • 增加足够的检验和比特,使发送发不仅可以检验差错还可以恢复差错。这对于会产生差错但不丢失分组的信道可以解决问题。
  • 当发送方接收到含糊不清的反馈时,只需重传当前分组即可。但是这种方法在接收方引入了冗余分组。冗余分组的问题在于:接收方不知道自己上次发送的反馈是否被发送方很好的接收,因此无法判断接收到的分组是新的还是上一次的重传。解决这个问题的方法是在分组中引入 序号 , 这就是 rdt 2.1。

4 持续更新中!