一、概述
1.1 因特网概述
-
网络:网络由若干结点和链接这些结点的链路组成
-
互联网:多个网络间还可以通过路由器互连起来,这样就构成了一个范围更大的网络即互联网
-
因特网:Internet 因特网是世界上最大的互连网络(用户数以亿计,网络数数以百万计)
-
Internet
与internet
的区别:- Internet(因特网):是一个专有名词,它指全球最大的、开放的、由众多网络相互连接而成的特定计算机网络,采用
TCP/IP
协议族作为通信规则,其前身是美国的ARPANET
- internet(互联网或互连网):是一个通用名词,它泛指由多个计算机网络互相连接而成的网络,在这些网络之间的通信协议可以是任意的
- Internet(因特网):是一个专有名词,它指全球最大的、开放的、由众多网络相互连接而成的特定计算机网络,采用
-
因特网发展的三个阶段:
-
1969:从单个网络 ARPANET 向互联网发展
-
1985:逐步建成三级结构的因特网
-
1993:逐步形成了多层次 ISP (
Internet Service Provider
)结构的因特网
-
-
因特网的标准化:因特网协会
ISOC
是一个国际性组织。它负责对因特网进行全面管理,以及在世界范围内促进其发展和使用。制订因特网的正式标准需要经过以下4
个阶段:- 因特网草案
- 建议标准
- 草案标准
- 因特网标准
-
因特网的组成:
- 边缘部分:由所有连接在因特网上的主机组成,这部分是用户直接使用的,用来通信和资源共享
- 核心部分:由大量网络和连接这些网络的路由器组成,为边缘部分提供服务(提供连通性和交换)
1.2 定义和分类
-
定义:计算机网络的精确定义尚未统一,最简单的定义是:一些
互连的、自治的
计算机的集合 -
计算机网络的分类:
1.3 三种交换技术
-
电路交换(
Circuit Switching
):电路交换机接通电话线的方式称为电路交换。交换就是按照某种方式动态地分配传输线路的资源。电路交换的三个步骤:建立连接(分配通信资源)、通话(一直占用通信资源)、释放连接(释放资源)- 优点:通信时延小、有序传输、没有冲突、使用范围广、实时性强、控制简单
- 缺点:建立时间长、线路独占使用效率低、灵活性差、难以规格化
-
分组交换(
Packet Switching
):发送方:构造分组、发送分组;路由器:缓存分组、转发分组,简称存储转发
;接收方:接收分组、还原报文- 优点:无需建立连接、线路利用率高、简化了存储管理、加速传输、减少出错概率和重发的数据量
- 缺点:引起了转发时延、需要传输额外的信息量、对于数据报服务存在失序、丢失或分组重复的问题
-
报文交换(
Message Switching
):报文交换中的交换结点也采用存储转发的方式,但报文的大小没有限制,要求交换结点拥有较大的缓存空间。报文交换主要用于早期的电报通信网- 优点:无需建立连接、动态分配线路、提供多目标服务、提高线路可靠性、提高线路利用率
- 缺点:引起了转发时延、需要较大缓存空间、需要传输额外的信息量
1.4 网络性能指标
常用数据量单位 | 常用数据量单位 |
---|---|
1 Byte = 8 bit | 1 KB = 210 B |
1 MB = K * KB = 220 B | 1 GB = K * MB = 230 B |
1 TB = K * MB = 240 B | 1 GB = 109 B (厂商) |
-
速率:连接在计算机网络上的主机在数字信道上传送比特的速度,也称比特率或数据率。常用单位有:bit/s、b/s、bps(kb/s = 103 bps)
-
带宽:表示网络通信线路所能传送数据的能力,因此网络带宽表示网络中的 “
最高数据率
” -
吞吐量:表示单位之间内通过某个网络(或信道、接口)的数据量
-
时延:发送时延 + 传播时延 + 处理时延
- 发送时延 = 分组长度(b) / 发送速率(b/s)
- 传播时延:信道长度(m)/ 电磁波传播速率(m/s)
- 自由空间:3*108m/s
- 铜线:2.3*108m/s
- 光纤:2.0*108m/s
-
时延带宽积:传播时延 * 带宽,链路的时延带宽积又称为以
比特为单位的链路长度
-
往返时间 RTT(
Round-Trip Time
):双向交互一次所需的时间 -
利用率:
-
网络利用率:全网络信道利用率的加权平均
-
信道利用率:用来表示某信道有百分之几的时间是被利用的。根据
排队论
,当某信道的利用率增大时,该信道引起的时延也会迅速增加,因而信道利用率并非越高越好。由下图得出结论:一些拥有极大主干网的 ISP 通常会控制它们的网络利用率不超过 50%,如果超过了就准备扩容,增大线路的带宽- U:信道利用率
- D0:网络空闲时延
- D:网络当前时延
-
-
丢包率:也称分组丢失率,是指在一定的时间范围内,传输过程中丢失的分组数量与总分组数量的比率。可细分为:接口丢包率、结点丢包率、链路丢包率、路径丢包率、网络丢包率等。丢包率反应了网络的拥塞情况
1.5 常见网络体系结构
层(从下至上) | 开放系统互连参考模型(OSI) | TCP/IP 体系结构 | 原理体系结构 |
---|---|---|---|
1 | 物理层 | 网络接口层 | 物理层 |
2 | 数据链路层 | 网际层 | 数据链路层 |
3 | 网络层 | 运输层 | 网络层 |
4 | 运输层 | 应用层 | 运输层 |
5 | 会话层 | 应用层 | |
6 | 表示层 | ||
7 | 应用层 |
注:OSI 是法律上的国际标志;四层 TCP/IP 体系结构是事实上的国际标志;五层原理体系结构更适用于学习
- 物理层:解决使用何种信号来传输比特的问题
- 数据链路层:解决分组在一段网络(或一段链路)上传输的问题
- 网络层:解决分组在多个网络上传输(路由)问题
- 运输层:解决进程之间基于网络的通信问题
- 会话层:解决进程间的会话问题
- 表示层:解决通信双方交换信息的表示问题
- 应用层:解决通过应用进程的交互来实现特定网络应用的问题
1.6 体系结构分层的必要性
-
HTTP 请求报文:应用层
-
TCP 报文段:运输层给 HTTP 请求报文添加一个 TCP 首部使之成为 TCP 报文段
-
IP 数据报:网络层给 TCP 报文段添加一个 IP 首部使之成为 IP 数据报
-
帧:数据链路层给 IP 数据报添加一个帧首和一个帧尾使之成为 帧
-
比特流:物理层将帧视作比特流,并在比特流前添加
前导码
1.7 专用术语
- 实体:任何可发送或接收信息的硬件或软件进程
- 对等实体:收发双发相同层次中的实体
- 协议:控制两个
对等实体
进行逻辑通信的规则的集合。协议三要素:语法、语义、同步- 语法:定义所交换信息的格式
- 语义:定义收发双方所要完成的操作
- 同步:定义收发双方的时序关系
- 服务:在
协议
的控制下,两个对等实体
间的逻辑通信使得本层能向上一层提供服务。协议是水平的,而服务是垂直的 - 服务访问点:在同一系统中
相邻两层
的实体交换信息的逻辑接口,用于区分不同的服务类型- 数据链路层的服务访问点为帧的 “类型” 字段
- 网络层的服务访问点为 IP 数据报首部中的 ”协议字段“
- 运输层的服务访问点为 ”端口号“
- 服务原语:上层使用下层所提供的服务必须与下层交换一些命令,这些命令称为服务原语
- 协议数据单元 PDU:对等层次之间传送的数据包称为该层的协议数据单元
- 服务数据单元 SDU:同一系统内,层与层之间交换的数据包
二、物理层
2.1 物理层概述
- 物理层职责:物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流的问题
- 物理层协议需要包含的主要内容:
- 机械特性:指明接口所用接线器的形状和尺寸、引脚数目和排列方式、固定及锁定装置
- 电气特性:指明在接口电缆上的各条线上出现的电压范围
- 功能特性:指明某条线上出现的某一电平的电压表示何种意义
- 过程特性:指明对于不同功能的各种可能事件的出现顺序
2.2 物理层下的传输媒体
-
同轴电缆:同轴电缆价格较贵且布线不够灵活,随着集线器的出现,在局域网领域基本上都是采用双绞线作为传输媒体
- 基带同轴电缆(
50Ω
):数字传输,过去用于局域网 - 宽带同轴电路(
75Ω
):模拟传输,目前主要用于有线电视
- 基带同轴电缆(
-
双绞线:绞合的目的是为了抵御部分来自外界的电磁波干扰和较少相邻导线的电磁干扰
类别 带宽 特点 应用 3 16MHz 2 对 4 芯双绞线 模拟电话,曾用于传统以太网(10Mbps) 4 20MHz 4 对 8 芯双绞线 曾用于令牌局域网 5 100MHz 增加了绞合度 不超过 100Mbps 5E(超 5 类) 125MHz 衰减更小 不超过 1Gbps 6 250MHz 改善串扰性能 高于 1Gbps 7 600MHz 屏蔽类双绞线 高于 10Gbps -
光纤:通信容量大、传输损耗小、抗干扰能力强、无串音干扰、保密性好防窃听、体积小重量轻
-
原理:当光从高折射率的媒体(纤芯)射向低折射率的媒体(包层)时,其折射角将大于入射角
-
纤芯:非常透明的石英玻璃拉成的细丝(直径 8~100 微米)
-
包层:折射率比纤芯低的玻璃封套(直径 125 微米)
-
单模光纤和多模光纤:
-
2.3 传输方式
-
串行传输:比特依次逐个发送,通信双方只需要一条通信线路
-
并行传输:依次发送 n 个比特,发送端和接收端需要有 n 条传输线路,传输速度是串行传输的 n 倍,但成本高
-
同步传输:数据块以稳定比特流的方式传输,字节之间没有间隔,接收端在每个比特的中间进行检测,判断接收到的是比特 0 还是。收发双发需要做到时钟同步,具体有以下两种方法:
- 外同步:在收发双发之间额外添加一条单独的时钟信号线
- 内同步:发送端将时钟同步信号编码到发送数据中一起传输(如曼彻斯特编码)
-
异步传输:以字节为独立的传输单位,字节之间的时间间隔不固定,接收端仅在字节的起始处对字节的比特实现同步,因此需要在字节的前后分别加上起始位和结束位
- 字节之间异步(字节之间的时间间隔不固定)
- 字节中每个比特仍然需要同步(各比特的持续时间是相同的)
-
单工通信:传输双方只有一个数据传输方向(无线电广播),只需要一条信道
-
半双工通信:通信双方可以相互传输数据,但不能同时进行(对讲机),需要两条信道
-
全双工通信:通信双方可以同时发送和接收信息(有线电话),需要两条信道
2.4 编码与调制
-
基带信号的编码与调制:计算机中的网卡将比特 0 和 1 变换成相应的电信号发送到网线,信号是数据的电磁表现。由信源发出的原始电信号称为
基带信号
,基带信号又可分为数字基带信号
和模拟基带信号
。在计算机网络中,常见的是将数字基带信号通过编码或调制的方法在相应信道上进行传输-
编码:在不改变信号性质的前提下,仅对数字基带信号的波形进行变换,称为编码
-
调制:把数字基带信号的频率范围搬移到较高的频段并转换为模拟信号,称为调制
-
数字基带信号编码:编码后产生的信号仍为数字信号,可在数字信道中传输。如以太网使用曼彻斯特编码、4B/5B、8B/10B 等
-
数字基带信号调制:调制后产生的信号是模拟信号,可以在模拟信道中传输。如 WiFi 使用补码键控、直接序列扩频、正交频分复用等调制方法
-
模拟基带信号编码:对音频信号进行编码的脉码调制 PCM,也就是将模拟音频信号通过
采用、量化、编码
这三个步骤进行数字化 -
模拟基带信号调制:将语音数据加载到模拟的载波信号中传输,如传统电话、频分复用 FDM 技术
-
-
码元:在使用时间域的波形表示数字信号时,代表不同离散数值的基本波形
-
几种常用的编码方法:
- 不归零编码:在整个码元时间内,电平不会出现零电平。缺点是存在数据同步问题
- 归零编码:每个码元传输结束后都要进行信号归零。优点是实现自同步,但编码效率低
- 曼彻斯特编码:在每个码元时间的中间时刻,信号都会发生跳变。码元中间时刻的跳变既表示时钟,又表示数据。传统以太网(10 Mbps)使用的就是曼彻斯特编码
- 差分曼彻斯特编码:在每个码元时间的中间时刻,信号都会发生跳变。跳变仅表示时钟,而用码元开始处电平是否发生变换来表示数据。比曼彻斯特编码变化少,更适合较高的传输速率
-
基本调制方法:调幅、调频、调相。一个码元只能包含一个比特信息
-
混合调制方法:一个码元包含更多的比特信息。可以将相位和振幅结合起来一起调制,称为正交振幅调制 QAM。而频率是相位随时间的变化率,因而不能同时调制频率和相位。以下是混合调制方式的举例 -
正交振幅调制 QAM16
:-
QAM16 调制的波形可以有 12 种相位,每种相位有 1 或 2 种振幅可选。一共可以调制出 16 种码元(波形)
-
16 种码元中,每种码元可以包含 4(log216) 个比特信息。码元与 4 个比特的对应关系应采用
格雷码
,即任意两个相邻码元只有 1 个比特不同
-
2.5 奈氏准则与香农公式
- 信号失真的原因:码元传输速率、信号传输距离、噪声干扰、传输媒体质量
- 奈氏准则:在假定的理想条件下,为了避免码间串扰(信号波形失去了码元间的清晰界限),码元传输速率是有上限的
- 理想
低通信道
的最高码元传输速率 = 2W Baud = 2W 码元/秒- W:信道带宽(Hz)
- Baud:波特(码元/秒)
- 理想
带通信道
的最高码元传输速率 = W Baud = W 码元/秒
- 理想
- 码元传输速率:又称波特率、调制速率、波形速率或符号速率,它与比特率存在一定的关系:
- 1 码元携带 1 比特信息时,波特率(码元/秒)在数值上等于比特率(比特/秒)
- 1 码元携带 n 比特信息时,波特率(码元/秒)转换为比特率时,在数值上乘以 n
- 香农公式:带宽受限且有
高斯白噪声干扰
的信道的极限信息传输速率:c = W * log2(1 + S/N)- c:信道的极限信息传输速率(b/s)
- W:信道带宽(Hz)
- S:信道内所传信号的平均功率
- N:信道内的高斯噪声功率
- S/N:信噪比,使用分贝(dB)作为度量单位。dB = 10 * log10(S/N)
注:根据奈氏准则和香农公式,在信道带宽一定的情况下,要想提高信息的传输速率就必须采用多元制(更好的调制方法)和努力提高信道中的信噪比
三、数据链路层
3.1 数据链路层概述
-
链路(
Link
):从一个结点到相邻结点的一段物理线路,中间没有其它任何交换结点 -
数据链路(
Data Link
):把实现通信协议的硬件和软件加到链路上,数据链路层以帧为单位传输和处理数据 -
点对点数据链路层需要解决的三个重要问题:
-
封装成帧
-
差错检测
-
可靠传输
-
-
广播信道的数据链路层需要解决的五个问题:
- 封装成帧
- 差错检测
- 可靠传输
- 编址问题
- 碰撞问题:
- 共享式局域网:采用以太网的媒体接入控制协议
CSMA/CD
(载波监听多点接入/碰撞检测) - 无线局域网:801.11 局域网采用的媒体介入控制协议是
CSMA/CA
(载波监听多点接入/碰撞避免)
- 共享式局域网:采用以太网的媒体接入控制协议
3.2 封装称帧
-
封装成帧:数据链路层将上层交付的协议数据单元(来自网络层的 IP 数据报)添加帧头和帧尾使之成为帧
-
以太网 V2 版本 MAC 帧和 PPP 帧的格式:
-
物理层前导码:以太网 V2 版本的 MAC(
Media Access Control
)帧格式的帧头、帧尾中并没有包含帧定界标志
,故以太网的数据链路层封装好 MAC 帧后,将其交付给物理层。物理层会在 MAC 帧前面添加8
字节的前导码,然后再将比特流转换为电信号发送。另外,以太网还规定了帧间间隔时间为96
比特的发送时间,因而 MAC 帧并不需要帧结束定界符 -
最大传送单元:为了提高帧的传输效率,应当使帧的数据部分长度尽可能大,但考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元 MTC(
Maximum Transfer Unit
)
3.3 差错检测
-
奇偶校验法
-
循环冗余校验 CRC(
Cyclic Redundancy Check
):循环冗余校验码 CRC 有很好的检错能力(漏检率非常低),虽然计算比较复杂,但易于硬件实现,因此被广泛应用于数据链路层中-
收发双发约定好一个生成多项式 G(x),CRC 算法要求生成多项式必须包含
最低次项
(常数项) -
发送方基于待发送的数据和 G(x) 计算机出差错检测码(冗余码),将其添加到待传输数据中一起传输
-
接收方通过 G(x) 来计算收到的数据是否产生了误码
-
CRC 常用的生成多项式:
CRC-16:G(x) = x16 + x15 + x2 + 1
CRC-CCITT:G(x) = x16 + x12 + x5 + 1
CRC-32:G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
-
注:检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误。要想纠正传输中的差错,可以使用冗余信息更多的 纠错码
进行前向纠正,但纠错码开销很大,在计算机网络中很少使用
3.4 可靠传输
- 误码率:在一段时间内,传输过程中错误的比特占所传输比特总数的比率称为误码率 BER(
Bit Error Rate
) - 有线链路:一般情况下,有线链路的误码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务。即使出现了误码,可靠传输的问题交由其上层处理
- 无线链路:无线链路易受干扰,误码率比较高,因此在无线链路中要求数据链路层必须向上层提供可靠传输服务
- 三种可靠传输实现机制:
- 停止 - 等待协议(SW)
- 回退 N 帧协议(GBN)
- 选择重传协议(SR)
3.5 可靠传输之停止 - 等待协议
-
分组丢失:接收方收不到数据分组就不会发送
ACK
(确认分组)和NAK
(否认分组),如果不采取适当措施,发送方就会一直处于等待接收方 ACK 或 NAK 的状态。采用超时重传机制解决此问题 -
超时重传:发送方在发送完一个数据分组后,启动一个超时计时器,若到了超时计时器设置的重传时间仍收不到接收方的 ACK 或 NAK,则重传原来的数据分组。一般可将重传时间选为略大于 “从发送方到接收方的平均往返时间”
-
分组重复:
- 发送方发送的分组在网络中滞留造成超时重传该分组,一段时间后两个分组均到达了接收方,导致接收方无法甄别收到的两个分组
- 为避免分组重复这种传输错误,必须给每个分组带上序号。对于停止 - 等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其序号与上次发送的数据分组的序号不同就可以了,因而只需使用一个比特进行编号
- 为了让发送方能够判断收到的确认分组 ACK 是否重复,也需要给 ACK 分组编号。所用比特数量与数据分组所用比特数量一样。数据链路层一般不会出现 ACK 分组迟到的情况,因此在数据链路层实现停止 - 等待协议可以不用给 ACK 分组编号
-
停止 - 等待协议(
Stop - and - Wait
)的信道利用率:U = TD / (TD + RTT + TA)- TD:数据分组发送时延
- RTT:往返时间
- TA:确认分组发送时延,一般情况下远小于 TD,可忽略
3.6 可靠传输之回退 N 帧协议
-
回退 N 帧协议(
GBN,Go - Back - N
):该协议在流水线传输的基础上,利用发送窗口来限制发送方可连续发送的数据分组的个数- 若采用 k 个比特给数据分组编号,则数据分组的序号范围为 0 ~ 2k - 1
- 发送窗口的尺寸 WT 的取值:1 < WT < 2k - 1
- 接收窗口的尺寸 WR 的取值:WR = 1
-
累计确认:接收方不一定要对收到的数据分组逐个发送 ACK,可以在收到几个分组后对按序到达的最后一个分组 ACK。ACKn 表示序号为 n 及其之前的所有数据分组均已被正确接收
-
传输存在差错的情况:如下图所示,尽管序号为
6,7,0,1
的数据分组已正确到达接收方,但由于 5 号数据分组存在误码不被接收方接受,它们也因此 “受到牵连” 而不被接受。发送方还需重传这些已发送且无差错的数据分组6,7,0,1
,这就是回退 N 帧协议名称的由来。可见,当通信线路质量不好时,回退 N 帧协议的信道利用率并不比停止 - 等待协议高 -
发送窗口 WT 取值不合理:若发送窗口尺寸 WT 的取值超过其上限,如例中 WT ∈ [0,7],故意取值 WT = 8,将导致接收方
无法分辨新、旧数据分组
这种传输差错
3.7 可靠传输之选择重传协议
-
回退 N 帧存在的问题:回退 N 帧协议的接收窗口 WR = 1,因此接收方只能接收按序正确到达的数据分组,一个数据分组的误码就会导致其后序多个数据分组不能被接受方按序接收而丢弃,造成了通信资源的浪费
-
选择重传协议(
Selective Request
):在回退 N 帧协议的基础上,为了进一步提高性能,可设法只重传出现误码的数据分组。因此接收窗口的尺寸 WR 不应恒等于 1,而应合理取值,以便接收方先收下失序到达但无误码并且序号落在接收接收窗口内的那些数据分组,等到所缺数据分组收齐后再一并送交上层处理,这就是选择重选协议 -
逐一确认:选择重传协议为了使发送方仅重传出现差错的分组,接收方不能再采用累计确认,而需对每个正确接收到的数据分组进行逐一确认
3.8 点对点协议 PPP
-
点对点协议(
Point - to - Point Protocol
):点对点协议是目前使用最广泛的点对点
数据链路层协议,使用 PPP 的数据链路层向上层不提供可靠传输服务。PPP 协议为在点对点链路中传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:- 对各种协议数据报(来自网络层)的封装方法(封装成帧)
- 链路控制协议
LCP
,用于建立、配置以及测试数据链路的连接 - 一套网络控制协议
NCPs
,其中的每一个协议支持不同的网络层协议
-
PPP 点对点协议的帧格式:
- F(Flag):PPP 帧的定界符,取值为
0x7E
- A(Address):取值为
0xFF
,预留使用 - C(Control):取值为
0x03
,预留使用 - P(Protocol):指明帧的数据部分交给哪个协议处理:
- 0x0021:IP 数据报
- 0xC021:LCP 分组
- 0x8021:NCP 分组
- FCS(Frame Check Sequence):CRC 循环冗余校验码计算出的校验位
- F(Flag):PPP 帧的定界符,取值为
-
PPP 协议的透明传输:
-
面向字节的异步链路采用插入转义字符的字节填充法,以下是发送方的处理过程:
- 出现的每一个定界符(7E)字节转变为 2 字节序列(7D, 5E)
- 出现的每一个转义字符(7D)字节转变为 2 字节序列(7D, 5D)
- 出现的每一个 ASCII 码控制字符(数值小于 0x20 的字符)则在该字符前插入一个 7D 字节,同时将该字符的编码加上 0x20
-
面向比特的同步链路采用比特 0 的比特填充法:只要发现 5 个连续的比特 1,则立即填充 1 个比特 0
-
-
PPP 协议的工作状态:
3.9 媒体接入控制
-
媒体接入控制:共享信道着重需要考虑的一个问题就是如何协调多个发送和接收站点对同一个共享传输媒体的占用,即媒体接入控制 MAC(
Medium Access Control
) -
静态划分信道:预先分配好信道,这类方法非常不灵活,对于突发性数据传输信道利用率会很低。通常在
无线网络
的物理层中
使用,而不是在数据链路层
中使用 -
集中控制的多点轮询协议:一个主站以循环方式轮询每个站点有无数据发送,只有被轮询到的站点才能发送数据,最大的缺点就是存在
单点故障问题
-
分散控制的令牌传递协议:各站点是平等的,并连接成一个环形网络。令牌(一种特殊的控制帧)沿环逐站传递,接收到令牌的站点才有权发送数据,并在发送完数据后将令牌传递给下一个站点。典型网络有:
- IEEE 802.5 令牌环网
- IEEE 802.4 令牌总线网
- 光纤分布式数据接口 FDDI
-
受控接入:这种媒体接入控制方式已逐步退出历史舞台
-
随机接入:所有站点通过竞争,随机地在信道上发送数据。如果恰巧有两个或更多的站点在同一时刻发送数据,则信号在共享媒体上就要产生碰撞,将导致这些站点的数据发送都失败。因此,这类协议要解决的关键问题是如何
避免冲突
及在发送冲突后如何尽快恢复通信,著名的共享式以太网
采用的就是随机接入
注:随着技术的发展,交换技术的日益成熟和设备成本的逐步降低,具有更高性能的使用 点对点链路的链路层交换机
的交换式局域网在 有线领域
已完全取代了共享式局域网。但由于无线信道的广播天性,无线局域网
仍然使用的是 共享媒体技术
3.10 媒体接入控制之静态划分信道
-
频分复用(
FDM
):频分复用的所有用户占用不同的频带资源并行
通信。用于多址接入时称为频分多址(FDMA,Frequency Division Multiple Access
) -
时分复用(
TDM
):时分复用的所有用户在不同的时间占用同样的频带宽度。用于多址接入时称时分多址(TDMA,Time Division Multiple Access
) -
波分复用(
WDM
):波分复用其实就是光的频分复用 -
码分复用(
CDM
):CDM 是另一种共享信道的方法。实际上该技术主要用于多址接入,人们更常用的名词时码分多址(CDMA,Code Division Multiple Access
)。码分复用的每一个用户可以在同样的时间使用同样的频带进行通信。由于各用户使用经过特殊挑选的不同码型,因此各用户之间不会造成干扰。码分复用最初是用于军事通信,因为这种系统所发送的信号有很强的抗干扰能力,其频谱类似于白噪声,不易被敌人发现-
码片(
Chip
):在码分多址(CDMA)中,每一个比特时间再划分为 m 个短的间隔,称为码片(Chip)。通常 m 的值是 64 或 128,后续例子中取 m = 8 -
使用 CDMA 的每一个站被指派一个唯一的 m bit 码片序列。惯例写法常将码片序列中的
0 写为 -1,1 写为 +1
- 一个站如果要发送比特 1,则发送它自己的 m bit 码片序列
- 一个站如果要发送比特 0,则发送它自己的 m bit 码片序列的二进制反码
-
码片序列的挑选原则如下:
-
分配给每个站的码片序列必须各不相同,常采用
伪随机码序列
-
分配个每个站的码片序列必须
相互正交
(规格化内积为 0)
-
-
码分多址应用举例:假设所有站所发送的码片序列都是同步的,接收站 D 知道其它各占所持有的码片序列。D 可对接收到的叠加信号进行判断,从而得出各站是否发送了数据以及发送的是比特 0 还是 1
-
-
复用与多址:
- 复用:将单一媒体的频带资源划分为很多子信道,这些子信道之间相互独立,互不干扰。从媒体的整体频带资源上看,每个子信道只占用该媒体频带资源的一部分
- 多址:更确切地说应称为多点接入,处理的是动态分配信道给用户。某种程度上可看作是复用技术的应用
注:FDMA、TDMA、CDMA 是常见的物理层信道复用技术,属于静态划分信道,用于多用户共享信道,不会发生冲突
3.11 媒体接入控制之随机接入 - CSMA/CD 协议
-
载波监听多址接入/碰撞检测:早期的以太网采用 CSMA/CD(
Carrier Sense Multiple Access / Collision Detection
) 协议来解决共享信道的碰撞
问题- 载波监听(“
先听后说
”):每一个站在发送帧之前先要检测一下总线上是否有其它站点在发送帧- 若检测到总线空闲 96 比特时间,则发送这个帧
- 若检测到总线忙,则继续检测并等待总线转为空闲 96 比特时间(接收处理时间、站点公平竞争),而后发送这个帧
- 多址接入:多个站连接在一条总线上,竞争使用总线
- 碰撞检测:每一个正在发送帧的站边发送边检测碰撞(“
边说边听
”),一旦发现总线上出现碰撞,则立即停止发送,退避一段随机时间后再次发送(“一旦冲突,立即听说,等待时机,重新再说
”)
- 载波监听(“
-
强化碰撞:以太网还采取一种叫做强化碰撞的措施,即发送帧的站点一旦检测到碰撞,出了立即停止发送帧外,还要再继续发送 32 或 48 比特的人为干扰信号(
Jamming Singal
),以便有足够多的碰撞信号使所有站点都能检测出碰撞 -
争用期(碰撞窗口):主机最多经过 2t 的时长就可检测到本次发送是否遭受了碰撞,因而以太网的端到端的往返传播时间 2t 称为争用期或碰撞窗口
-
最大总线长度:显然,在以太网中发送帧的主机越多,端到端往返传播时延越大,发生碰撞的概率就越大。因此共享式以太网不能连接太多的主机,使用的总线也不能太长。10Mbps 的以太网把争用期定为
512 比特发送时间
,即 51.2 微秒,因此其总线长度不能超过 5120m,但考虑到一些其它因素,如信号衰减等,以太网规定总线长度不能超过 2500m
-
最小帧长:以太网的最小帧长确保了主机可在帧发送完成之前就检测到该帧的发送过程中是否遭遇了碰撞
- 以太网规定最小帧长为
64 字节
(不足则填充),即 512 比特。512 比特发送时间即为争用期 - 如果在争用期内没有检测到碰撞,那么后续发送的数据就一定不会发送碰撞
- 如果在争用期内检测到碰撞,就立即终止发送,这时已经发送出去的数据一定小于 64 字节,因此凡长度小于 64 字节的帧都是由于碰撞而导致的无效帧
- 以太网规定最小帧长为
-
最大帧长:
数据载荷
的最小长度不小于 46 字节,最大长度为 1500 字节- 加上首部和尾部共 18 字节,
最大帧长为 1518 字节,最小帧长为 64 字节
-
退避时间:使用
截断二进制指数退避算法
来计算退避时间,- 退避时间 = 基本退避时间(争用期 2t)* 随机数 r(r ∈ {0, 1, …, (2k - 1)},k = min[重传次数,10])
- 从上述公式不难看出,若连续多次发生碰撞,就表明可能有较多的主机参与竞争信道,使用上述的退避算法可使重传需要推迟的平均时间随重传次数而增大(也称动态退避),因而减少发生碰撞的几率,有利于整个系统的稳定
-
CSMA/CD 协议的信道利用率:极限信道利用率 S = T0 / (T0 + t) = 1 / (1 + T0/t)。假定各主机发送帧都不会遭遇碰撞,总线一旦空闲就有某个主机立即发送帧
- T0:帧本身的发送时间
- T0 + t:发送一帧占用总线的时间
-
CSMA/CD 协议帧发送流程图:
-
CSMA/CD 协议帧接收流程图:
注:CSMA/CD 协议曾经用于各种总线结构的以太网和双绞线以太网的早期版本中。现在的以太网基于 交换机和全双工连接
,不会产生碰撞,因此没有必要使用 CSMA/CD 协议
3.12 媒体接入控制之随机接入 - CSMA/CA 协议
-
无线局域网中不能使用 CSMA/CD 的原因:
-
硬件要求:无线信道传输条件特殊,其信号强度的动态范围非常大,无线网卡上接收到的信号强度往往会小于发送信号的强度,如果要在无线网卡上实现碰撞检测,对硬件的要求非常高
-
隐蔽站问题:即使能够在硬件上实现无线局域网的碰撞检测功能,但由于无线电波传输的特殊性(存在隐蔽站问题),进行碰撞检测没有意义
-
-
载波监听多址接入/碰撞避免:
802.11 无线局域网
使用CSMA/CA(Carrier Sense Multiple Access / Collision Avoidance)
协议来解决无线信道的碰撞问题,不再实现 CAMA/CA 的碰撞检测功能。由于不可能避免所有的碰撞,并且无线信道误码率较高,因而 802.11 标准还在数据链路层使用了确认机制(停止 - 等待协议)
来保证数据被正确接收 -
802.11 的媒体接入控制标准定义了两种不同的媒体接入方式:
- 分布式协调功能 DCF(
Distributed Coordination Function
)。在 DCF 方式下,没有中心控制站点,每个站点使用 CSMA/CA 协议通过争用信道
来获取发送权,这是 802.11 的默认方式 - 点协调功能 PCF(
Point Coordination Function
)。PCF 方式使用集中控制的接入算法(一般在接入点 AP 实现集中控制),是 802.11 定义的可选方式,在实际中较少使用
- 分布式协调功能 DCF(
-
帧间间隔 IFS(
Inter Frame Space
):802.11 标准规定所有的站点必须在持续检测到信道空闲一段时间后才能发送帧,这段时间称为帧间间隔 IFS。帧间间隔的长短取决于该站点要发送的帧类型:- 高优先级帧需要等待的时间较短,因此可优先获得发送权
- 低优先级帧需要等待的时间较长,若某个站的低优先级帧还没来得及发送,而其它站的高优先级帧已发送到信道上,则信道变为忙碌状态,因而低优先级帧只能推迟发送,这样便减小了碰撞发生的几率
-
常见的两种帧间间隔:
- 短帧间间隔 SIFS(
28 µs
):最短的帧间间隔,用来分隔属于一次对话的各帧。一个站点应当能够在这段时间内从发送模式切换到接收模式。使用 SIFS 的帧类型有:- ACK 帧
- CTS 帧
- 由过长的 MAC 帧分片后的数据帧
- 所有回答接入点 AP 探寻的帧
- 在 PCF 方式中接入点 AP 发送出的任何帧
- DCF 帧间间隔 DIFS(
128 µs
):它比短帧间间隔 SIFS 要长得多,在 DCF 方式中用来发送数据帧和管理帧
- 短帧间间隔 SIFS(
-
CSMA/CA 的工作原理:
- 源站在检测到信道空闲后还要再等待一个 DIFS 时间的原因:考虑到其它站需要发送高优先级帧,若有则先发送高优先级帧
- 目的站正确接收数据帧后需等段一个 SISF 时间后才发送 ACK 帧的原因:用来分隔开一次对话的各帧,在这段时间内,一个站点应当能从发送模式切换到接收模式
-
CAMA/CA 的退避时间:
-
不使用退避算法的情况:当站点检测到信道是空闲的,并且上一个成功发送的数据帧不是本站所发送的,则不使用退避算法
-
必须使用退避算法的情况:
- 在发送数据帧之前检测到信道是否处于忙状态
- 在每一次重传一个数据帧时
- 在每一次成功发送后要连续发送下一个帧时(避免一个站点长时间占用信道)
-
随机退避时间:在执行退避算法时,站点需为退避计时器设置一个随机的退避时间
-
当退避计时器的时间减小到零时,就开始发送数据
-
当退避计时器的时间还未减小到零时而信道又转变为忙状态,这时就冻结退避计时器的数据,重新等待信道变为空闲,再经过 DIFS 后,继续启动退避计时器
-
在进行第 i 次退避时,退避时间在时隙编号 {0, 1, …, 22+i - 1} 中随机选择一个,然后乘以基本退避时间(争用期)就可以得到随机退避时间。这样做的目的是为了使不同站点选择相同退避时间的概率减小。当
时隙编号
达到 255 (对应于第 6 次退避)后就不再增加了
-
-
-
CAMA/CA 协议的信道预约:为了尽可能较小碰撞的概率和降低碰撞的影响,802.11 标准允许要发送数据帧的站点对信道进行预约
- 源站在发送数据帧之前先发送一个短的控制帧,称为
请求发送 RTS(Request To Send)
,它包括源地址、目的地址以及这次通信所需的时间。如果 RTS 帧发生碰撞,源站就收不到 CTS 帧,源站需执行退避算法重传 RTS 帧 - 若目的站正确收到源站发来的 RTS 帧且信道空闲,就发送一个响应控制帧,称为
允许发送 CTS(Clear To Send)
,它也包括这次通信所需的持续时间(从 RTS 中复制) - 源站收到 CTS 帧后,再等待一个 SIFS 时间后,就可发送其数据帧
- 若目的站正确收到了来自源站的数据帧,再等待时间 SIFS 后,就向源站发送确认帧 ACK
- 除源站和目的站以外的其它各站,在收到 CTS 帧(或数据帧)后就推迟接入到无线局域网,这样就保证了源站和目的站间的通信不会受到其他站的干扰
注:由于 RTS 和 CTS 帧很短,发生碰撞的概率、碰撞产生的开销以及本身发送的开销都很小,而对于一般的数据帧,其发送时延往往大于传播时延,碰撞的概率很大,且一旦发生碰撞将导致数据帧重发,浪费的时间会更多,因此用很小的代价对信道进行预约往往是值得的。802.11 标准规定了 3 种情况供用户选择:
- 使用 RTS 帧和 CTS 帧
- 不使用 RTS 帧和 CTS 帧
- 只有当数据帧的长度超过某一数值时才使用 RTS 帧和 CTS 帧
- 源站在发送数据帧之前先发送一个短的控制帧,称为
-
CAMA/CA 协议的虚拟载波监听:除 RTS 帧和 CTS 帧会携带通信需要持续的时间外,数据帧也能携带通信需要的持续时间。由于利用虚拟载波监听机制,站点只要监听到 RTS 帧、CTS 帧或数据帧中的任何一个,就能知道信道被占用的持续时间,而不需要真正监听信道上的信号,因此虚拟载波监听机制能减少隐蔽站带来的碰撞问题
3.13 MAC 地址
- MAC(
Media Access Control
) 地址:一般被固化在网卡(网络适配器)的电可擦可编程只读存储器 EEPROM
中,因此 MAC 地址也称为硬件地址,习惯上也称物理地址。一般情况下,用户主机会包含两个网络适配器:有线局域网适配器(有线网卡)和无线局域网适配器(无线网卡),每个网卡都配置有一个全球唯一的 MAC 地址,而交换机和路由器往往拥有更多的网络接口,所有会拥有更多的 MAC 地址。综上所述,严格来说 MAC 地址是对网络上各接口
的唯一标识,而不是对网络上各设备的唯一标识
-
MAC 地址的四种类型:全球管理多播地址、全球管理单播地址、本地管理多播地址、本地管理单播地址
- MAC 地址的发送顺序:字节顺序从第一字节到第六字节,比特顺序从第 0 个比特到第 7 个比特
- 广播 MAC 地址:全 F 的地址,即
FF-FF-FF-FF-FF-FF
-
IEEE 802 局域网 MAC 地址格式:
3.14 IP 地址
-
IP 地址属于 TCP/IP 体系结构的网际层,是因特网(Internet)上的主机和路由器所使用的地址,用于标识两部分内容:
- 网络编号:标识因特网上数以百万计的网络
- 主机编号:标识同一网络上不同主机(或路由器各接口)
-
分组转发过程中 IP 地址与 MAC 地址的变化情况:
- 源 IP 地址和目的 IP 地址保持不变
- 源 MAC 地址和目的 MAC 地址逐个链路(或逐个网络)改变
3.15 ARP 协议
-
ARP(
Address Resolution Protocol
) 协议属于 TCP/IP 体系结构的网际层,其作用是根据已知的设备 IP 地址获取设备的 MAC(Media Access Control
) 地址 -
ARP 的两种报文:
- ARP 请求报文(广播):封装在 MAC 帧中,目的地址为广播 MAC 地址
FF-FF-FF-FF-FF-FF
- ARP 响应报文(单播):封装在 MAC 帧中,目的地址为请求报文的 MAC 地址
- ARP 请求报文(广播):封装在 MAC 帧中,目的地址为广播 MAC 地址
-
Windows 系统下查看自己主机的 ARP 高速缓存表:
注:ARP 协议只能在一段链路上或一个网络上使用,而不能跨网络使用
3.16 集线器
-
早期的总线型以太网(已淘汰)
-
使用双绞线和
集线器(HUB)
的星型以太网 -
集线器式以太网的特点:
-
逻辑上仍是一个总线型网络,各站共享资源,使用的还是
CSMA/CD
协议 -
集线器只工作在物理层,它的每个接口仅简单地转发比特,不进行碰撞检测(由各站的网卡检测)
-
集线器一般都有少量的容错能力和网络管理能力
-
使用集线器在物理层扩展以太网,形成了更大的冲突域和广播域
-
3.17 交换机
-
交换机式以太网的特点:
-
通常具有多个不同速率的接口,每个接口可以与一台主机或另一个以太网交换机相连,一般都工作在全双工模式
-
具有并行性,能同时连通多对接口,使多对主机同时通信,无碰撞(
不使用 CSMA/CD
) -
工作在数据链路层(也包括物理层),收到帧后在帧交换表中查找帧目的 MAC 地址所对应的接口号,然后通过接口转发该帧
-
帧转发的两种方式:
存储转发
和直通交换
(基于硬件的交叉矩阵:交换时延小、但不检查帧是否有差错) -
使用交换机在数据链路层扩展以太网,扩大了广播域,但隔离了碰撞域
-
-
以太网交换机自学习和转发帧的流程(建立帧交换表):
-
以太网交换机生成树协议 STP:
- 如何提高以太网的可靠性?增加冗余链路可以提高以太网的可靠性,但冗余链路也会带来负面效应,如形成网络环路。网络环路将导致广播风暴的发生,存在广播风暴的网络将导致大量消耗网络资源、重复收到广播帧、交换机帧交换表震荡(漂移)等问题
- 以太网交换机使用生成树协议 STP(
Spanning Tree Protocol
)保证在增加冗余链路提高网络可靠性的同时又避免网络环路带来的各种问题 - 当首次连接交换机或网络物理拓扑发生变化时,交换机都将进行生成树的重新计算
3.18 虚拟局域网 VLAN
-
交换机式以太网存在的问题:以太网交换机工作在数据链路层(也包括物理层,也存在三层交换机),使用一个或多个以太网交换机互连起来的交换式以太网,其所有站点都属于同一个广播域。随着交换式以太网规模的扩大,广播域相应扩大。巨大的广播域存在广播风暴、难以维护和管理等问题
-
分割广播域的方法:
- 增加路由器(成本高):路由器默认情况下不转发广播数据包,起到了隔离广播域的作用
- 虚拟局域网技术(
VLAN,Virtual Local Area Network
):一种将局域网内的设备划分为与物理位置无关的逻辑组的技术,这些逻辑组具有某些共同特征
-
虚拟局域网 VLAN 的实现机制:虚拟局域网技术 VLAN 是在交换机上实现的,要求交换机实现以下功能:
- 能够处理带有 VLAN 标记的
IEEE 802.1Q 帧
- 交换机可以支持不同的端口类型
- 能够处理带有 VLAN 标记的
-
IEEE 802.1Q 帧:也称
Dot One Q 帧
,对以太网的 MAC 帧格式进行了扩展,插入了4
字节的 VALN 标记- VLAN 标记的最后
12
比特称为VLAN 标识符 VID
,它唯一地标识了以太网帧属于哪一个 VLAN - VID ∈ [0, 4095],0 和 4095 都不用来表示 VLAN,所以 VID 的实际有效范围是 [1, 4094]
- VLAN 标记的最后
-
交换机对 802.1 Q 帧的处理流程:
- 打标签:当交换机收到普通的以太网帧时,会将其插入 4 字节的 VLAN 标记转变为 802.1Q 帧,简称 “打标签”
- 去标签:当交换机转发 802.1Q 帧时,可能会删除其 4 字节的 VLAN 标识转变为普通以太网帧,简称 “去标签”
-
交换机的三种端口:
-
Access
:一般用于连接用户计算机
,Access 端口只能属于一个 VLAN,端口的 PVID 值与所属 VLAN 的 VID 相同(默认为 1)- 发送帧:若帧中 VID 的值与端口的 PVID 值相等,则 “去标签” 后转发该帧,否则不转发
- 接收帧:一般只接受 “未打标签” 的普通以太网 MAC 帧,根据端口的 PVID 给帧 “打标签”,即插入 4 字节的 VLAN 标记字段
-
Trunk
:一般用于交换机之间或交换机与路由器之间的互连,Trunk 端口可以属于多个 VLAN,用户可以设置 Trunk 端口的 PVID 值(默认为 1)- 发送帧:若 VID == PVID,“去标签” 后转发;若 VID != PVID,则直接转发
- 接收帧:接收 “未打标签” 的帧并根据 PVID 打标签;接收 “已打标签的帧”
-
Hybrid
:既可用于交换机之间或交换机与路由器之间的互连(Trunk),也可用于交换机与用户计算机之间的互连(Access)。Hybrid 端口可以属于多个 VLAN,用户可以设置 Hybrid 端口的 PVID 值(默认为 1)- 发送帧:查看帧的 VID 是否在 Hybrid 端口的 “去标签” 列表中,若在则 “去标签” 后转发;否则直接转发
- 接收帧:接收 “未打标签” 的帧并根据 PVID 打标签;接收 “已打标签的帧”
-
四、网络层
4.1 网络层概述
-
网络层需要解决的主要问题:
- 网络层向上层提供怎样的服务(可靠传输还是不可靠传输)
- 网络寻址问题
- 路由选择问题:人工配置路由表或实现路由选择协议自学习路由记录
-
网际层:因特网(Internet)是目前全世界用户数量最多的互联网,使用四层协议体系的 TCP/IP 协议栈。由于 TCP/IP 协议栈的网络层使用网际协议 IP,它是整个协议栈的核心协议,因此在 TCP/IP 协议栈中的网络层常称为网际层
-
网络层提供的两种服务:
- 面向连接的虚电路服务:核心思想是可靠通信应由
网络自身
来保证,计算机通信时应先建立网络层的连接 - 虚电路 VC(Virtual Circuit
),通信双方沿着已建立的虚电路发送分组。虚电路只是一条逻辑
上的连接,分组沿着这条逻辑连接按照存储转发方式传送,通信结束后需要释放之前所建立的虚电路- 目的主机地址仅在连接建立阶段使用,之后每个分组的首部只需携带一条虚电路的编号,不再携带目的主机地址
- 这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复)
- 很多
广域分组交换网
都是用面向连接的虚电路服务。如曾经的 X.25 和逐渐过时的帧中继 FR、异步传输模式 ATM 等
- 无连接的数据报服务:核心思想是可靠通信应由
用户主机
来保证,通信双方不需要建立网络层连接。由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,造价低廉- 每个分组可走不同的路径,首部必须携带目的主机的完整地址
- 这种通信方式所传送的分组可能误码、丢失、重复和失序
- 面向连接的虚电路服务:核心思想是可靠通信应由
-
IPv4:IPv4 地址就是给因特网上的每台主机(或路由器的每一个接口)分配一个在全世界范围内唯一的 32 比特的标识符
-
IPv4 地址的编址方法经历了三个历史阶段:
- 1981:分类编址
- 1985:划分子网
- 1993:无分类编址
4.2 IPv4 编址之分类编码
分类 | 表示方法 | 范围 |
---|---|---|
A | 0 + 7 位网络号 + 24 位主机号 | 0.0.0.0 ~ 127.255.255.255 |
B | 10 + 14 位网络号 + 16 位主机号 | 128.0.0.0 ~ 191.255.255.255 |
C | 110 + 21 位网络号 + 8 位主机号 | 192.0.0.0 ~ 223.255.255.255 |
D | 1110 + 28 位多播组号 | 224.0.0.0 ~ 239.255.255.255 |
E | 11110 + 27 位留待后用 | 240.0.0.0 ~ 247.255.255.255 |
-
A 类地址:
- 最小网络号:
00000000
,保留不指派。0.0.0.0
只能作为源地址使用,表示 “在本网络上的本主机”,封装有DHCP Discovery
报文的 IP 分组的源地址使用 0.0.0.0 - 最大网络号:
01111111
即 127 作为本地环回测试地址,既可以作为源地址使用,也可以作为目的地址使用,不指派 - 可指派的网络数量:27 - 2 = 126(减去最小网络号 0 和最大网络号 127)
- 每个网络中可分配的 IP 地址数量:224 - 2 = 16777214(减去主机号全 0 的网络地址和全 1 的广播地址)
- 最小网络号:
-
B 类地址:
- 可指派的网络数量:216 = 16384
- 每个网络中可分配的 IP 地址数量:216 - 2 = 65534
-
C 类地址:
- 可指派的网络数量:221 = 2097152
- 每个网络中可分配的 IP 地址数量:28 - 2 = 254
注:
- 只有 A、B、C 类地址可以分配给网络中的各主机或路由器各接口
- 地址
255.255.255.255
只能作为目的地址使用,表示 “只在本网络上进行广播,各路由器均不转发
”
4.3 IPv4 编址之划分子网
-
子网掩码:32 比特的子网掩码可以表明分类 IP 地址的
主机号部分
被借用了几个比特作为子网号- 子网掩码使用连续的比特 1 来对应
网络号和子网号
,使用连续的比特 0 来对应主机号
- 所在子网的网络地址:
IPv4 地址 & 子网掩码
- 子网掩码使用连续的比特 1 来对应
-
子网掩码例题:某个网络的地址为
218.75.230.0
,使用子网掩码255.255.255.128
进行子网划分,请给出划分细节解:子网掩码 255.255.255.128 = 255.255.255.10000000,3 个 255(14 个连续的比特 1)对应网络号部分,一个比特 1 表示从主机号中借用一个比特作为子网号
- 可划分的子网数量:21 = 2
- 每个子网可分配的地址数量:28-1 - 2 = 126(减去全 0 的网络地址和全 1 的广播地址)
-
默认子网掩码:指在未划分子网的情况下使用的子网掩码
- A 类:255.0.0.0
- B 类:255.255.0.0
- C 类:255.255.255.0
4.4 IPv4 编址之无分类编址
-
使用子网掩码划分网络子网后仍然存在的问题:划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的 C 类网因为其地址空间太小并没有得到充分利用,而因特网的 IP 地址仍在加速消耗,整个 IPv4 地址空间面临全部耗尽的威胁。为此,因特网工程任务组
IETF
提出了采用无分类编址
的方法来解决 IP 地址紧张的问题。1993 年,IETF 发布了无分类域间路由选择 CIDR(Classless Inter-Domain Routing
)的 RFC 文档:- CIDR 消除了传统的 A 类、B 类和 C 类地址,以及划分子网的概念
- CIDR 可以更加有效地分配 IPv4 的地址空间
-
无分类编址:CIDR 使用 “斜线记法”,或称 CIDR 记法,即在 IPv4 地址后面加上斜线 “/” 并在斜线后写上
网络前缀
所占的比特数量。CIDR 实际上是将网络前缀都相同的连续的 IP 地址组成一个 “CIDR” 地址块 -
路由聚合构造超网:找共同前缀
- 网络前缀越长,地址块越小,路由越具体
- 若路由器查表转发分组发现有多条路由可选时,则选择网络前缀最长的那条,这称为最长前缀匹配
4.5 IPv4 地址的应用规划
-
定长的子网掩码(
Fixed Length Subnet Mask
):使用同一个子网掩码来划分子网,每个子网所分配的 IP 地址数量相同,容易造成 IP 地址的浪费 -
变长的子网掩码(
Variable Length Subne Mask
):使用不同的子网掩码来划分子网,每个子网所分配的 IP 地址数量不同,尽可能较少对 IP 地址的浪费(根据网络中所需 IP 地址数量确定地址掩码)
4.6 IP 数据报的发送和转发流程
-
默认网关:为了让本网络中的主机能和其它网络中的主机进行通信,就必须给主机指定本网络中的一个路由器,由该路由器帮忙转发分组从而实现跨网络通信,指定的路由器也称
默认网关
-
路由器收到 IP 数据报后的转发流程:
- 检查 IP 数据报首部是否出错,若出错则丢弃该 IP 数据报并通告源主机;若没错则进行转发
- 根据 IP 数据报的目的地址在路由表中查找匹配的路由条目,若找到则转发给路由记录中指定的下一跳,否则丢弃该 IP 数据报并通告源主机
-
路由表:
目的网络 地址掩码 下一跳 -
中继器、集线器、网桥、交换机和路由器间的对比:
中继器 集线器 网桥 交换机 路由器 工作层次 物理层 物理层 数据链路层 数据链路层 网络层 隔离碰撞域 否 否 是 是 是 隔离广播域 否 否 否 否 是
注:IP 路由器工作在 TCP/IP 体系结构的网际层,该层并不负责可靠传输,也就是不能确保传输 IP 分组不丢失。IP 路由器对收到的 IP 分组头进行差错检测,当发现错误时会丢弃该 IP 分组并向源主机发送 ICMP 差错报告报文
。路由器隔离广播域,默认不转发广播数据报
4.7 静态路由
- 静态路由配置:静态路由配置是指用户或网络管理员使用路由器相关命令给路由器人工配置路由表。这种配置方式简单、开销小,但不能及时适应网络状态的变化,一般只在小规模网络中使用。配置不当可能会导致以下问题:配置错误、聚合了不存在的网络、网络故障等
- 生存时间:为了防止 IP 数据报在路由环路中永久兜圈,在 IP 数据报首部设有生存时间
TTL
字段。IP 数据报进入路由器后,TTL 字段的值减 1,若 TTL != 0,则被路由器转发,否则被丢弃 - 黑洞路由:下一跳地址为
null0
4.8 路由选择协议
-
因特网所采用的路由选择协议的主要特点:
- 自适应:动态路由选择,能较好地适应网络状态的变化
- 分布式:路由器之间相互交换路由信息
- 分层次:将整个因特网划分为许多较小的自治系统 AS(
Autonomous System
)
-
常用的路由选择协议:
-
常用内部网关协议和外部网关协议:
-
路由器的基本结构:
- 路由器的端口一般都具有输入和输出的功能,图示区分输入、输出端口的目的是为了更好地理解路由器的工作流程
4.9 内部网关协议之路由信息协议 RIP
-
路由信息协议:路由信息协议 RIP(
Routing Information Protocol
)是内部网关协议中最早得到广泛使用的协议之一,其要求自治系统 AS 内的每一个路由器都要维护从它自己到 AS 内其它每一个网络的距离。这是一距离,称为 “距离向量”。RIP 使用跳数(Hop Count
)作为度量来衡量到达目的网络的距离- RIP 规定路由器到直连网络的距离定义为 1
- RIP 规定到非直连网络的距离定义为所经过的路由器数 +1
- RIP 允许一条路径上最多只能包含 15 个路由器,“距离” 等于 16 时相当于不可达,因而 RIP 只适用于小型网络
- RIP 认为好的路由就是 “距离短” 的路由,也就是所通过路由器数量最少的路由
-
路由收敛:
- 路由器刚开始工作时,只知道自己到直连网络的距离为 1
- 每个路由器和相邻路由器周期性地交换自己的路由表信息,并更新自己的路由信息(建立 UDP 连接,端口号为 520)
- 若干次交换和更新后,每个路由器都知道到达本 AS 内各网络的最短距离和下一跳地址,这称为收敛
-
RIP 路由条目的更新规则:
-
RIP 中坏消息传得慢问题:坏消息传播得慢又称为
路由环路
或距离无穷计数
问题,这是距离向量算法的一个固有问题。可以采取以下措施减小该问题出现的概率:- 触发更新:当路由表发生变化时就立即发送路由更新报文,而不是周期性发送
- 水平分割:让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送
4.10 内部网关协议之开放最短路径优先 OSPF
-
开放最短路径:开放最短路径优先 OSPF(
Open Shortest Path First
)是为克服 RIP 的缺点在 1989 年开发出来的。 “开放” 表明 OSPF 协议是公开发表的,“最短路径优先“ 是因为使用了Dijkstra
提出的最短路径算法- OSPF 是基于链路状态的,而不是像 RIP 基于距离向量(链路状态是指本路由器都和哪些路由器相邻,以及相应链路的 ”代价“)
- OSPF 采用最短路径优先算法计算路由,从算法上保证了不会产生路由环路
- OSPF 不限制网络规模,更新效率高,收敛速度快
-
OSPF 维护邻居关系:OSPF 相邻路由器之间通过交互问候(
Hello
)分组来建立和维护邻居关系- Hello 分组封装在 IP 数据报中,发往组播地址
224.0.0.5
- 发送周期为 10 秒,若 40 秒未收到来自邻居路由器的 Hello 分组,则认为该邻居路由器不可达
- Hello 分组封装在 IP 数据报中,发往组播地址
-
链路状态通告:使用 OSPF 的每个路由器都会产生链路状态通告 LSA(
Link State Advertisement
),其中包含了直连网络和邻居路由器的链路状态信息- LSA 被封装在
链路状态更新分组
LSU 中,采用洪泛法
发送 - 使用 OSPF 的每个路由器都有一个
链路状态数据库
LSDB,用于存储 LSA - 通过各路由器洪泛发送封装有自己 LSA 的 LSU 分组,各路由器的 LSDB 最终将达到一致
- 使用 OSPF 的各路由器基于 LSDB 进行最短路径优先计算,构建出各自到达其它各路由器的最短路径,即构建各自的路由表
- LSA 被封装在
-
OSPF 的五种分组类型:
- 问候(Hello)分组:用来发现和维护邻居路由器的可达性
- 数据库描述(Database Description)分组:向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
- 链路状态请求(Link State Request)分组:向邻居路由器请求发送某些链路状态项目的详细信息
- 链路状态更新(Link State Update)分组:路由器使用这种分组将其链路状态进行洪泛发送以对全网链路状态进行更新
- 链路状态确认(Link State Acknowledgement)分组:对链路状态更新分组的确认分组
-
指定路由器 DR:当 OSPF 路由器在多点接入网络中建立邻居关系时,如不采用其它机制将会产生大量的多播分组。为了减少所发送分组的数量, OSPF 采用指定路由器 DR(
Designated Router
) 和备用指定路由器 BDR(Backup Designated Router
) 的方法。所有的非 DR/BDR 只与 DR/BDR 建立邻居关系,非 DR/BDR 之间不能直接交换信息,只能通过 DR/BDR 间接交换信息 -
区域 Area:为了使 OSPF 能够用于规模很大的网络,OSPF 把一个自治系统 AS 再划分为若干个更小的范围,称为区域(Area)
- 每个区域都有一个 32 比特的区域标识符,
主干区域
的标识符必须为 0 - 每个区域的规模不应太大,一般不超过
200
个路由器
- 每个区域都有一个 32 比特的区域标识符,
4.11 外部网关协议之边界网关协议 BGP
-
边界网关协议:边界网关协议 BGP(
Border Gateway Protocol
)力求寻找一条能够到达目的网络的比较好的路由(不兜圈子),而并非要寻找一条最佳路由 -
BGP 的基本工作原理:
-
选定 BGP 发言人:在配置 BGP 时,每个自治系统的管理员需要选择至少一个路由器作为该自治系统的 ”BGP 发言人“,不同自治系统的 BGP 发言人要互相交换路由信息(通过建立 TCP 连接,端口号为
179
)- 在此 TCP 连接上交换 BGP 报文以建立 BGP 会话
- 利用 BGP 会话交换路由信息
- 使用 TCP 连接交换路由信息的两个 BGP 发言人彼此称对方为邻站(neighbor)或对等站(peer)
-
运行自己的内部网关协议:BGP 发言人除了运行 BGP 外,还必须运行自己所在 AS 所使用的内部网关协议,如 OSPF 或 RIP
-
BGP 发言人交换网络可达性信息(到达某个网络所要经过的一系列自治系统)
-
当 BGP 发言人互相交换了网络可达性信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找到到达各自治系统的较好的路由,也就是构造出树形结构、不存在回路的自治系统连通图
-
-
BGP-4 中规定的四种报文:
- 打开(Open)报文:用来与相邻的另一个 BGP 发言人建立关系,使通信初始化
- 更新(Update)报文:用来通告某一路由信息,以及列出要撤销的多条路由
- 保活(Keep Alive)报文:用来周期性地证实邻站的连通性
- 通知(Notification)报文:用来发送检测到的差错
4.12 IPv4 数据报的首部格式
-
版本:占 4 比特,表示 IP 协议版本。通信双发要求版本一致,目前广泛使用的 IPv4
-
首部长度:占 4 比特,表示 IP 数据报
首部
的长度。该字段的取值以 4 字节为单位
- 最小十进制取值为 5,表示 IP 数据报首部只有 20 字节的固定部分
- 最大十进制取值为 15,表示 IP 数据报包含 20 字节的固定部分和最大 40 字节的可选字段
-
可选字段:长度从 1 ~ 40 字节不等,用来支持排错、测量及安全等措施。可选字段增加了 IP 数据报的功能,但这同时使得 IP 数据报的首部长度成为可变的,增加了每一个路由器处理 IP 数据报的开销,实际上很少被使用
-
填充字段:该字段用来确保
首部长度为 4 字节的整数倍
,不足时使用全 0 进行填充 -
区分服务:占 8 比特,用来获得更好的服务。该字段在旧标准中叫做服务类型,但实际上一直没有被使用。1998 年因特网工程任务组 IETF 将服务类型改名为区分服务,不同的数值可提供不同的等级服务指令,一般情况下都不使用该字段
-
总长度:占 16 比特,表示 IP 数据报的总长度(首部长度 + 数据载荷)。最大取值为十进制的 65535,
以字节为单位
-
标识、标志、片偏移:这三个字段共同用于 IP 数据报的分片。IP 数据报在数据链路层封装成帧,每一个数据链路层协议都规定了帧的数据载荷的最大长度,称为最大传输单元 MTU。如以太网的数据链路层规定 MTU 的值为 1500 字节,如果某个 IP 数据报的总长度超过 MTU 时将无法封装成帧,需要将原 IP 数据报分片为更小的 IP 数据报,再将各 IP 数据报封装成帧
- 标识:占 16 比特,属于同一个 IP 数据报的各分片应具有相同的标识。IP 软件维持一个计数器,每产生一个 IP 数据报,计数器加 1 并将此值赋给标识字段
- 标志:占 3 比特,各比特含义如下
DF
:1 - 不允许分片;0 - 允许分片MF
:1 - 后面还有分片;0 - 最后一个分片保留位
:必须为 0
- 片偏移:占 13 比特,指出分片数据报的
数据载荷部分
偏移其在原数据报的位置有多少个单位(整数),以 8 字节为单位
-
生存时间 TTL:占 8 比特。用于防止 IP 数据报在网络中永久兜圈
- 最初以秒为单位,最大生存周期为 255 秒。路由器转发 IP 数据报时,将 IP 数据报首部中的该字段的值减去 IP 数据报在本路由器上所耗费的时间,若不为 0 就转发,否则就丢弃
- 现在以 “跳数” 为单位,路由器转发 IP 数据报时,将 IP 数据报首部中的该字段的值减 1,若不为 0 就转发,否则就丢弃
-
协议:占 8 比特,指明 IPv4 数据报的
数据载荷部分
使用的是何种协议数据单元 PDU协议名称 ICMP IGMP TCP UDP IPv6 OSPF 字段值 1 2 6 17 41 89 -
首部检验和:占 16 比特,也称因特网检验和。用来检测首部在传输过程中是否出现差错,比 CRC 校验码简单。IP 数据报每经过一个路由器,路由器都会重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生了变化。由于
网际层本身并不提供可靠传输服务
,并且计算首部检验和是一项耗时的工作,因此在 IPv6 中路由器不再计算首部检验和,从而更快转发 IP 数据报
4.13 网际控制报文协议 ICMP
-
网际控制报文协议:为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP(
Internet Control Message Protocol
),主机或路由器使用 ICMP 来发送差错报告报文和询问报文,ICMP 报文直接封装在 IP 数据报中发送 -
五种 ICMP 差错报告报文:
-
终点不可达:当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据 ICMP 的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络位置、目的主机未知等 13 种错误
-
源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢
-
时间超过:
-
当路由器收到一个目的 IP 地址不是自己的 IP 数据报,就会将其生存时间 TTL 字段值减 1,若结果不为 0 则转发该数据报,否则丢弃该数据报后需要向源点发送时间超过报文
-
当终点在预先规定的时间内不能收到一个数据报的全部数据报分片时,就将已收到的数据报片全部丢弃,并向源点发送时间超过报文
-
-
参数问题:当路由器或目的主机收到 IP 数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报并向源点发送参数问题报文
-
改变路由(重定向):路由器把改变路由报文发送给主机,让主机知晓下次应将数据报发送给另外的路由器(更好的路由)
-
-
以下情况不应发送 ICMP 差错报告报文:
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文
- 对具有多播地址的数据报都不发送 ICMP 差错报告报文
- 对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报都不发送 ICMP 差错报告报文
-
常用的 ICMP 询问报文:
- 回送请求和回答:ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达及了解其有关状态(Ping)
- 时间戳请求和回答:ICMP 时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在 ICMP 时间戳回答报文中有一个 32 位的字段,其中写入的整数代表从 1900 年 1 月 1 日起到当前时刻一共有多少秒。这种询问报文用来进行时钟同步和测量时间
-
ICMP 的典型应用:
-
分组网间探测 PING(
Packet Internet Groper
):用来测试主机或路由器间的连通性,应用层直接使用网际层的 ICMP
(没有经过运输层的 TCP 或 UDP)。使用 ICMP 回送请求和回答报文 -
跟踪路由(Trace Route):用来测试 IP 数据报从源主机到达目的主机要经过哪些路由器。实现原理是通过设置 IP 数据报首部中生存时间 TTL 的值从而实现各路由器向源主机发送 ICMP 的差错报告报文(时间超过)
- Windows:
tracert
。应用层直接使用网际层的 ICMP
、使用了 ICMP 回送请求和回答以及差错报告报文 - Unix:
traceroute
。在运输层使用 UDP 协议、仅使用 ICMP 差错报告报文
- Windows:
-
4.14 虚拟专用网 VPN
-
VPN:虚拟专用网 VPN(
Virtual Private Networ
),也称 IP 隧道技术。由于 IPv4 地址的紧缺,一个机构能申请到的 IPv4 地址数量往往远小于本机构所拥有的主机数量,因而虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的共有地址。可利用公用的因特网作为本机构各专用网之间的通信载体 -
专用(私有)地址:私有地址仅用作本地地址而不能用作全球地址,因特网中的所有路由器对目的地址为私有地址的 IP 数据报一律不转发
- 10.0.0.0 ~ 10.255.255.255(10/8 地址块)
- 172.16.0.0 ~ 172.31.255.255(172.16/12 地址块)
- 192.168.0.0 ~ 192.168.255.255(192.168/16 地址块)
-
VPN 的分类:
- 内联网 VPN:同一机构内不同部门的内部网络所构成的虚拟专用网
- 外联网 VPN:一个机构的 VPN 加入了外部机构网络
- 远程接入 VPN:在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入因特网,运行驻留在员工 PC 中的 VPN 软件,在员工 PC 和公司主机之间建立 VPN 隧道即可访问专用网络中的资源
4.15 网络地址转换 NAT
-
网络地址转换:NAT(
Network Address Translation
)。虽然因特网采用了无分类编制方式来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公网络和家庭网络接入导致对因特网的需求不断增加,IPv4 地址空间即将面临耗尽的危险仍然没有被解除。1994 年提出了一种网络地址转换 NAT 的方法再次缓解了 IPv4 地址空间即将耗尽的问题。NAT 能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源 -
上述 NAT 转换方式存在的问题:如果 NAT 路由器具有 N 个全球 IP 地址,那么至多只能有 N 个内网主机能够同时和外网主机通信
-
网络地址与端口号转换:由于绝大多数的网络应用都是使用运输层协议 TCP 或 UDP 来传送数据,因此可以利用运输层的端口号与 IP 地址一起进行转换。这样使用一个全球 IP 地址就可以使多个内网主机同时和因特网上的主机进行通信。这种将端口号和 IP 地址一起进行转换的技术叫做
网络地址与端口号转换
NAPT(Network Address and Port Translation
)
注:由于 NAT 对外网屏蔽了内网主机的网络地址,能为内网主机提供一定的安全保护。但对于一些 P2P(点对点)网络应用,需要外网主机主动与内网主机进行通信,在通过 NAT 时会遇到问题,需要网络应用自己使用一些特殊的 NAT 穿透技术来解决问题
五、运输层
5.1 运输层概述
-
端对端通信:计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互连起来的问题,实现了
主机到主机
的通信。但实际上计算机网络中进行通信的真正实体时位于通信两端主机中的进程。如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务,运输层协议又称为端到端协议 -
端口号:TCP/IP 体系的运输层使用端口号来区分应用层的不同应用进程。端口号使用 16 比特来表示,取值范围是 [0, 65535]
- 熟知端口号:
[0, 1023]
。IANA 把这些端口号指派给了 TCP/IP 体系中最重要的一些应用协议,如 FTP(20/21),HTTP(80),DNS(53) - 登记端口号:
[1024, 49151]
。给应用进程使用,使用这类端口号必须在 IANA 登记以防止重复,如 Microsoft RDP 微软远程桌面使用的端口号是 3389 - 临时端口号:
[49152, 65535]
。留给客户进程暂时使用,使用结束后释放给其它进程使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号
- 熟知端口号:
-
TCP/IP 体系的应用层常用协议所使用的熟知端口号:
-
发送方的复用和接收方的分用:
5.2 TCP 与 UDP
-
用户数据报协议 UDP(
User Datagram Protocol
)和传输控制协议 TCP(Transmission Control Protocol
)UDP TCP 有无连接 无连接(随时发送数据) 面向连接(三报文握手,四报文挥手) 通信方式 单播(一对一)、多播(一对多)、广播(一对全) 单播(一对一) 报文处理 面向应用报文(既不合并也不拆分) 面向字节流(依据字节流封装 TCP 报文段) 传输可靠 无连接不可靠的传输服务 面向连接可靠的传输服务 应用场景 实时应用,如 IP 电话、视频会议等 可靠传输,如文件传输 首部大小 8 字节 最小 20 字节,最大 60 字节(40 字节可选) -
UDP 和 TCP 对报文的处理:
-
UDP 和 TCP 首部格式:
5.3 TCP 流量控制
-
流量控制:所谓流量控制(
Flow Control
)就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制
可以很方便地在 TCP 连接上实现对发送方的流量控制 -
TCP 流量控制:例中假设 A 发送的每个 TCP 数据报文段可携带 100 字节数据。接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小
- seq:TCP 报文段首部中的
序号
字段 - DATA:TCP 数据报文段
- ACK:TCP 报文段首部中的
标志位
。取值 1 表示这是一个确认报文段 - ack:TCP 报文段首部中的
确认号
字段。取值 201 表示 201 号之前的数据已全部正确接收 - rwnd:TCP 报文段首部中的
窗口
字段。取值 300 表示接收方的接收窗口大小为 300
- seq:TCP 报文段首部中的
-
TCP 流量控制之零窗口探测报文的发送与重传:TCP 发送方收到接收方的零窗口通知后,启动持续计时器,若持续计时器超时则发送零窗口探测报文。零窗口探测报文也存在持续计时器,超时后重传零窗口探测报文
5.4 TCP 拥塞控制
为方便研究拥塞控制算法的基本原理,假定条件如下:
- 数据沿单方向传送,而另一个方向只传送确认
- 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度确定(不进行流量控制)
- 以最大报文段的个数为单位讨论问题,而不是以字节为单位
发送窗口(swnd)、拥塞窗口(cwnd)、慢开始门限(ssthresh):
- 发送方维护一个拥塞窗口变量,其值取决于网络的拥塞程度且动态变化。发送方将拥塞窗口作为发送窗口,即
swnd = cwnd
- cwnd 的变化原则:网络未出现拥塞就增大一些,出现拥塞(发生超时重传)就减小一些
- 发送方维护一个慢开始门限状态变量 ssthresh:
- cwnd < ssthresh:使用慢开始算法
- cwnd > ssthresh:停止使用慢开始算法而改用拥塞避免算法
- cwnd = ssthresh:既可以使用慢开始算法,也可以使用拥塞避免算法
- 传输轮次:发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间就是 RTT
-
慢开始(
Slow-Start
):一开始向网络注入的报文段少,并不是指拥塞窗口cwnd
增长速度慢- cwnd < ssthresh 时使用慢开始算法,每个传输轮次后
cwnd = cwnd * 2
- cwnd < ssthresh 时使用慢开始算法,每个传输轮次后
-
拥塞避免(
Congestion Avoidance
):并非指完全能避免拥塞,只是使网络比较不容易出现拥塞- 当 cwnd = ssthresh 时改用拥塞避免算法, 每个传输轮次后
cwnd = cwnd + 1
- 当判断网络发生拥塞(出现超时重传)时,修改
ssthresh = cwnd / 2; cwnd = 1
,重新执行慢开始算法
注:慢开始算法和拥塞避免算法是 1988 年提出的 TCP 拥塞控制算法(TCP Tahoe 版本),1990 年又增加了两个新的拥塞控制算法以改进 TCP 的性能,这就是快重传和快恢复(TCP Reno 版本)
- 当 cwnd = ssthresh 时改用拥塞避免算法, 每个传输轮次后
-
快重传(
Fast Retransmit
):使发送方尽快进行重传,而不是等重传计时器超时后再重传。对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了网络拥塞,使用快重传算法可以使整个网络的吞吐量提高约 20%- 要求接收方不要等待自己需要发送数据时才进行捎带确认,而是在收到分组时立即发送确认
- 要求接收方即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
- 发送方一旦收到
3
个连续的重复确认,就将相应的报文段立即重传,而不是等重传计时器超时后再重传
-
快恢复(
Fast Recovery
):发送方一旦收到 3 个重复确认,就知道现在只是丢失了个别报文段。不启动慢开始算法,转而执行快恢复算法-
发送方将
ssthresh = swnd /2 ; cwnd = swnd / 2
,开始执行拥塞避免算法 -
有的快恢复实现将
ssthresh = swnd / 2; cwnd = ssthresh + 3
,开始执行拥塞避免算法。这是因为既然发送方收到 3 个重复的确认,就表明有 3 个数据报文段已经离开了网络,这 3 个报文段不再消耗网络资源而是停留在接收方的接收缓存中,因而可以适当把拥塞窗口的值扩大些
-
5.5 TCP 超时重传时间
- TCP 超时重传时间的选择:超时重传时间 RTO 的值应略大于
加权平均往返时间
RTTs。利用每次测量得到的往返时间 RTT 样本,可计算出加权平均往返时间 RTTs(又称为平滑的往返时间)- 加权平均往返时间:RTTs = (1 - α) * RTTs + α * RTT(RTTs1 = RTT1)。RFC 6298 推荐 α = 1/8
- RTT 偏差加权平均:RTTD = (1 - β) * RTTD + β * |RTTs - RTT|(RTTD1 = RTT1 / 2),RFC 6298 推荐 β = 1/4
- 超时重传时间:RTO = RTTs + 4 * RTTD
- 无法准确测量 RTT:针对出现超时重传时无法准确测量往返时间 RTT 的问题,Karn 提出了一个算法:在计算加权平均往返时间 RTTs 时,只要报文段重传了,就不采用其往返时间 RTT 样本,也即不重新计算 RTTs 和 RTO
- Karn 算法存在的问题:一段时间内报文段传输时延突然增大了很多,并且之后较长一段时间内都会保持这种时延。根据 Karn 算法,不考虑重传报文段的往返时间样本,这将导致原来的超时重传时间过短,报文段会被反复重传
- 对 Karn 算法的修正:报文段每重传一次,就报超时重传时间 RTO 增大一些,典型做法是翻倍处理:RTO = RTO * 2
5.6 TCP 可靠传输的实现
TCP 基于以字节为单位的滑动窗口来实现可靠传输:
-
虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻发送方的发送窗口并不总是和接收方的接收窗口一样大
-
网络传送窗口值需要一定时间
-
发送方根据网络拥塞情况适当减小了自己的发送窗口尺寸
-
-
对于未按序到达的数据 TCP 并未明确规定如何处理,可一律丢弃(浪费通信资源)也可暂存接收窗口缓存中并等待缺失的字节数据
-
TCP 要求接收方必须有累计确认和捎带确认机制,这样做可以减小传输开销
-
接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传。TCP 规定确认推迟的时间不应超过
0.5s
。若连续收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认 -
捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据
-
-
TCP 通信是全双工通信,每一方都可以在边发送数据和边接收报文段,因而每一方均有自己的发送窗口和接收窗口
5.7 TCP 建立连接
-
TCP 连接建立要解决以下三个问题:
- 使 TCP 双方能够确知对方的存在
- 使 TCP 双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
- 使 TCP 双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
-
TCP “三报文握手” 建立连接过程:
- 一开始 TCP 服务器进程先创建传输控制块,用来存储 TCP 连接中的一些重要信息(如 TCP 连接表、指向发送和接收缓存的指针、指向重传队列的指针、当前发送和接收序号等),之后就进入监听状态等待来自 TCP 客户进程的请求,称为被动打开连接
- TCP 客户进程首先会创建传输控制块,打算进行通信时向 TCP 服务器发送 TCP 连接请求报文段并进入同步已发送(
SYS-SENT
)状态,这称为主动打开连接- SYN:同步位。SYN = 1 表明这是一个 TCP 连接请求报文段,
不能携带数据但要消耗掉一个序号
- seq:序号字段。seq = x 作为 TCP 客户进程所选择的初始序号
- SYN:同步位。SYN = 1 表明这是一个 TCP 连接请求报文段,
- TCP 服务器进程同意建立连接则向客户端发送 TCP 连接请求确认报文段 ,并进入同步已接收状态(
SYN-RCVD
)- ACK:确认位。
SYN = 1 && ACK = 1
表明这是一个 TCP 连接请求确认报文段 - seq:序号字段。seq = y 作为 TCP 服务器进程所选择的初始序号
- ack:ack = x + 1 这是对 TCP 客户进程所选择的初始序号的确认
- ACK:确认位。
- TCP 客户进程还需给服务器进程发送一个普通的 TCP 确认报文段,并进入连接已建立状态(
ESTABLISHED
)- ACK:ACK = 1 表明这是一个普通的 TCP 确认报文段。普通的报文段可以携带数据,不携带数据就不消耗序号
- seq:seq = x + 1
- ack:ack = y + 1 这是对 TCP 服务器进程所选择的初始序号的确认
- TCP 服务器进程收到客户进程的普通确认报文段后也进入连接已建立(ESTABLISHED)状态,至此 ”三报文握手“ 建立连接成功
-
“三报文握手” 不能改为 “两报文握手” 的原因:防止已失效的
连接请求报文段
到达服务器导致服务器进入连接已建立状态,而客户端实际上并未发起连接请求,这将白白浪费服务器的通信资源 -
基于 Java 语言实现 TCP 的 Socket 套接字通信:
-
Server.java
/** * @author Spring-_-Bear * @datetime 2022-09-16 09:29 Friday */ public class Server { public static void main(String[] args) throws IOException { // 监听 5555 端口 ServerSocket serverSocket = new ServerSocket(5555); // 等待来自客户端的连接 Socket socket = serverSocket.accept(); // 从数据通道读取数据,读取客户端的消息 InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int readLen; while ((readLen = inputStream.read(buf)) != -1) { System.out.println(new String(buf, 0, readLen)); } // 关闭 socket 的输入流 socket.shutdownInput(); // 写数据到数据通道,给客户端发送消息 OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello, client!".getBytes(StandardCharsets.UTF_8)); // 关闭资源 outputStream.close(); inputStream.close(); socket.close(); serverSocket.close(); } }
-
Client.java
/** * @author Spring-_-Bear * @datetime 2022-09-16 09:29 Friday */ public class Client { public static void main(String[] args) throws IOException { // 与服务器建立连接 Socket socket = new Socket(InetAddress.getLocalHost(), 5555); // 写数据到数据通道,给服务器发送消息 OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello, server!".getBytes(StandardCharsets.UTF_8)); // 关闭 socket 的输出流 socket.shutdownOutput(); // 从数据通道读取数据,读取来自服务器的消息 InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int readLen; while ((readLen = inputStream.read(buf)) != -1) { System.out.println(new String(buf, 0, readLen)); } // 关闭资源 inputStream.close(); outputStream.close(); socket.close(); } }
-
5.8 TCP 释放连接
-
客户进程主动申请关闭 TCP 连接,向 TCP 服务发送连接释放报文段,并进入终止等待 1 状态(
FIN-WAIT-1
)- ACK:ACK = 1
- FIN:终止位。
FIN = 1 && ACK = 1
表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。TCP 规定 FIN = 1 的报文段即使不携带数据也要消耗掉一个序号
- seq:seq = u,等于客户进程之前已传送过的数据的最后一个字节的序号加 1
- ack:ack = v,等于客户进程之前已收到的数据的最后一个字节的序号加 1
-
服务器进程收到客户端的释放连接请求报文段后,向客户进程发送一个普通的
确认报文段
并进入关闭等待状态(CLOSE-WAIT
)。然后通知高层应用进程,TCP 客户进程想要断开与自己的 TCP 连接。此时客户端 -> 服务器
连接已释放,这时的 TCP 连接处于半关闭状态,也即 TCP 客户进程已没有数据需要发送,但服务器进程若有数据需要发送仍可继续发送,客户进程仍要接收,此状态可能会持续一段时间- ACK:ACK = 1 表明这是一个普通的确认报文段
- seq:seq = v
- ack:ack = u + 1,这是对 TCP 客户进程释放连接请求报文段的确认
-
TCP 客户进程收到 TCP 确认报文段后就进入终止等待 2 (
FIN-WAIT-2
)状态,等待 TCP 服务器进程发出的 TCP 连接释放报文段 -
一段时间后,服务器进程的应用进程再无数据需要传输,就通知 TCP 进程释放连接。TCP 服务进程发送 TCP 释放报文端并进入最后确认状态(
LAST-ACK
)- ACK:ACK = 1
- FIN:FIN = 1 && ACK = 1 表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认
- seq:seq = w,服务器进程可能继续传输了一部分数据给客户进程
- ack:ack = u + 1,对之前收到的
释放报文段的重复确认
-
TCP 客户进程收到 TCP 连接释放报文段后,必须针对该报文段发送普通的 TCP 确认报文段,之后进入时间等待状态(
TIME-WAIT
)。TCP 服务器进程收到报文段后就进入关闭状态(CLOSED
),而 TCP 客户进程还要经过 2MSL(Maximum Segment Lifetime
,最长报文段寿命,RFC 793 建议为 2 分钟) 后才能进入关闭状态,这么做的目的是确保 TCP 服务器进程可以收到最后一个 TCP 确认报文段从而进入关闭状态,而且可以保证本次连接持续时间内所产生的所有报文段都从网络中消失,确保下一个 TCP 连接是全新的连接- ACK:ACK = 1
- seq:seq = u + 1,之前发送的连接释放报文段虽然不携带数据,但要消耗掉一个序号
- ack:ack = w + 1,对所收到的 TCP 连接释放报文段的确认
注:TCP 服务器进程每收到一次 TCP 客户进程的数据,就重置并启动保活计时器(2h
)。若保活计时器定时周期内未收到 TCP 客户进程发来的数据,则当保活计时器到时后,TCP 服务器就向 TCP 客户进程发送一个探测报文段,以后每隔 75s
发送一次,若连续 10
个探测报文段后仍无 TCP 客户进程的响应,TCP 服务器进程就认为 TCP 客户进程所在的主机出现了故障,接着就释放这个 TCP 连接
5.9 TCP 首部格式
-
源端口:占 16 比特。写入源端口号,用来标识发送该 TCP 报文段的应用进程
-
目的端口:占 16 比特。写入目的端口号,用来标识接收该 TCP 报文段的应用进程
-
序号(seq):占 32 比特。取值范围 [0, 232 - 1],序号增加到最后一个后,下一个序号从 0 开始。用于指出本 TCP 报文段数据载荷的第一个字节的序号
-
确认号(ack):占 32 比特。取值范围 [0, 232 - 1],确认号增加到最后一个后,下一个确认号从 0 开始。用于指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
-
确认标志位(ACK):取值为 1 时 ACK 才有效,取值为 0 时无效。TCP 规定,在连接建立后所有传送的 TCP 报文段都必须把 ACK 设置为 1
-
数据偏移:占 4 比特并
以 4 字节为单位
。用来指出 TCP 报文段的数据载荷部分的起始处距离 TCP 报文段的起始处有多远,实际上指出了 TCP 报文段的首部长度
-
保留:占 6 比特。保留为今后使用,目前应置为 0
-
窗口:占 16 比特并
以字节为单位
。指出发送本报文段的一方的接收窗口,窗口值作为接收方让发送方设置起发送窗口的依据(流量控制)。发送窗口 = min(接收窗口,拥塞窗口) -
校验和:占 16 比特。用来检查整个 TCP 报文段(首部 + 数据载荷)在传输的过程中是否出现了误码
-
同步标志位(SYN):在 TCP 连接建立时用来同步序号
-
终止标志位(FIN):用来释放 TCP 连接
-
复位标志位(RST):用来复位 TCP 连接。当 RST = 1 时表明 TCP 连接出现了异常,必须释放连接后重新建立连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个 TCP 连接
-
推送标志位(PSH):接收方的 TCP 进程收到该标志位为 1 的报文段会尽快上交上层应用进程,而不必等到接收缓存填满后再交付
-
紧急标志位(URG):URG = 1 时紧急指针字段有效,URG = 0 时紧急指针字段无效
-
紧急指针:占 16 比特并
以字节为单位
。用来实现紧急操作,指明紧急数据的长度。当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个 TCP 报文段中进行发送。紧急指针字段指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。接收方收到 URG = 1 的报文段时会直接上交应用进程而不等待接收缓存填满 -
选项(长度可变,最大 40 字节):可以增加 TCP 的功能
- 最大报文段长度 MSS 选项:TCP 报文段数据载荷部分的最大长度
- 窗口扩大选项:扩大窗口、提高吞吐率
- 时间戳选项:用来计算往返时间 RTT、用于处理序号超范围的情况(防止序号绕回 PAWS)
- 选择确认选项:用来实现选择确认功能
-
填充:由于选项长度可变,因此使用填充 0 来确保报文段首部能被 4 整除(因为数据偏移字段也就是首部长度字段是以 4 字节为单位的)
六、应用层
6.1 C/S 与 P2P
网络应用程序运行在处于网络边缘的不同的端系统上,通过彼此间的通信来共同完成某项任务。开发一种新的网络应用首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和他们之间的关系,目前主要有以下两种方式:
-
客户/服务器(
Client/Server,C/S
)方式-
客户、服务器指通信过程中涉及的两个应用进程,C/S 描述的是进程之间服务与被服务的关系
-
服务总是处于运行状态,并等待客户的服务请求。服务器具有固定的端口号,而运行服务器的主机也具有固定的 IP 地址
-
-
对等(
Peer-to-Peer,P2P
)方式-
在 P2P 方式中,没有固定的服务请求者和服务提供者,分布在网络边缘各端系统中的应用进程是对等的,被称为对等方。对等方相互之间直接通信,每个对等方既是服务的请求者又是服务的提供者
-
流行的 P2P 应用:P2P 文件共享、即时通信、P2P 流媒体、分布式存储等
-
6.2 动态主机配置协议 DHCP
DHCP 是 TCP/IP 协议应用层中的协议,它使用运输层的 UDP 所提供的服务。DHCP 报文在运输层会被封装成为 UDP 用户数据报,DHCP 服务器使用的端口是 67
,DHCP 客户使用的 UDP 端口是 68
-
当启用主机的 DHCP 后,DHCP 客户将广播发送 DHCP 发现报文(
DHCP DISCOVERY
),封装该报文的 IP 数据报的源 IP 地址为0.0.0.0
,目的 IP 地址是广播地址255.255.255.255
。DHCP 发现报文内部封装有事物 ID 和 DHCP 客户端的 MAC 地址 -
DHCP 服务器收到发现报文后,根据其中封装的 DHCP 客户端的 MAC 地址来查找自己的数据库,看是否有针对该 MAC 地址的配置信息:
- 若有则使用这些信息来构建并发送 DHCP 提供报文(
DHCP OFFER
) - 若没有则采用默认配置信息来构建并发送 DHCP 提供报文(DHCP 服务器从自己的 IP 地址池中挑选待租用给主机的 IP 地址时,
会使用 ARP 来确保所选 IP 地址未被网络中的其它主机占用
)
封装该 DCHP 提供报文的 IP 数据报的源 IP 地址为 DHCP 服务器的 IP 地址,目的 IP 地址仍为广播地址
255.255.255.255
- 若有则使用这些信息来构建并发送 DHCP 提供报文(
-
DHCP 客户收到 DHCP 服务器的提供报文后,会根据报文中的事物 ID 来判断该报文是否是自己所请求的报文,提供报文中含有重要的配置信息如 IP 地址、子网掩码、地址租期、默认网关、DNS 服务器等。DHCP 客户向所选择的 DHCP 服务器发送 DHCP 请求报文(
DHCP REQUEST
)。DHCP 请求报文中封装有事物 ID、DHCP 客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器的 IP 地址等信息- 封装该报文的 IP 数据报的源 IP 地址仍为
0.0.0.0
(因为此时 DHCP 客户才从多个 DHCP 服务器中挑选一个作为自己的 DHCP 服务器,它首先需要争得该服务器的同意,之后才能正式使用该 DHCP 服务器租用的 IP 地址) - 目的 IP 地址仍为广播地址(不用向网络中的每一个 DHCP 服务器单播发送 DHCP 请求报文来告知它们是否请求它们作为自己的 DHCP 服务器)
- 封装该报文的 IP 数据报的源 IP 地址仍为
-
DHCP 服务器收到 DHCP 客户的发现报文后,会给 DHCP 客户端发送 DHCP 确认报文(
DHCP ACK
),封装该报文的 IP 数据报的源 IP 地址为服务器的 IP 地址,目的 IP 地址仍为广播地址255.255.255.255
-
DHCP 客户收到 DHCP 服务器的确认报文后,在正式
使用 IP 地址之前还会使用 ARP 检测所租用的 IP 地址是否已被网络中的其它主机占用
,若已被占用则给 DHCP 服务器发送谢绝报文(DHCP DECLINE
),并重新发送 DHCP 发现报文(DHCP DISCOVERY
) -
当租用期过了一半时,DHCP 客户会向自己的 DHCP 服务器发送 DHCP 请求报文来请求更新租用期,源 IP 地址为之前租用的 IP 地址,目的 IP 地址为主机 DHCP 服务器的 IP 地址
- 若 DHCP 服务器若同意则发送确认报文
- 若 DHCP 服务器不同意则发送否认报文(
DHCP NACK
),这时 DHCP 客户应立即停止使用租用到的 IP 地址并重新广播发送 DHCP 发现报文来重新申请 IP 地址 - 若 DHCP 服务器未响应,则租用期过了 7/8 时需要再次重新发送请求报文请求更新租期,若 DCHP 服务器仍未响应则租期到期后 DHCP 客户立即停止之前租用到的 IP 地址并重新发送发现报文来申请新的 IP 地址
-
DHCP 客户可随时提前终止 DHCP 服务器所提供的租用期,这时只需向 DHCP 服务器发送
DHCP 释放报文段
即可
注:使用 DCHP 中继代理的主要原因是我们并不愿意在每一个网络上都设置一个 DHCP 服务器,这样将导致网络中的 DHCP 服务器过多
6.3 分布式域名系统 DNS
-
分布式域名系统:在 1983 年,因特网就开始采用层次结构命名树作为主机的名字(即域名),并使用分布式域名系统 DNS。DNS 时大多数域名都在本地解析,仅少量解析需要在因特网上通信,因而效率很高。DNS 报文使用运输层的 UDP 协议进行封装,运输层端口号为
53
-
域名结构:
- 域名的结构由若干个分量组成,各分量之间用点隔开,分别代表不同级别的域名
- 每一级的域名都由
英文字母和数字
组成,不超过 63 个字符,不区分大小写字母
。域名系统既不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思。各级域名由其上一级的域名管理机构管理,顶级域名由因特网名称与数字地址分配机构
ICANN 进行管理 - 级别最低的域名写在最左边,级别最高的顶级域名写在最右边
- 完整的域名不超过
255
个字符
-
顶级域名(
Top Level Domain
):-
国家顶级域名 nTLD:采用 ISO3166 的规定
- cn:中国
- en:英国
- us:美国
-
通用顶级域名 gTLD:
- com:公司企业
- net:网络服务机构
- org:非营利性组织
- int:国际组织
- edu:美国教育机构
- gov:美国政府部门
- mil:美国军事部门
-
反向域 arpa:用于反向域名解析,即 IP 地址反向解析为域名
-
-
我国的二级域名划分:
-
类别域名:
- ac:科研结构
- com:工商金融等企业
- edu:教育机构
- gov:政府部门
- net:提供网络服务的机构
- mil:军事机构
- org:非营利性组织
-
行政区域名:
- bj:北京市
- sh:上海市
-
-
域名服务器的四种类型:
- 根域名服务器:根域名服务器是最高层次的域名服务器。每个根域名服务器都知道所有的顶级域名服务器及其 IP 地址。因特网上共有 13 个不同 IP 地址的根域名服务器。尽管我们将这 13 台根域名服务器中的每一个都视为单个的服务器,但 “每台服务器” 实际上是由许多分布在世界各地的计算机构成的服务器群集。当本地域名服务器向根域名服务器发出查询请求时,路由器就会把查询请求报文转发到离这个 DNS 客户最近的一个根域名服务器。根域名服务器通常并不直接对域名进行解析,而是返回该域名所属顶级域名服务器的 IP 地址
- 顶级域名服务器:顶级域名服务器负责管理在该顶级域名服务器下注册的所有二级域名,当收到 DNS 查询请求时就给出相应的回答(可能是最后的域名解析结果,也可能是下一级权限域名服务器的 IP 地址)
- 权限域名服务器:权限域名服务器负责管理某个区域的域名。每一个主机的域名都必须在某个权限域名服务器处登记。因此权限域名服务器知道其管辖的域名与 IP 地址的映射关系。另外,权限域名服务器还知道其下级域名服务器的地址
- 本地域名服务器:本地域名服务器不属于上述域名服务器的等级结构。当一个主机发出 DNS 请求报文时,这个报文就首先被送往该主机的本地域名服务器。本地域名服务器起着代理的作用,会将报文转发到上述的域名服务器等级结构中。每一个因特网服务提供者 ISP、一个大学、甚至一个大学的学院都可以拥有一个本地域名服务器,它有时也成为默认域名服务器。本地域名服务器离用户较近,一般不超过几个路由器的距离,也有可能就在同一个局域网中。本地域名服务器的 IP 地址需要直接配置在需要域名解析的主机中
-
域名解析方式:递归查询与迭代查询
注:为了提高 DNS 的查询效率,并减轻根域名服务器的负荷和减少因特网上的 DNS 查询报文数量,在域名服务器中广泛地使用了高速缓存,高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。不但在本地域名服务器中需要高速缓存,在用户主机中也同样需要。许多用户主机在启动时从本地域名服务器下载域名和 IP 地址的全部数据库,维护并存放主机最近使用的域名的高速缓存,并且只有在从缓存中找不到域名时才向本地域名服务器查询
6.4 文件传输协议 FTP
-
FTP:文件传输协议 FTP(
File Transfer Protocol
)允许客户指明文件的类型与格式,并允许文件具有存取权限。FTP 屏蔽了各计算机系统的细节,因而适用于在异构网络中的任意计算机之间传送文件。在因特网发展的早期阶段,用 FTP 传送文件约占整个因特网通信量的三分之一,到了 1995 年,万维网 www 的通信量才首次超过了 FTP。FTP 的常见用途是在计算机之间传输文件,尤其是用于批量传输文件。FTP 的另一个常见用途是让网站设计者将构成网站内容的大量文件上传到它们的 Web 服务器 -
FTP 的工作原理:
- FTP 服务器监听熟知端口号
21
,FTP 客户随机选择一个临时端口号与其建立 TCP 连接,这条 TCP 连接是 FTP 客户与服务器之间的命令通道 - 当有数据要传输时,FTP 客户通过命令通道告知 FTP 服务器来与自己的另一个临时端口号建立 TCP 连接即建立数据通道,FTP 使用自己的熟知端口号
20
与其建立 TCP 连接与构成数据通道(主动模式) - 控制连接在整个会话期间一直保持打开,用于传送 FTP 相关控制命令
- 数据连接用于文件传输,仅在每次需要传输文件时才建立,传输结束就关闭
- FTP 服务器监听熟知端口号
6.5 电子邮件
-
电子邮件系统的组成:用户代理(电子邮件客户端软件)、邮件服务器、电子邮件所需的协议(发送协议如 SMTP 和读取协议如 POP3)
-
电子邮件的信息格式:电子邮件的信息格式并不是由 SMTP 定义的,而是在 RFC 822 中单独定义的。这个 RFC 文档已在 2008 年更新为 RFC 5322。一个电子邮件由
信封和内容
两部分,而内容又由首部和主体
两部分构成 -
电子邮件的发送流程:
- 发件人将邮件发送到自己使用的邮件服务器
- 发件人的邮件服务器将收到的邮件按其目的地址转发到收件人邮件服务器中的收件人邮箱
- 收件人在方便的时候访问自己邮件服务器中的邮箱,获取收到的电子邮件
-
简单邮件传送协议 SMTP(
Simple Mail Transfer Protocol
)的基本工作原理:-
发送方的邮件服务器周期性地扫描邮件缓存,若发现存在待转发的邮件,则发送方邮件服务器中的 SMTP 客户会与接收方邮件服务器中的 SMTP 服务器进行 TCP 连接,使用熟知端口号
25
-
之后 SMTP 客户就可以基于这条 TCP 连接给 SMTP 服务器发送 SMTP 命令(
共 14 条
),SMTP 服务器也会给 SMTP 客户发送响应的应答(共 21 种
)。SMTP 客户与服务器之间通过命令与应答的交互方式最终实现 SMTP 客户将邮件发送给 SMTP 服务器
-
- 多用途因特网邮件扩展:SMTP 协议只能传送 ASCII 码文本数据,不能传送可执行文件或其它的二进制对象。为了解决此问题,提出了多用途因特网邮件扩展
MIME(Multipurpose Internet Mail Extensions)
。为了实现 MIME 的转换功能,MIME 增加了5 个新的邮件首部字段
,这些字段提供了有关邮件主体的信息。MIME 定义了许多邮件内容的格式,对多媒体电子邮件的标识方法进行了标准化,定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变。实际上,MIME 不仅仅使用于 SMTP,也用于同样面向 ASCII 字符的 HTTP
-
常见的邮件读取协议:
-
邮局协议 POP(
Post Office Protocol
):POP3 是其第三个版本,使用熟知端口号110
,是正式的因特网标准。POP3 是一个非常简单、功能有限的邮件读取协议。用户只能以下载并删除方式或下载并保留方式从邮件服务器下载邮件到用户计算机,不允许用户在邮件服务器上管理自己的邮件(如分类管理等) -
因特网邮件访问协议 IMAP(
Internet Message Access Protocol
):IMAP4 是其第四个版本,使用熟知端口号143
,目前还只是因特网建议标准。IMAP4 是功能比 POP3 更强大的邮件读取协议,用户在自己的计算机上就可以操控邮件系统中的邮箱,就像在本地操控一样,因此 IMAP 是一个联机协议
-
-
基于万维网的电子邮件:通过浏览器登录邮件服务器万维网网站就可以撰写、收发、阅读和管理电子邮件。这种工作模式与 IMAP 很类似,不同的是用户计算机无需安装专门的用户代理程序
6.6 万维网 www
-
万维网:万维网 WWW(
World Wide Web
)并非某种特殊的计算机网络,它是一个大规模的、联机式的信息储藏所,是运行在因特网上的一个分布式应用
。万维网利用网页之间的超链接将不同网站的网页链接成一张逻辑上的信息网。万维网是欧洲粒子物理实验室的Tim Berners-Lee
最初于 1989 年 3 月提出的 -
浏览器:浏览器最重要的部分是渲染引擎,也就是浏览器内核,负责对网页内容进行解析和显示
- 1993 年 2 月,第一个图形界面的浏览器
Mosaic
- 1995 年著名的
Netscape Navigator
浏览器上市
- 1993 年 2 月,第一个图形界面的浏览器
-
URL:为了方便地访问在世界范围内的文档,万维网使用统一资源定位符 URL 来指明因特网上任何种类 “资源” 的位置。URL 一般形式由以下四个部分组成:
协议://主机:端口:路径
-
HTTP:超文本传输协议 HTTP(
Hyper Text Transfer Protocol
)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及万维网服务器怎样把万维网文档传送给浏览器 -
HTTP 的两种连接方式:
HTTP/1.0
采用非持续连接方式。在该方式下,每次浏览器要请求一个文件都要与服务器建立 TCP 连接,当收到响应后就立即关闭连接。每次请求一个文档需要 2RTT 时间,若一个网页上有很多引用对象,那么请求每一个对象都需要花费 2RTT 时间。为了减小时延,浏览器通常会建立多个并行的 TCP 连接同时请求多个对象。但是,这会大量占用万维网服务器的资源,特别是万维网服务器往往要服务于大量客户的请求,这将加重服务器的负担
HTTP/1.1
采用持续连接方式。在该方式下,万维网服务器在发送响应后仍然保持这条 TCP 连接,该浏览器进程和服务器进程可以继续在这条连接上传送后续的 HTTP 请求和响应报文。这并不局限于传送同一个页面上的引用的对象,只要这些文档都在同一个服务器上就行。为了进一步提高效率,HTTP/1.1 的持续连接还可以使用流水线方式工作,即浏览器在收到 HTTP 的响应报文之前可以连续发送多个请求报文,这样一个接一个的请求报文到达服务器后,服务器就依次发回响应报文,这就节省了很多个 RTT 时间,使 TCP 连接中的空闲时间减少,提高了下载文档的效率
-
HTTP 报文格式:HTTP 是面向文本的,其报文中的每一个字段都是 ASCII 码串,并且每个字段的长度都是不确定的
-
HTTP 请求报文格式:
-
HTTP 响应报文格式:
-
-
HTTP 请求支持的方法:
方法 描述 GET 请求 URL 标志的文档 HEAD 请求 URL 标志文档的首部 POST 向服务器发送数据 PUT 在指明的 URL 下存储一个文档 DELETE 删除 URL 标志的文档 CONNECT 用于代理服务器 OPTIONS 请求一些选项信息 TRACE 用来进行环回测试 PATCH 对 PUT 方法的补充,用来对已知资源进行局部更新 -
HTTP 响应码:
状态码(五大类 33 种) 描述 1XX 表示通知信息,如请求收到了或正在进行处理 2XX 表示成功,如接受或知道了 3XX 表示重定向,即要完成请求还必须采取进一步行动 4XX 表示客户的差错,如请求中有错误的语法或不能完成 5XX 表示服务器的差错,如服务器无法完成请求 -
万维网缓存与代理服务器:万维网缓存又称为 Web 缓存(Web Cache),可位于客户机也可位于中间系统上,位于中间系统上的 Web 缓存又称为代理服务器(
Proxy Server
)