网络:网络由若干结点和链接这些结点的链路组成
互联网:多个网络间还可以通过路由器互连起来,这样就构成了一个范围更大的网络即互联网
因特网:Internet 因特网是世界上最大的互连网络(用户数以亿计,网络数数以百万计)
Internet 与 internet 的区别:
TCP/IP 协议族作为通信规则,其前身是美国的 ARPANET因特网发展的三个阶段:
1969:从单个网络 ARPANET 向互联网发展
1985:逐步建成三级结构的因特网
1993:逐步形成了多层次 ISP (Internet Service Provider)结构的因特网

因特网的标准化:因特网协会 ISOC 是一个国际性组织。它负责对因特网进行全面管理,以及在世界范围内促进其发展和使用。制订因特网的正式标准需要经过以下 4 个阶段:
因特网的组成:
定义:计算机网络的精确定义尚未统一,最简单的定义是:一些 互连的、自治的 计算机的集合
计算机网络的分类:

电路交换(Circuit Switching):电路交换机接通电话线的方式称为电路交换。交换就是按照某种方式动态地分配传输线路的资源。电路交换的三个步骤:建立连接(分配通信资源)、通话(一直占用通信资源)、释放连接(释放资源)

分组交换(Packet Switching):发送方:构造分组、发送分组;路由器:缓存分组、转发分组,简称 存储转发;接收方:接收分组、还原报文
报文交换(Message Switching):报文交换中的交换结点也采用存储转发的方式,但报文的大小没有限制,要求交换结点拥有较大的缓存空间。报文交换主要用于早期的电报通信网
| 常用数据量单位 | 常用数据量单位 |
|---|---|
| 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)
带宽:表示网络通信线路所能传送数据的能力,因此网络带宽表示网络中的 “最高数据率”
吞吐量:表示单位之间内通过某个网络(或信道、接口)的数据量
时延:发送时延 + 传播时延 + 处理时延
时延带宽积:传播时延 * 带宽,链路的时延带宽积又称为以 比特为单位的链路长度

往返时间 RTT(Round-Trip Time):双向交互一次所需的时间
利用率:
网络利用率:全网络信道利用率的加权平均
信道利用率:用来表示某信道有百分之几的时间是被利用的。根据 排队论,当某信道的利用率增大时,该信道引起的时延也会迅速增加,因而信道利用率并非越高越好。由下图得出结论:一些拥有极大主干网的 ISP 通常会控制它们的网络利用率不超过 50%,如果超过了就准备扩容,增大线路的带宽

丢包率:也称分组丢失率,是指在一定的时间范围内,传输过程中丢失的分组数量与总分组数量的比率。可细分为:接口丢包率、结点丢包率、链路丢包率、路径丢包率、网络丢包率等。丢包率反应了网络的拥塞情况
| 层(从下至上) | 开放系统互连参考模型(OSI) | TCP/IP 体系结构 | 原理体系结构 |
|---|---|---|---|
| 1 | 物理层 | 网络接口层 | 物理层 |
| 2 | 数据链路层 | 网际层 | 数据链路层 |
| 3 | 网络层 | 运输层 | 网络层 |
| 4 | 运输层 | 应用层 | 运输层 |
| 5 | 会话层 | 应用层 | |
| 6 | 表示层 | ||
| 7 | 应用层 |
注:OSI 是法律上的国际标志;四层 TCP/IP 体系结构是事实上的国际标志;五层原理体系结构更适用于学习

HTTP 请求报文:应用层

TCP 报文段:运输层给 HTTP 请求报文添加一个 TCP 首部使之成为 TCP 报文段

IP 数据报:网络层给 TCP 报文段添加一个 IP 首部使之成为 IP 数据报

帧:数据链路层给 IP 数据报添加一个帧首和一个帧尾使之成为 帧

比特流:物理层将帧视作比特流,并在比特流前添加 前导码

对等实体 进行逻辑通信的规则的集合。协议三要素:语法、语义、同步
协议 的控制下,两个 对等实体 间的逻辑通信使得本层能向上一层提供服务。协议是水平的,而服务是垂直的相邻两层 的实体交换信息的逻辑接口,用于区分不同的服务类型

同轴电缆:同轴电缆价格较贵且布线不够灵活,随着集线器的出现,在局域网领域基本上都是采用双绞线作为传输媒体
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 微米)

单模光纤和多模光纤:

串行传输:比特依次逐个发送,通信双方只需要一条通信线路
并行传输:依次发送 n 个比特,发送端和接收端需要有 n 条传输线路,传输速度是串行传输的 n 倍,但成本高
同步传输:数据块以稳定比特流的方式传输,字节之间没有间隔,接收端在每个比特的中间进行检测,判断接收到的是比特 0 还是。收发双发需要做到时钟同步,具体有以下两种方法:
异步传输:以字节为独立的传输单位,字节之间的时间间隔不固定,接收端仅在字节的起始处对字节的比特实现同步,因此需要在字节的前后分别加上起始位和结束位
单工通信:传输双方只有一个数据传输方向(无线电广播),只需要一条信道
半双工通信:通信双方可以相互传输数据,但不能同时进行(对讲机),需要两条信道
全双工通信:通信双方可以同时发送和接收信息(有线电话),需要两条信道
基带信号的编码与调制:计算机中的网卡将比特 0 和 1 变换成相应的电信号发送到网线,信号是数据的电磁表现。由信源发出的原始电信号称为 基带信号,基带信号又可分为 数字基带信号 和 模拟基带信号。在计算机网络中,常见的是将数字基带信号通过编码或调制的方法在相应信道上进行传输
编码:在不改变信号性质的前提下,仅对数字基带信号的波形进行变换,称为编码
调制:把数字基带信号的频率范围搬移到较高的频段并转换为模拟信号,称为调制
数字基带信号编码:编码后产生的信号仍为数字信号,可在数字信道中传输。如以太网使用曼彻斯特编码、4B/5B、8B/10B 等
数字基带信号调制:调制后产生的信号是模拟信号,可以在模拟信道中传输。如 WiFi 使用补码键控、直接序列扩频、正交频分复用等调制方法
模拟基带信号编码:对音频信号进行编码的脉码调制 PCM,也就是将模拟音频信号通过采用、量化、编码这三个步骤进行数字化
模拟基带信号调制:将语音数据加载到模拟的载波信号中传输,如传统电话、频分复用 FDM 技术

码元:在使用时间域的波形表示数字信号时,代表不同离散数值的基本波形

几种常用的编码方法:

基本调制方法:调幅、调频、调相。一个码元只能包含一个比特信息

混合调制方法:一个码元包含更多的比特信息。可以将相位和振幅结合起来一起调制,称为正交振幅调制 QAM。而频率是相位随时间的变化率,因而不能同时调制频率和相位。以下是混合调制方式的举例 - 正交振幅调制 QAM16:
QAM16 调制的波形可以有 12 种相位,每种相位有 1 或 2 种振幅可选。一共可以调制出 16 种码元(波形)

16 种码元中,每种码元可以包含 4(log216) 个比特信息。码元与 4 个比特的对应关系应采用 格雷码,即任意两个相邻码元只有 1 个比特不同

低通信道 的最高码元传输速率 = 2W Baud = 2W 码元/秒
带通信道 的最高码元传输速率 = W Baud = W 码元/秒高斯白噪声干扰 的信道的极限信息传输速率:c = W * log2(1 + S/N)
注:根据奈氏准则和香农公式,在信道带宽一定的情况下,要想提高信息的传输速率就必须采用多元制(更好的调制方法)和努力提高信道中的信噪比
链路(Link):从一个结点到相邻结点的一段物理线路,中间没有其它任何交换结点
数据链路(Data Link):把实现通信协议的硬件和软件加到链路上,数据链路层以帧为单位传输和处理数据
点对点数据链路层需要解决的三个重要问题:
封装成帧
差错检测
可靠传输
广播信道的数据链路层需要解决的五个问题:
CSMA/CD(载波监听多点接入/碰撞检测)CSMA/CA(载波监听多点接入/碰撞避免)封装成帧:数据链路层将上层交付的协议数据单元(来自网络层的 IP 数据报)添加帧头和帧尾使之成为帧
以太网 V2 版本 MAC 帧和 PPP 帧的格式:

物理层前导码:以太网 V2 版本的 MAC(Media Access Control)帧格式的帧头、帧尾中并没有包含 帧定界标志,故以太网的数据链路层封装好 MAC 帧后,将其交付给物理层。物理层会在 MAC 帧前面添加 8 字节的前导码,然后再将比特流转换为电信号发送。另外,以太网还规定了帧间间隔时间为 96 比特的发送时间,因而 MAC 帧并不需要帧结束定界符

最大传送单元:为了提高帧的传输效率,应当使帧的数据部分长度尽可能大,但考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元 MTC(Maximum Transfer Unit)
奇偶校验法
循环冗余校验 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
注:检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误。要想纠正传输中的差错,可以使用冗余信息更多的 纠错码 进行前向纠正,但纠错码开销很大,在计算机网络中很少使用
Bit Error Rate)
分组丢失:接收方收不到数据分组就不会发送 ACK(确认分组)和 NAK(否认分组),如果不采取适当措施,发送方就会一直处于等待接收方 ACK 或 NAK 的状态。采用超时重传机制解决此问题
超时重传:发送方在发送完一个数据分组后,启动一个超时计时器,若到了超时计时器设置的重传时间仍收不到接收方的 ACK 或 NAK,则重传原来的数据分组。一般可将重传时间选为略大于 “从发送方到接收方的平均往返时间”
分组重复:
停止 - 等待协议(Stop - and - Wait)的信道利用率:U = TD / (TD + RTT + TA)

回退 N 帧协议(GBN,Go - Back - N):该协议在流水线传输的基础上,利用发送窗口来限制发送方可连续发送的数据分组的个数
累计确认:接收方不一定要对收到的数据分组逐个发送 ACK,可以在收到几个分组后对按序到达的最后一个分组 ACK。ACKn 表示序号为 n 及其之前的所有数据分组均已被正确接收
传输存在差错的情况:如下图所示,尽管序号为 6,7,0,1 的数据分组已正确到达接收方,但由于 5 号数据分组存在误码不被接收方接受,它们也因此 “受到牵连” 而不被接受。发送方还需重传这些已发送且无差错的数据分组 6,7,0,1 ,这就是回退 N 帧协议名称的由来。可见,当通信线路质量不好时,回退 N 帧协议的信道利用率并不比停止 - 等待协议高

发送窗口 WT 取值不合理:若发送窗口尺寸 WT 的取值超过其上限,如例中 WT ∈ [0,7],故意取值 WT = 8,将导致接收方 无法分辨新、旧数据分组 这种传输差错

回退 N 帧存在的问题:回退 N 帧协议的接收窗口 WR = 1,因此接收方只能接收按序正确到达的数据分组,一个数据分组的误码就会导致其后序多个数据分组不能被接受方按序接收而丢弃,造成了通信资源的浪费
选择重传协议(Selective Request):在回退 N 帧协议的基础上,为了进一步提高性能,可设法只重传出现误码的数据分组。因此接收窗口的尺寸 WR 不应恒等于 1,而应合理取值,以便接收方先收下失序到达但无误码并且序号落在接收接收窗口内的那些数据分组,等到所缺数据分组收齐后再一并送交上层处理,这就是选择重选协议

逐一确认:选择重传协议为了使发送方仅重传出现差错的分组,接收方不能再采用累计确认,而需对每个正确接收到的数据分组进行逐一确认
点对点协议(Point - to - Point Protocol):点对点协议是目前使用最广泛的 点对点 数据链路层协议,使用 PPP 的数据链路层向上层不提供可靠传输服务。PPP 协议为在点对点链路中传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:
LCP,用于建立、配置以及测试数据链路的连接NCPs,其中的每一个协议支持不同的网络层协议PPP 点对点协议的帧格式:
0x7E0xFF,预留使用0x03,预留使用
PPP 协议的透明传输:
面向字节的异步链路采用插入转义字符的字节填充法,以下是发送方的处理过程:

面向比特的同步链路采用比特 0 的比特填充法:只要发现 5 个连续的比特 1,则立即填充 1 个比特 0

PPP 协议的工作状态:

媒体接入控制:共享信道着重需要考虑的一个问题就是如何协调多个发送和接收站点对同一个共享传输媒体的占用,即媒体接入控制 MAC(Medium Access Control)

静态划分信道:预先分配好信道,这类方法非常不灵活,对于突发性数据传输信道利用率会很低。通常在 无线网络 的 物理层中 使用,而不是在 数据链路层 中使用
集中控制的多点轮询协议:一个主站以循环方式轮询每个站点有无数据发送,只有被轮询到的站点才能发送数据,最大的缺点就是存在 单点故障问题
分散控制的令牌传递协议:各站点是平等的,并连接成一个环形网络。令牌(一种特殊的控制帧)沿环逐站传递,接收到令牌的站点才有权发送数据,并在发送完数据后将令牌传递给下一个站点。典型网络有:
受控接入:这种媒体接入控制方式已逐步退出历史舞台
随机接入:所有站点通过竞争,随机地在信道上发送数据。如果恰巧有两个或更多的站点在同一时刻发送数据,则信号在共享媒体上就要产生碰撞,将导致这些站点的数据发送都失败。因此,这类协议要解决的关键问题是如何 避免冲突 及在发送冲突后如何尽快恢复通信,著名的 共享式以太网 采用的就是随机接入
注:随着技术的发展,交换技术的日益成熟和设备成本的逐步降低,具有更高性能的使用 点对点链路的链路层交换机 的交换式局域网在 有线领域 已完全取代了共享式局域网。但由于无线信道的广播天性,无线局域网 仍然使用的是 共享媒体技术
频分复用(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
码片序列的挑选原则如下:
分配给每个站的码片序列必须各不相同,常采用 伪随机码序列
分配个每个站的码片序列必须 相互正交(规格化内积为 0)
码分多址应用举例:假设所有站所发送的码片序列都是同步的,接收站 D 知道其它各占所持有的码片序列。D 可对接收到的叠加信号进行判断,从而得出各站是否发送了数据以及发送的是比特 0 还是 1

复用与多址:
注:FDMA、TDMA、CDMA 是常见的物理层信道复用技术,属于静态划分信道,用于多用户共享信道,不会发生冲突
载波监听多址接入/碰撞检测:早期的以太网采用 CSMA/CD(Carrier Sense Multiple Access / Collision Detection) 协议来解决 共享信道的碰撞 问题
先听后说”):每一个站在发送帧之前先要检测一下总线上是否有其它站点在发送帧
边说边听”),一旦发现总线上出现碰撞,则立即停止发送,退避一段随机时间后再次发送(“一旦冲突,立即听说,等待时机,重新再说”)
强化碰撞:以太网还采取一种叫做强化碰撞的措施,即发送帧的站点一旦检测到碰撞,出了立即停止发送帧外,还要再继续发送 32 或 48 比特的人为干扰信号(Jamming Singal),以便有足够多的碰撞信号使所有站点都能检测出碰撞
争用期(碰撞窗口):主机最多经过 2t 的时长就可检测到本次发送是否遭受了碰撞,因而以太网的端到端的往返传播时间 2t 称为争用期或碰撞窗口

最大总线长度:显然,在以太网中发送帧的主机越多,端到端往返传播时延越大,发生碰撞的概率就越大。因此共享式以太网不能连接太多的主机,使用的总线也不能太长。10Mbps 的以太网把争用期定为 512 比特发送时间,即 51.2 微秒,因此其总线长度不能超过 5120m,但考虑到一些其它因素,如信号衰减等,以太网规定总线长度不能超过 2500m
最小帧长:以太网的最小帧长确保了主机可在帧发送完成之前就检测到该帧的发送过程中是否遭遇了碰撞
64 字节(不足则填充),即 512 比特。512 比特发送时间即为争用期最大帧长:
数据载荷 的最小长度不小于 46 字节,最大长度为 1500 字节最大帧长为 1518 字节,最小帧长为 64 字节
退避时间:使用 截断二进制指数退避算法 来计算退避时间,
CSMA/CD 协议的信道利用率:极限信道利用率 S = T0 / (T0 + t) = 1 / (1 + T0/t)。假定各主机发送帧都不会遭遇碰撞,总线一旦空闲就有某个主机立即发送帧
CSMA/CD 协议帧发送流程图:

CSMA/CD 协议帧接收流程图:

注:CSMA/CD 协议曾经用于各种总线结构的以太网和双绞线以太网的早期版本中。现在的以太网基于 交换机和全双工连接,不会产生碰撞,因此没有必要使用 CSMA/CD 协议
无线局域网中不能使用 CSMA/CD 的原因:
硬件要求:无线信道传输条件特殊,其信号强度的动态范围非常大,无线网卡上接收到的信号强度往往会小于发送信号的强度,如果要在无线网卡上实现碰撞检测,对硬件的要求非常高
隐蔽站问题:即使能够在硬件上实现无线局域网的碰撞检测功能,但由于无线电波传输的特殊性(存在隐蔽站问题),进行碰撞检测没有意义

载波监听多址接入/碰撞避免:802.11 无线局域网 使用 CSMA/CA(Carrier Sense Multiple Access / Collision Avoidance)协议来解决无线信道的碰撞问题,不再实现 CAMA/CA 的碰撞检测功能。由于不可能避免所有的碰撞,并且无线信道误码率较高,因而 802.11 标准还在 数据链路层使用了确认机制(停止 - 等待协议)来保证数据被正确接收
802.11 的媒体接入控制标准定义了两种不同的媒体接入方式:
Distributed Coordination Function)。在 DCF 方式下,没有中心控制站点,每个站点使用 CSMA/CA 协议通过 争用信道 来获取发送权,这是 802.11 的默认方式Point Coordination Function)。PCF 方式使用集中控制的接入算法(一般在接入点 AP 实现集中控制),是 802.11 定义的可选方式,在实际中较少使用帧间间隔 IFS(Inter Frame Space):802.11 标准规定所有的站点必须在持续检测到信道空闲一段时间后才能发送帧,这段时间称为帧间间隔 IFS。帧间间隔的长短取决于该站点要发送的帧类型:
常见的两种帧间间隔:
28 µs):最短的帧间间隔,用来分隔属于一次对话的各帧。一个站点应当能够在这段时间内从发送模式切换到接收模式。使用 SIFS 的帧类型有:
128 µs):它比短帧间间隔 SIFS 要长得多,在 DCF 方式中用来发送数据帧和管理帧CSMA/CA 的工作原理:

CAMA/CA 的退避时间:
不使用退避算法的情况:当站点检测到信道是空闲的,并且上一个成功发送的数据帧不是本站所发送的,则不使用退避算法
必须使用退避算法的情况:
随机退避时间:在执行退避算法时,站点需为退避计时器设置一个随机的退避时间
当退避计时器的时间减小到零时,就开始发送数据
当退避计时器的时间还未减小到零时而信道又转变为忙状态,这时就冻结退避计时器的数据,重新等待信道变为空闲,再经过 DIFS 后,继续启动退避计时器
在进行第 i 次退避时,退避时间在时隙编号 {0, 1, …, 22+i - 1} 中随机选择一个,然后乘以基本退避时间(争用期)就可以得到随机退避时间。这样做的目的是为了使不同站点选择相同退避时间的概率减小。当 时隙编号 达到 255 (对应于第 6 次退避)后就不再增加了

CAMA/CA 协议的信道预约:为了尽可能较小碰撞的概率和降低碰撞的影响,802.11 标准允许要发送数据帧的站点对信道进行预约
请求发送 RTS(Request To Send),它包括源地址、目的地址以及这次通信所需的时间。如果 RTS 帧发生碰撞,源站就收不到 CTS 帧,源站需执行退避算法重传 RTS 帧允许发送 CTS(Clear To Send),它也包括这次通信所需的持续时间(从 RTS 中复制)
注:由于 RTS 和 CTS 帧很短,发生碰撞的概率、碰撞产生的开销以及本身发送的开销都很小,而对于一般的数据帧,其发送时延往往大于传播时延,碰撞的概率很大,且一旦发生碰撞将导致数据帧重发,浪费的时间会更多,因此用很小的代价对信道进行预约往往是值得的。802.11 标准规定了 3 种情况供用户选择:
CAMA/CA 协议的虚拟载波监听:除 RTS 帧和 CTS 帧会携带通信需要持续的时间外,数据帧也能携带通信需要的持续时间。由于利用虚拟载波监听机制,站点只要监听到 RTS 帧、CTS 帧或数据帧中的任何一个,就能知道信道被占用的持续时间,而不需要真正监听信道上的信号,因此虚拟载波监听机制能减少隐蔽站带来的碰撞问题
Media Access Control) 地址:一般被固化在网卡(网络适配器)的 电可擦可编程只读存储器 EEPROM 中,因此 MAC 地址也称为硬件地址,习惯上也称物理地址。一般情况下,用户主机会包含两个网络适配器:有线局域网适配器(有线网卡)和无线局域网适配器(无线网卡),每个网卡都配置有一个全球唯一的 MAC 地址,而交换机和路由器往往拥有更多的网络接口,所有会拥有更多的 MAC 地址。综上所述,严格来说 MAC 地址是对 网络上各接口 的唯一标识,而不是对网络上各设备的唯一标识
MAC 地址的四种类型:全球管理多播地址、全球管理单播地址、本地管理多播地址、本地管理单播地址
FF-FF-FF-FF-FF-FF
IEEE 802 局域网 MAC 地址格式:

IP 地址属于 TCP/IP 体系结构的网际层,是因特网(Internet)上的主机和路由器所使用的地址,用于标识两部分内容:
分组转发过程中 IP 地址与 MAC 地址的变化情况:

ARP(Address Resolution Protocol) 协议属于 TCP/IP 体系结构的网际层,其作用是根据已知的设备 IP 地址获取设备的 MAC(Media Access Control) 地址
ARP 的两种报文:
FF-FF-FF-FF-FF-FFWindows 系统下查看自己主机的 ARP 高速缓存表:

注:ARP 协议只能在一段链路上或一个网络上使用,而不能跨网络使用
早期的总线型以太网(已淘汰)

使用双绞线和 集线器(HUB)的星型以太网

集线器式以太网的特点:
逻辑上仍是一个总线型网络,各站共享资源,使用的还是 CSMA/CD 协议
集线器只工作在物理层,它的每个接口仅简单地转发比特,不进行碰撞检测(由各站的网卡检测)
集线器一般都有少量的容错能力和网络管理能力
使用集线器在物理层扩展以太网,形成了更大的冲突域和广播域

交换机式以太网的特点:
通常具有多个不同速率的接口,每个接口可以与一台主机或另一个以太网交换机相连,一般都工作在全双工模式
具有并行性,能同时连通多对接口,使多对主机同时通信,无碰撞(不使用 CSMA/CD)
工作在数据链路层(也包括物理层),收到帧后在帧交换表中查找帧目的 MAC 地址所对应的接口号,然后通过接口转发该帧
帧转发的两种方式:存储转发 和 直通交换(基于硬件的交叉矩阵:交换时延小、但不检查帧是否有差错)
使用交换机在数据链路层扩展以太网,扩大了广播域,但隔离了碰撞域

以太网交换机自学习和转发帧的流程(建立帧交换表):

以太网交换机生成树协议 STP:
Spanning Tree Protocol)保证在增加冗余链路提高网络可靠性的同时又避免网络环路带来的各种问题交换机式以太网存在的问题:以太网交换机工作在数据链路层(也包括物理层,也存在三层交换机),使用一个或多个以太网交换机互连起来的交换式以太网,其所有站点都属于同一个广播域。随着交换式以太网规模的扩大,广播域相应扩大。巨大的广播域存在广播风暴、难以维护和管理等问题
分割广播域的方法:
VLAN,Virtual Local Area Network):一种将局域网内的设备划分为与物理位置无关的逻辑组的技术,这些逻辑组具有某些共同特征虚拟局域网 VLAN 的实现机制:虚拟局域网技术 VLAN 是在交换机上实现的,要求交换机实现以下功能:
IEEE 802.1Q 帧IEEE 802.1Q 帧:也称 Dot One Q 帧,对以太网的 MAC 帧格式进行了扩展,插入了 4 字节的 VALN 标记
12 比特称为 VLAN 标识符 VID,它唯一地标识了以太网帧属于哪一个 VLAN
交换机对 802.1 Q 帧的处理流程:
交换机的三种端口:
Access:一般用于连接 用户计算机,Access 端口只能属于一个 VLAN,端口的 PVID 值与所属 VLAN 的 VID 相同(默认为 1)
Trunk:一般用于交换机之间或交换机与路由器之间的互连,Trunk 端口可以属于多个 VLAN,用户可以设置 Trunk 端口的 PVID 值(默认为 1)

Hybrid:既可用于交换机之间或交换机与路由器之间的互连(Trunk),也可用于交换机与用户计算机之间的互连(Access)。Hybrid 端口可以属于多个 VLAN,用户可以设置 Hybrid 端口的 PVID 值(默认为 1)
网络层需要解决的主要问题:
网际层:因特网(Internet)是目前全世界用户数量最多的互联网,使用四层协议体系的 TCP/IP 协议栈。由于 TCP/IP 协议栈的网络层使用网际协议 IP,它是整个协议栈的核心协议,因此在 TCP/IP 协议栈中的网络层常称为网际层

网络层提供的两种服务:
网络自身 来保证,计算机通信时应先建立网络层的连接 - 虚电路 VC(Virtual Circuit),通信双方沿着已建立的虚电路发送分组。虚电路只是一条 逻辑 上的连接,分组沿着这条逻辑连接按照存储转发方式传送,通信结束后需要释放之前所建立的虚电路
广域分组交换网 都是用面向连接的虚电路服务。如曾经的 X.25 和逐渐过时的帧中继 FR、异步传输模式 ATM 等用户主机 来保证,通信双方不需要建立网络层连接。由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,造价低廉
IPv4:IPv4 地址就是给因特网上的每台主机(或路由器的每一个接口)分配一个在全世界范围内唯一的 32 比特的标识符
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.001111111 即 127 作为本地环回测试地址,既可以作为源地址使用,也可以作为目的地址使用,不指派B 类地址:
C 类地址:

注:
255.255.255.255 只能作为目的地址使用,表示 “只在本网络上进行广播,各路由器均不转发”子网掩码:32 比特的子网掩码可以表明分类 IP 地址的 主机号部分 被借用了几个比特作为子网号
网络号和子网号,使用连续的比特 0 来对应 主机号IPv4 地址 & 子网掩码子网掩码例题:某个网络的地址为 218.75.230.0,使用子网掩码 255.255.255.128 进行子网划分,请给出划分细节
解:子网掩码 255.255.255.128 = 255.255.255.10000000,3 个 255(14 个连续的比特 1)对应网络号部分,一个比特 1 表示从主机号中借用一个比特作为子网号

默认子网掩码:指在未划分子网的情况下使用的子网掩码
使用子网掩码划分网络子网后仍然存在的问题:划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的 C 类网因为其地址空间太小并没有得到充分利用,而因特网的 IP 地址仍在加速消耗,整个 IPv4 地址空间面临全部耗尽的威胁。为此,因特网工程任务组 IETF 提出了采用 无分类编址 的方法来解决 IP 地址紧张的问题。1993 年,IETF 发布了无分类域间路由选择 CIDR(Classless Inter-Domain Routing)的 RFC 文档:
无分类编址:CIDR 使用 “斜线记法”,或称 CIDR 记法,即在 IPv4 地址后面加上斜线 “/” 并在斜线后写上网络前缀 所占的比特数量。CIDR 实际上是将网络前缀都相同的连续的 IP 地址组成一个 “CIDR” 地址块
路由聚合构造超网:找共同前缀

定长的子网掩码(Fixed Length Subnet Mask):使用同一个子网掩码来划分子网,每个子网所分配的 IP 地址数量相同,容易造成 IP 地址的浪费

变长的子网掩码(Variable Length Subne Mask):使用不同的子网掩码来划分子网,每个子网所分配的 IP 地址数量不同,尽可能较少对 IP 地址的浪费(根据网络中所需 IP 地址数量确定地址掩码)

默认网关:为了让本网络中的主机能和其它网络中的主机进行通信,就必须给主机指定本网络中的一个路由器,由该路由器帮忙转发分组从而实现跨网络通信,指定的路由器也称 默认网关
路由器收到 IP 数据报后的转发流程:
路由表:
| 目的网络 | 地址掩码 | 下一跳 |
|---|
中继器、集线器、网桥、交换机和路由器间的对比:
| 中继器 | 集线器 | 网桥 | 交换机 | 路由器 | |
|---|---|---|---|---|---|
| 工作层次 | 物理层 | 物理层 | 数据链路层 | 数据链路层 | 网络层 |
| 隔离碰撞域 | 否 | 否 | 是 | 是 | 是 |
| 隔离广播域 | 否 | 否 | 否 | 否 | 是 |
注:IP 路由器工作在 TCP/IP 体系结构的网际层,该层并不负责可靠传输,也就是不能确保传输 IP 分组不丢失。IP 路由器对收到的 IP 分组头进行差错检测,当发现错误时会丢弃该 IP 分组并向源主机发送 ICMP 差错报告报文。路由器隔离广播域,默认不转发广播数据报
TTL 字段。IP 数据报进入路由器后,TTL 字段的值减 1,若 TTL != 0,则被路由器转发,否则被丢弃null0因特网所采用的路由选择协议的主要特点:
Autonomous System)常用的路由选择协议:

常用内部网关协议和外部网关协议:

路由器的基本结构:

路由信息协议:路由信息协议 RIP(Routing Information Protocol)是内部网关协议中最早得到广泛使用的协议之一,其要求自治系统 AS 内的每一个路由器都要维护从它自己到 AS 内其它每一个网络的距离。这是一距离,称为 “距离向量”。RIP 使用跳数(Hop Count)作为度量来衡量到达目的网络的距离
路由收敛:

RIP 路由条目的更新规则:

RIP 中坏消息传得慢问题:坏消息传播得慢又称为 路由环路 或 距离无穷计数 问题,这是距离向量算法的一个固有问题。可以采取以下措施减小该问题出现的概率:

开放最短路径:开放最短路径优先 OSPF(Open Shortest Path First)是为克服 RIP 的缺点在 1989 年开发出来的。 “开放” 表明 OSPF 协议是公开发表的,“最短路径优先“ 是因为使用了 Dijkstra 提出的最短路径算法
OSPF 维护邻居关系:OSPF 相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系
224.0.0.5
链路状态通告:使用 OSPF 的每个路由器都会产生链路状态通告 LSA(Link State Advertisement),其中包含了直连网络和邻居路由器的链路状态信息
链路状态更新分组 LSU 中,采用 洪泛法发送链路状态数据库 LSDB,用于存储 LSAOSPF 的五种分组类型:

指定路由器 DR:当 OSPF 路由器在多点接入网络中建立邻居关系时,如不采用其它机制将会产生大量的多播分组。为了减少所发送分组的数量, OSPF 采用指定路由器 DR(Designated Router) 和备用指定路由器 BDR(Backup Designated Router) 的方法。所有的非 DR/BDR 只与 DR/BDR 建立邻居关系,非 DR/BDR 之间不能直接交换信息,只能通过 DR/BDR 间接交换信息

区域 Area:为了使 OSPF 能够用于规模很大的网络,OSPF 把一个自治系统 AS 再划分为若干个更小的范围,称为区域(Area)
主干区域 的标识符必须为 0200 个路由器
边界网关协议:边界网关协议 BGP(Border Gateway Protocol)力求寻找一条能够到达目的网络的比较好的路由(不兜圈子),而并非要寻找一条最佳路由
BGP 的基本工作原理:
选定 BGP 发言人:在配置 BGP 时,每个自治系统的管理员需要选择至少一个路由器作为该自治系统的 ”BGP 发言人“,不同自治系统的 BGP 发言人要互相交换路由信息(通过建立 TCP 连接,端口号为 179)
运行自己的内部网关协议:BGP 发言人除了运行 BGP 外,还必须运行自己所在 AS 所使用的内部网关协议,如 OSPF 或 RIP

BGP 发言人交换网络可达性信息(到达某个网络所要经过的一系列自治系统)

当 BGP 发言人互相交换了网络可达性信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找到到达各自治系统的较好的路由,也就是构造出树形结构、不存在回路的自治系统连通图
BGP-4 中规定的四种报文:

版本:占 4 比特,表示 IP 协议版本。通信双发要求版本一致,目前广泛使用的 IPv4
首部长度:占 4 比特,表示 IP 数据报 首部 的长度。该字段的取值 以 4 字节为单位
可选字段:长度从 1 ~ 40 字节不等,用来支持排错、测量及安全等措施。可选字段增加了 IP 数据报的功能,但这同时使得 IP 数据报的首部长度成为可变的,增加了每一个路由器处理 IP 数据报的开销,实际上很少被使用
填充字段:该字段用来确保 首部长度为 4 字节的整数倍,不足时使用全 0 进行填充
区分服务:占 8 比特,用来获得更好的服务。该字段在旧标准中叫做服务类型,但实际上一直没有被使用。1998 年因特网工程任务组 IETF 将服务类型改名为区分服务,不同的数值可提供不同的等级服务指令,一般情况下都不使用该字段
总长度:占 16 比特,表示 IP 数据报的总长度(首部长度 + 数据载荷)。最大取值为十进制的 65535,以字节为单位
标识、标志、片偏移:这三个字段共同用于 IP 数据报的分片。IP 数据报在数据链路层封装成帧,每一个数据链路层协议都规定了帧的数据载荷的最大长度,称为最大传输单元 MTU。如以太网的数据链路层规定 MTU 的值为 1500 字节,如果某个 IP 数据报的总长度超过 MTU 时将无法封装成帧,需要将原 IP 数据报分片为更小的 IP 数据报,再将各 IP 数据报封装成帧
DF:1 - 不允许分片;0 - 允许分片MF:1 - 后面还有分片;0 - 最后一个分片保留位:必须为 0数据载荷部分 偏移其在原数据报的位置有多少个单位(整数),以 8 字节为单位
生存时间 TTL:占 8 比特。用于防止 IP 数据报在网络中永久兜圈
协议:占 8 比特,指明 IPv4 数据报的 数据载荷部分 使用的是何种协议数据单元 PDU
| 协议名称 | ICMP | IGMP | TCP | UDP | IPv6 | OSPF |
|---|---|---|---|---|---|---|
| 字段值 | 1 | 2 | 6 | 17 | 41 | 89 |
首部检验和:占 16 比特,也称因特网检验和。用来检测首部在传输过程中是否出现差错,比 CRC 校验码简单。IP 数据报每经过一个路由器,路由器都会重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生了变化。由于 网际层本身并不提供可靠传输服务,并且计算首部检验和是一项耗时的工作,因此在 IPv6 中路由器不再计算首部检验和,从而更快转发 IP 数据报
网际控制报文协议:为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP(Internet Control Message Protocol),主机或路由器使用 ICMP 来发送差错报告报文和询问报文,ICMP 报文直接封装在 IP 数据报中发送
五种 ICMP 差错报告报文:
终点不可达:当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据 ICMP 的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络位置、目的主机未知等 13 种错误
源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢
时间超过:
当路由器收到一个目的 IP 地址不是自己的 IP 数据报,就会将其生存时间 TTL 字段值减 1,若结果不为 0 则转发该数据报,否则丢弃该数据报后需要向源点发送时间超过报文
当终点在预先规定的时间内不能收到一个数据报的全部数据报分片时,就将已收到的数据报片全部丢弃,并向源点发送时间超过报文
参数问题:当路由器或目的主机收到 IP 数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报并向源点发送参数问题报文
改变路由(重定向):路由器把改变路由报文发送给主机,让主机知晓下次应将数据报发送给另外的路由器(更好的路由)
以下情况不应发送 ICMP 差错报告报文:
常用的 ICMP 询问报文:
ICMP 的典型应用:
分组网间探测 PING(Packet Internet Groper):用来测试主机或路由器间的连通性,应用层直接使用网际层的 ICMP(没有经过运输层的 TCP 或 UDP)。使用 ICMP 回送请求和回答报文

跟踪路由(Trace Route):用来测试 IP 数据报从源主机到达目的主机要经过哪些路由器。实现原理是通过设置 IP 数据报首部中生存时间 TTL 的值从而实现各路由器向源主机发送 ICMP 的差错报告报文(时间超过)
tracert。应用层直接使用网际层的 ICMP、使用了 ICMP 回送请求和回答以及差错报告报文traceroute。在运输层使用 UDP 协议、仅使用 ICMP 差错报告报文
VPN:虚拟专用网 VPN(Virtual Private Networ),也称 IP 隧道技术。由于 IPv4 地址的紧缺,一个机构能申请到的 IPv4 地址数量往往远小于本机构所拥有的主机数量,因而虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的共有地址。可利用公用的因特网作为本机构各专用网之间的通信载体

专用(私有)地址:私有地址仅用作本地地址而不能用作全球地址,因特网中的所有路由器对目的地址为私有地址的 IP 数据报一律不转发
VPN 的分类:
网络地址转换: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 穿透技术来解决问题
端对端通信:计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互连起来的问题,实现了 主机到主机 的通信。但实际上计算机网络中进行通信的真正实体时位于通信两端主机中的进程。如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务,运输层协议又称为端到端协议
端口号: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 体系的应用层常用协议所使用的熟知端口号:

发送方的复用和接收方的分用:

用户数据报协议 UDP(User Datagram Protocol)和传输控制协议 TCP(Transmission Control Protocol)
| UDP | TCP | |
|---|---|---|
| 有无连接 | 无连接(随时发送数据) | 面向连接(三报文握手,四报文挥手) |
| 通信方式 | 单播(一对一)、多播(一对多)、广播(一对全) | 单播(一对一) |
| 报文处理 | 面向应用报文(既不合并也不拆分) | 面向字节流(依据字节流封装 TCP 报文段) |
| 传输可靠 | 无连接不可靠的传输服务 | 面向连接可靠的传输服务 |
| 应用场景 | 实时应用,如 IP 电话、视频会议等 | 可靠传输,如文件传输 |
| 首部大小 | 8 字节 | 最小 20 字节,最大 60 字节(40 字节可选) |
UDP 和 TCP 对报文的处理:

UDP 和 TCP 首部格式:

流量控制:所谓流量控制(Flow Control)就是让发送方的发送速率不要太快,要让接收方来得及接收。利用 滑动窗口机制 可以很方便地在 TCP 连接上实现对发送方的流量控制
TCP 流量控制:例中假设 A 发送的每个 TCP 数据报文段可携带 100 字节数据。接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小
序号 字段标志位。取值 1 表示这是一个确认报文段确认号 字段。取值 201 表示 201 号之前的数据已全部正确接收窗口 字段。取值 300 表示接收方的接收窗口大小为 300
TCP 流量控制之零窗口探测报文的发送与重传:TCP 发送方收到接收方的零窗口通知后,启动持续计时器,若持续计时器超时则发送零窗口探测报文。零窗口探测报文也存在持续计时器,超时后重传零窗口探测报文

为方便研究拥塞控制算法的基本原理,假定条件如下:
- 数据沿单方向传送,而另一个方向只传送确认
- 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度确定(不进行流量控制)
- 以最大报文段的个数为单位讨论问题,而不是以字节为单位
发送窗口(swnd)、拥塞窗口(cwnd)、慢开始门限(ssthresh):
- 发送方维护一个拥塞窗口变量,其值取决于网络的拥塞程度且动态变化。发送方将拥塞窗口作为发送窗口,即
swnd = cwnd
- cwnd 的变化原则:网络未出现拥塞就增大一些,出现拥塞(发生超时重传)就减小一些
- 发送方维护一个慢开始门限状态变量 ssthresh:
- cwnd < ssthresh:使用慢开始算法
- cwnd > ssthresh:停止使用慢开始算法而改用拥塞避免算法
- cwnd = ssthresh:既可以使用慢开始算法,也可以使用拥塞避免算法
- 传输轮次:发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间就是 RTT
慢开始(Slow-Start):一开始向网络注入的报文段少,并不是指拥塞窗口 cwnd 增长速度慢
cwnd = cwnd * 2拥塞避免(Congestion Avoidance):并非指完全能避免拥塞,只是使网络比较不容易出现拥塞
cwnd = cwnd + 1ssthresh = cwnd / 2; cwnd = 1,重新执行慢开始算法
注:慢开始算法和拥塞避免算法是 1988 年提出的 TCP 拥塞控制算法(TCP Tahoe 版本),1990 年又增加了两个新的拥塞控制算法以改进 TCP 的性能,这就是快重传和快恢复(TCP Reno 版本)
快重传(Fast Retransmit):使发送方尽快进行重传,而不是等重传计时器超时后再重传。对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了网络拥塞,使用快重传算法可以使整个网络的吞吐量提高约 20%
3 个连续的重复确认,就将相应的报文段立即重传,而不是等重传计时器超时后再重传
快恢复(Fast Recovery):发送方一旦收到 3 个重复确认,就知道现在只是丢失了个别报文段。不启动慢开始算法,转而执行快恢复算法
发送方将 ssthresh = swnd /2 ; cwnd = swnd / 2,开始执行拥塞避免算法
有的快恢复实现将 ssthresh = swnd / 2; cwnd = ssthresh + 3,开始执行拥塞避免算法。这是因为既然发送方收到 3 个重复的确认,就表明有 3 个数据报文段已经离开了网络,这 3 个报文段不再消耗网络资源而是停留在接收方的接收缓存中,因而可以适当把拥塞窗口的值扩大些

加权平均往返时间 RTTs。利用每次测量得到的往返时间 RTT 样本,可计算出加权平均往返时间 RTTs(又称为平滑的往返时间)

TCP 基于以字节为单位的滑动窗口来实现可靠传输:
虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻发送方的发送窗口并不总是和接收方的接收窗口一样大
网络传送窗口值需要一定时间
发送方根据网络拥塞情况适当减小了自己的发送窗口尺寸
对于未按序到达的数据 TCP 并未明确规定如何处理,可一律丢弃(浪费通信资源)也可暂存接收窗口缓存中并等待缺失的字节数据
TCP 要求接收方必须有累计确认和捎带确认机制,这样做可以减小传输开销
接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传。TCP 规定确认推迟的时间不应超过 0.5s。若连续收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认
捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据
TCP 通信是全双工通信,每一方都可以在边发送数据和边接收报文段,因而每一方均有自己的发送窗口和接收窗口

TCP 连接建立要解决以下三个问题:
TCP “三报文握手” 建立连接过程:
SYS-SENT)状态,这称为主动打开连接
不能携带数据但要消耗掉一个序号SYN-RCVD)
SYN = 1 && ACK = 1 表明这是一个 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();
}
}
客户进程主动申请关闭 TCP 连接,向 TCP 服务发送连接释放报文段,并进入终止等待 1 状态(FIN-WAIT-1)
FIN = 1 && ACK = 1 表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。TCP 规定 FIN = 1 的报文段即使不携带数据也要消耗掉一个序号服务器进程收到客户端的释放连接请求报文段后,向客户进程发送一个普通的 确认报文段 并进入关闭等待状态(CLOSE-WAIT)。然后通知高层应用进程,TCP 客户进程想要断开与自己的 TCP 连接。此时 客户端 -> 服务器 连接已释放,这时的 TCP 连接处于半关闭状态,也即 TCP 客户进程已没有数据需要发送,但服务器进程若有数据需要发送仍可继续发送,客户进程仍要接收,此状态可能会持续一段时间
TCP 客户进程收到 TCP 确认报文段后就进入终止等待 2 (FIN-WAIT-2)状态,等待 TCP 服务器进程发出的 TCP 连接释放报文段
一段时间后,服务器进程的应用进程再无数据需要传输,就通知 TCP 进程释放连接。TCP 服务进程发送 TCP 释放报文端并进入最后确认状态(LAST-ACK)
释放报文段的重复确认TCP 客户进程收到 TCP 连接释放报文段后,必须针对该报文段发送普通的 TCP 确认报文段,之后进入时间等待状态(TIME-WAIT)。TCP 服务器进程收到报文段后就进入关闭状态(CLOSED),而 TCP 客户进程还要经过 2MSL(Maximum Segment Lifetime,最长报文段寿命,RFC 793 建议为 2 分钟) 后才能进入关闭状态,这么做的目的是确保 TCP 服务器进程可以收到最后一个 TCP 确认报文段从而进入关闭状态,而且可以保证本次连接持续时间内所产生的所有报文段都从网络中消失,确保下一个 TCP 连接是全新的连接

注:TCP 服务器进程每收到一次 TCP 客户进程的数据,就重置并启动保活计时器(2h)。若保活计时器定时周期内未收到 TCP 客户进程发来的数据,则当保活计时器到时后,TCP 服务器就向 TCP 客户进程发送一个探测报文段,以后每隔 75s 发送一次,若连续 10 个探测报文段后仍无 TCP 客户进程的响应,TCP 服务器进程就认为 TCP 客户进程所在的主机出现了故障,接着就释放这个 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 的功能
填充:由于选项长度可变,因此使用填充 0 来确保报文段首部能被 4 整除(因为数据偏移字段也就是首部长度字段是以 4 字节为单位的)
网络应用程序运行在处于网络边缘的不同的端系统上,通过彼此间的通信来共同完成某项任务。开发一种新的网络应用首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和他们之间的关系,目前主要有以下两种方式:
客户/服务器(Client/Server,C/S)方式
客户、服务器指通信过程中涉及的两个应用进程,C/S 描述的是进程之间服务与被服务的关系
服务总是处于运行状态,并等待客户的服务请求。服务器具有固定的端口号,而运行服务器的主机也具有固定的 IP 地址
对等(Peer-to-Peer,P2P)方式
在 P2P 方式中,没有固定的服务请求者和服务提供者,分布在网络边缘各端系统中的应用进程是对等的,被称为对等方。对等方相互之间直接通信,每个对等方既是服务的请求者又是服务的提供者
流行的 P2P 应用:P2P 文件共享、即时通信、P2P 流媒体、分布式存储等
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 OFFER)会使用 ARP 来确保所选 IP 地址未被网络中的其它主机占用)封装该 DCHP 提供报文的 IP 数据报的源 IP 地址为 DHCP 服务器的 IP 地址,目的 IP 地址仍为广播地址 255.255.255.255
DHCP 客户收到 DHCP 服务器的提供报文后,会根据报文中的事物 ID 来判断该报文是否是自己所请求的报文,提供报文中含有重要的配置信息如 IP 地址、子网掩码、地址租期、默认网关、DNS 服务器等。DHCP 客户向所选择的 DHCP 服务器发送 DHCP 请求报文(DHCP REQUEST)。DHCP 请求报文中封装有事物 ID、DHCP 客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器的 IP 地址等信息
0.0.0.0(因为此时 DHCP 客户才从多个 DHCP 服务器中挑选一个作为自己的 DHCP 服务器,它首先需要争得该服务器的同意,之后才能正式使用该 DHCP 服务器租用的 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 NACK),这时 DHCP 客户应立即停止使用租用到的 IP 地址并重新广播发送 DHCP 发现报文来重新申请 IP 地址DHCP 客户可随时提前终止 DHCP 服务器所提供的租用期,这时只需向 DHCP 服务器发送 DHCP 释放报文段 即可

注:使用 DCHP 中继代理的主要原因是我们并不愿意在每一个网络上都设置一个 DHCP 服务器,这样将导致网络中的 DHCP 服务器过多

分布式域名系统:在 1983 年,因特网就开始采用层次结构命名树作为主机的名字(即域名),并使用分布式域名系统 DNS。DNS 时大多数域名都在本地解析,仅少量解析需要在因特网上通信,因而效率很高。DNS 报文使用运输层的 UDP 协议进行封装,运输层端口号为 53
域名结构:
英文字母和数字 组成,不超过 63 个字符,不区分大小写字母。域名系统既不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思。各级域名由其上一级的域名管理机构管理,顶级域名由 因特网名称与数字地址分配机构 ICANN 进行管理255 个字符顶级域名(Top Level Domain):
国家顶级域名 nTLD:采用 ISO3166 的规定
通用顶级域名 gTLD:
反向域 arpa:用于反向域名解析,即 IP 地址反向解析为域名
我国的二级域名划分:
类别域名:
行政区域名:
域名服务器的四种类型:
域名解析方式:递归查询与迭代查询

注:为了提高 DNS 的查询效率,并减轻根域名服务器的负荷和减少因特网上的 DNS 查询报文数量,在域名服务器中广泛地使用了高速缓存,高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。不但在本地域名服务器中需要高速缓存,在用户主机中也同样需要。许多用户主机在启动时从本地域名服务器下载域名和 IP 地址的全部数据库,维护并存放主机最近使用的域名的高速缓存,并且只有在从缓存中找不到域名时才向本地域名服务器查询
FTP:文件传输协议 FTP(File Transfer Protocol)允许客户指明文件的类型与格式,并允许文件具有存取权限。FTP 屏蔽了各计算机系统的细节,因而适用于在异构网络中的任意计算机之间传送文件。在因特网发展的早期阶段,用 FTP 传送文件约占整个因特网通信量的三分之一,到了 1995 年,万维网 www 的通信量才首次超过了 FTP。FTP 的常见用途是在计算机之间传输文件,尤其是用于批量传输文件。FTP 的另一个常见用途是让网站设计者将构成网站内容的大量文件上传到它们的 Web 服务器
FTP 的工作原理:
21,FTP 客户随机选择一个临时端口号与其建立 TCP 连接,这条 TCP 连接是 FTP 客户与服务器之间的命令通道20 与其建立 TCP 连接与构成数据通道(主动模式)
电子邮件系统的组成:用户代理(电子邮件客户端软件)、邮件服务器、电子邮件所需的协议(发送协议如 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 服务器

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 很类似,不同的是用户计算机无需安装专门的用户代理程序

万维网:万维网 WWW(World Wide Web)并非某种特殊的计算机网络,它是一个大规模的、联机式的信息储藏所,是运行在因特网上的一个 分布式应用。万维网利用网页之间的超链接将不同网站的网页链接成一张逻辑上的信息网。万维网是欧洲粒子物理实验室的 Tim Berners-Lee 最初于 1989 年 3 月提出的
浏览器:浏览器最重要的部分是渲染引擎,也就是浏览器内核,负责对网页内容进行解析和显示
MosaicNetscape Navigator 浏览器上市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)
