计算机网络
绪论
1.1 因特网概述
1.1.1 计算机网络在新时代的作用
互联网能够向用户提供很多服务,有两个最重要的基本特点:连通性和共享
连通性:用户之间交换各种信息,但应注意互联网的虚拟性,无法准确知道对方是谁
共享:资源共享,包含:信息共享,软件共享,硬件共享
1.1.2 网络、互连网和互联网
计算机网络:简称网络,由若干结点和连接这些结点的链路组成,结点可以是:计算机,集线器,交换机,路由器等。
互连网internet:通过路由器把网络连接起来,构成的范围更大的计算机网络,因此互连网是网络的网络
互联网,特指Internet,现已发展成世界最大的覆盖全球的计算机网络
Internet与internet的区别:
internet互联网,指由多个计算机网络互连而成的计算机网络
Internet互联网,专有名词,全球最大的,开放的,由众多网络连接而成的特定互连网,采用TCP/IP协议簇作为通信的规则,其前身是美国的ARPANET。
1.1.3 因特网发展的三个阶段
第一阶段:从单个网络ARPANET向互连网发展的过程
1983年TCP/IP协议成为ARPANET上的协议,使所有使用TCP/IP协议的计算机都能利用互连网相互通信。 -=-互联网诞生时间
第二阶段:建成了三级结构的互联网
主干网、地区网、校园网(企业网)
第三阶段:多层次ISP结构的互联网
根据提供服务的覆盖面积大小及所拥有的IP地址数目不同,ISP可分为:
- 主干ISP:服务面积最大
- 地区ISP:
- 本地ISP:给用户提供直接的服务
ISP:互联网服务提供者(Internet Service Provider),可从互联网管理机构申请到很多IP地址,互联网上的主机必须有IP地址才能上网(通过ISP获得IP地址并接入网络)。
基于ISP的三层结构的因特网
1.1.4 互联网的标准化工作
制定互联网的正式标准需要经过三个阶段:
- 互联网草案
- 建议标准:成为RFC文档
- 互联网标准
1.1.4 互联网的组成
互联网的拓扑结构,从工作方式上看,分为:
- 边缘部分:由所有连接在互联网上的主机组成,用户直接使用,用来通信和资源共享
- 核心部分:有大量网络和连接这些路由器组成,为边缘部分提供服务
1.1.5 边缘部分
计算机之间的通信:主机A的某个进程和主机B上的另一个进程及其通信。
在网络边缘的端系统之间的通信方式分为:客户-服务器方式(C/S)和对等方式(P2P)
1.客户client-服务器server方式
客户程序:
- 向服务器发起通信,必须知道服务器地址
- 不需要特殊的硬件或复杂的操作系统
服务器程序:
- 专门提供服务的程序,可同时处理多个请求
- 系统启动后,被动地等待着接受客户的通信请求,不需要知道客户程序地址
- 需要强大的硬件和高级的操作系统支持
2.对等连接方式
两台主机都运行了对等连接软件,不区分哪个是服务请求方,哪个是服务提供方,它们是进行平等的,对等连接的通信,双方都可下载对方存储在硬盘的共享文档
1.1.6 核心部分
互联网中最复杂的部分,要向边缘中的大量主机提供连通性,使每个主机都能向其他主机通信
路由器:一种专用计算机,是实现分组交换的关键构件,任务是转发收到的分组。
1.2 三种交换方式
1.2.1 电路交换
交换:按照某种方式动态的分配传世线路的资源
电路交换过程:建立连接->通话->释放连接
电路交换的一个重要特点是:在通话的全部时间内,通话的两个用户始终占用端到端的通信资源
电路交换的缺点:计算机数据具有突发性,故在通信时通信线路利用率很低
1.2.2 报文交换
Message Switching
1.2.3 分组交换
采用存储转发技术,把一个报文(需要发送的整块数据)划分为几个等长的数据段,再加上一些必要的控制信息组成的首部(包头)后,就构成了分组(又称包)后再进行传送,接收端收到分组后剥去首部还原报文。
- 分组是在互联网中的传送单元。
- 首部包含了目的地址和源地址等重要控制信息
互联网核心部分的路由器(转发分组)之间一般用高速的链路连接,在边缘的主机(为用户进行信息处理)接入核心的部分通常用相对较低速率相连接
路由器分组过程:
把收到的分组放入缓存,查找转发表找出目标地址,把分组送到适当的端口转发出去,交给下个路由器。
优点:高效,灵活,迅速,可靠
缺点:分组在各个结点存储转发时需要排队,会造生成时延;分组必须携带首部,造成一定开销
1.2.4 三种交换方式的对比
三种方式优缺点:
1.3 计算机网络的定义与分类
1.3.1 计算机网络的定义
计算机网络主要是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某个特定的目的,这些可编程的硬件(硬件中一定含有中央处理机cpu)按可以用来传送多种不同类型的数据,并且支持广泛和日益增长的应用。
根据这个定义:
- 计算机网络所连接的硬件,并不限于一般的计算机,而是包括了智能手机。
- 计算机网络并非专门用于传送数据,而是能够支持很多应用
1.3.2 计算机网络的分类
-
按照网络的作用范围进行分类:
广域网WAN、域域网MAN、局域网LAN、个人区域网PAN
-
按照网络使用者分类:
公用网(按电信公司规定缴纳费用的人都可使用)
专用网(为特殊业务工作需要而建造的网络)
-
用来把用户接入到互联网的网络:
这种网络称为接入网AN又称本地接入网或居民接入网,既不属于互联网的核心部分,又不属于边缘部分,是一种比较特殊的网络,用于用户接入互联网,是某个用户端系统到互联网的第一个路由器(也称边缘路由器)之间的一种网络。
从范围看,接入网属于局域网;
从作用看,接入网只是起到让用户能够与互联网连接的桥梁作用。
1.4 计算机网络的性能指标
1.4.1 速率
数据传送的速率,也称数据率或比特率。速率往往是额定速率或标称速率,并非实际速率。
单位是bit/s,kbit/s千103,Mbit/s兆106,Gbit/s吉10^9
比特bit:二进制数字中的一个0或1,是计算机中数据量的单位
1.4.2 带宽
两个含义:
-
本来是指某信号具有的频带宽度,单位是赫,千赫,兆赫,吉赫
-
在计算机网络中,表示网络中某通道传送数据的能力,即在单位时间内网络中某通信所能通过的最高数据率,单位是biit/s比特每秒
联系:
- 前者是频域称谓,后者是时域称谓,本质相同,即一条通信链路带宽越窄,所能传输的最高数据率也越高。
1.4.3 吞吐量
单位时间内通过某个网络(或接口、通道)的数据量,更经常地用于现实世界中的网络一种测量,以便知道实际上到底有多少数据量能通过网络。
1.4.4 时延
数据从网络的一端传送到里那个一端所需的时间,也称延迟或迟延
$$
总时延=发送时延+传播时延+处理时延+排队时延
$$
网络中的时延由几个不同部分组成:
-
发送时延:主机或路由器发送数据帧所需的时间,也就是从发送数据帧的第一个比特算起,到最后一个比特发送完毕所需的时间。也叫发送时延。
发生在机器内部的发送器中
$$
发送时延=数据帧长度(bit)/发送速率(bit/s)
$$ -
传播时延:电磁波在通信中传播一定距离需要花费的时间
$$
传播时延=通信长度(米)/信号在通道上的传播速率(米/秒)
$$
发生在机器外的传送道媒体上 -
处理时延:主机或路由器在收到分组时,为处理分组(分析首部、提取数据、差错检验或查找路由)所花费的时间
-
排队时延:分组在路由器输入输出队列中排队等待所经历的时延,取决于网络中当时的通信量。
1.4.5 时延带宽面积
又称比特为单位的链路
$$
时延带宽积=传播时延*带宽
$$
1.4.6 往返时间RTT
从发送方发送数据开始,到发送方收到接收方的确认,总共经历的时间。
$$
有效数据率=数据长度/(发送时间+RTT)
$$
在使用卫星通信时,往返时间相对较长,是很重要的指标。
1.4.7 利用率
分为信道利用率和网络利用率。
信道利用率,指出通道有百分之几的是被利用的(有数据通过),完全闲置的信道利用率是零。
网络利用率,是全网络的信道利用率加权平均值
信道利用率并非越大越好,信道的利用率增大时,时延也增加。
时延与网络利用率的关系:
D表示网络当前时延 D0表示网络空闲时时延 U表示网络利用率
$$
D=D0/(1-U)
$$
1.5 计算机网络体系结构
1.5.1 计算机网络体系结构分层的必要性
“分层”可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理
- 物理层 ——解决使用何种信号来传输比特的问题,实际上传输媒体不属于物理层
- 数据链路层 ——解决分组在一个网络(或一段链路)上传输的问题
- 网络层 ——解决分组在多个网络上传输(路由)的问题
- 运输层 ——解决进程之间基于网络的通信问题
- 应用层 ——解决通过应用进程的交互来实现特定网络应用的问题
1.5.2 计算机网络体系结构分层思想举例
各层对数据进行加码
物理层会将帧看作比特流并加上前导码
各层加码的具体内容与作用(后面会学,先了解一下)
- HTTP请求报文内容
- TCP报文段首部格式 ——区分应用进程、实现可靠传输
- IP数据报首部格式 ——使IP数据报可以在互联网上传输(即被路由器转发)
- 帧首部格式 ——使帧能在一个网络(或一段链路)上传输,能够被响应的主机接收
- 帧尾部格式 ——让目的主机检查所接收到的帧是否有误码
- 比特流前导码格式 ——为了让目的主机做好接收帧的准备
1.5.3 计算机网络体系结构专用术语
-
实体:任何可发送或接收消息的硬件或软件进程
-
对等实体:收发双方相同层次中的实体
- 协议:控制两个对等实体进行逻辑通信的规则的集合
-
协议三要素
- 语法:定义所交换信息的格式
- 语义:定义收发双方所要完成的操作
- 同步:定义收发双方的时序关系
-
服务
协议与服务的关系:
- 在协议的控制下,两个对等实体间的逻辑通信使得本层能够向上一层提供服务
- 要实现本层协议,还需要使用下面一层所提供的服务
- 协议是”水平的“,服务是”垂直的“
- 实体看得见相邻下层所提供的服务,但并不知道实现该服务的具体协议。也就是说,下面的协议对上面的实体是”透明的“
服务访问点:在同一系统中相邻两层的实体交换信息的逻辑接口,用于区分不同的服务类型
- 数据链路层的服务访问点:帧的类型字段
- 网络层的服务访问点:IP数据报首部中的协议字段
- 运输层的服务访问点:端口号
服务原语:上层使用下层所提供的服务必须通过与下层交换一些命令,这些命令称为服务原语
协议数据单元PDU:对等层次之间传送的数据包称为该层的协议数据单元
服务数据单元SDU:同一系统内,层与层之间交换的数据包称为服务数据单元
- 多个SDU可以合成为一个PDU,一个SDU也可划分为几个PDU
物理层
物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流,而不是具体的传输媒体
2.1物理层的基本概念
- 物理层数据链路层屏蔽了各种传输媒体的差异,使数据链路层只需要考虑如何完成本层的协议和服务,而不必考虑网络具体的传输媒体是什么
2.2 物理层下面的传输媒体
2.2.1 导引型传输媒体
- 同轴电缆
-
双绞线
-
光缆
光纤的优点
- 通信容量大(25000 - 30000GHz的带宽)
- 传输损耗小,远距离传输时更加经济
- 抗雷电和电磁干扰性能好(这在大电流脉冲干扰的环境下尤为重要)
- 无串音干扰,保密性好,不易被窃听
- 体积小,重量轻
光纤的缺点
- 割接需要专用设备
- 光电接口价格较贵
2.2.2 非导引型传输媒体
- 无线电波
- 微波
- 红外线
- 可见光
2.3 传输方式
2.3.1 串行传输与并行传输
2.3.2 同步传输与异步传输
2.3.3 单工,半双工和全双工
2.4 编码与调制
常用编码:
基本调制方法:
2.5 信道极限容量
2.5.1 失真因素
- 码元传输速率
- 信号传输速率
- 噪声干扰
- 传输媒体质量
2.5.2 奈氏准则
2.5.3 香农公式
在信道带宽一定的情况下,根据奈氏准则和香农公式,要想提高信息的传输速率就必须采用多元制(更好的调制方法)和努力提高信道中的信噪比
2.5.4 信道复用
复用(Multiplexing)是通信技术中的一个重要概念。复用就是通过一条物理线路同时传输多路用户的信号
- 当网络中的传输媒体的传输容量大于多条单一信道传输的总通信量时,可以利用复用技术在一条物理线路上建立多条通信信道来充分利用传输媒体的带宽
常见的信道复用技术:
- 频分复用技术FDM
- 时分复用TDM
- 波分复用WDM
- 码分复用CDM
在CDMA中,每一个比特时间再划分为m个短的间隔,称为码片(Chip)。通常m的值是64或128。为了简单期间,后续的举例中,假设m为8
使用CDMA的每个站被指派一个唯一的m bit码片序列(Chip Sequence)
- 一个站若要发送比特1,则发送它自己的m bit码片序列
- 一个站若要发送比特0,则发送它自己的m bit码片序列的二进制反码
码片序列的挑选原则如下:
- 分配给每个站的码片序列必须各不相同,实际常采用伪随机码序列
- 分配给每个站的码片序列必须相互正交(规格化内积为0)
数据链路层
在同一个局域网中,分组怎样从一台主机传送到另一台主机,但不经过路由器转发
3.1 数据链路层概述
链路(Link)就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点
数据链路(Data Link)是指把实现通信协议的硬件和软件加到链路上,就构成了数据链路
- 数据链路层以帧为单位传输和处理数据
数据链路层三个重要问题
- 封装成帧
- 透明传输
- 差错检测
3.2 封装成帧
封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧
- 帧头和帧尾中包含有重要的控制信息
- 帧头和帧尾的作用之一就是帧定界
- 帧开始符SOH,帧结束符EOT
3.3 透明传输
透明传输指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样
- 传输的是文本文件组成的帧时,数据部分显然不会出现像SOH或EOT这二样的帧定界字符。可见不管从键盘上输入什么样的字符,都可以放这样的帧传输过去,这样的传输就是透明传输
- 但当数据部分是非ASCII码时,就可能出现帧定界字符
解决方法:
-
面向字节的物理链路使用字节填充(或称字符填充)的方法实现透明传输
在数据中与标识符相同的字段前加上转义字符
- 面向比特的物理链路使用比特填充的方法实现透明传输
零比特填充法:对于数据部分出现的同标志位的字段,在每连续5个1后添加1个0(无论其是否构成和帧标志相同,都一律按该规则添0),保证了数据部分不再与标志位相同,接收方接收时将每连续的5个1后的一个0进行剔除
传输效率
- 为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大些
- 考虑到差错控制等多种因素,每种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元MTU(Maximum Transfer Unit)
3.4 差错检测
比特差错,实际的通信链路都不是理想的,比特在传输的过程中可能会产生差错:1可能变为0,而0也可能变为1
误码率BER(Bit Error Rate)在一段时间内,传输错误的比特占所传输比特总数的比率
使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一
3.4.1 奇偶校验
- 在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)“1”的个数为奇数(奇校验)或偶数(偶校验)
- 如果有奇数个位发生误码,则奇偶性发生变化,可以检查出误码
- 如果有偶数个位发生误码,则奇偶性不发生变化,不能检查出误码(漏检)
3.4.2 循环冗余校验CRC
Cyclic Redundancy Check
- 收发双方约定好一个生成多项式G ( x ) G(x)G(x)
- 发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起传输
- 接收方通过生成多项式来计算收到的数据是否产生了误码
- 检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误
- 想要纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用
- 循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但是非常易于用硬件实现,因此被广泛应用于数据链路层
- 在计算机网络中通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务
3.5 可靠传输
3.5.1 可靠传输的基本概念
-
数据链路层向上层提供的服务类型:
-
不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做
-
可靠传输服务:想办法实现发送端发送什么,接收端就收到什么
-
-
一般情况下,有线链路的误码率较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务。即使出现了误码,可靠传输的问题由其上层处理
-
无线链路易受干扰,误码率比较高,因此要求数据链路层必须向上层提供可靠传输服务
-
比特差错只是传输差错中的一种,从整个计算机网络体系结构来看,传输差错还包括分组丢失、分组失序以及分组重复(这些传输差错一般出现在数据链路层的上层)
-
可靠传输服务并不仅局限于数据链路层,其他各层均可选择实现可靠传输
3.5.2 可靠传输的实现机制 ——停止等待协议
- 发送方向接收方发送数据,并等待
- 接收方通过差错检测若无误码则接收并向发送方发送确认分组(ACK)
- 发送方接收到确认分组后便可删除上条数据的缓存并发送下一组数据
- 若出现了误码,接收方丢弃该数据并向发送方发送否认分组(NAK)
- 发送方收到否认分组后重新传送上一条数据
- 若到了计时器所设置的重传时间而发送方仍收不到接收方的任何ACK或NAK,则重传原来的数据分组,这就叫超时重传
- 为避免分组重复这种传输错误,必须给每个分组带上序号。接收方通过编号便可判断是否是重复的数据,对于重复的数据丢弃即可
- 为避免重复的确认分组,还需给确认分组编号,遇到重复的确认分组将其忽略
信道利用率
$$
信道利用率=数据帧发送时延/(数据帧发送时延+端到端的往返时延RTT)
$$
缺点:
- 当往返时延RTT远大于数据帧发送时延时(例如使用卫星链路),信道利用率非常低
- 若出现重传,则对于传送有效的数据信息来说,信道利用率更低
- 为克服停止-等待协议信道利用率很低的缺点,便产生另外两种协议(后退N帧协议GBN 和 选择重传协议SR)
3.5.2 可靠传输的实现机制 ——回退N帧协议GBN
缺点:
- 回退N帧协议的接收窗口尺寸WR只能等于1,因此接收方只能按序接收正确到达的数据分组
- 一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱序和误码)。这必然会造成发送方对这些数据分组的超时重传,显然这时对通信资源的极大浪费
3.5.3 可靠传输的实现机制 ——选择重传协议SR
3.6 点对点协议PPP
-
点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议
-
PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成
-
对各种协议数据报的封装方法(封装成帧)
-
链路控制协议LCP,用于建立、配置以及测试数据链路的连接
-
一套网络控制协议NCPs,其中的每一个协议支持不同的网络层协议
-
3.6.1 帧格式
3.6.2 透明传输
-
面向字节的异步链路采用插入转义字符的字节填充法
- 出现的每个7E(PPP帧的定界符)字节转变成2字节序列(7D5E)
- 出现的每个7D(转义字符)字节转变成2字节序列(7D5D)
- 出现的每个ASCII码控制字符(数值小于0x20的字符),则在该字符前插入一个7D字节,同时将该字符的编码加上0x20
接收方进行反变换即可恢复出原来的帧的数据部分
-
面向比特的同步链路采用插入比特0的比特填充法
-
发送方:对帧的数据部分进行扫描(一般由硬件实现)只要发现5个连续的比特1,则立即填充1个比特0
-
接收方:对帧的数据部分进行扫描(一般由硬件实现)只要发现5个连续的比特1,就把其后的1个比特0删除
-
3.6.3 差错检测
接收方每收到一个PPP帧,就进行CRC检验。若CRC检验正确,就收下该帧;反之就丢弃该帧。使用PPP的数据链路层向上提供的是不可靠传输服务
3.7 使用广播信道的数据链路层
3.7.1 媒体接入控制MAC的基本概念
共享信道要考虑的一个问题就是如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制MAC(Medium Access Control)
随着技术的发展,交换技术的成熟和成本的降低,具有更高性能的使用点对点链路和链路层交换机的交换式局域网在有线领域已经完全取代了共享式局域网,但由于无线信道的广播天性,无线局域网仍然使用的是共享媒体技术
3.7.2 媒体接入控制——静态划分信道
用户只要分配到了信道,就不会和其它用户发生冲突,但此方法代价高,不适合局域网使用。
信道复用技术,详见信道复用
3.7.3 媒体接入控制——动态接入控制
总线局域网使用的协议CSMA/CD
载波监听多址接入/碰撞检测 CSMA/CD (Carrier Sense Multiple Access/Collision Detection)
争用期(碰撞窗口)
主机最多经过2 τ (即δ → 0 )的时长就可以检测到本次发送是否遭受了碰撞,因此,以太网端到端往返传播时延2 τ 称为争用期或碰撞窗口
-
经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞
-
每个主机在自己发送帧之后的一小段时间内,存在着遭遇碰撞的可能性。这小段时间是不确定的,它取决于另一个发送帧的主机到本主机的距离,但不会超过总线的端到端往返传播时延,即一个争用期时间
-
显然,在以太网中发送帧的主机越多,端到端往返传播时延越大,发送碰撞的概率就越大。因此,共享式以太网不能连接太多的主机,使用的总线也不能太长
最小帧长
- 以太网规定最小帧长为64字节,即512比特(512比特时间即为争用期)
- 如果要发送的数据非常少,那么必须加入一些填充字节,是帧长不小于64字节
- 以太网的最小帧长确保了主机可在帧发送完成之前就检测到该帧的发送过程中是否遭遇了碰撞
- 如果在争用期(共发送64字节)没有检测到碰撞,那么后续发送的数据就一定不会发送碰撞
- 如果在争用期内检测到碰撞,就立即中止发送,这时已经发送出去的数据一定小于64字节,因此凡长度小于64字节的帧都是由于碰撞而异常中止的无效帧
最大帧长
截断二进制指数退避算法
- 若连续多次发生碰撞,就表明可能有较多的主机参与竞争信道。但使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(这也称为动态退避),因而减小发生碰撞的概率,有利于整个系统的稳定
- 当重传达16次仍不能成功时,表明同时打算发送帧的主机太多,以至于连续发生碰撞,则丢弃该帧,并向高层报告
信道利用率
帧发送流程
帧接受流程
无线局域网使用的协议CSMA/CA
载波监听多址接入/碰撞避免 CSMA/CA (Carrier Sense Multiple Access/Collision Avoidance)
3.8 MAC地址
MAC地址是以太网的MAC子层所用的地址 ——数据链路层
当多个主机连接在同一个广播信道上,要想实现两个主机之间的通信,则每个主机都必须有一个唯一的标识,即一个数据链路层地址
在每个主机发送的帧中必须携带标识发送主机和接收主机的地址。由于这类地址是用于媒体接入控制MAC(Media Access Control),因此这类地址被称为MAC地址
-
MAC地址一般被固化在网卡(网络适配器)的电可擦可编程只读存储器EEPROM中,因此MAC地址也被称为硬件地址
-
MAC地址有时也被称为物理地址。请注意:这并不意味着MAC地址属于网络体系结构中的物理层!
一般情况下,用户主机会包含两个网络适配器:有线局域网适配器(有线网卡)和无线局域网适配器(无线网卡)。每个网络适配器都有一个全球唯一的MAC地址。而交换机和路由器往往拥有更多的网络接口,所以会拥有更多的MAC地址。综上所述,严格来说,MAC地址是对网络上各接口的唯一标识,而不是对网络上各设备的唯一标识
MAC地址格式
MAC地址发送顺序
- 字节发送顺序:第一字节->第六字节
- 字节内的比特发送顺序:b0->b7
3.9 IP地址 ---网络层
IP地址是TCP/IP体系结构网际层使用的地址
IP地址是因特网上的主机和路由器所使用的地址,用于标识两部分信息
- 网络编号:标识因特网上数以百万计的网络
- 主机编号:标识同一网络上不同主机(或路由器各接口)
3.9.1 从网路体系结构看IP地址与MAC地址
- Ip地址,封装有源IP地址
- MAC地址,封装有源MAC地址和目的MAC地址
3.9.2 数据包转发过程中IP地址与MAC地址的变化情况
- 数据包转发过程中源IP地址和目的IP地址保持不变
- 数据包转发过程中源MAC地址和目的MAC地址逐个链路(或逐个网络)改变
目前发送站知道应该将数据包转给具体哪个路由或主机,发送站知道其目的站的IP地址,但不知道其对应的MAC地址是什么(将在后续的ARP协议中解释)
3.10 ARP协议
ARP协议属于TCP/IP体系结构的网际层,作用是在已知设备所分配的IP地址,使用ARP协议就可以获取到设备的MAC地址
- 主机B打算给C发送数据包。目前B知道C的IP地址,但不知道MAC地址,因此B的数据链路层封装MAC帧时,无法填写目的MAC地址
- 由于未找到,则主机B需要发送ARP请求报文(广播)获取主机C的MAC地址
- 主机C收到广播后,首先将B的IP地址与MAC地址记录到自己的ARP高速缓存表中,再给B发送ARP响应(单播),以告知自己的MAC地址
- 主机B收到主机C发送的ARP响应后,将对应信息添加在自己的ARP高速缓存中
其中每条记录的类型分为动态(dynamic)和静态(static)两种:
- 动态:自动获取,生命周期默认为2min
- 静态:手工设置,不同的操作系统下的生命周期不同,例如系统重启后不存在或系统重启后依然有效
- ARP协议只能在一段链路或一个网络上使用,而不能跨网络使用,ARP协议的使用是逐段链路进行的
3.11 集线器与交换机的区别
- 早期的总线型以太网
-
使用双绞线和集线器HUB的星型以太网
- 使用集线器的以太网在逻辑上仍是一个总线网,各站共享总线资源,使用的还是CSMA/CD协议
- 集线器只工作在物理层,它的每个接口仅简单地转发比特,不进行碰撞检测(由各站的网卡检测)
- 集线器一般都有少量的容错能力和网络管理功能。例如,若网络中某个网卡出了故障,不停地发送帧。此时,集线器可以检测到这个问题,在内部断开与出故障网卡的连线,使整个以太网仍然能正常工作
小结
集线器HUB | 交换机SWITCH |
---|---|
早期以太网的互联设备 工作在OSI体系结构的物理层 对接收到的信号进行放大、转发 实用集线器作为互联设备的以太网仍然属于总线式以太网,集线器互联起来的所有主机共享总线带宽,属于同一碰撞与和广播域 |
目前以太网中使用最广泛的互联设备 工作在OIS体系结构中的数据链路层(也包括物理层) 根据MAC地址对帧进行转发 使用交换机作为互联设备的以太网,称为交换式以太网。交换机可根据MAC地址过滤帧,即隔离碰撞区域 交换机的每一个接口是一个独立的区域 交换机隔离碰撞域但不隔离广播域(VLAN除外) |
3.12 以太网交换机自学习和转发帧的流程
以太网交换机自学习和转发帧的流程:
- 收到帧后进行登记。登记的内容为帧的源MAC地址及进入交换机的接口号
- 根据帧的目的MAC地址和交换机的帧交换表对帧进行转发,有以下三种情况:
- 明确转发:交换机知道应当从哪个(或哪些)接口转发该帧(单播,多播,广播)
- 盲目转发:交换机不知道应当从哪个端口转发帧,只能将其通过除进入交换机的接口外的其他所有接口转发(也称为泛洪)
- 明确丢弃:交换机知道不应该转发该帧,将其丢弃
帧交换表中,每条记录都有自己的有效时间,到期自动删除。这是因为MAC地址和交换机接口的对应关系并不是永久性的
- 交换机的接口改接了另一台主机
- 主机更换了网卡
网络层
4.1 网络层概述
- 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输
- 要实现网络层任务,需要解决以下主要问题:
- 网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输”)
- 网络层寻址问题
- 路由选择问题
- 因特网(Internet)是目前全世界用户数量最多的互联网,它使用TCP/IP协议栈,由于TCP/IP协议栈的网络层使用网际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层常称为网际层
- 综上所述,我们通过学习TCP/IP协议栈的网际层来学习网络层的理论知识和实践技术
4.2 网络层提供的两种服务
4.2.1 面向连接的虚电路服务
- 可靠通信由网络来保证
- 必须建立网络层的连接——虚电路VC(Virtual Circuit)
- 通信双方沿着已建立的虚电路发送分组
- 这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复)
- 通信结束后,需要释放之前所建立的虚电路
- 很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的X.25和逐渐过时的帧中继FR、异步传输模式ATM等
4.2.2 无连接的数据报服务
-
可靠通信应当由用户主机来保证
-
不需要建立网络层连接
-
每个分组可走不同的路径
-
每个分组的首部必须携带目的主机的完整地址
-
这种通信方式所传送的分组可能误码、丢失、重复和失序
-
由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)
-
因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心
4.3 IPv4地址
4.3.1 概述
IPv4地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符
- IP地址由因特网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配
- 我国用户可向亚太网络信息中心APNIC(Asia Pacific Network Information Center)申请IP地址,需要缴费
- 2011年2月3日,互联网号码分配管理局IANA(由ICANN行使职能)宣布,IPv4地址已经分配完毕
- 我国在2014至2015年也逐步停止了向新用户和应用分配IPv4地址。同时全面开展商用部署IPv6
IPv4地址编址方式经历的三阶段:
4.3.2 分类编址的IPv4地址
- A类地址
- B类地址
- C类地址
各类地址详细区别:
4.3.3 划分子网的IPv4地址
32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
- 子网掩码使用连续的比特1来对应网络号和子网号
- 子网掩码使用连续的比特0来对应主机号
- 将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址
默认子网掩码是指在未划分子网的情况下使用的子网掩码
4.3.4 无分类的IPv4地址
划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的C类网因为其地址空间太小并没有得到充分使用,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁,为此,因特网工程任务组IETF又提出了采用无分类编址的方法来解决IP地址紧张的问题,同时还专门成立IPv6工作组负责研究新版本IP以彻底解决IP地址耗尽问题
-
1993年,IETF发布了无分类域间路由选择CIDR(Classless Inter-Domain Routing)的RFC文档:RFC 1517~1519和1520
-
CIDR消除了传统的A类、B类和C类地址,以及划分子网的概念
-
CIDR可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增长
-
-
CIDR使用“斜线记法”,或称CIDR记法。即在IPv4地址后面加上斜线“/”,在斜线后面写上网络前缀所占的比特数量
-
CIDR实际上是将网络前缀都相同的连续的IP地址组成一个“CIDR地址块”
-
我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节:
-
地址块的最小地址
-
地址块的最大地址
-
地址块中的地址数量
-
地址块聚合某类网络(A类、B类或C类)的数量
-
地址掩码(也可继续称为子网掩码)
-
- 路由聚合(构造超网)
- 网络前缀越长,地址块越小,路由越具体
- 若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体
4.3.5 IPv4地址的应用规划
定长的子网掩码FLSM(Fixed Length Subnet Mask)
- 使用同一个子网掩码来划分子网
- 每个子网所分配的IP地址数量相同,造成IP地址的浪费
变长的子网掩码VLSM(Variable Length Subnet Mask)
- 使用不同的子网掩码来划分子网
- 每个子网所分配的IP地址数量可以不同,尽可能减少对IP地址的浪费
总结
4.4 IP数据报的发送和转发过程
为了将重点放在TCP/IP协议栈的网际层发送和转发IP数据报的过程上,在之后的举例中,我们忽略使用ARP协议来获取目的主机或路由器接口的MAC地址的过程以及以太网交换机自学习和转发帧的过程。
IP数据报的发送和转发过程包含以下两部分:
- 主机发送IP数据报
- 路由器转发IP数据报
直接交付:同一个网络中的主机之间可以直接通信
间接交付:不同网络之间主键需要通过路由器中转
源主机如何知道目的主机是否与自己在同一个网络中?
将源主机IP与源主机子网掩码相与得到本机网络地址,再将目的主机IP与源主机子网掩码相与得到目的网络地址,再比对网络地址即可,相同则说明在同一网络中
主机C如何知道该由哪个路由器转发呢?
实际上,用户为了让本网络的主机能和其他网络中的主机进行通信,就必须给其指定本网络中的一个路由器,由该路由器帮忙进行转发。所指定的路由器也被称为默认网关
路由器收到IP数据报后如何转发?
-
检测IP数据报首部是否出错:
- 若出错,则直接丢弃该IP数据报并通告源主机
- 若没有出错,则进行转发
-
根据IP数据报的目的地址在路由表中查找匹配的条目:
- 若找到匹配的条目,则转发给条目中指示的下一跳
- 若找不到,则丢弃该IP数据报并通告源主机
路由器将首部中的目的地址与路由表中地址掩码相与,再比对是否匹配
4.5 静态路由配置及其可能产生的路由环路问题
静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表
静态路由配置特点:
- 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化
- 一般只在小规模网络中采用
使用静态路由配置可能出现以下导致产生路由环路的错误
- 配置错误
- 聚合了不存在的网络
- 网络故障
静态路由示例
默认路由示例
特定主机路由示例
路由环路问题
- 静态路由配置错误导致路由环路
为了防止IP数据报在路由环路中永久兜圈,在IP数据报首部设有生存时间TTL字段
IP数据报进入路由器后,TTL字段的值减1。若TTL的值不等于0,则被路由器转发,否则被丢弃
- 聚合了不存在的网络而导致路由环路
对于该情况,可以在路由表中为聚合路由中不存在的网络添加黑洞路由(其作为下一跳相当于丢弃了该数据报)
- 网络故障而导致路由环路
4.6 路由选择协议
4.6.1 路由选择协议概述
静态路由选择 | 动态路由选择 |
---|---|
人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由 | 路由器通过路由选择协议自动获取路由信息 |
这种人工配置方式简单、开销小。 但不能及时适应网络状态(流量、拓扑等)的变化 |
比较复杂、开销比较大。 能较好地适应网络状态的变化 |
一般只在小规模网络中采用 | 适用于大规模网络 |
因特网所采用的路由选择协议的主要特点
- 自适应:动态路由选择,能较好地适应网络状态的变化
- 分布式:路由器之间交换路由信息
- 分层次:将整个因特网划分为许多较小的自治系统AS(Autonomous System)
因特网采用分层次的路由选择协议
- 域间路由选择采用外部网关协议EGP(现也称外部路由协议ERP),域内路由选择采用内部网关协议IGP(现也称内部路由协议IRP)
路由器基本结构
路由器工作过程
- 数据分组 —— 根据分组首部的目的地址进行查找转发,选择丢弃或指定端口进行转发
- 路由器之间交换信息的路由报文 —— 把该分组送交路由选择处理机,路由选择处理机根据分组的内容来更新自己的路由表
- 路由选择处理机除了处理收到的路由报文外,还会周期性的给其他路由器发送自己所知道的路由信息
- 路由器的各端口还应具有输入缓冲区和输出缓冲区,输入缓冲区用来暂存新进入路由器但还来不及处理的分组,输出缓冲区用来暂存已经处理完毕但还来不及发送的分组
4.6.2 路由信息协议RIP的基本工作原理
路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议之一,其相关标准文档为RFC 1058
RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为“距离向量D-V(Distance-Vector)"
RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离
- 路由器到直连网络的距离定义为1
- 路由器到非直连网络的距离定义为所经过的路由器数加1
- 允许一条路径最多只能包含15个路由器。“距离”等于16时相当于不可达。因此,RIP只适用于小型互联网
RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由,当到达同一目的网络有多条“距离相等”的路由时,可以进行等价负载均衡(即将通信量均衡地分布到多条等价的路由上)
RIP包含以下三个要点:
- 仅和相邻路由器交换信息
- 交换的是自己的路由表
- 周期性交换(例如每30秒)
RIP的基本工作过程
收敛:若干次交换和更新后,每个路由器都知道本自治系统AS内各网络的最短距离和下一跳地址
RIP的路由条目的更新规则
RIP存在“坏消息传播得慢”的问题
“坏消息传播得慢”又称为路由环路或距离无穷计数问题,这是距离向量算法的一个固有问题。可以采取多种措施减少出现该问题的概率或减小该问题带来的危害
- 限制最大路径距离为15(16表示不可达)
- 当路由表发生变化时就立即发送更新报文(即“触发更新”),而不仅是周期性发送
- 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即“水平分割”)
4.6.3 开放路径最短优先OSPF原理
开放最短路径优先OSPF(Open Shortest Path First),是为克服RIP的缺点在1989年开发出来的
- “开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的
- “最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF
与RIP区别:
- OSPF是基于链路状态的,而不像RIP那样是基于距离向量的
- OSPF采用SPF算法计算路由,从算法上保证了不会产生路由环路
- OSPF不限制网络规模,更新效率高,收敛速度快
- 链路状态是指本路由器都和哪些路由器相邻,以及相应链路的“代价”(cost)
“代价”用来表示费用、距离、时延、带宽,等等。这些都由网络管理人员来决定
例如:
-
OSPF相邻路由器之间通过交互问候(Hello)分组,建立和维护邻居关系
-
Hello分组封装在IP数据报中,发往组播地址224.0.0.5
-
发送周期为10秒
-
40秒未收到来自邻居路由器的Hello分组,则认为该邻居路由器不可达
-
- 使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement)。LSA中包含以下内容:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
- LSA被封装在链路状态更新分组LSU中,采用洪泛法发送
- 使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA
- 通过各路由器洪泛发送封装有自己LSA的LSU分组,各路由器的LSDB最终将达到一致
- 使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表
OSPF五种分组类型类型
问候(Hello)分组 | 用来发现和维护邻居路由器的可达性 |
---|---|
数据库描述(Database Description)分组 | 向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息 |
链路状态请求(Link State Request)分组 | 向邻居路由器请求发送某些链路状态项目的详细信息 |
链路状态更新(Link State Update)分组 | 路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态 |
链路状态确认(Link State Acknowledgment)分组 | 这是对链路状态更新分组的确认分组 |
OSPF的基本工作过程
OSPF在多点接入网络中路由器邻居关系的建立
- 选举指定路由器DR(designated router)和备用的指定路由器BDR(backup designated router)
- 所有的非DR/BDR只与DR/BDR建立邻居关系
- 非DR/BDR之间通过DR/BDR交换信息
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域(Area)
4.6.4 Dijkstra最短路径算法
- 首先选择一个点作为根结点
- 将根结点相邻的结点记录在表中,表中记录每个点到根结点的最短距离以及其前驱结点,初始时表中的距离可视作无穷大
- 此时以根结点作为出发点的过程已完毕,做上标记,于是再以表中距离较小且为做完毕标记的结点为出发点
- 计算途经该出发点到它的邻接点的距离(根到出发点距离 + 出发点到邻接点距离),若计算出的距离小于表中原有距离则更新表(同时更新距离和前驱结点,前驱即为该出发点)
- 于是循环步骤3、4操作直到所有的点都做上标记说明路径已全部计算完毕
4.6.5 边界网关协议BGP
在不同自治系统内,度量路由的“代价”(距离,带宽,费用等)可能不同。因此,对于自治系统之间的路由选择,使用“代价”作为度量来寻找最佳路由是不行的。
- 由于自治系统之间的路由选择必须考虑相关策略(政治,经济,安全等),BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由
基本工作原理
- 在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的BGP发言人
- 不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接,端口号为179
- 在此TCP连接上交换BGP报文以建立BGP会话
- 利用BGP会话交换路由信息(例如,增加新的路由,或撤销过时的路由,以及报告出错的情况等)
- 使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)
- BGP发言人除了运行BGP外,还必须运行自己所在自治系统所使用的内部网关协议IGP,例如OSPF或RIP
- BGP发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统)
- 当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的较好的路由。也就是构造出树形结构、不存在回路的自治系统连通图
- BGP适用于多级结构的因特网
BGP-4有以下四种报文
- OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,使通信初始化
- UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由
- KEEPALIVE(保活)报文:用来周期性地证实邻站的连通性
- NOTIFICATION(通知)报文:用来发送检测到的差错
各协议的封装关系
4.7 IPv4数据报的首部格式
-
版本
占4比特,表示IP协议的版本
通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4) -
首部长度
占4比特,表示IP数据报首部的长度。该字段的取值以4字节为单位
最小十进制取值为5,表示IP数据报首部只有20字节固定部分
最大十进制取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分 -
可选字段
长度从1个字节到40个字节不等。用来支持排错、测量及安全等措施
可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理IP数据报的开销。实际上可选字段很少被使用 -
填充字段
确保首部长度为4字节的整数倍。使用全0进行填充 -
区分服务
占8比特,用来获得更好的服务
该字段在旧标准中叫作服务类型,但实际上一直没有被使用过
1998年,因特网工程任务组IETF把这个字段改名为区分服务
利用该字段的不同数值可提供不同等级的服务质量
只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段 -
总长度
占16比特,表示IP数据报的总长度(首部+数据载荷)
最大取值为十进制65535,以字节为单位
由于数据链路层的帧的数据载荷长度受限于最大传输单元MTU(例如,以太网规定MTU值为1500字节),因此当IP数据报长度超过MTU时,无法封装,需要进行分片
标识、标志、片偏移三个字段共同用于IP数据报分片
-
标识
占16比特,属于同一个数据报的各分片数据报应该具有相同的标识
IP软件维护一个计数器,每产生一个数据报,计数器值加1,并将此值赋给标识字段
-
标志
占3比特,各比特含义如下:
- DF位:1表示不允许分片;0表示允许分片
- MF位:1表示“后面还有分片”;0表示“这是最后一个分片”
- 保留位:必须为0
-
片偏移
占13比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位
片偏移以8个字节为单位
-
生存时间TTL
占8比特,最初以秒为单位,最大生存周期为255秒;路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间,若不为0就转发,否则就丢弃
现在以“跳数”为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则就丢弃
生存时间TTL字段的作用——防止IP数据报在网络中永久兜圈(路由环路)
- 协议
占8比特,指明IPv4数据报的数据部分是何种协议数据单元
常用的一些协议和相应的协议字段值如下:
协议名称 | ICMP | IGMP | TCP | UDP | IPv6 | OSPF |
---|---|---|---|---|---|---|
协议字段值 | 1 | 2 | 6 | 17 | 41 | 89 |
-
首部检验和
占16比特,用来检测首部在传输过程中是否出现差错。比CRC检验码简单,称为因特网检验和
IP数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化
由于IP层本身并不提供可靠传输的服务,并且计算首部校验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部校验和,从而更快转发IP数据报
-
源IP地址和目的IP地址
各占32比特,用来填写发送该IP数据报的源主机的IP地址和接收该IP数据报的目的主机的IP地址
4.8 网际报文控制协议ICMP
-
为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)
-
主机或路由器使用ICMP来发送差错报告报文和询问报文
-
ICMP报文被封装在IP数据报中发送
4.8.1 ICMP差错报文
ICMP差错报告报文共有以下五种:
-
终点不可达
当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误
- 源点抑制
当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢
-
时间超过
当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值减1。若结果不为0,则将该IP数据报转发出去;若结果为0,除丢弃该IP数据报外,还要向源点发送时间超过报文另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文
- 参数问题
当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文
- 改变路由(重定向)
路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)
以下情况不应发送ICMP差错报告报文
- 对ICMP差错报告报文不再发送ICMP差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
- 对具有多播地址的数据报都不发送ICMP差错报告报文
- 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文
4.8.2 ICMP询问报文
常用的ICMP询问报文有以下两种:
-
回送请求和回答
ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。
收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。
这种询问报文用来测试目的站是否可达及了解其有关状态。
-
时间戳请求和回答
ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。
在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。
这种询问报文用来进行时钟同步和测量时间
4.8.2 ICMP两个典型应用
分组网间探测PING(Packet InterNet Groper)
- 用来测试主机或路由器间的连通性
- 应用层直接使用网际层的ICMP(没有通过运输层的TCP或UDP)
- 使用ICMP回送请求和回答报文
跟踪路由traceroute
-
用来测试IP数据报从源主机到达目的主机要经过哪些路由器
Windows版本
- tracert命令
- 应用层直接使用网际层ICMP
- 使用了ICMP回送请求和回答报文以及差错报告报文
Unix版本
- traceroute命令
- 在运输层使用UDP协议
- 仅使用ICMP差错报告报文
跟踪路由traceroute原理:不断从1开始增加数据报的生存时间TTL,借助ICMP差错报告中的时间超过来获取沿途的路由器信息,直至收到目的主机返回的回答报文
4.9 虚拟专用网VPN与网络地址转换NET
虚拟专用网VPN(Virtual Private Network)
利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。
由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址。
如图所示,同一机构内不同部门的内部网络所构成的虚拟专用网VPN又称为内联网VPN
- 有时一个机构的VPN需要有某些外部机构(通常就是合作伙伴)参加进来。这样的VPN就称为外联网VPN
- 在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,即可访问专用网络中的资源。这种VPN称为远程接入VPN
网络地址转换NAT(Network Address Translation)
- 虽然因特网采用了无分类编址方式来减缓IPv4地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有被解除
- 1994年提出了一种网络地址转换NAT的方法再次缓解了IPv4地址空间即将耗尽的问题
- NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源
该转换方法存在一个问题:如果NAT路由器具有N个全球IP地址,那么至多只能有N个内网主机能够同时和因特网上的主机通信。
由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传送数据,因此可以利用运输层的端口号和IP地址一起进行转换
这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和IP地址一起进行转换的技术叫作网络地址与端口号转换NAPT(Network Address and Port Translation)
外网主机是否可以首先发起通信?
不可以,若由外网主机首先发起,当NAPT路由器收到来自外网的IP数据报后,在NAPT转换表中找不到相应的记录,也就无法把数据报转发给内网的主机。因此,使用私有地址的主机不能直接充当因特网服务器
对于一些P2P网络应用,需要外网主机主动与内网主机进行通信,在通过NAT时会遇到问题,需要网络应用自己使用一些特殊的NAT穿越技术来解决问题
另外,由于NAT对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护
运输层
5.1 运输层概述
之前课程所介绍的计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信,但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程。
如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务,运输层协议又称为端到端协议
5.2 运输层端口号、复用与分用的概念
-
运行在计算机上的进程使用进程标识符PID来标志
-
因特网上的计算机并不是使用统一的操作系统,不同的操作系统(Windows、Linux、Mac OS)又使用不同格式的进程标识符
-
为了使运行不同操作系统的计算机的应用进程之间能够进行网络通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识
-
TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程
- 端口号使用16比特表示,取值范围0 ~ 65535
- 熟知端口号:0~1023,IANA把这些端口号指派给了TCP/IP体系中最重要的一些应用协议,例如:FTP使用21/20,HTTP使用80,DNS使用53
- 登记端口号:1024~49151,为没有熟知端口号的应用程序使用。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。例如:Microsoft RDP微软远程桌面使用的端口是3389
- 短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用
- 端口号使用16比特表示,取值范围0 ~ 65535
-
端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机中的相同端口号是没有联系的
发送方的复用和接收方的分用
TCP/IP体系的应用层常用协议所使用的运输层熟知端口号
举例运输层端口号
- 浏览器中输入Web服务器域名,用户PC中会发送一个DNS查询请求报文,封装到IP数据报中通过以太网发给DNS服务器
2.DNS服务器按要求查找后会发送DNS响应报文,封装为UDP用户数据报,封装为IP数据报在以太网中传回用户PC
- PC知道IP地址后,HTTP请求报文会封装为TCP报文段,封装到IP数据包中,发送到Web服务器
- Web服务器发送Http响应报文,使用TCP协议封装为TCP报文段,再封装到IP数据报中,发回PC
- 从TCP报文中得到端口号,知道要用http客户端进程解析http响应报文的内容,并在网页浏览器中显示
5.3 TCP与UDP对比
用户数据报协议UDP(User Datagram Protocol)
传输控制协议TCP(Transmission Control Protocol)
- 无连接的UDP:可随时发送数据
- 面向连接的TCP:在数据通信之前,必须通过“三报文握手”建立TCP连接,建立成功后才能进行数据传输,数据传输结束后必须通过“四报文挥手”释放连接(这里所谓的连接是指逻辑连接关系,而非物理连接)
- UDP支持单播、多播以及广播;TCP仅支持单播
- UDP是面向应用报文的:UDP对应用进程交下来的报文既不合并也不拆分,而是保留这些报文的边界
TCP是面向字节流的:这正是TCP实现可靠传输、流量控制、以及拥塞控制的基础
- UDP向上层提供无连接不可靠传输服务:对于误码报文仅丢弃,中途丢失的报文不做任何处理。适用于IP电话、视频会议等实时应用
TCP向上层提供面向连接的可靠传输服务:基于TCP连接的可靠信道,不会出现传输差错(误码、丢失、乱序、重复)。适用于要求可靠传输的应用,例如文件传输
- UDP用户数据报首部仅8字节
TCP报文段首部最小20字节,最大60字节
小结
UDP | TCP |
---|---|
无连接 | 面向连接 |
支持一对一、一对多、多对一和多对多交互通信 | 每一条TCP连接只能有两个端点EP,只能是一对一通信 |
对应用层交付的报文直接打包 | 面向字节流 |
尽最大努力交付,也就是不可靠,不适用流量控制和拥塞机制 | 可靠传输,使用流量控制和拥塞机制 |
首部开销小 | 首部最小20字节,最大600字节 |
5.4 TCP的流量控制
- 一般来说,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失
流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收
- 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制
- TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小
- TCP发送方收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文
举例:
5.5 拥塞控制
- 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞(congestion)
- 在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源
- 若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降
拥塞控制的四种算法:
- 慢开始(slow-start)
- 拥塞避免(congestion avoidance)
- 快重传(fast retransmit)
- 快恢复(fast recovery)
下面介绍这四种拥塞控制算法的基本原理,假定如下条件:
- 数据是单方向传送,而另一个方向只传送确认
- 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定
- 以最大报文段MSS的个数为讨论问题的单位,而不是以字节为单位
- 发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化
拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减少一些
判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发生超时重传)
- 发送方将拥塞窗口作为发送窗口swnd,即swnd = cwnd
- 维护一个慢开始门限ssthresh状态变量:
- 当cwnd < ssthresh时,使用慢开始算法
- 当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法
- 当cwnd = ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法
5.5.1 慢开始
- 慢开始和拥塞避免算法是1988年提出的TCP拥塞控制算法(TCP Tahoe版本)
5.5.2 拥塞避免
5.5.3 快重传
- 1990年又增加了两个新的拥塞控制算法(改进TCP的性能),这就是快重传和快恢复(TCP Reno版本)
有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞,这将导致发送方超时重传,并误认为网络发生了拥塞,发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率。采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失
所谓快重传,就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传
- 要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认
- 即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
- 发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传
- 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%
-
发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法
-
发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半,开始执行拥塞避免算法
-
也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh+3。既然发送方收到3个重复的确认,就表明有3个数据报文段已经离开了网络。这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中。可见现在网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口扩大些
5.5.4 快恢复
5.6 TCP超时重传时间的选择
超时重传时间RTO的选择是TCP最复杂的问题之一
- 超时时间设置比RTT0小,会引起不必要的重传
- 超时时间设置远大于RTT0,会使重传推迟时间太长,使网络的空闲时间过长,降低传输效率
- 超时时间应设置略大于往返时间RTT
5.6.1 超时重传时间RTO的选择
不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO
- 利用每次测量得到的RTT样本,计算加权平均往返时间RTTs(又称为平滑的往返时间)
$$
RT { T }{ { S } } = RTT { T }_{ 1 },...
$$
$$
RT { T }{ { S } } = \left( 1- \alpha \right) R { T }{ { S } } + \alpha RT { T }_{ n }
$$
上式中,0<=α<1
- 若α很接近1,则新RTT样本对RTTs的影响较大
- 若α很接近0,则新RTT样本对RTTs的影响不大
已成为建议标准的RFC6298推荐的α的值为0.125
- 用这种方法得出的加权平均往返时间RTTs就比测量出的RTT值更加平滑
- 显然,超时重传时间RTO应略大于加权平均往返时间RTTs
5.6.2 RFC6298标准
RFC6298建议使用下式计算超时重传时间RTO:
$$
RTO=RTT
S
+4×RTT
D
$$
$$
RTTSn=(1−α)×RTTSn-1+α×RTTn(0≤α<1)
$$
$$
RTTDn=(1−β)×RTTDn−1+β×∣RTTSn-1−RTTn∣(0≤β<1)
$$
5.6.3 往返时间RTT的测量
超时重传时测量往返时间RTT的问题
针对出现超时重传时无法测准往返时间RTT的问题,Karn提出了一个算法:在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。也就是出现重传时,不重新计算RTTs,进而超时重传时间RTO也不会重新计算
这又引起了新的问题。设想出现这样的情况:报文段的时延突然增大了很多,并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。但根据Karn算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。这会导致报文段反复被重传。
因此,要对Karn算法进行修正。方法是:报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是将新RTO的值取为旧RTO值的2倍
5.7 TCP可靠传输的实现
TCP基于以字节为单位的滑动窗口来实现可靠传输
如何编程实现滑动窗口?
TCP可靠传输说明:
虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接方的接收窗口一样大
- 网络传送窗口值需要经历一定的时间滞后,并且这个时间还是不确定的
- 发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸
对于不按序到达的数据应如何处理,TCP并无明确规定
- 如果接收方把不按序到达的数据一律丢弃,那么接收窗口的管理将会比较简单,但这样做对网络资源的利用不利,因为发送方会重复传送较多的数据
- TCP通常对不按序到达的数据是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程
TCP要求接收方必须有累积确认和捎带确认机制,这样可以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上
- 接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传,这反而浪费了网络的资源
- TCP标准规定,确认推迟的时间不应超过0.5秒。若收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认[RFC 1122]
- 捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据
TCP的通信是全双工通信。通信中的每一方都在发送和接收报文段。因此,每一方都有自己的发送窗口和接收窗口。在谈到这些窗口时,一定要弄清楚是哪一方的窗口。
5.8 TCP的运输连接管理
TCP是面向连接的协议,它基于运输连接来传送TCP报文段
TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程
TCP运输连接有以下三个阶段:
- 建立TCP连接
- 数据传送
- 释放TCP连接
TCP的运输连接管理就是使运输连接的建立和释放都能正常地进行
5.8.1 TCP的连接建立
TCP的连接建立要解决以下三个问题:
- 使TCP双方能够确知对方的存在
- 使TCP双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
- 使TCP双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
TCP使用“三报文握手”建立连接
- TCP服务器进程创建传输控制块,之后进入监听状态被动等待TCP客户进程的连接请求
- TCP客户进程也首先创建传输控制块,然后可以发送TCP连接请求,并进入同步已发送状
- 如果TCP服务器进程同意建立连接,就发送TCP请求连接确认报文段,并进入同步已接受状态
- TCP客户端收到后,还要向TCP服务器发送一个普通的TCP确认报文段,并进入连接已进入状态
- TCP服务器进程收到后,就进入连接已建立状态
- 双方可以进行数据传输
注意:TCP的标准规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号;普通的确认报文段可以携带数据,但如果不携带数据,则不消耗序号
第三次“握手”发送针对TCP连接请求的确认的确认是否多余,是否可改为仅通过“两次握手”实现建立连接?不多余。这是为了防止已失效的连接请求报文段突然又传送到了TCP服务器,因而导致错误
5.8.2 TCP连接释放
- TCP客户进程发送TCP连接释放报文段,进入终止等待1状态
- TCP服务器端收到后发送普通TCP确认报文段,并进入关闭等待状态
- TCP服务器进程通知高层应用进程,断开TCP连接
- TCP客户进程收到后进入终止等待状态2
- 若TCP服务进程没有数据发送了,应用进程就通知TCP服务进程释放连接
- TCP服务器进程发送TCP连接释放报文段并进入最后的确认状态
- TCP客户进程收到后,发送普通的TCP确认报文段,进入时间等待状态
- TCP服务进程收到后就进入关闭状态,TCP客户进程还要等待2MSL后才关闭
等待2MSL的必要性:可以确保TCP服务器进程可以收到最后一个TCP确认报文段而进入关闭状态
另外,TCP客户进程在发送最后一个普通的TCP确认报文段后,再经过2MSL时长,就可以使本次链接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的TCP连接中,不会出现旧连接的报文段
保活计时器
- TCP服务器进程每收到一次TCP客户进程的数据,就重新设置并启动保活计时器(2小时定时)
- 若保活计时器定时周期内未收到TCP客户进程发来的数据,则当保活计时器到时后,TCP服务器进程就向TCP客户进程发送一个探测报文段,以后则每隔75秒钟发送一次。若一连发送10个探测报文段后仍无TCP客户进程的响应,TCP服务器进程就认为TCP客户进程所在主机出了故障,接着就关闭这个连接
5.9 TCP报文段的首部格式
为了实现可靠传输,TCP采用了面向字节流的方式。但TCP在发送数据时,是从发送缓存取出一部分或全部字节并给其添加一个首部使之成为TCP报文段,后进行发送
- 一个TCP报文段由首部和数据载荷两部分构成
- TCP的全部功能都体现在它首部中各字段的作用
5.5.1 TCP报文段的首部格式
-
源端口:占16比特,写入源端口号,用来标识发送该TCP报文段的应用进程
-
目的端口:占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程
-
序号:占32比特,取值范围[ 0 , 2 32 − 1 ] [0,2^{32}-1][0,2 32 −1],序号增加到最后一个后,下一个序号就又回到0。
指出本TCP报文段数据载荷的第一个字节的序号
-
确认号:占32比特,取值范围[ 0 , 2^32 − 1 ] ,确认号增加到最后一个后,下一个确认号就又回到0
指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据
- 确认标志位ACK:取值为1时确认号字段才有效;取值为0时确认号字段无效
TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1
-
数据偏移:占4比特,并以4字节为单位。
用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远
这个字段实际上是指出了TCP报文段的首部长度。
- 首部固定长度为20字节,因此数据偏移字段的最小值为(0101)2
- 首部最大长度为60字节,因此数据偏移字段的最大值为(1111)2
- 保留:占6比特,保留为今后使用,但目前应置为0
- 窗口:占16比特,以字节为单位。指出发送本报文段的一方的接收窗口
窗口值作为接收方让发送方设置其发送窗口的依据。这是以接收方的接收能力来控制发送方的发送能力,称为流量控制。
发送窗口的大小还取决于拥塞窗口的大小,也就是应该从接收窗口和拥塞窗口中取小者
- 校验和:占16比特,检查传输过程中是否发生乱码,检查范围包括TCP报文段的首部和数据载荷两部分
在计算校验和时,要在TCP报文段的前面加上12字节的伪首部 - 同步标志位SYN:在TCP连接建立时用来同步序号
- 终止标志位FIN:用来释放TCP连接
- 复位标志位RST:用来复位TCP连接
当RST=1时,表明TCP连接出现了异常,必须释放连接,然后再重新建立连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个TCP连接。
- 推送标志位PSH:实现推送操作,接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付
- 紧急标志位URG:取值为1时紧急指针字段有效;取值为0时紧急指针字段无效
- 紧急指针:占16比特,以字节为单位,用来指明紧急数据的长度
当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
-
选项:可以增加TCP功能
-
最大报文段长度MSS选项:TCP报文段数据载荷部分的最大长度
-
窗口扩大选项:为了扩大窗口(提高吞吐率)
-
时间戳选项:用来计算往返时间RTT;用于处理序号超范围的情况,又称为防止序号绕回PAWS
-
选择确认选项,实现选择确认功能
-
-
填充:由于选项的长度可变,因此使用填充来确保报文段首部能被4整除(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的)
应用层
6.1 应用层概述
应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分
- 早期基于文本的应用(电子邮件、远程登录、文件传输、新闻组)
- 20世纪90年代将因特网带入干家万户的万维网WWW
- 当今流行的即时通信、P2P文件共享及各种音视频应用
- 计算设备的小型化和“无处不在”,宽带住宅接入和无线接入的日益普及和迅速发展,为未来更多的新型应用提供了广阔的舞台
在本章中,我们以一些经典的网络应用为例来学习有关网络应用的原理、协议和实现方面的知识
- 万维网WWW
- 域名系统DNS
- 动态主机配置协议DHCP
- 电子邮件
- 文件传送协议FTP
- P2P文件共享
- 多媒体网络应用
6.2 客户/服务器方式(C/S方式)和对等方式(P2P方式)
绪论->1.1.5边缘部分


6.3 动态主机配置协议DHCP
动态主机配置协议DHCP(Dynamic Host Configuration Protocol)提供了一种机制,称为即插即用连网。这种机制允许一台计算机加入新网络时可自动获取IP地址等网络配置信息而不用手工参与。
6.3.1 DHCP的工作过程
DHCP主要使用以下报文来实现其功能:
- DHCP DISCOVER:DHCP发现报文
- DHCP OFFER:DHCP提供报文
- DHCP REQUEST:DHCP请求报文
- DHCP ACK:DHCP确认报文
- DHCP NACK:DHCP否认报文
- DHCP RELEASE:DHCP释放报文
DHCP报文在运输层使用UDP协议封装
- DHCP客户使用的UDP端口号为68
- DHCP服务器使用的UDP端口号为67
DHCP客户在未获取到IP地址时使用地址0.0.0.0
6.3.2 DHCP中继代理
在每一个网络上都设置一个DHCP服务器会使DHCP服务器的数量太多。因此现在是使每一个网络至少有一个DHCP中继代理(通常是一台路由器),它配置了DHCP服务器的IP地址信息,作为各网络中计算机与DHCP服务器的桥梁
6.4 域名系统DNS
6.4.1 域名系统的作用
互联网能否只是用一个DNS服务器?
这种做法不可取,因为互联网的规模很大,因为互联网的规模很大,这样的域名服务器肯定会因为负荷超载而无法正常工作,而且一旦域名服务器出现故障,整个互联网就会瘫痪。
早在1983年,互联网就采用层次结构的命名树作为主机的名字(域名),并使用分布式的域名系统DNS
由于DNS是分布式系统,即使单个计算机出现了故障,也不会妨碍整个系统的正常运行。
6.4.2 互联网采用的层次结构的命名树
域名的结构由若干个分量组成,各分量之间用“点”隔开,分别代表不同级别的域名
- 每一级的域名都由英文字母和数字组成,不超过63个字符,不区分大小写字母
- 级别最低的域名写在最左边,而级别最高的顶级域名写在最右边
- 完整的域名不超过255个字符
域名系统既不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思
各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由因特网名称与数字地址分配机构ICANN进行管理
顶级域名TLD(Top Level Domain)分为以下三类:
- 国家顶级域名nTLD:采用ISO3166的规定。如cn表示中国,us表示美国,uk表示英国、等等
- 通用顶级域名gTLD:最常见的通用顶级域名有七个,即:com(公司企业)、net(网络服务机构)、org(非营利性组织)、int(国际组织)、edu(美国教育结构)、gov(美国政府部门)、mil(美国军事部门)
- 反向域arpa:用于反向域名解析,即IP地址反向解析为域名
在国家顶级域名下注册的二级域名均由该国家自行确定。例如,顶级域名为jp的日本,将其教育和企业机构的二级域名定为ac和co,而不用edu和com
我国则将二级域名划分为以下两类:
- 类别域名:共七个,ac(科研机构)、com(工、商、金融等企业)、edu(教育机构)、gov(政府部门)、net(提供网络服务的机构)、mil(军事机构)和org(非营利性组织)
- 行政区域名:共34个,适用于我国的各省、自治区、直辖市。例如:bj为北京市、sh为上海市、js为江苏省,等等
这种按等级管理的命名方法便于维护名字的唯一性,并且也容易设计出一种高效的域名查询机制。需要注意的是,域名只是个逻辑概念,并不代表计算机所在的物理地点
6.4 3 域名服务器分类
域名和IP地址的映射关系必须保存在域名服务器中,供所有其他应用查询。显然不能将所有信息都储存在一台域名服务器中。DNS使用分布在各地的域名服务器来实现域名到IP地址的转换
域名服务器可以划分为以下四种不同的类型:
-
根域名服务器
根域名服务器是最高层次的域名服务器。每个根域名服务器都知道所有的顶级域名服务器的域名及其IP地址。因特网上共有13个不同IP地址的根域名服务器。尽管我们将这13个根域名服务器中的每一个都视为单个的服务器,但“每台服务器”实际上是由许多分布在世界各地的计算机构成的服务器群集。当本地域名服务器向根域名服务器发出查询请求时,路由器就把查询请求报文转发到离这个DNS客户最近的一个根域名服务器。这就加快了DNS的查询过程,同时也更合理地利用了因特网的资源。根域名服务器通常并不直接对域名进行解析,而是返回该域名所属顶级域名的顶级域名服务器的IP地址
-
顶级域名服务器
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时就给出相应的回答(可能是最后的结果,也可能是下一级权限域名服务器的IP地址)
-
权限域名服务器
这些域名服务器负责管理某个区的域名。每一个主机的域名都必须在某个权限域名服务器处注册登记。因此权限域名服务器知道其管辖的域名与IP地址的映射关系。另外,权限域名服务器还知道其下级域名服务器的地址
-
本地域名服务器
本地域名服务器不属于上述的域名服务器的等级结构。当一个主机发出DNS请求报文时,这个报文就首先被送往该主机的本地域名服务器。本地域名服务器起着代理的作用,会将该报文转发到上述的域名服务器的等级结构中。每一个因特网服务提供ISP,一个大学,甚至一个大学里的学院,都可以拥有一个本地域名服务器,它有时也称为默认域名服务器。本地域名服务器离用户较近,一般不超过几个路由器的距离,也有可能就在同一个局域网中。本地域名服务器的IP地址需要直接配置在需要域名解析的主机中
6.4.4 域名解析过程
递归查询
迭代查询
由于递归查询对于被查询的域名服务器负担太大,通常采用以下模式:从请求主机到本地域名服务器的查询是递归查询,而其余的查询是迭代查询。
为了提高DNS的查询效率,并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛地使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录
由于域名到IP地址的映射关系并不是永久不变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项(例如,每个项目只存放两天)
不但在本地域名服务器中需要高速缓存,在用户主机中也很需要。许多用户主机在启动时从本地域名服务器下载域名和IP地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到域名时才向域名服务器查询。同理,主机也需要保持高速缓存中内容的正确性
6.5 文件传送协议FTP
文件传送:将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中,是一项基本的网络应用
文件传送协议FTP(File Transfer Protocol)是因特网上使用得最广泛的文件传送协议
- FTP提供交互式的访问,允许客户指明文件的类型与格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)
- FTP屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件
在因特网发展的早期阶段,用FTP传送文件约占整个因特网的通信量的三分之一,而由电子邮件和域名系统所产生的通信量还要小于FTP所产生的通信量。只是到了1995年,万维网WWW的通信量才首次超过了FTP
6.5.1 FTP基本工作原理
FTP客户与服务器之间要建立两个并行的TCP连接:
- 控制连接在整个会话期间已知保持打开,用于传送FTP相关控制命令
- 数据连接用于文件传输,在每次文件传输时才建立,传输结束就关闭
6.5.2 FTP的应用
FTP常见用途是计算机之间传输文件,尤其是批量传输文件。另一个常见用途是让网站设计者将构成网站内容的大量文件批量上传到他们的web服务器。
6.6 电子邮件
电子邮件(E-mail)是因特网上最早流行的一种应用,并且仍然是当今因特网上最重要、最实用的应用之一
传统的电话通信属于实时通信,存在以下两个缺点:
-
电话通信的主叫和被叫双方必须同时在场
-
一些不是十分紧迫的电话也常常不必要地打断人们的工作或休息
而电子邮件与邮政系统的寄信相似:
- 发件人将邮件发送到自己使用的邮件服务器
- 发件人的邮件服务器将收到的邮件按其目的地址转发到收件人邮件服务器中的收件人邮箱
- 收件人在方便的时候访问收件人邮件服务器中自己的邮箱,获取收到的电子邮件
电子邮件使用方便、传递迅速而且费用低廉。它不仅可以传送文字信息,而且还可附上声音和图像
由于电子邮件的广泛使用,现在许多国家已经正式取消了电报业务。在我国,电信局的电报业务也因电子邮件的普及而濒临消失
6.5.1 邮件发送过程
电子邮件系统采用客户/服务器方式
电子邮件系统的三个主要组成构件:用户代理,邮件服务器,以及电子邮件所需的协议
- 用户代理是用户与电子邮件系统的接口,又称为电子邮件客户端软件
- 邮件服务器是电子邮件系统的基础设施。因特网上所有的ISP都有邮件服务器,其功能是发送和接收邮件,同时还要负责维护用户的邮箱
- 协议包括邮件发送协议(例如SMTP)和邮件读取协议(例如POP3,IMAP)
6.5.2 简单邮件传送协议SMTP(Simple Mail Transfer Protocol)的基本工作原理
6.5.3 电子邮件信息格式
电子邮件的信息格式并不是由SMTP定义的,而是在RFC 822中单独定义的。这个RFC文档已在2008年更新为RFC 5322。一个电子邮件有信封和内容两部分。而内容又由首部和主体两部分构成。
- SMTP协议只能传送ASCII码文本数据,不能传送可执行文件或其他的二进制对象
- SMTP不能满足传送多媒体邮件(例如带有图片、音频或视频数据)的需要。并且许多其他非英语国家的文字(例如中文、俄文、甚至带有重音符号的法文或德文)也无法用SMTP传送
为解决SMTP传送非ASCII码文本的问题,提出了多用途因特网邮件扩展MIME(Multipurpose Internet Mail Extensions)
- 增加了5个新的邮件首部字段,这些字段提供了有关邮件主体的信息
- 定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化
- 定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变

实际上,MIME不仅仅用于SMTP,也用于后来的同样面向ASCII字符的HTTP
6.5.4 邮件读取协议
常用的邮件读取协议有以下两个:
邮局协议POP(Post Office Protocol),POP3是其第三个版本,是因特网正式标准。非常简单、功能有限的邮件读取协议。用户只能以下载并删除方式或下载并保留方式从邮件服务器下载邮件到用户方计算机。不允许用户在邮件服务器上管理自己的邮件。(例如创建文件夹,对邮件进行分类管理等)
因特网邮件访问协议IMAP(Internet Message Access Protocol),IMAP4是其第四个版本,目前还只是因特网建议标准。功能比POP3强大的邮件读取协议。用户在自己的计算机上就可以操控邮件服务器中的邮箱,就像在本地操控一样,因此IMAP是一个联机协议
POP3和IMAP4都采用基于TCP连接的客户/服务器方式。POP3使用熟知端口110,IMAP4使用熟知端口143
6.5.5 基于万维网的电子邮件
通过浏览器登录(提供用户名和口令)邮件服务器万维网网站就可以撰写、收发、阅读和管理电子邮件。这种工作模式与IMAP很类似,不同的是用户计算机无需安装专门的用户代理程序,只需要使用通用的万维网浏览器
邮件服务器网站通常都提供非常强大和方便的邮件管理功能,用户可以在邮件服务器网站上管理和处理自己的邮件,而不需要将邮件下载到本地进行管理
6.7 万维网
万维网WWW(World Wide Web)并非某种特殊的计算机网络。它是一个大规模的、联机式的信息储藏所,是运行在因特网上的一个分布式应用。万维网利用网页之间的超链接将不同网站的网页链接成一张逻辑上的信息网。
- 万维网是欧洲粒子物理实验室的Tim Berners-Lee最初于1989年3月提出的
- 1993年2月,第一个图形界面的浏览器Mosaic
- 1995年著名的Netscape Navigator浏览器上市
浏览器最重要的部分是渲染引擎,也就是浏览器内核。负责对网页内容进行解析和显示
- 不同的浏览器内核对网页内容的解析也有不同,因此同一网页在不同内核的浏览器里的显示效果可能不同
- 网页编写者需要在不同内核的浏览器中测试网页显示效果
为了方便地访问在世界范围的文档,万维网使用统一资源定位符URL来指明因特网上任何种类“资源”的位置
URL的一般形式由以下四个部分组成:
6.7.1 万维网的文档
6.7.2 超文本传输协议HTTP
超文本传输协议HTTP(HyperText Transfer Protocol)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及万维网服务器怎样把万维网文档传送给浏览器
HTTP/1.0采用非持续连接方式。在该方式下,每次浏览器要请求一个文件都要与服务器建立TCP连接,当收到响应后就立即关闭连接
- 每请求一个文档就要有两倍的RTT的开销。若一个网页上有很多引用对象(例如图片等),那么请求每一个对象都需要花费2RTT的时间
- 为了减小时延,浏览器通常会建立多个并行的TCP连接同时请求多个对象。但是,这会大量占用万维网服务器的资源,特别是万维网服务器往往要同时服务于大量客户的请求,这会使其负担很重
HTTP/1.1采用持续连接方式。在该方式下,万维网服务器在发送响应后仍然保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上引用的对象,而是只要这些文档都在同一个服务器上就行。
为了进一步提高效率,HTTP/1.1的持续连接还可以使用流水线方式工作,即浏览器在收到HTTP的响应报文之前就能够连续发送多个请求报文。这样的一个接一个的请求报文到达服务器后,服务器就发回一个接一个的响应报文。这样就节省了很多个RTT时间,使TCP连接中的空闲时间减少提高了下载文档的效率
6.7.3 HTTP的报文字段
HTTP是面向文本的,其报文中的每一个字段都是一些ASCII码串,并且每个字段的长度都是不确定的。
HTTP响应报文的状态码
响应报文中常见的状态行
6.7.4 Cookie
使用Cookie在服务器上记录用户信息
早期的万维网应用非常简单,仅仅是用户查看存放在不同服务器上的各种静态的文档。因此HTTP被设计为一种无状态的协议。这样可以简化服务器的设计
现在,用户可以通过万维网实现各种复杂的应用,如网上购物、电子商务等。这些应用往往需要万维网服务器能够识别用户
Cookie提供了一种机制使得万维网服务器能够“记住”用户,而无需用户主动提供用户标识信息。也就是说,Cookie是一种对无状态的HTTP进行状态化的技术
Cookie工作原理:
6.7.5 万维网缓存与代理服务器
在万维网中还可以使用缓存机制以提高万维网的效率,万维网缓存又称为Web缓存(Web Cache),可位于客户机,也可位于中间系统上,位于中间系统上的Web缓存又称为代理服务器(Proxy Server)
Web缓存把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按URL的地址再次去因特网访问该资源
若web缓存命中率比较高,会大大减少与互联网通信链路上的通信量,因而减小访问互联网的时延
代理服务器中的文档副本中有修改时间字段和有效日期字段,若未过期,可直接相应;若已过期,则代理服务器会向互联网上的原始服务器发送请求,在请求报文中包含一个首部字段If-modified-since的首部行,值为文档的修改日期,原始服务器就可判断出代理服务器中存储的文档是否与自己存储的文档一致。
- 若一致,就相应不包含实体主体的响应,状态码为304短语为Not Modified,代理服务器会重新更新文档的有效日期,然后封装在响应报文中发回主机;
- 若不一致,发送装有该文档的响应报文,这样代理服务器就更新了文档,然后封装在响应报文中发回主机;