计算机网络是把分布在不同地点, 并具有独立功能的多个计算机系统通过通信设备和线路连接起来, 在功能完善的网络软件和协议的管理下, 以实现网络中资源共享为目标的系统. 计算机网络是由若干节点和连接这些节点的链路组成的网络, 其中节点可以是计算机, 集线器, 交换机或路由器.

概述

计算机网络将许多计算机连接起来, 而互联网将许多网络通过路由器连接起来, 与网络相连的计算机称为主机(host).

互联网经历三个发展阶段. 第一阶段是单个网络ARPANET向互联网发展, 第二阶段是三级网络互联网, 即主干网,地区网和校园网(或企业网), 第三阶段是多层次ISP结构的互联网.

互联网的组成分为边缘部分和核心部分, 其中边缘部分由所有连接在互联网上的主机构成, 是用户直接使用的部分, 用来进行通信和资源共享. 核心部分由大量网络和连接这些网络的路由器组成, 为边缘部分提供服务.

数据交换方式

电路交换: 在两个通讯端之间建立一条专用的物理通路, 必须经过建立连接->通话->释放资源的过程, 在通话的全部时间内 ,通话的两个用户始终占用端到端的通讯资源.

分组交换: 采用存储转发技术, 一个报文(message)被划分为几个数据段以后再进行传送. 每个数据段加上一些必要的首部(header)后, 构成一个分组(packet).

若要连续传送大量的数据, 且其传送时间远大于连接建立时间, 则电路交换的传输速率较快. 分组交换不需要预先分配传输带宽, 在传送突发数据时可提高整个网络的信道利用率.

协议的分层

  • 层次: 每个层次解决不同问题, 下层为上层提供服务, 上层屏蔽下层的服务实现细节
  • 协议: 下面的协议对上面的服务用户是透明的
  • 接口: 层间的信息传送的规约, 增加灵活性
7 应用层应用层5 应用层
6 表示层
5 会话层
4 运输层运输层4 运输层
3 网络层网络层3 网络层
2 数据链路层网络接口层2 数据链路层
1 物理层1 物理层
ISO体系结构TCP/IP体系结构五层体系结构

计算机网络性能指标

  1. 速率
    • 单位是比特每秒(bit per second,bps)
  2. 带宽
    • 原本指信号具有的频率带宽,单位制赫兹
    • 在计算机网络中指某通道传送数据的能力,单位与速率相同,为bps
  3. 吞吐量
    • 单位时间通过某个网络的实际数据量
    • 吞吐量受带宽或额定速率的限制
  4. 时延
    • 数据从网络的一端传送到另一端所需的时间
    • 发送时延: 主机或路由器发送数据帧所需要的时间,即从发送第一个bit到最后一个bit用的时间
    • 传播时延: 电磁波在信道中传播一定距离的时间 (信道长度/电磁波在信道上传播的速率)
    • 处理时延: 主机或路由器收到分组进行数据提取,差错检验或查找路由的时间
    • 排队延时: 分组在进入路由器后在输入队列等待的时间
    • 总延时 = 发送延时 + 传播延时 + 处理延时 + 排队延时
  5. 时延带宽积
    • 时延带宽积 = 传播时延 X 带宽
    • 表示信号的容量,相当于在第一个bit到达目的地时,发送端发送的在链路上的数据量
    • 也称以比特为单位的链路长度
  6. 往返时间(Round-Trip Time,RTT)
    • 一次双向交互需要的时间
    • A发送完毕后开始计时,B收到后立即发送确认信息,到A收到返回信息后截止计时
  7. 利用率
    • 信道被利用时间与总时间的比例
    • 根据排队了,利用率提高会导致时延增加
    • 利用率U,空闲网络时延D0,当前网络时延D满足 \(D=\frac{D_0}{1-U}\)

物理层

物理层定义计算机网络实际传输信号的物理介质的多种规范, 例如

  • 机械特性: 接线器形状与尺寸等
  • 电气特性: 各线路电压范围
  • 功能特性: 各线路电压含义
  • 过程特性: 不同功能涉及的顺序

奈氏准则与香农定理

奈奎斯特准则: 在理想条件下, 码元的传输速率的上限值 = 2W Baud. 即最大传输速率等于传输带宽的两倍. 大于该速度会出现码间串扰的问题, 使接收端对码元的判决(即识别)成为不可能

香农公式: 信道的极限信息传输速率(b/s)为

$$
C=W \log_{2}( 1 + \frac{S}{N} )
$$

其中 $W$ 为信号带宽, $S/N$ 为信噪比. 信道的带宽或信道中的信噪比越大, 则信息的极限传输速率就越高.

只要信息传输速率低于信道的极限信息传输速率, 就一定可以找到某种办法来实现无差错的传输

信道复用技术

  1. 频分复用(Frequency Division Multiplexing, FDM)
    • 用户在分配到一定的频带后, 在通信过程中自始至终都占用这个频带
    • 频分复用的所有用户在同样的时间占用不同的带宽资源
  2. 时分复用(Time Division Multiplexing, TDM)
    • 时分复用则是将时间划分为一段段等长的时分复用帧(TDM 帧)
    • 每一个时分复用的用户在每一个 TDM 帧中占用固定序号的时隙
    • 每一个用户所占用的时隙是周期性地出现(其周期就是 TDM 帧的长度)
  3. 统计时分复用(Statistic TDM, STDM)
    • 通过统计各个数据的实际到来情况,从而更紧凑的发出数据
  4. 波分复用(Wavelength Division Multiplexing, WDM)
    • 实际就是光的频分复用
  5. 码分复用(Code Division Multiple Access, CDMA)
    • 通过正交向量点乘为零实现多用户同时数据通信

数据链路层

链路(link)是指一个节点到另外一个节点的物理线路,在两者之间没有其他交换节点. 通常一次通信需要经过多个这样的链路. 数据链路(data link)是指因为通信的需要而使用的一系列硬件和软件的整体. 数据链路传输的基本数据单元称为 .

在数据链路层协议中有三个基本问题, 后续的各种协议都是围绕以下这三个问题展开

  1. 封装成帧: 如何将从上层收到的数据进行封装,组成基本的传输结构
  2. 透明传输: 在传输过程中可能用到了特殊的符号, 如何进行控制使得用户的数据不需要对特殊符号进行处理
  3. 差错检测: 传输过程中可能存在错误, 如何进行检测

以太网协议

以太网是美国施乐公司的研究中心与1975年研制成功的一种数据链路层协议. 当时以太网是一种基带总线局域网, 以无源电缆作为总线来传输数据帧, 并以历史上表示电磁波传播介质的以太(Ether)命名.

DIX Ethernet V2是世界上第一个局域网产品(以太网)的规约. IEEE 802.3是第一个 IEEE 的以太网标准. 两个标准只有很小的差别, 因此可以将802.3局域网简称为以太网.

局域网数据链路可以分为逻辑链路控制(Logical Link Control, LLC)和媒体接入控制(Medium Access Control, MAC), 由于DIX Ethernet V2的胜利,现在的很多配置器只有MAC协议.


以太网帧结构

以太网帧结构如上所示. 前8字节为同步码和帧开始符. 以太网的物理层最初使用曼切斯特编码, 交替的0和1将在物理层产生一个方波.

MAC地址是一种全球唯一的48bit的固化在适配器ROM中的地址, 前3字节需要购买,后3字节厂家自行分配.

数据部分长度为46~1500字节, 以保证整个MAC帧至少有64字节且不超过1518字节.

帧中不包含尾部,信道为空则说明到达尾部.

无线局域网协议

无线保真(Wi-Fi)是最流行的Internet接入方式之一, 其协议标准为IEEE 802.11.

点对点协议

点对点协议(Point-to Point Protocol, PPP)是一种简单协议, 不进行纠错, 不负责流量控制. 其满足封装成帧和透明性的要求, 支持多种网络协议并可在多种物理链路上运行. PPP协议具有基本的错误检测能力并可检测连接状态, 具有能够及时的(几分钟内)检测链路是否正常的机制, 能够使网络层协议知道彼此的网络层地址.

PPP协议规定了数据部分的默认最大长度MTU为1500字节, 并提供协商压缩算法的方法.


PPP帧格式

PPP协议帧格式如上所示. 帧首尾的F字段是开始和结束的标记, 都指定为0x7E. 帧头部的A字段和C字段长度均为1字节, 没有定义, 通常设置为0xFF0x03.

帧头部的协议字段,为0x0021时为IP数据报,为0xC021为LCP协议. 后续为信息部分, 可变长, 最大不超过1500字节. 尾部FCS字段是使用CRC的帧检验序列

字节填充(异步传输): 使用0x7D作为转移符号, 出现0x7E时,转换为0x7D 0x5E, 出现0x7D时,转换为0x7D 0x5D, 出现ASCII控制字符时, 也使用类似的方法加入转移字符

零比特填充(同步传输): 发送过程中, 一旦出现5个0x1, 就立即插入一个0x0. 接受过程中, 一旦读取到5个0x1, 下一个比特如果是0x0, 就删除该比特并继续解码

地址解析协议ARP

在网络中传输数据时, 网络层使用IP地址统一所有类型的网络, 但在数据链路层不同主机之间交互依然需要使用MAC地址. 因此需要有协议能将IP地址转换为MAC地址.

对于IPv4网络, 地址解析协议ARP完成这个工作. 而对于IPv6网络, 则使用邻居发现协议, 该协议被合入ICMPv6协议之中.

在使用Internet服务时, 需要判断服务的IP是本地的还是远程的. 如果该服务位于远程, 则需要1台可到达目标位置的路由器进行转发. 仅当服务位于本地(同一局域网)时, 才可以通过ARP协议实现转换.

每台主机设有一个ARP高速缓存, 保存了本局域网中各主机和路由器的IP地址与MAC地址映射关系. 主机A与主机B通信,如果可以直接由IP地址查询到B的MAC地址, 则直接发送信息, 否则广播ARP分组请求获得对应的映射.


ARP分组的请求的格式类似”我的IP是209.0.0.5 MAC地址是00-00-C0-15-AD-18, 我想知道IP地址位209.0.0.6的主机的MAC地址”. 此时局域网中只有B的IP地址与分组请求的地址一致, 因此B则收下该分组并向A发送ARP分组相应.

ARP响应的格式类似”我的IP地址是209.0.0.6 MAC地址是08-00-2B-00-EE-0A”. 考虑到A与B发送消息后,B可能还要与A发送消息,因此ARP分组中包含A的MAC地址,B可以保存下来以便于后续使用.

ARP分组请求是广播的, 而响应是单播的. ARP高速缓存中的条码都存在生存时间, 时间到达后会被自动删除

网络层

网络层与电信网络提供的虚电路不同, 网络层向上只提供简单灵活的, 无连接的, 尽量努力交付的 数据报服务. 网络层 不提供服务质量的承诺.

由于历史的进程, 实际上网络最初并没有统一的通信标准, 因此各种网络之间是无法直接通信的, IP协议的出现使得不同的网络之间可以使用同样的协议进行通信, 从而将不同的网络连接起来, 组成更大网络, 即虚拟IP网络或互联网.

常见中间网络设备和工作的网络层次如下表所示:

网络层次 中间设备
物理层 转发器(repeater)
数据链路层 网桥/桥接器(bridge)
网络层 路由器(router)
网络层以上 网关(gateway)

当中间设备是转发器或者网桥时, 则仅仅是把一个网络扩大, 网络的角度看, 这仍然是一个网络. 而网关用于连接两个不兼容的系统并在高层进行协议转换, 现在已经很少使用. 因此对网络进行互连时, 主要时通过路由器进行连接.

IP地址及其表示方法

IPv4地址是一个32位的标识符, 通常可以按照字节写成4个使用.划分的十进制数, 例如127.0.0.1.

IPv6地址是一个128位的标识符, 通常按照每4个十六进制数字分割为块, 并使用8个这样的块, 例如240e:36d:d3c:a310:d82c:5c46:1a0d:cf5e. 由于IPv6地址比较长, 因此规范要求每个块开头的0必须省略, 例如上述地址中第二块是36d而不是036d. 此外, 如果多个块全部是0则必须使用::替换, 如果存在多个片段均为全0, 则必须将最长的片段替换为::, 例如2001:0db8:0:0:0:0:0:2可以简写为2001:0db8::2


一个IPv4地址可以分成 网络号主机号, 具体地, IP地址可以划分为5大类

  1. A类, 网络号占1字节且以0开始, 主机号占3字节
  2. B类, 网络号占2字节且以10开始,主机号占2字节
  3. C类, 网络号占3字节且以110开始,主机号占1字节
  4. D类, 多播地址, 以1110开始
  5. E类, 保留地址, 以1111开始

具体地, 每类网络的情况如下:

网络类型 最大网络数 第一个可指派网络号 最后一个可指派网络号 每个网络最大主机数
A 126(\(2^{7}-2\)) 1 126 16777214
B 16383(\(2^{14}-1\)) 128.1 191.255 65534
C 2097151(\(2^{21}-1\)) 192.0.1 223.255.255 254

注意

  1. A类网络中,0表示本网络,127表示回环测试,从而不能使用
  2. B类中128.0被保留
  3. C类中192.0.0被保留
  4. 主机号全0表示本主机连接的网络地址,全1表示本网络所有主机,从而不能使用

基于上述规则可以得到如下的一些特殊地址

网络号 主机号 源地址使用 目标地址使用 含义
0 0 Y N 本网络上的本主机
0 host-id Y N 本网络的某台主机host-id
全 1 全1 N Y 对本网络广播
net-id 全1 N Y 对net-id上的所有主机广播
127 非全0或全1 Y Y 回环测试

由于IP地址最初建立时并未考虑大规模的网络互联, 因此划分划分比较粗犷, 在实际使用过程中, A类网络主机数太多, 使用不方便, 因此提出了划分子网的思路.

从主机号借用若干位构成子网号,从而使IP地址变成由 网络号, 子网号, 主机号 构成. 在划分子网后, 内部分成若干网络, 对外仍然表现为一个网络. 路由器收到数据后,如果在当前网络,则直接交付,否则根据子网号交付给相应的子网

由于子网长度可以任意设置, 因此需要设置一个子网掩码来表明网络号+子网号的长度. 将数据包中的网络号和掩码进行&运算即可得到目标主机的网络号+子网号

注意: 按照规定, 对于n位的子网号, 全0和全1不能使用, 因此划分后只有 \( 2^{n} - 2\) 个子网, 总可用IP数进一步减少了.


子网转发过程如下:

  1. 从收到的数据提取目的IP地址D
  2. 判断是否位于同一网络(使用掩码运算),是则直接交付,否则执行下一步
  3. 判断是否又特定路由,是则发送给特定路由,否则执行下一步
  4. 对比路由表中每一行, 通过掩码计算后比较是否是同一网络, 发现匹配项目后发送给对应的端口
  5. 没有匹配条目则发送给默认路由或报错

IP网络的特点:

  1. 每一个IP由网络号和主机号组成, 从而便于分配和管理
  2. 路由器只需要根据 网络号进行转发而不需要考虑主机号,从而极大减少路由表的大小和查找时间
  3. IP地址本质上是表示一个接口,一个主机(或路由器)可以连接多个网络从而获得不同的IP地址, 这种主机称为多归属主机

CIDR(Classless Inter-Domain Routing), 即无分类域间路由选择, 该技术消除了传统的A,B,C类地址以及划分子网的概念, 从而能更有效的利用IPv4地址.

CIDR将IP地址划分为网络前缀和主机号两个部分,并且使用斜线记法来表示网络前缀的长度,例如

128.14.35.7/20 => 10000000 00001110 00110011 00000111

即使用20位表示网络前缀,剩余的12为表示主机号. CIDR使用与子网掩码同样的技术来指示网络前缀.

注意:

  1. 在使用此模式表示IP地址时, 一定要写斜线后面的数字, 否则是没有意义的
  2. 不使用主机号为全0或者全1的IP地址

由于CIDR的分配方式, 在一个大的网络中, 可以进一步的分配成多个子网, 因此在路由表中可能或有多个条目与指定的IP匹配. 此时按照最长前缀原则匹配, 即尽可能到更具体的网络位置. 查询过程可以使用二叉树等技术.

IP地址和MAC地址的关系

IP地址与MAC地址的关系

IP地址与MAC地址的关系如上图所示, IP层抽象的互联网只能看到IP数据报, 中间过程的路由器IP地址不体现在IP数据报中, 路由器仅仅根据目标IP地址的网络号进行路由选择.

在局域网的数据链路层, 只能看到MAC帧, 每一步都更换MAC地址. 由于IP层屏蔽了不同网络的下层细节, 因此不同网络能使用统一的方式通信

IP协议

IPV4协议

IPv4数据报

IPV4协议格式如上所示, 其中每个部分的含义如下:

版本: 表示IP协议版本, 当前使用的版本号为4

首部长度: 以4字节(32位字)为单位, 表示首部长度的的单位数. 通常首部占20个字节, 因此该字段取值为5

区分服务: 该字段最初为8bit, 用于服务类型. 但该功能从未被广泛使用, 因此后来拆分为2个字段, 前6bit称为区分服务字段, 后2bit称为显式拥塞通知字段.

总长度: 包括首部和数据在内的整个数据报的长度. 该字段占16bit,单位为字节, 因此单个IP数据包最大为65535字节. 由于数据链路层的长度限制, IP协议可能需要对数据进行分片处理.

标识: IP软件内部维持一个计数器, 同一批的数据具有同样的标识值. 从而一个分片的数据报能够依据标识值进行恢复.

标志: 占3bit,但目前只有低2bit有意义. 最低位是MF(More Fragment), MF=1表示后续还有分片, MF=0表示这是最后一个数据报片. 中间位是DF(Don’t Fragment), DF=0时才允许分片.

片偏移: 占13bit, 以8字节位一个单位,表示此分片的数据在原始数据中的偏移单位数, 能够表示接近65535的偏移. 分片时, 数据偏移需要按照8的倍数分割,从而起始位置能被正确的表示.

生存时间: 每经过一个节点, 生存时间减一. 生存时间为零时, 数据报被丢弃.

协议: 表述此数据报携带的数据使用的协议,从而上层能使用正确的方式进行处理. 常见协议字段值如下所示:

协议名 ICMP IGMP IP TCP EGP IGP UDP IPv6 ESP OSPF
字段值 1 2 4 6 8 9 17 41 50 89

首部检验和: 使用二进制反码求和对数据报首部(因此不包括负载)进行计算. 计算时将校验和字段设置为0,计算所有字段的反码二进制和, 取反后写入校验和字段. 校验时将所有字段再次计算反码二进制和后求反码, 结果为0则数据正常,否则丢弃该数据包.

首部可变部分: 该部分没有规定,可以自行扩展. 由于当前的很多路由器并不考虑可变部分, 因此在后续的协议(例如IPv6)中取消了可变部分.

IPV6协议

IPv6数据报

IPV6协议格式如上图所示, 其中每部分含义如下

版本: 表示IP协议版本, 当前使用的版本号为6.

区分服务: 该字段使用方式与IPv4版本相同.

流标签:

负载长度: 不包括头部(但包括扩展头部)的负载内容的长度, 最大为64KB

下一个头部: 指示IPv6头部以后的其他扩展头部的类型, 多个头部通过该字段实现类似链表的结构

跳数限制: 实际就是IPV4中的TTL, 每经过一个节点该值减1


与IPv4协议相比, IPv6协议存在一些区别:

IPv6协议不对头部进行校验. 通常高层协议会顺便校验IP协议头部的重要字段, 且当前网络已经不容易产生传输错误, 因此IPv6协议放弃对头部进行校验处理. 在IPv4协议中, 路由器需要减少TTL值, 每次转发均需要重新计算校验.

IP层转发过程

路由器的路由表中只包含了目的网络地址(网络号)和下一跳地址(主机或者其他路由器IP地址). 有以下三种情况

  1. 目标主机在当前网络,则路由器直接交付
  2. 目的主机在其他网络,且所在网络号在路由表中有记录, 则路由器转发给相应的下一跳地址
  3. 目的主机所在网络没有记录,则路由器转发给默认路由, 如果没有默认路由,则报告转发分组错误

虽然任意一个路由器都不包含完整的路径信息, 但是通过一步步的查询最终也能找到目标主机

动态主机配置协议DHCP

动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)是一种使主机自动协商获取IP地址的协议. DHCP协议负责IP地址的动态分配和地址租用. 当客户机分配到一个IP地址后, 通常只能在一段时间内使用该地址, 这段时间称为租用期. 一个典型的租用期时长为12~24小时.

DHCP协议比较复杂, 具体协议格式和状态机转换略过

防火墙

防火墙的目标是在网络和主机之间过滤和限制部分流量, 以保护防火墙之后的主机不被攻击. 最常用的两类防火墙是代理防火墙和包过滤防火墙.

包过滤防火墙类似于一个路由器, 可以丢弃满足特定条件的数据包. 而代理防火墙类似于一个服务器主机, 在传输层进行控制.

网络地址转换NAT

网络地址转换是一种允许在互联网不同地方重复使用相同IP地址的机制. NAT的主要动机是解决IPv4地址数量过少的问题. 在使用NAT后, 通常对外仅需要1个IP地址, 而对内可以有多台主机同时访问互联网.

NAT通过重写数据包中的识别信息实现其功能. 向外传输数据时, NAT将源IP地址信息改写为对外的IP地址, 向内接受数据时, 将目标IP地址还原为对应的主机的私有IP地址.

由于传输层的协议具有伪首部(例如UDP和TCP), 因此NAT不仅需要重写IP层的字段, 还需要调整传输层的校验和等信息. 这导致NAT的重写工作实际相当的深入协议细节.

典型的NAT技术使用传输层的标识符(例如UDP和TCP的端口号)来确定一个数据包和NAT内部那一台主机相关, 因此大量的内部主机可以共用一个对外的IP地址.

网际控制报文协议ICMP

网络层使用网际控制报文协议(Internet Control Message Protocol, ICMP)来保证更加有效的转发IP数据报. ICMP允许主机或路由器报告差错情况和提供有关异常的报告.

ICMP通常被认为是IP层的一部分, 但实际上它是一个位于网络层和传输层之间的协议, ICMP作为数据部分封装在IP数据报中.

由于ICMP协议能够影响重要的系统功能和获取配置信息, 因此黑客们已经在大量的攻击中使用ICMP报文. 出于对这种攻击的考虑, 许多设备的防火墙会阻隔ICMP报文, 因而导致对应地诊断程序(例如ping)无法正常工作.


ICMP分成两大类, 一类是差错报告报文, 另一类是询问报文. 其中

差错报告报文包括: 终点不可达, 时间超时, 参数问题, 改变路由等

询问报文包括: 回送请求或回答, 时间戳请求或回答

通常差错报告报文传递给用户进程或传输层协议进行处理, 而询问报文由操作系统处理


ICMP格式

ICMP的前4字节结构是相同的,分别表示类型,代码和校验和. 之后的4个字节内容取决于不同的协议.

ICMP的数据部分都是相同的, 将收到需要进行差错报告的IP数据报的首部以及数据部分的前8个字节作为ICMP的数据部分.

IP数据报的数据部分前8字节包含运输层协议的端口内容, 该信息有助于通知高层协议.


ICMP协议最常见的应用是分组网间探测(Packet InterNet Groper, PING). 在Windows上和Linux上都是使用ping指令来执行此应用. 此外还可以使用traceroute(UNIX)或tracert(Windows)指令来执行路由追踪, 了解一个数据包从本地主机到目标主机的路由路径.

例如以下是从本地到知乎服务器的路由路径, 可以看到数据包在本地局域网中经过若干步跳转后进入本地ISP网络, 最后达到位于北京的腾讯云服务器.

到知乎的路由

运输层

从通信和信息处理的角度看, 运输层向它上面的应用层提供通信服务, 它属于面向通信部分的最高层, 同时也是用户功能中的最底层. 网络层是为主机之间提供逻辑通信, 而运输层为应用程序之间提供端到端的通信.

端口四元组

运输层的一个重要功能是复用和分用. 各类运输层协议均使用 IP + 端口 的四元组确定收发进程, 即(源地址IP, 源端口, 目标地址IP, 目标端口). 通过端口这一抽象的概念, 使得不同主机之间可以唯一的确定需要通信的进程, 而不会受到相关进程动态变化的影响.

端口是一个数字, 其中 0 ~ 1023 为熟知端口, 1024 ~ 49151 为登记端口, 49152 ~ 65535为短暂端口

由于不同协议之间使用不同的头部进行区分, 因此对于同一个端口可以监听不同的协议. 例如对于同一个端口可以同时启用TCP协议和UDP协议.

UDP协议

UDP协议提供无连接服务. UDP协议在传输数据前不需要建立连接, 双方在收到UDP报文后不需要给出任何确认. 虽然UDP不提供可靠交付, 但在某些情况下是一种最有效的方式. UDP协议可提供多对对的通信.

UDP格式

UDP协议使用端口号标识通信双方的进程. 如果发送方不需要接收方进行回复, 则可以将源端口号置位0. 由于IP协议在头部设置了协议字段, 因此不同的协议可以使用相同的端口号.

在实践中, 如果某个服务同时提供TCP协议和UDP协议, 往往也会使用同样的端口.

UDP长度: UDP协议中记录了整个数据包的长度(单位为字节), 由于数据部分可以为0, 因此长度部分的最小值为8. 由于长度字段仅有2字节, 因此UDP协议整体上只能传输65535字节, 大约为64KB数据.

UDP校验和: UDP协议使用使用 二进制反码加法 计算包括伪首部在内的全部数据, 计算结果最后取反写入校验和字段. 该计算以16bit作为一个基本单位, 因此当整个数据包长度为奇数时, 会补充一个虚拟的0字节参与计算. 接收方在校验时, 只需要对所有内容使用二进制反码求和, 结果为全1则说明校验通过.

伪首部: UDP协议在计算校验和时, 会从IP层协议提取部分数据, 构造一个虚拟的首部参与计算.

注意: 从IP数据包的层次来看, 伪首部并不等价于沿着UDP协议头部向前读取IP协议的头部, 两者的字段结构并不相同.

UDP伪首部的设计违反了分层规则, 在运输层读取了网络层的数据. 虽然通常而言, 在发送UDP协议时, IP协议部分的数据已经确认, 但在NAT场景存在修改IP协议字段的情况, 这会导致需要一同修改UDP协议的校验和.


UDP协议在IPv6的版本中没有太大的变化, 最直接的影响是伪首部的格式与IPv4版本中的不同.

UDP协议在IPv6的版本中的伪首部格式

注意到, 其中的长度部分扩展到32位. IPv6支持传输更大的数据报, 甚至可以超过UDP的限制. 此时将通过IP头部的长度计算UDP数据报的实际长度.

UDP协议与IP分片

数据链路层通常对单个数据帧长度进行了限制, 因此在IP协议中会根据数据帧长度以及要发送的数据长度进行分片. 分片后的数据可能经由不同的链路到达接收方, 并在接收方进行重组.

由于IP协议并不进行错误控制, 因此当UDP数据包被分片传送后, 其中任意一个分片数据包丢失, 都会导致整个UDP数据丢失. 对于一个典型的以太网来说, 其数据帧最大值为1500字节, 在去除了各类首部后, UDP数据部分通常可传输1470字节左右.

相对应地, TCP协议尽可能避免分片, 使得每个数据包传输的数据都小于最大帧长度

TCP协议

TCP协议提供面向连接的服务. TCP协议在传输数据前需要建立连接, 双发通过确认机制提供可靠的数据交付. TCP发送的每一组数据都需要接收方进行确认, 如果没有在规定的时间内收到确认消息(由于网络丢弃数据或者网络延迟等原因), 则会自动重新发送数据.

TCP协议提供点对点通信, 将通信过程抽象为字节流. 基于TCP协议的应用程序需要自行在数据包中标定数据的起始和结束位置, 而不能假定每次读取都可以正好读取一组发送的数据.

TCP格式

端口: TCP协议中的源端口和目的端口加上IP协议中的源地址和目标地址唯一标识了通信双向的进程

序号: 本报文发送的第一个字节在待发送的字节流中的序号. 序号通常并不是从0开始的, 而是在建立连接的时候随机指定的.

确认号: 期望收到对方的下一个报文的第一个字节的序号. 当选项的ACK启用时才有效.

头部长度: TCP协议头部的长度, 以4字节为单位, 此字段最大值为15, 可表示60字节. 由于TCP头部具有可变字段, 因此需要标记头部的实际长度. 没有可选字段时, TCP头部长度为20字节.

保留: 保留部分需要置为零

控制位: TCP协议定义了8个控制位, 具体含义如下

选项 含义 备注
CWR 拥塞窗口减, 要求发送方降低发送速率
ECE ECN回显
URG 紧急, 表示紧急指针有效, 从而可发送紧急数据 该特性很少用到
ACK 确认, 表示确认号字段有效 建立连接后应该始终为启用状态
PSH 推送, 表示不等缓冲区满就发送信息 该功能未被可靠的实现
RST 复位, 表示出现严重错误, 必须释放连接
SYN 同步, 表示初始化报文
FIN 终止, 表示传输结束, 要求释放连接

窗口: 发送此报文方的接收窗口大小, 作为另一方决定发送窗口大小的依据

检验和: 校验包括伪首部在内的全部内容,校验方法与UDP一致

紧急指针: 指示紧急数据的大小,从而能提取紧急数据和其他正常数据

选项: 长度可变,最多40字节. 每个选项首先使用1字节表示选项的类型, 然后跟上若干字节的具体类型, 其中一些常见的选项如下所示:

类型编号 长度 名称 说明
0 1 EOL 选项列表结束
1 1 NOP 无操作(用于填充)
2 4 MSS 最大段大小
3 3 WSOPT 窗口缩放因子
8 10 TSOPT 时间戳选项

由于TCP协议中表示头部长度的字段以4字节作为基本单位, 因此有时需要使用若干NOP选项进行填充, 使其对齐到4字节的整数倍.

TCP协议链接管理

建立连接

TCP建立连接的过程叫握手, 握手需要在客户端和服务器之间交换三个TCP报文段. 使用三次报文主要是为了保证已经失效的请求不会被服务器端处理.

三报文握手的过程如下所示:

TCP的连接建立

注意: SYN报文始终消耗序号, 单纯的ACK报文如果不携带数据,则可以不消耗序号,即第三次报文后,A的下一个报文还可以使用x+1作为序号

释放链接

释放过程如下所示:

TCP的链接释放

  1. A主动结束程序, 发送FIN报文
  2. B对A的报文确认, 后续根据实际情况传输一些数据
  3. B数据传输完毕, 发送FIN+ACK报文
  4. A对B的报文进行确认, 并等待2MSL的时间(报文最大生存时间)

在等待过程中,若B没有收到A的确认报文, 超时后B会重传FIN+ACK报文, 从而A在2MSL的等待时间内可以重传ACK报文. 如果A在等待的时间内没有收到B的重传报文, 则可以认为B已经收到了确认报文, 从而可以关闭连接.

在连接关闭后, 客户端在2MSL的等待时间内, 继续到达的数据包将会视为延迟到达的数据包而直接丢弃. 操作系统层面也会限制一个还处于2MSL的等待时间内的四元组被复用. 这一特性有助于避免连接四元组复用后, 延迟到达的数据包对新连接的数据传输产生干扰.

TCP链接的释放过程需要四个数据包, 从而支持所谓的”半关闭”特性, 即一方主动发起关闭请求后, 不再主动发送数据, 但依然可以接受数据, 直到另一方也关闭连接. 由于客户端需要等待服务端发送完毕所有数据, 因此必须依赖服务端发送的FIN+ACK包, 否则将会在FIN_WAIT_2状态无限等待. 因此为了保证该数据包一定到达, 客户端必须对该数据包进行确认. 如果服务端未收到该包, 则需要重发FIN+ACK包.

即使基于以上确认机制, 依然可能出现客户端在FIN_WAIT_2状态无限等待的情况. 因此如果客户端期望的是完全关闭, 则通常还会启用一个定时器, 在定时器结束时如果TCP链接时空闲状态, 则直接关闭连接.

重置链接

针对不存在的端口: 如果一个请求到达本地, 但没有应用程序在对应的端口, 则会产生一个重置报文段. 重置报文虽然没有任何内容, 但其序号必须位于正确的窗口范围内. 这可以避免攻击者通过在随意发送重置报文导致正常的链接被重置.

终止链接: 通常情况下TCP通过FIN结束链接, 但应用程序也可以通过终止链接的方式来关闭, 由于重置报文会立即发送, 因此可以抛弃任何排队中的数据, 并向另一端通知这是一次非正常的关闭.

半开链接: TCP协议在不发送信息的情况下, 无法感知到连接是否依然有效. 因此可能存在一端因为意外导致系统重启丢失连接信息的情况. 此时另一端如果发送消息, 则本地由于已经丢失连接信息, 无法匹配到对应的应用程序, 因此发送重置报文.

超时与重传

TCP协议发送的数据包均需要确认, 在一定时间内如果为收到确认, 则TCP会对数据包进行重传. 对于超时重传时间的选择, TCP采取了一种自适应算法, 通过采集传输过程的往返时间动态的调整重传时间

加权平均往返时间 $\text{RTT}_S$ 初始值为第一次测量到的时间, 此后每测量到一个新的样本, 就按照如下公式更新取值:

$$
新的 \text{RTT}_S 值 = (1 - α) \times (旧的 \text{RTT}_S 值) + α \times (新的 \text{RTT}_S 样本)
$$

α建议取值为0.125

加权平均往返值偏差 $\text{RTT}_D$ 初始值为 $\text{RTT}_S$ 的一半, 此后按照如下的公式计算

除了对往返时间进行估计以外, 还同时的对往返时间的偏差进行估计, 第一次测量时 \(RTT_D\) 取值为 \(RTT_S\) 值的一半,以后按照如下的公式计算

$$
新的 \text{RTT}_D 值 = (1- β) \times (旧的 \text{RTT}_D 值) + β \times | \text{RTT}_S - 新的 \text{RTT}_S 样本|
$$

β建议取值为0.25.

超时重传时间(Retransmission Time-Out, RTO)按照如下公式计算:

$$ RTO = RTT_S + 4 \times RTT_D $$

因此超时重传时间是一种基于统计的指数平滑算法


由于发生重传以后,无法知道对方发送的确认是对于以前的包的确认还是对重传包的确认, 因此使用Karn算法时, 不将重传的确认作为样本. 但如果线路发送变化, 导致延时突然增加, 产生了大量的重传, 则由于不采用这些数据, 导致算法无法调整.

修正的Karn算法在每次发生重传时, 将超时重传时间翻倍, 当不再发送超时重传以后, 再采用之前的公式计算重传时间. 实践证明, 此策略较为合理.

TCP数据流与窗口管理

滑动窗口

TCP滑动窗口

TCP连接的每一端都可以收发数据, 收发数据量通过滑动窗口结构进行维护. 例如根据B的确认号和窗口值, 可以构建A的发送窗口. 其中窗口内的数据是在没有收到B的确认信号前, A可以继续发送的数据.

TCP以字节而非数据包作为窗口的基本单位.

B根据接收缓冲区大小以及已经收到的数据决定窗口值大小. 当收到的ACK需要增加而窗口大小不变时(通常如此), 就相当于窗口在向前”滑动”.

通常不建议前沿收缩, 但TCP协议也需要考虑支持这一特性.

零窗口探测报文

极端情况可能出现窗口大小变为0的情况, 此时TCP发送端需要启用零窗口探测, 以确保不会因为后续增加窗口值的报文丢失导致双方互相等待.

对于发送方, 窗口值被置为零后启动一个计数器, 到达设定时间后向接收方发送零窗口探测报文. 接受方即使窗口为零, 也必须接收和处理此报文, 从而双方能保证消息被相互传达, 解除死锁

TCP拥塞控制

流量控制就是让发送方的发送速率不要太快, 使接受发来得及接收.

拥塞控制过程

TCP的拥塞控制算法涉及四个概念, 即慢开始(slow-start), 拥塞避免(congestion avoidance), 快重传(fast retransmit)和快恢复(fast recovery).

慢开始: 发送方维持一个拥塞窗口cwin(congestion window)的变量, 此变量大小取决与网络的拥塞层度, 并且可以动态变化.

慢开始算法要求主机先使cwin取一个较小的值, 例如cwin等于1个发送方最大报文段长度(Sender Maximum Segment Size,SMSS). 以后每次收到一个报文段确认,则有

$$ d(cwin) = min(N,SMSS) $$

其中N为之前未被确认, 而现在被确认的字节数. 因此cwin每次最多可以增加一个SMSS大小. 通常以SMSS为单位讨论数据发送, 因此每轮收到全部的确认以后,cwin大小翻倍. 但实际上收到确认报文后, 会立即更新, 而不会按照轮次进行翻倍. 但最终表现都是cwin随时间指数增加.

注意: 实际的发送窗口大小等于接受方给出的窗口值和实际拥塞窗口值中的最小值

拥塞避免: 为了防止cwin无限增大,导致网络最终拥塞,设置了一个门限值ssthresh. 在此阶段, 每轮使cwin增加一个SMSS大小, 由于实际的确认报文是逐一到达的, 因此每次到达后,可以设置

$$ d(cwin) = SMSS \times (SMSS / cwin) $$

例如当前cwin等于10个SMSS, 则现在收到一个确认以后增加0.1个SMSS, 从而一轮以后正好增加一个SMSS.

当拥塞避免算法运行到产生超时重传时, 将门限值ssthresh置为当前cwin的一半. 并开始执行慢开始算法

快重传与快恢复: 在通信过程中, 快重传算法要求接受发每次收到一个报文后,立即发送确认. 例如有某个报文段M2缺失, 后续收到M3,M4,M5时, 接受发都要发送确认收到M1.

当接受发收到3个重复的确认时, 就可以肯定M2确实没有被收到, 此时立即重传M2, 以免由于超时进入慢开始过程.

发生快重传以后,启动快恢复过程, 将门限值ssthresh置为当前cwin的一半, 并从ssthresh值开始执行拥塞避免算法

基于丢包的拥塞控制算法

BIC-TCP算法是从Linux 2.6.8开始应用的拥塞控制算法, 其主要目标是解决RTT公平性问题, 使得连接能够得到的带宽与其RTT成反比, 而不是一个更复杂的函数.

RTT公平性是指网络中的所有数据流, 据它们的RTT来公平地获得网络带宽. 较长的RTT可能导致数据流在网络拥塞时获得较少的带宽, 因为它们需要更长的时间来确认数据包的接收.

BIC-TCP算法引入了二分搜索增大和加法增大两个算法来修改TCP的发送端. 这些算法在出现拥塞信号时调用.

二分搜索算法在最小窗口和最大窗口之间使用二分法确定最佳的窗口大小. 最小窗口是最新一次在一个完整RTT中没有丢包的窗口大小, 最大窗口是最近一次出现丢包的窗口大小. 基于此算法可以比标准TCP更快的确定网络的最佳窗口值.

RTT较长的连接在每次调整窗口大小时, 由于RTT较长, 拥塞窗口的增长速度可能会更慢. 因此, 在相同的网络条件下, RTT较长的连接可能会获得更多的带宽资源


CUBIC算法的核心思想是通过一个三次函数来调整拥塞窗口的大小. 当检测到网络拥塞时, CUBIC算法会将拥塞窗口减小到一个保守的值, 并进入快速恢复阶段. 在这个阶段, CUBIC算法使用三次函数来逐渐增加拥塞窗口的大小, 直到达到一个新的稳定状态.

CUBIC算法的优势在于它提供了更好的公平性和更平滑的拥塞窗口增长. 由于其窗口调整不依赖RTT, 因此相较于BIC-TCP算法更公平. CUBIC算法使用三次函数来调整拥塞窗口的大小, 这种设计使得窗口增长在接近最大值时减慢, 从而减少了在高带宽环境下可能出现的剧烈波动, 提高了网络的整体稳定性.

基于延迟的拥塞控制算法

Vegas算法通过估算网络在一定时间内能够传输的数据量, 并与实际传输能力进行比较, 来调整拥塞窗口的大小. 当网络延迟增大时, 算法会减小拥塞窗口, 以降低发送速率;当网络延迟减小时, 算法会增大拥塞窗口, 以提高发送速率.

FastTCP算法结合了速率起搏技术和基于延迟的拥塞控制, 通过每隔一个RTT更新发送速率, 并在延迟远小于阈值时加快窗口增长, 而在延迟增大时减缓增长. 这种机制使得FastTCP算法能够在高速网络中保持较高的带宽利用率, 同时减少网络拥塞


BBR算法的核心思想是通过准确估算网络的瓶颈带宽和往返传播时间来调整发送速率, 以达到最大化利用网络带宽和最小化延迟的目的. BBR算法状态机包含四个阶段

启动阶段: BBR算法在启动阶段会指数增加发送速率, 目的是尽快填满网络链路并提高带宽利用率.

排空阶段: 在启动阶段结束后, BBR算法会降低发送速率, 尽力排空网络中的所有数据包, 确保不会在下一个阶段过度冲击网络, 导致延迟增加或丢包情况发生

带宽探测阶段: 在排空阶段完成后, BBR算法会逐渐增加发送速率, 并测量网络的可用带宽.

往返时延探测阶段: 在带宽探测阶段之后, BBR算法会进入往返时延探测阶段. 测量网络的往返时延, 并根据往返时延变化来调整发送速率. 如果网络的往返时延较高, BBR算法会降低发送速率以避免过度填充网络

BBR算法通过动态地在这些状态之间切换, 能够有效地适应不同的网络环境, 提供更好的传输性能. BBR算法不会因为一次或者偶然的丢包就大幅降低吞吐量, 因此具有较强的抗丢包能力.

TCP保活机制

一个TCP连接如果双方均不发送数据, 则连接中不会有任何数据交换, 如果没有其他轮询机制, 该连接可以维持任意长的连接状态. 如果其中一发发生故障, TCP连接并不能感知到该变化.

TCP保活机制是一种不影响数据流内容的情况下探测对方的机制. 当TCP连接处于空闲状态时, 保活定时器会定期发送保活探测报文, 确认连接的另一端是否仍然可达. 如果在规定时间内没有收到响应, 则认为连接已经断开.

该机制虽然不是标准TCP的一部分, 但大部分TCP实现依然具有该机制. 保活功能一般为服务器提供, 服务器通过该机制探测客户端是否崩溃或离开.

应用层

DNS服务

一个服务器所负责管辖的(或有权限的)范围叫做区(zone), 各单位根据具体情况来划分自己管辖范围的区. 但在一个区中的所有节点必须是能够连通的. 每一个区设置相应的权限域名服务器, 用来保存该区中的所有主机的域名到IP地址的映射. DNS 服务器的管辖范围不是以“域”为单位, 而是以“区”为单位.

主机向本地域名服务器的查询一般都是采用递归查询, 本地域名服务器向根域名服务器的查询通常是采用迭代查询.

DNS缓存

现代浏览器(如Chrome、Firefox)在内存中维护独立DNS缓存,优先于系统缓存查询,以提升性能和隐私。系统级服务(如Windows的DNS Client)缓存全局DNS记录。路由器或ISP的DNS服务器可能保留历史记录。

在无痕模式下, 为了避免DNS缓存导致访问记录泄露, 会禁用浏览器缓存, 每次DNS查询均重新解析. 部分浏览器(如Firefox)直接向DoH服务器发起新请求,忽略本地系统缓存。

DNS-over-HTTPS(DoH)将DNS查询封装在HTTPS中,通过TLS加密传输。并且会使用443端口(标准HTTPS),绕过传统DNS的53端口监控。由于协议被封装, 因此不会在操作系统层和路由器层产生记录.

常见DNS类型

类型 英文名 中文名 作用 使用场景 简单示例
A记录 A Record (Address Record) IPv4地址记录 将域名解析为IPv4地址。 网站服务器绑定IPv4地址。 example.com → 192.0.2.1
AAAA记录 AAAA Record IPv6地址记录 将域名解析为IPv6地址。 支持IPv6网络的服务器配置。 example.com → 2001:db8::1
CNAME记录 CNAME Record (Canonical Name) 别名记录 将域名设置为另一个域名的别名,继承目标域名的解析结果。 CDN加速、服务转发。 www.example.com → example.cdn.com
MX记录 MX Record (Mail Exchange) 邮件交换记录 指定接收邮件的服务器地址及优先级。 企业邮箱配置(如Gmail、Exchange)。 example.com → mail.example.com(优先级10)
TXT记录 TXT Record (Text) 文本记录 存储任意文本信息,常用于验证或安全策略。 SPF防垃圾邮件、SSL证书验证。 example.com → "v=spf1 include:_spf.google.com ~all"
NS记录 NS Record (Name Server) 权威名称服务器记录 指定域名的权威DNS服务器。 切换DNS服务商(如Cloudflare)。 example.com → ns1.cloudflare.com
PTR记录 PTR Record (Pointer) 指针记录 将IP地址反向解析为域名(反向DNS)。 邮件服务器反垃圾验证。 192.0.2.1 → mail.example.com
SRV记录 SRV Record (Service) 服务定位记录 指定提供特定服务的服务器地址、端口及优先级。 VoIP(如SIP)、即时通讯服务。 _sip._tcp.example.com → 10 60 5060 sipserver.example.com
SOA记录 SOA Record (Start of Authority) 起始授权记录 定义域名的权威信息(主DNS服务器、管理员邮箱、序列号等)。 主DNS服务器配置与同步管理。 example.com → ns1.example.com admin.example.com 2023081501 3600 600 86400
CAA记录 CAA Record (Certification Authority Authorization) 证书颁发机构授权记录 限制允许为域名签发SSL证书的机构。 增强SSL证书安全性。 example.com → 0 issue "letsencrypt.org"
DNAME记录 DNAME Record (Delegation Name) 委派名称记录 将域及其子域整体重定向到另一个域(类似批量CNAME)。 域名整体迁移或重定向。 old-example.com → new-example.com

内容分发网络

内容分发网络(CDN)是一种通过全球分布的服务器节点,优化内容传输速度并减轻源站负载的技术。其核心原理如下:

CDN在全球各地部署多个边缘节点(服务器),这些节点存储静态资源的副本(如图片、视频、CSS/JS文件等)。用户请求会被自动路由到地理距离最近网络延迟最低的节点,从而减少数据传输时间。当用户访问网站时,DNS会分析其地理位置和网络状况,返回最优CDN节点的IP地址,而非直接指向源站。CDN根据节点健康状态、实时负载和网络拥堵情况,动态选择最佳节点。

当你的网站启用CDN后,用户访问流程会从直接连接你的服务器变为通过CDN节点中转。原配置:域名 → A记录 → 你的服务器IP,CDN配置:域名 → CNAME记录 → CDN服务商提供的域名

FTP协议

文件传送协议 FTP 只提供文件传送的一些基本的服务, 它使用 TCP 可靠的运输服务. FTP 的主要功能是减少或消除在不同操作系统下处理文件的不兼容性.

FTP 使用客户服务器方式. 一个 FTP 服务器进程可同时为多个客户进程提供服务.

FTP 的服务器进程由两大部分组成: 一个主进程, 负责接受新的请求; 若干个从属进程, 负责处理单个请求.

控制连接在整个会话期间一直保持打开, FTP 客户发出的传送请求通过控制连接发送给服务器端的控制进程, 但控制连接不用来传送文件. 实际用于传输文件的是“数据连接”. 服务器端的控制进程在接收到 FTP 客户发送来的文件传输请求后就创建“数据传送进程”和“数据连接”, 用来连接客户端和服务器端的数据传送进程. 数据传送进程实际完成文件的传送, 在传送完毕后关闭“数据传送连接”并结束运行.

电子邮件协议

  • 发送邮件的协议: SMTP
  • 读取邮件的协议: POP3(Post Office Protocol), 网际报文存取协议(Internet Message Access Protocol, IMAP)

邮件传输过程


此外, 还可以使用基于万维网的电子邮件, 两端的用户使用HTTP协议与服务器通信, 服务器之间使用SMTP协议.

基于万维网的电子邮件

从而只要能够找到上网的计算机, 打开任何一种浏览器就可以非常方便的收发邮件.

网络安全

计算机网络的安全威胁

  1. 被动攻击: 主要是截获, 即从网络上窃听他人的通信内容, 又称为流量攻击
  2. 主动攻击:
    • 篡改: 故意篡改网络上传送的报文
    • 恶意程序:包括计算机病毒, 计算机蠕虫,特洛伊木马和逻辑炸弹, 后门入侵等
    • 拒绝服务: 包括分布式拒绝服务攻击, 攻击者向互联网的某个服务器不停发送大量分组而导致该服务器无法提供正常服务

数字签名

数字签名必须保证以下三点:

  1. 报文鉴别: 接收者能够核实发送者对报文的签名;
  2. 报文的完整性: 发送者事后不能抵赖对报文的签名;
  3. 不可否认: 接收者不能伪造对报文的签名

鉴别分类

  • 报文鉴别:即鉴别所收到的报文的确是报文的发送者所发送的, 而不是其他人伪造的或篡改的. 这就包含了端点鉴别和报文完整性的鉴别.
  • 实体鉴别:仅仅鉴别发送报文的实体. 实体可以是一个人, 也可以是一个进程(客户或服务器). 这就是端点鉴别.

附录

本节讨论一些与计算机网络相关但不太重要的主题

虚拟局域网VLAN协议

在引入交换机后, 以太网内的所有主机均可实现互联和广播. 但很多时候可能需要禁用全局的广播或者任意两个主机的通信, 因此可引入虚拟局域网技术. VLAN通过在MAC帧中添加标记来确定一个消息所属的局域网.

VLAN在物理网络中创建多个逻辑网络, 这些逻辑网络在功能上可以被视为独立的局域网. VLAN通过将网络设备的端口或设备分配到不同的虚拟网络中, 实现了逻辑上的隔离.

目前该技术已经逐步被高性能路由器取代

链路聚合

链路聚合技术可将一个设备上的多个网口在逻辑上变为一个网口, 通过将消息冗余或拆分到多个网口上发送, 可以获得更好的性能或稳定性.

循环冗余校验

循环冗余校验(Cyclic Redundancy Check, CRC)算法在给定一个k bit的数据时, 可提供一个n bit的冗余码, 组成k+n位数据进行发送,从而接收端能对数据进行检验. 例如设数据M = 101001, 则k=6, 此时可取n=3. 按照以下步骤进行计算和校验

  1. 在M后添加n个零,即变成M’ = 101001000
  2. 产生一个双方事先约定的数据P = 1101. (P要求是一个n+1 bit数据)
  3. 使用模2运算计算 M’ / P , 得余数为001
  4. 将获得的余数加添到M的末尾,组成k+n bit数据,即M’’ = 10100001

  1. 接收端将收到的数据N使用模2运算计算 N / P
  2. 如果余数为0,说明数据正确

模2运算实际上就是异或, 在进行除法运算时,只要最高位与P相同,商就可以上1.

对于除数P, 有几种常见的选择,例如CRC-16, CRC-CCITT,CRC-32等, 具体形式可以查阅其他相关资料. 数学上可以证明, 如果数据传输过程中发生改变, 进行校验后除数仍为零是一个非常小的小概率事件.

通过使用CRC等技术, 可以对数据进行校验,从而实现了数据链路过程中的差错检验, 不过数据链路层通常不负责数据错误数据重传, 如果发现错误, 通常仅仅直接将数据丢弃.

CSMA/CD协议

注意: 由于交换机的大范围使用, 以太网已经从总线结构变为了星型结构, 两台机器进行通信时通过交换机转发消息, 使得它们就如同使用独立线路进行直连. 此时不存在冲突问题, 也就不需要进行冲突检测.

载波监听多点介入/碰撞检测(Carrier Sense Multiple Access with Collision Detection,CSMA/CD)协议是总线结构的以太网常用的协调方法.

多点接入是指这是总线型网络, 有许多计算机接入. 载波监听是指利用电子技术,在数据发送前和发送中对数据信道进行监听. 发送数据前如果发现其他节点正在发送,就暂时等待. 发送数据过程中, 检测到其他节点也在发送,即发送碰撞,就进行相应的处理.

假定在线路上有A,B两个节点且相距1km, 由于电磁波传输1km大约需要5μs, 因此如果某时段信道为空,A检测到后发送信息,则信息需要5μs后才到达B节点, 若B在此时间段内发送信息,则会导致碰撞. 而从B发送信息开始的5μs后,A才能检测到发送碰撞, 因此在线路上,至多只需要10μs,任意一个节点都能检测到碰撞. 通常,将A到B的传播时延记为τ. 将2τ称为争用期


协议规定,基本退避时间为争用期2τ, 具体值为51.2μs. 对于10Mbps的网络,相当于发送512个bit的时间, 因此也说争用期是512比特时间.

从离散的整数集合[0,1,2,3,4,…,(2^k-1)]中随机取出一个数r,重传推迟时间为r倍的争用期. 并且k按照以下规律获得

$$k = Min[重传次数,10]$$

即当重传次数小于10次时,k等于重传次数,重传次数大于10时,k始终为10. 且当重传次数为16时仍然不能成功,则丢弃该帧并向高层反馈.

一些限制:

  1. 发送数据最小长度必须大于64字节,即512bit,否则数据发送完毕后发生的冲突无法被发现
  2. 从开始发送数据的一个争用期内没有发送冲突,则后续也不会发生冲突
  3. 由于发送过程需要监听信道,因此只能以半双工方式工作
  4. 由于争用期为51.2μs,因此以太网理论上最大长度约为5km
  5. 发送节点检测到碰撞以后,立即停止发送数据并发送32bit或48bit的人为干扰信息以强化碰撞
  6. 帧与帧之间最小间隔96bit时间,即任何时刻必须监听到96bit以上空闲时间才能发送数据

发送过程

  1. 收到数据后封装成帧
  2. 等待信道空闲96bit时间
  3. 发送数据,一边发送一边等待,有两种情况
    1. 如果开始发送后的一个争用期内没有检测到冲突,则此帧必定可以发送成功
    2. 如果在争用期内检测到冲突,则执行指数退避算法

互联网路由选择协议

互联网规模非常大, 让每一个路由器知道所有的网络如何到达时不现实的,而且很多企业不愿意暴露自己网络的布局和细节. 因此可以把互联网划分成许多较小的自治系统(Autonomous System,AS). 自治系统内部使用单一的技术一致的路由选择策略, 然后将不同的自治系统连接起来组成互联网.

这样, 互联网就涉及两种协议,即 内部网关协议(Interior Gateway Protocol,IGP)和外部网关协议(External Gateway Protocol, EGP). 由于历史的进程原因, 这里的网关实际上是指路由器, 但由于名称由来已久,因此依旧使用此名称.

内部网关协议

IGP协议有两个主要的协议, 即基于距离向量的路由选择协议(Routing Information Protocol)和开放最短路径优先(Open Shortest Path First, OSPF)

RIP协议的特点

  • 仅和相邻的路由器交换数据, 交换当前的全部路由表数据,按固定的时间间隔交换数据
  • 定义直接相连距离为1, 每通过一个路由器距离+1, 定义16为不可达
  • 坏消息传的慢(不可到信息可能被其他路由中未更新的错误信息覆盖)

RIP协议交换过程

  • 收到X的路由表后,对其中的所有条目进行修改,将所有的下一条地址都修改为X,对距离字段都+1
  • 对比修改后的路由表A和当前的路由表B的每一条记录I
    • 如果B中不包含I的网络,则将I加入B
    • 如果A和B都包含I的网络,且B中下一跳地址正好是X,则使用I更新B的条目
    • 如果A和B都包含I的网络,且下一跳地址不同,则I的路径更短时更新B的条目

OSPF协议特点

  • 和所有的路由器交换信息, 使用泛洪法
  • 交换本路由器和其他路由器的链接信息
  • 只有网络改变时才交换信息
  • 通过将一个自治域划分未为若干个区域,可以扩展OSPF网络规模

Teredo隧道

Teredo隧道技术是一种IPv6过渡技术, 它允许IPv6主机通过IPv4互联网建立隧道, 从而实现IPv6通信. 这项技术特别适用于那些位于IPv4 NAT(网络地址转换)设备后的主机, 因为它们无法直接使用IPv6进行通信. Teredo通过封装IPv6数据包在IPv4 UDP数据包内, 使得这些数据包能够通过IPv4网络传输, 包括穿越NAT设备.

UDP-Lite

DP-Lite协议是一种轻量级的用户数据报协议, 它允许将潜在损坏的数据负载发送给接收方, 而不会被接收方直接丢弃. 这种协议特别适用于那些可以容忍一定数据损坏的应用场景, 如实时视频传输和VoIP等.

UDP-Lite协议通过修改传统的UDP协议, 提供了部分校验和来解决这个问题. 它允许对数据报的任意长度计算相应的校验和进行验证保护, 通过UDP数据包头的“报文长度”字段来控制需要计算校验和的数据包长度, 从而容许没被校验和覆盖的数据部分可能有损地传输

最后更新: 2025年07月13日 11:34

版权声明:本文为原创文章,转载请注明出处

原始链接: https://lizec.top/2018/03/01/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E7%AC%94%E8%AE%B0/