摘要
- 复习计算机基础四大件,打牢基础。
第一章 计算机网络和因特网
1.1 什么是因特网
- 在本书中,我们使用一种特定的计算机网络,即公共因特网,作为讨论计算机网络及其协议的主要载体。
- 但什么是因特网?回答这个问题有两种方式:
- 其一,我们能够描述因特网的具体构成,即构成因特网的基本硬件和软件组件
- 其二,我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。
1.1.1 具体构成描述
- 因特网是一个世界范围的计算机网络,即它是一个互联了遍及全世界数十亿计算设备的网络。
- 端系统通过通信链路(communication link)和分组交换机(packet switch)连接到一起。
- 在1.2节中,我们将介绍许多类型的通信链路,它们由不同类型的物理媒体组成。这些物理媒体包括同轴电缆,铜线,光纤和无线电频谱。不同的链路能够以不同的速率传输数据,链路的传输速率(transmission rate)以比特/秒(bit/s, bps)度量。
- 当一台端系统要向另一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节。由此形成的信息包用计算机网络的术语来说称为分组(packet)。这些分组通过网络发送到目的端系统,在那里被装配成功为初始数据。
- 市面上流行着各种类型,各具特色的分组交换机,但在当今的因特网中,两种最著名的类型是路由器(router)和链路层交换机(link-layer switch)。这两种类型的交换机朝着最终目的地转发分组。链路层交换机通常用于接入网中,而路由器通常用于网络核心中。
- 从发送端系统到接收端系统,一个分组所经历的一系列通信链路和分组交换机称为通过该网络的路径(route, path)。
- 端系统通过因特网服务提供商(Internet Service Provider, ISP)接入因特网。
- 端系统,分组交换机和其他因特网部件都要运行一系列协议(protocol),这些协议控制因特网中信息的接收和发送。TCP(Transmission Control Protocol, 传输控制协议)和IP(Internet Protocol, 网际协议)是因特网中两个最为重要的协议。IP协议定义了在路由器和端系统之间发送和接收的分组格式。因特网的主要协议统称为TCP/IP。
- 鉴于因特网协议的重要性,每个人就各个协议及其作用取得一致认识是很重要的,这样人们就能够创造协同工作的系统和产品。这正是标准发挥作用的地方。因特网标准(Internet standard)由因特网工程任务组(Internet Engineering Task Force, IETF)研发。IETF的标准文档称为请求评论(Request For Comment, RFC)。RFC最初只是普通的请求评论,目的是解决因特网先驱者们面临的网络和协议问题。
1.1.2 服务描述
- 前面的讨论已经辨识了构成因特网的许多部件。但是我们也能从一个完全不同的角度,即从为应用程序提供服务的基础设施的角度来描述因特网。
- 与因特网相连的端系统提供了一个套接字接口(socket interface),该接口规定了运行在一个端系统上的程序请求因特网基础设施向运行在另一个端系统上的特定目的地程序交付数据的方式。
1.1.3 什么是协议
- 协议(protocol)定义了在两个或多个通信实体之间交换的报文的格式和顺序,以及报文发送和/或接收一条报文或其他事件所采取的动作。
1.2 网络边缘
- 通常把与因特网相连的计算机和其他设备称为端系统。因为它们位于因特网的边缘,故而被称为端系统。
- 端系统也称为主机(host),因为它们容纳(即运行)应用程序。本书通篇将交替使用主机和端系统这两个术语,即主机==端系统。主机有时又被进一步划分为两类:客户(client)和服务器(server)。客户通常是桌面PC,移动PC和智能手机等,而服务器通常是更为强大的机器,用于存储和发布Web页面,流视频,中继电子邮件等。
1.2.1 接入网
- 考虑了位于网络边缘的应用程序和端系统后,我们接下来考虑接入网,这是指将端系统物理连接到其边缘路由器(edge router)的网络。边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器。
1.2.2 物理媒体
- 比特当从源到目的地传输时,通过一系列 发射器–接收器 对。对于每个发射器–接收器 对,通过跨越一种物理媒体(physical medium)传播电磁波或光脉冲来发送该比特。
- 物理媒体的例子包括双绞铜线,同轴电缆,多模光纤缆,陆地无线电频谱和卫星无线电频谱。物理媒体分成两种类型:导引型媒体(guided media)和非导引型媒体(unguided media)和非导引型媒体(unguided media)。对于导引型媒体,电波沿着固体媒体前行,例如光缆,双绞铜线或同轴电缆。对于非导引型媒体,电波在空气或外层空间中传播,例如在无线局域网或数字卫星频道中。
1.3 网络核心
- 在考察了因特网边缘后,我们现在更深入的研究网络核心,即由互联因特网端系统的分组交换机和链路构成的网状网络。
1.3.1 分组交换
- 在各种网络应用中,端系统彼此交换报文(message)。报文能够包含协议设计者需要的任何东西。报文可以执行一种控制功能,也可以包含数据。为了从源端系统向目的端系统发送一个报文,源将长报文划分为较小的数据块,称之为分组(packet)。在源和目的地之间,每个分组都通过通信链路和分组交换机(packet switch)传送。
- 存储转发传输
- 多数分组交换机在链路的输入端使用存储转发传输(store-and-forward transmission)机制。存储转发传输是指在交换机能够开始向输出链路传输该分组的第一个比特之前,必须接收到整个分组。
- 排队时延和分组丢失
- 每台分组交换机有多条链路与之相连。对于每条相连的链路,该分组交换机具有一个输出缓存(output buffer,也称为输出队列(output queue)),它用于存储路由器准备发往那条链路的分组。该输出缓存在分组交换中起着重要的作用。
- 转发表和路由选择协议
- 路由器从与它相连的一条通信链路得到分组,然后向与它相连的另一条通信链路转发该分组。
- 在因特网中,每个端系统具有一个称为IP地址的地址。当源主机要想目的端系统发送一个分组时,源在该分组的首部包含了目的地的IP地址。
- 当一个分组到达网络中的路由器时,路由器检查该分组的目的地址的一部分,并向一台相邻路由器转发该分组。更特别的是,每台路由器具有一个转发表(forwarding table),用于将目的地址(或目的地址的一部分)映射成为输出链路。当某分组到达一台路由器时,路由器检查该地址,并用这个目的地址搜索其转发表,以发现适当的出链路。路由器则将分组导向该出链路。
1.3.3 网络的网络
- 今天的因特网是一个网络的网络,其结构复杂,由十多个第一层ISP和数十万个较低层ISP组成。ISP覆盖的区域多种多样,有些跨越多个大洲和大洋,有些限于狭窄的地理区域。较低层的ISP与较高层的ISP相连,较高层ISP彼此互联。用户和内容提供商是较低层ISP的客户,较低层ISP是较高层ISP的客户。
1.5 协议层次及其服务模型
1.5.1 分层的体系结构
- 为了给网络协议的设计提供一个结构,网络设计者以分层(layer)的方式组织协议以及实现这些协议的网络硬件和软件。每个协议属于这些层次之一。某层向它的上一层提供的服务(service),即所谓一层的服务模型(service model)。每层通过在该层中执行某些动作或使用直接下层的服务来提供服务。
- 各层的所有协议被称为协议栈(protocol stack)。因特网的协议栈由5个层次组成:物理层,链路层,网络层,运输层和应用层。
- 应用层
- 应用层是网络应用程序及它们的应用层协议存留的地方。
- 应用层协议分布在多个端系统上,而一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换信息分组。我们把这种位于应用层的信息分组称为报文(message)
- 运输层
- 因特网的运输层在应用程序端点之间传送应用层报文。在因特网中,有两种运输协议,即TCP和UDP,利用其中的任一个都能运输应用层报文。
- TCP向它的应用程序提供了面向连接的服务。这种服务包括了应用层报文向目的地的确保传递和流量控制(即发送放/接收方速率匹配)。TCP也将长报文划分为短报文,并提供拥塞控制机制,因此当网络拥塞时,源抑制其传输速率。
- UDP协议向它的应用程序提供无连接服务。这是一种不提供不必要服务的服务,没有可靠性,没有流量控制,也没有拥塞控制。
- 在本书中,我们把运输层的分组称为报文段(segment)
- 网络层
- 因特网的网络层负责将称为数据报(datagram)的网络层分组从一台主机移动到另一台主机。在一台源主机中的因特网运输层协议(TCP或UDP)向网络层递交运输层报文段和目的地址。
- 因特网的网络层包括著名的网际协议IP,该协议定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段。IP仅有一个,所有具有网络层的因特网组件必须运行IP。因特网的网络层也包括决定路由的路由选择协议,它根据该路由将数据报从源传输到目的地。
- 链路层
- 因特网的网络层通过源和目的地之间的一系列路由器路由数据报。为了将分组从一个节点(主机或路由器)移动到路径上的下一个节点,网络层必须依靠该链路层的服务。特别是在每个节点,网络层将数据包下传给链路层,链路层沿着路径将数据包传递给下一个节点。在该下一个节点,链路层将数据报上传给网络层。
- 由链路层提供的服务取决于应用于该链路的特定链路层协议。网络层将受到来自每个不同的链路层协议的不同服务。在本书中,我们把链路层分组称为帧(frame)
- 物理层
- 虽然链路层的任务是将整个帧从一个网络元素移动到邻近的网络元素,而物理层的任务是将该帧中的一个个比特从一个节点移动到下一个节点。
- 在这层中的协议仍然是链路相关的,并且进一步与该链路的实际传输媒体相关(例如,双绞铜线,单模光纤)。例如,以太网具有许多物理层协议:一个是关于双绞铜线的,另一个是关于同轴电缆的,还有一个是关于光纤的,等等。在每种场合中,跨越这些链路层移动一个比特是以不同的方式进行的。
1.5.2 封装
- 一个重要的概念: 封装(encapsulation)
- 在发送主机端,一个应用层报文(application-layer message)被传送给传输层。在最简单的情况下,运输层收取到报文并附上附加信息(所谓运输层首部信息),该首部将被接收端的运输层使用。应用层报文和运输层首部信息一道构成了运输层报文段(transport-layer segment)。运输层报文段因此封装了应用层报文。
- 运输层则向网络层传递该报文段,网络层增加了如源和目的端系统地址等网络层首部信息,生成了网络层数据报(network-layer datagram)。
- 该数据报接下来被传递给链路层,链路层增加它自己的链路层首部信息并生成链路层帧(link-layer frame)
- 所以我们看到,在每一层,一个分组具有两种类型的字段:首部字段和有效载荷字段(payload field)。有效载荷通常是来自上一层的分组。
第二章 应用层
- 网络应用是计算机网络存在的理由,如果我们不能构想出任何有用的应用,也就没有任何必要去设计支持它们的网络协议了。
2.1 应用层协议原理
- 研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。
2.1.1 网络应用程序体系结构
- 当进行软件编码之前,应当对应用程序有一个宽泛的体系结构计划。记住应用程序的体系结构明显不同于网络的体系结构。
- 从应用程序研发者的角度看,网络体系结构是固定的,并为应用程序提供了特定的服务集合。在另一方面,应用程序体系结构(application architecture)由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序。在选择应用程序体系结构时,应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一:客户–服务器体系结构或对等(P2P)体系结构
- 在客户–服务器体系结构(client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。
- 在一个P2P体系结构(P2P architecture)中,对位于数据中心的专用服务器有最小的依赖。相反,应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。这些对等方并不为服务提供商所有,相反却为用户控制的桌面机所有。
- P2P体系结构的最引人入胜的特性之一是它们的自扩展性(self-scalability)。
2.1.2 进程通信
在构建网络应用程序前,还需要对运行在多个端系统上的程序是如何互相通信的情况有一个基本了解。用操作系统的术语来说,进行通信的实际上是进程(process)而不是程序。一个进程可以被认为是运行在端系统中的一个程序。当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信。进程间通信的规则由端系统上的操作系统确定。而在本书中,我们并不特别关注同一台主机上的进程间的通信,而关注运行在不同端系统上的进程间的通信。
在两个不同端系统上的进程,通过跨越计算机网络交换报文(message)而相互通信。发送进程生成并向网络中发送报文;接收进程接收这些报文并可能通过回送报文进行响应。
网络应用程序由成对的进行组成,这些进程通过网络相互发送报文。对每对通信进程,我们通常将这两个进行之一标识为客户(client),而另一个进程标识为服务器(server).在一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器。
多数应用程序是由通信进程对组成,每对中的两个进程互相发送报文。从一个进程向另一个进程发送的报文必须通过下面的网络。进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。
套接字是同一台主机内应用层与传输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用编程接口(Application Programming Interface, API)。应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字的运输层端几乎没有控制权。应用程序开发者对于运输层的控制仅限于:选择运输层协议;也许能设定几个运输层参数,例如最大缓存和最大报文段长度等。一旦应用程序开发者选择了一个运输层协议,则应用程序就建立在由该协议提供的运输层服务之上。
为了向特定目的地发送邮政邮件,目的地需要有一个地址。类似的,在一台主机上运行的进程为了向在另一台主机上运行的进行发送分组,接收进程需要有一个地址。为了标识该接收进程,需要定义两种信息:主机地址;在目的主机中指定接收进程的标识符。
在因特网中,主机由其IP地址标识,IP地址是一个32比特的量且它能够唯一的标识该主机。
一般而言一台主机能够运行许多网络应用,这些信息是需要的。目的地端口号(port number)用于这个目的。
2.1.3 可供应用程序使用的运输服务
- 一个运输层协议能够为调用它的应用程序提供什么样的服务呢?我们大体能够从四个方面对应用程序服务要求进行分类:可靠数据传输,吞吐量,定时和安全性。
- 运输层协议能够潜在的向应用程序提供的一个重要服务是进程到进程的可靠数据传输。当一个运输协议提供这种服务时,发送进程只要将其数据传递进套接字,就可以完全相信该数据将能无差错的到达接收进程。当一个运输层协议不提供可靠数据传输时,由发送进程发送的某些数据可能到达不了接收进程。这可能能被容忍丢失的应用所接受,最值得注意的是多媒体应用。
- 在沿着一条网络路径上的两个进程之间的通信会话场景中,可用吞吐量就是发送进程能够向接收进程交付比特的速率。具有吞吐量要求的应用程序被称为带宽敏感的应用(bandwidth-sensitive application)
- 运输层协议也能提供定时保证。
- 运输协议能够为应用程序提供一种或多种安全性服务。
2.1.4 因特网提供的运输服务
- 因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议,即UDP和TCP。当你为因特网创建一个新的应用时,首先要做出的决定是,选择UDP还是选择TCP。每个协议为调用它们的应用程序提供了不同的服务集合。
- TCP服务模型包括面向连接服务和可靠数据传输服务。
- 面向连接的服务:在应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息。这个所谓的握手过程提醒客户和服务器,让它们为大量分组的到来做好准备。在握手阶段后,一个TCP连接(TCP connection)就在两个进程的套接字之间建立了。这条连接是全双工的,即连接双方的进程可以在此连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接。
- 可靠的数据传送服务:通信进程能够依靠TCP,无差错,按适当顺序交付所有发送的数据。当应用程序的一端将字节流传进套接字时,它能够依靠TCP将相同的字节流交付给接收方的套接字,而没有字节的丢失和冗余。
- UDP服务是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。
- UDP是无连接的,因此在两个进程通信前没有握手过程。
- UDP协议提供一种不可靠数据传送服务,也就是说,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达接收进程。不仅如此,到达接收进程的报文也可能是乱序到达的。
- UDP没有包括拥塞控制机制,所以UDP的发送端可以用它选定的任何速率向其下层(网络层)注入数据。
2.1.5 应用层协议
- 应用层协议(application-layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。特别是应用层协议定义了:
- 交换的报文类型,例如请求报文和响应报文
- 各种报文类型的语法,例如报文中的各个字段及这些字段是如何描述的
- 字段的语义,即这些字段中的信息的含义
- 确定一个进程何时以及如何发送报文,对报文进行响应的规则
- 区分网络应用和应用层协议是很重要的。应用层协议只是网络应用的一部分。
2.2 Web和HTTP
2.2.1 HTTP概况
- Web的应用层协议是超文本传输协议(HyperText Transfer Protocol, HTTP),它是Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式。
2.2.2 非持续连接和持续连接
- 在许多因特网应用程序中,客户和服务器在一个相当长的时间范围内通信,其中客户发出一系列请求并且服务器对每个请求进行响应。依据应用程序以及该应用程序的使用方式,这一系列请求可以以规则的间隔周期性的或者间断性的一个接一个发出。当这种客户–服务器的交互是经TCP进行的,应用程序的研制者就需要做一个重要决定,即每个请求/响应对是经一个单独的TCP连接发送,还是所有的请求及其响应经相同的TCP连接发送呢?采用前一种方法,该应用程序被称为使用非持续连接(non-persistent connection);采用后一种方法,该应用程序被称为使用持续连接(persistent connection)。HTTP既能够使用非持续连接,也能够使用持续连接。尽管HTTP在其默认方式下使用持续连接,HTTP客户和服务器也能配置成使用非持续连接。
- 非持续连接有一些缺点
- 第一,必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这给Web服务器带来了严重的负担,因为一台Web服务器可能同时服务于数以百计不同的客户的请求。
- 第二,每一个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。
2.2.3 HTTP报文格式
- HTTP报文有两种:请求报文和响应报文。
- HTTP请求报文
1
2
3
4
5GET /somedir/page.html
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr - HTTP请求报文的第一行叫做请求行(request line),其后继的行叫做首部行(header line)
- 请求行有3个字段:方法字段,URL字段和HTTP版本字段。方法字段可以取几种不同的值,包括GET, POST, HEAD, PUT, DELETE
- HTTP响应报文
1
2
3
4
5
6
7
8200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015 15:44:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...) - 我们仔细看一下这个响应报文。它有三个部分:一个初始状态行(status line),6个首部行(header line),然后是实体体(entity body)。实体体部分是报文的主要部分,即它包含了所请求的对象本身。
- 状态行有3个字段:协议版本字段,状态码和响应状态信息
2.2.4 用户与服务器的交互:cookie
- 我们前面提到了HTTP服务器是无状态的。这简化了服务器的设计,并且允许工程师们去开发可以同时处理数以千计的TCP连接的高性能Web服务器。然而一个Web站点通常希望能够识别用户,可能是因为服务器希望限制用户的访问,或者因为它希望把内容与用户身份联系起来。为此,HTTP使用了cookie。
- cookie技术有4个组件:
- 在HTTP响应报文中的一个cookie首部行
- 在HTTP请求报文中的一个cookie首部行
- 在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理;
- 位于Web站点的一个后端数据库
2.2.5 Web缓存
- Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。
- 通过使用内容分发网络(Content Distribution Netowrk, CDN),Web缓存器正在因特网中发挥着越来越重要的作用。
第三章 运输层
- 运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。我们在本章采用的教学方法是,交替的讨论运输层的原理和这些原理在现有的协议中是如何实现的。与往常一样,我们将特别关注因特网协议,即TCP和UDP运输层协议。
3.1 概述和运输层服务
- 运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能。
- 运输层协议是在端系统中而不是在路由器中实现的。在发送端,运输层将从发送应用程序进程接收到报文转换成运输层分组,用因特网来讲该分组称为运输层报文段(segment)。实现的方法(可能)是将应用报文划分为较小的块,并为每块加上一个运输层首部以生成运输层报文段。然后,在发送端系统中,运输层将这些报文段传递给网络层,网络层将其封装成网络层分组(即数据报)并向目的地发送。注意到下列事实是重要的:
- 网络路由器仅作用域该数据报的网络层字段;即他们不检查封装在该数据报的运输层报文段的字段
- 在接收端,网络层从数据报中提取运输层报文段,并将该报文段上交给运输层。运输层则处理接收到的报文段,使该报文段中的数据为接收应用进程使用。