前言
概述
计算机网络由若干节点和连接这些节点的链路组成
网络把许多计算机连接在一起,而互连网则把许多网络通过一些路由器连接在一起。与网络相连的计算机常称为主机
ISP(Internet Service Provider):互联网服务提供者,互联网现在采用三层 ISP 结构(主干 ISP、地区 ISP、本地 ISP)
RFC(Request For Comments):互联网标准发布的文档形式
internet(互联网或互连网):通用名词,它泛指由多个计算机网络互连而成的网络。
Internet(因特网):专用名词,特指采用 TCP/IP 协议的互联网络。
区别:后者实际上是前者的双向应用
互联网的组成
边缘部分:由所有连接在互联网上的主机组成,这部分是用户直接使用的,用来进行通信(传送数据、音频或视频)和资源共享
主机:为用户进行信息处理
通信方式分为两大类:
客户-服务器方式:客户(client)是服务请求方,服务器(server)是服务提供方
对等连接方式(peer-to-peer,P2P)
核心部分:由大量网络和连接这些网络的路由器组成,这部分是为边缘部分提供服务的(提供连通性和交换)
路由器:一种专用计算机(不叫主机),实现分组交换,任务是转发收到的分组
分组交换:采用存储转发技术,把要发送的整块数据称为一个报文,把较长的报文划分为一个个更小的等长数据段,在每一个数据段前面加上一些必要的控制信息组成的首部后就构成了一个分组(包)
要点:(1)报文分组,加首部(2)经路由器储存转发(3)在目的地合并
- 电路交换:端对端通信质量因约定了通信资源获得可靠保障,对连续传送大量数据效率高。
- 报文交换:无须预约传输带宽,动态逐段利用传输带宽对突发式数据通信效率高,通信迅速。
- 分组交换:具有报文交换之高效、迅速的要点,且各分组小,路由灵活,网络生存性能好。
在下列条件下比较电路交换和分组交换。要传送的报文共x(bit)。从源点到终点共经过k段链路,每段链路的传播时延为d(s),数据率为b(b/s)。在电路交换时电路的建立时间为s(s)。在分组交换时分组长度为p(bit),且各结点的排队等待时间可忽略不计
类别
广域网 WAN:远程、高速、是Internet的核心网
城域网 MAN:城市范围,链接多个局域网
局域网 LAN:校园、企业、机关、社区
个人区域网 PAN:个人电子设备
按用户分类:公用网:面向公共营运。专用网:面向特定机构。
性能
bit
就是位,也叫比特位,是计算机表示数据最小的单位
byte
就是字节
1byte = 1B = 8bit
一个字符 = 2个字节
1KB = 1024B
速率:数据率或比特率
带宽:此处为“最高数据率”
吞吐量
时延:发送时延(数据帧长度/发送速率),传播时延(信道长度/电磁波在信道上的传播速率),处理时延,排队时延
提高数据的发送速率只是减小了数据的发送时延
时延带宽积
往返时间 RTT
利用率:D0为网络空闲时的时延,D为网络当前的时延,则利用率 U = 1 - (D0/D)
计算机网络体系结构
网络协议由以下三个要素组成:
- 语法:数据与控制信息的结构或格式
- 语义:需要发出何种控制信息,完成何种动作以及做出何种响应
- 同步:事件实现顺序的详细说明
协议体系结构:
- 应用层:通过应用进程间的交互来完成特定网络应用,协议有 DNS、HTTP、SMTP 等,应用层交互的数据单元称为报文(message)
- 运输层:向两台主机中进程之间的通信提供通用的数据传输服务,协议有 TCP(Transmission Control Protocol,数据传输单位:报文段)和 UDP(User Datagram Protocol,数据传输单位:数据报)
- 网络层:为分组交换网上的不同主机提供通信服务,使用 IP 协议
- 数据链路层:将网络层交下来的 IP 数据包组装成帧
- 物理层:数据单位是比特(0101010)
OSI参考模型把对等层次之间传送的数据单位称为该层的协议数据单元 PDU(Protocol Data Unit)
物理层
数据通信
一个数据通信系统可划分为源系统、传输系统和目的系统
信道基本概念
单向通信/单工通信:只能有一个方向的通信而没有反方向的交互
双向交替通信/半双工通信:通信的双方都可以发送信息,但不能双方同时发送
双向同时通信/全双工通信:通信的双方都可以同时发送和接收信息
基带信号:来自信源的信号
带通信号:经过载波调制后的信号
基本的带通调制方法:调幅(AM)、调频(FM)、调相(PM)
信道的极限容量
限制码元在信道上的传输速率的两个因素:码元传输速率受奈氏准则的限制,信息传输速率受香农公式的限制
信道能够通过的频率范围:
奈氏准则:数据率 C = 2W log2 V (W 为带宽,V 为几种码元/码元的离散电平数目)
在带宽为 W 的低通信道中,若不考虑噪声影响,则码元传输的最高速率是 2W
信噪比:**信噪比(dB) = 10 log10(S/N)**:当 S/N = 10时,信噪比为 10 dB, S/N = 1000 时,信噪比为 30dB
香农公式:信道的极限信息传输速率 C = W log2 (1 + S/N) (W 为信道的带宽)
信道的带宽或信道中的信噪比越大,信息的极限传输速率就越高
信道复用技术
为了通过共享信道、最大限度提高信道利用率
频分复用 FDM:各路信号在同样的事件占用不同的带宽资源
时分复用 TDM:所有用户在不同的时间占用同样的频带宽度
波分复用
码分复用 CDM
码分多址 CDMA:给每一个站分配的码片序列不仅必须各不相同,并且还必须互相正交(设向量 S 为站 S 的码片量,T 为其他任何站的码片向量,则 S 和 T 的内积为0)
发送信号时,当 T 站发送比特 1,在 S 站计算内积的结果是 +1;当 T 站发送比特0,内积的结果为 -1
码分多址CDMA为什么可以使所有用户在同样的时间使用同样的频带进行通信而不会互相干扰?这种复用方法有何优缺点?
各用户使用经过特殊挑选的相互正交的不同码型,因此彼此不会造成干扰。
优点:这种系统发送的信号有很强的抗干扰能力,其频谱类似于白噪声,不易被敌人发现。
缺点:占用较大的带宽。
数据链路层
OSI第二层,分为MAC子层和LLC子层
使用点对点信道(一对一)或广播信道(一对多)
三个基本问题:封装成帧、透明传输和差错检测
三个基本问题
封装成帧
在一段数据的前后分别添加首部和尾部
控制字符SOH:帧的首部开始
控制字符EOT:帧的结束
透明传输
问题:数据部分出现控制字符导致提前开始或者结束
转义字符ESC:使数据中可能出现的控制字符在接收端不被解释为控制字符
差错检测
比特差错:1变0或者0变1
传输差错:帧丢失、帧重复、帧失序
循环冗余检验CRC
设待传送的数据M=101001(k=6),CRC运算就是在数据M的后面添加供差错检测用的n位冗余码(帧检验序列FCS),然后构成一个帧发出去,一共发送(k+n)位
求n位冗余码:
- 用二进制的模2运算(注:加减法不进位):2n * M,相当于在M后面添加n个0
- 得到的 (k+n) 位的数除以事先商定的长度为 (n+1) 位的除数P:(2n * M) / P
- 得到商Q和余数R(n位,比P少一位):Q = (2n * M) | P + R
接收端CRC检验:
把收到的每一个帧都除以同样的除数P(模2运算),然后检查得到的余数R,
若 R=0,则判定这个帧没有差错,接受
若 R≠0,则判定这个帧有差错,丢弃
ctf中的应用:misc——压缩包爆破crc32
也可以用生成多项式来表示检验过程,在上面的例子中,可以用P(X)=X3+X2+1来表示除数P=1101
最后,近似认为:凡是接收端数据链路层接收的帧均无差错
(仅仅采用了CRC检验,缺重传机制,数据链路层的传输还不是可靠的传输)
点对点协议 PPP
RFC 1661
目前使用最广泛的数据链路层协议
满足以下条件:
- 简单
- 封装成帧
- 透明性
- 多种网络层协议
- 多种类型链路
- 差错检测
- 检测连接状态
- 最大传送单元
- 网络层地址协商
- 数据压缩协商
帧格式
PPP帧的首部和尾部分别为四个字段和两个字段
F (Flag):标志字段,0x7E,表示一个帧的开始或结束,即定界符
协议字段:2字节
0x0021——IP 数据报
0xC021——PPP 链路控制协议 LCP 的数据
0x8021——网络层的控制数据
信息字段长度可变,不超过1500字节
字节填充
和前面的透明传输和类似,利用字节填充的方式转义信息中的标志字段(如定界符0x7E)
填充方法(RFC 1662):
- 0x7E –> 0x7D,0x5E
- 0x7D –> 0x7D,0x5D
- ASCII码控制字符(数值 < 0x20),如 0x03 –> 0x7D,0x23
零比特填充
只要发现有5个连续 1,则立刻填入一个 0
以太网标准
IEEE 802.3
数据链路层拆成两个子层:逻辑链路控制LLC(已过时)和媒体接入控制MAC
计算机与外界局域网的连接——适配器(网卡NIC):具有过滤功能
为了通信的简便,以太网采用以下措施:
- 无连接,尽最大努力的交付,即不可靠的交付
- 曼彻斯特编码
MAC层
硬件地址/物理地址/MAC地址
48位,是每一台计算机中固化在适配器的 ROM 中的地址
格式
只介绍以太网 V2 的 MAC 帧格式
扩展以太网
物理层:加光纤,加 hub
数据链路层:交换机(switch)
交换机
实质上就是一个多端口的网桥,一般工作在全双工方式
相互通信的主机都独占传输媒体,无碰撞地传输数据
内部的帧交换表(地址表):通过自学习算法自动建立
自学习功能:
A先向B发送一帧,从端口1进入交换机。交换机收到帧,先查找交换表,现在表中没有B的地址。于是,交换机把此帧的源地址A和端口1写入到交换表中,并向除了端口1以外的所有端口广播这个帧
由于在交换表中写入了项目(A,1),因此以后不管从哪个端口收到帧,只要其目的地址是A,就把收到的帧从端口1转发出去送交A
注:交换表中的项目还有一列是写入时间,超过预设时间即删除该项目
为了防止广播风暴,有生成树协议STP:不改变网络的实际拓扑,但在逻辑上切断某些链路,使从一台主机到所有其他主机的路径是无环路的树状结构
动作 | 交换表的状态 | 向哪些接口转发帧 | 说明 |
---|---|---|---|
A发送帧给D | 写入(A,1) | 2,3,4,5,6 | 表是空的,第一次进行广播,向所有接口转发帧 |
D发送帧给A | 写入(D,4) | 1 | A存在了,将D存入 |
E发送帧给A | 写入(E,5) | 1 | A存在,将E存入 |
A发送帧给E | 刷新(A,1) | 5 | A,E信息都已存在 |
虚拟局域网VLAN
把一个较大的局域网分割成一些较小的局域网
只是局域网给用户提供的一种服务,并不是一种新型局域网
VLAN 标签:前两个字节总是设置为 0x8100,称为IEEE 802.1Q标签类型
CSMA/CD协议
载波监听多点接入/碰撞检测
多点接入:说明是总线型网络
载波监听:边发边监听
碰撞检测:
边发送数据边检测信道上信号电压的变化情况
tips:电磁波在 1km 电缆的传播时延约为 5μs
τ:单程端到端传播时延,则检测碰撞的最长时间是两倍的总线端到端的传播时延(2τ)
最短帧长 = 总线传播时延 * 数据传输速率 * 2
显然,使用 CSMA/CD 协议时,一个站不可能同时进行发送和接收,但必须边发送边监听信道,因此为半双工通信
假定1km长的CSMA/CD网络的数据率为1Gb/s。设信号在网络上的传播速率为200000km/s。求能够使用此协议的最短帧长
对于1km电缆,单程传播时间为1/200000=5微秒,来回路程传播时间为10微秒,为了能够按照CSMA/CD工作,最小帧的发射时间不能小于10微秒,以1Gb/s速率工作,10微秒可以发送的比特数等于10*10-6 * 1*109=10000,因此,最短帧是10000位或1250字节长
退避算法
让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是退避一个随机的时间
基本退避时间为争用期 2τ,具体的争用期时间是 51.2μs
以太网规定了一个最短帧长64字节,即512比特
假定在使用CSMA/CD协议的10Mb/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100。试问这个站需要等待多长时间后才能再次发送数据?如果是100Mb/s的以太网呢?
对于10mb/s的以太网,以太网把争用期定为51.2微秒,要退后100个争用期,等待时间是51.2(微秒)*100=5.12ms对于100mb/s的以太网,以太网把争用期定为5.12微秒,要退后100个争用期,等待时间是5.12(微秒)*100=512微秒
使用集线器的星型拓扑
IEEE 802.3i
集线器(Hub):
- 使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是 CSMA/CD 协议
- 多端口转发器,每个端口通过 RJ-45 插头用两对双绞线与一台计算机上的适配器相连
- 集线器工作在物理层,每个端口仅简单转发比特,不进行碰撞检测
网络层
网络层(Network Layer)是 OSI 模型中的第三层(TCP/IP 模型中的网际层),提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,并具有一定的拥塞控制和流量控制的能力。相当于传送邮件时需要地址一般重要。由于 TCP/IP 协议体系中的网路层功能由 IP 协议规定和实现,故又称 IP 层。
互联网设计思路:网络层要设计得尽量简单,向其上层只提供简单灵活的、无连接的、尽最大努力交付的数据报(即分组)服务
网络在发送分组时不需要先建立连接,每一个分组(IP数据报)独立发送,与其前后的分组无关(不进行编号),网络层不提供服务质量的承诺
主要功能
寻址:使用IP地址来唯一标识互联网上的各个寻址,网络层依靠IP地址进行相互通信
路由:在同一个网络中的内部通信并不需要网络层设备,仅仅靠数据链路层就可以完成相互通信,对于不同的网络之间相互通信则必须借助路由器等三层设备
网络层向上提供的服务
虚电路服务:面向连接,所有的数据都在此虚电路上传送。
- 优点:预约了双方通信所需的一切网络资源,能提供服务质量的承诺。即所传送的分组不出错、丢失、重复和失序(不按序列到达终点),也保证分组传送的时限
- 缺点:路由器复杂,网络成本高
数据报服务:无连接,数据传送的路径是不确定的
- 优点:无网络资源障碍,尽力而为(与虚电路服务优缺点互易)
对比:
虚电路服务 | 数据报服务 | |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不需要 |
终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电信号 | 每个分组都有终点的完整地址,即IP地址 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立查找转发表进行转发 |
当节点出故障的时 | 所有通过出故障的节点的虚电路均不能工作 | 出故障的节点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达终点 | 到达终点的顺序不一定按发送的顺序 |
端到端的差错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
网际协议IP
配套使用:
- 地址解析协议ARP:经常使用
- 网际控制报文协议ICMP:要使用协议IP
- 网际组管理协议IGMP:要使用协议IP
IP地址
32位的二进制代码(总共232个地址),指明了连接到某个网络上的一个主机(或路由器)
每个主机的接口分配一个IP地址
点分十进制:如 10000000 00001011 00000011 00011111 转为 128.11.3.31
第一个字段是网络号,标志主机(或路由器)所连接到的网络,一个网络号在整个互联网范围内必须是唯一的
第二个字段是主机号,标志该主机(或路由器)
一个IP地址在整个互联网范围内是唯一的
IP地址 ::= { <网络号>, <主机号> }
(::=
表示“定义为”)
128 = 10000000
192 = 11000000
255 = 11111111
分类
单播地址(一对一通信):
A类(n=8):共有 231 个地址,占50%
网络号字段占 1个字节,只有 7 位可供使用(第一位固定为0)。
网络号全为0的IP地址表示本网络,网络号为 127(即01111111)保留作为本地软件环回测试本主机的进程直接的通信用
所以A类地址可指派的网络号是 126 个(即27-2)
主机号字段占 3 个字节。
全0的主机号表示该IP地址是“本主机”所连接到的单个网络地址(例:主机IP为5.6.7.8,则网络号为5,网络地址为5.0.0.0)
全1的主机号表示“所有的”表示该网络上的所有主机,即广播地址
因此每一个A类网络最大主机数是 224-2
B类(n=16):共有 230 个地址,占25%
网络号字段有 2 个字节,则可指派的网络号为 214
每一个B类网络上的最大主机数是216-2(扣除全0和全1)
C类(n=24):共有 229 个地址,占12.5%
网络号字段有3个字节,则可指派的网络号为 221
每一个C类网络上的最大主机数/地址数是 28
多播地址(一对多通信):D类,占6.25%
保留地址:E类,占6.25%
判断哪一类地址看开头4位的二进制位即可
无分类编址 CIDR
网络前缀
“网络号”改为“网络前缀”,但n不是固定的数,可以在0~32之间任意取值
IP地址 ::= { <网络前缀>,<主机号> }
CIDR记法(斜线记法):在IP地址后面加上/
,斜线后面是网络前缀所占的位数
地址块
网络前缀都相同的所有连续 IP 地址组成“ CIDR 地址块”
一个 CIDR 地址块包含的 IP 地址数目,取决于网络前缀的位数
注:
128.14.32.7 是IP地址,但未指明网络前缀长度,因此不知道网络地址
128.14.32.7/20 也是IP地址,同时指明网络前缀为20位,所以可导出网络地址
128.14.32.0/20 是包含多个IP地址的地址块或网络前缀
地址掩码/子网掩码
使用二进制计算时就必须使用32位的地址掩码从IP地址迅速算出网络地址,网络前缀位数对应二进制位 1 的数量
A类:255.0.0.0 或 255.0.0.0/8,即 255 == 1111 1111
B类:255.255.0.0 或 255.255.0.0/16
C类:255.255.255.0 或 255.255.255.0/24
把二进制的IP地址和地址掩码进行按位AND运算(同为1则为1,其他情况均为0)即可得出网络地址
网络地址和IP地址的区别:IP 地址可分配给主机,网络地址不可分配给主机。IP 地址一般是指主机的地址。网络地址是网络地址(网络号)路由器或三层交换机对数据包进行路由选择的
路由聚合:用较大的一个CIDR地址来代替许多较小的地址块
对如下的4个/24地址块:
212.56.132.0/24
212.56.133.0/24
212.56.134.0/24
212.56.135.0/24
212 =(11010100)
56 =(00111000)
132 =(10000100),133 =(10000101),134 =(10000110),135 =(10000111)
所以共同的前缀有22位,即 11010100 00111000 100001,聚合的CIDR地址块是: 212.56.132.0/22
IP地址特点
- 每一个IP地址都由网络前缀和主机号两部分组成
- 实际上IP地址是标志一台主机和一条链路的接口
- 一个网络(或子网)是指具有相同网络前缀的主机的集合:因此,用转发器或交换机连接起来的若干个局域网仍为一个网络
- 互联网同等对待每一个IP地址
IP地址与MAC地址区别
IP地址是逻辑地址
地址解析协议 ARP
已知 IP 地址怎么找 MAC 地址?
在主机的ARP高速缓存中存放一个从IP地址到MAC地址的映射表,并且这个映射表还经常动态更新
ARP请求分组:广播发送
ARP响应分组:单播
使用 ARP 的四种情况:(相同的 N 代表同一个网络)
- N1上的主机H1 –> N1上的主机H2:H1 发送 ARP 请求分组(在 N1 上广播),找到 H2 的 MAC 地址
- N1上的主机H1 –> N1上的路由器R1 –> N2上的主机H3:H1 发送 ARP 请求分组(在 N1 上广播),找到 R1 的 MAC 地址,剩下交给第3或第4种情况
- N1上的路由器R1 –> N2上的主机H3:R1 发送 ARP 请求分组(在 N2 上广播),找到 H3 的 MAC 地址
- N1上的路由器R1 –> N2上的路由器R2 –> N3上的主机H4:R1 发送 ARP 请求分组(在 N2 上广播),找到 R2 的 MAC 地址,剩下的交给 R2
IP数据报格式
首部:前一部分固定20字节,后一部分是可选字段
版本:占4位,指IP协议的版本
首部长度:占4位,可表示最大十进制数15。最常用首部长度是20字节
区分服务:占8位
总长度:首部和数据之和的长度,数据报最大长度216-1=65535字节
最大传送单元MTU:一个数据帧中的数据字段的最大长度,最常用的以太网规定MTU为1500字节,数据报长度超过则需要分片处理
注:总长度指分片后的每一个分片首部长度与该分片的数据长度的总和
标识:占16位
标志(flag):占3位
- 最低位为
MF
:MF=1表示后面还有分片,MF=0表示这是若干数据报片中的最后一个 - 中间一位为
DF
:DF=1不能分片,DF=0允许分片
- 最低位为
片偏移:占13位,以8个字节为偏移单位。除最后一个数据报片外,其他每个分片的长度一定是8字节(64位)的整数倍
总长度 标识 MF DF 片偏移 原始数据报 3820 12345 0 0 0 数据报片1 1420 12345 1 0 0/8 = 0 数据报片2 1420 12345 1 0 1400/8 = 175 数据报片3 1020 12345 0 0 2800/8 = 350 设数据报片2经过某网络时还需要再分片为 2-1(800字节)和 2-2(600字节):
则 2-1 :820,12345,1,0,1400/8=175
2-2:620,12345,1,0,2200/8=275
生存时间(TTL):占8位,表明这是数据报在网络中的寿命(现在是跳数限制),路由器在每次转发数据报之前就把TTL值减1,当TTL=0时丢弃数据报,所以TTL的单位是跳数
TTL最大值为255
若TTL初始值为1,就标识这个数据报只能在本局域网中传送
协议:占8位
常见的协议字段值
ICMP 1 IGMP 2 TCP 6 EGP 8 IFP 9 UDP 17 IPv6 41 ESP 50 AH 51 ICMP-IPv6 58 OSPF 89
首部检验和:占16位,只检验数据报的首部但不包括数据部分
当某个路由器发现一IP数据报的检验和有差错时,为什么采取丢弃的办法而不是要求源站重传此数据报?计算首部检验和为什么不采用CRC检验码?
纠错控制由上层(运输层)执行,IP首部中的源站地址也可能出错,请错误的源地址重传数据报是没有意义的
不采用CRC简化解码计算量,提高路由器的吞吐量
源地址:占32位
目的地址:占32位
IP分配
分配网络前缀时应先分配地址数较多的前缀
某单位分配到一个地址块136.23.12.64/26。现在需要进一步划分为4个一样大的子网
- 每一个子网的网络前缀:由公式知,划分4个子网需要借2位"1",那么网络前缀为 26+2=28(11111111 11111111 11111111 11110000)
- 每一个子网中的地址数:由公式知,主机数 = 2 ^ 4 = 16
- 每一个子网的地址:
- 136.23.12.64/28
- 136.23.12.80/28
- 136.23.12.96/28
- 136.23.12.112/28
IP层分组转发
基于终点的转发
先查找目的网络(网络前缀),在找到了目的网络之后,就把分组在这个网络上直接交付目的主机
转发过程:路由表如下
前缀匹配 | 目的网络 | 子网掩码 | 下一跳 |
---|---|---|---|
192.4.153.0/26 | 192.4.153.0 | 255.255.255.192 | R3 |
128.96.39.0/25 | 128.96.39.0 | 255.255.255.128 | 接口m0 |
128.96.39.128/25 | 128.96.39.128 | 255.255.255.128 | 接口m1 |
128.96.40.0/25 | 128.96.40.0 | 255.255.255.128 | R2 |
*(默认) | —— | —— | R4 |
现共收到5个分组,其目的地址分别为:
- 128.96.39.10:与子网掩码 255.255.255.128 相与,得 128.96.39.0,则经接口0转发
- 128.96.40.12:与子网掩码 255.255.255.128 相与得 128.96.40.0,不等于 128.96.39.0;与子网掩码 255.255.255.128 相与得 128.96.40.0,经查路由表可知,该项分组经R2转发
- 128.96.40.151:与子网掩码 255.255.255.128 相与后得 128.96.40.128,与子网掩码 255.255.255.192 相与后得 128.96.40.128,查路由表知,该分组转发选择默认路由,经R4转发
- 192.4.153.17:与子网掩码 255.255.255.128 相与后得 192.4.153.0;与子网掩码 255.255.255.192 相与后得 192.4.153.0,经查路由表知,该分组经R3转发
- 192.4.153.90:与子网掩码 255.255.255.128 相与后得 192.4.153.0。与子网掩码 255.255.255.192 相与后得 192.4.153.64,经查路由表知,该分组转发选择默认路由,经R4转发
最长前缀匹配
在采用CIDR编址时,如果一个分组在转发表中可以找到多个匹配的前缀,那么就应当选择前缀最长(子网掩码最长)的一个作为匹配的前缀
例:
192.168.20.16/28
192.168.0.0/16
在要查找地址192.168.20.19的时候,这两个表项都“匹配”。也就是说,两个表项都包含着要查找的地址。这种情况下,前缀最长的路由就是192.168.20.16/28,因为它的子网掩码(/28)比其他表项的掩码(/16)要长
分组转发算法
从收到的分组的首部提前目的主机的IP地址
若查找到有特定主机路由,就按照这条路由的下一跳转发分组;否则从转发表中下一行(也就是前缀最长的一行)开始检查,执行3
把这一行的子网掩码与目的地址按位进行AND运算
若运算结果与本行的前缀匹配,则查找结束,按下一跳所指出的进行处理
否则,若转发还有下一行,则对下一行进行检查,重新执行3
否则,执行4
若转发表中有一个默认路由,则按照指明的接口,把分组传送到指明的默认路由器。否则,报告转发分组出错
网际控制报文协议ICMP
报文种类
ICMP报文种类 | 类型的值 | ICMP报文类型 |
---|---|---|
差错报告报文 | 3 | 终点不可达 |
11 | 时间超过 | |
12 | 参数问题 | |
5 | 改变路由(重定向) | |
询问报文 | 8或0 | 回送请求或者回送回到 |
13或14 | 时间戳请求或时间戳回答 |
应用——PING
测试两台主机之间的连通性,PING使用了ICMP回送请求与回送回答报文,没有通过运输层的TCP或UDP
以前面那张图为例
应用——traceroute
跟踪一个分组从源点到终点的路径,获取目的主机的路由信息,Windows中是tracert
traceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报
然后路由器向源主机发送ICMP时间超过差错报告报文和ICMP终点不可达差错报告报文
IPv6
长度:128位
采用冒号十六进制记法
零压缩
一连串连续的零可以为一对冒号所替代
如 FF05:0:0:0:0:0:0:B3 可压缩为 FF05::B3
规定任一地址中只能使用一次零压缩
IPv4向IPv6过渡
- 双协议栈
- 隧道技术
路由选择协议
分为两大类:
内部网关协议 IGP:域内路由选择,如 RIP 和 OSPF。力求最佳路由,只关心本自治系统内如何传送数据报,与互联网中其他自治系统使用什么协议无关
外部网关协议 EGP:域间路由选择,如 BGP-4。力求较好路由(不兜圈子),在不同的AS边界传递路由信息的协议,不关心AS内部使用何种协议
内部网关协议RIP
基于距离向量的路由选择协议
- 仅和相邻路由器交换信息
- 交换自己现在的路由表
- 按固定的时间间隔交换路由信息
距离向量算法
- 对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加1
- 若原来的路由表中没有目的网络Net,则把该项目添加到路由表中
- 否则,若下一条路由器地址是X,则把收到的项目替换原路由表中的项目
- 否则,若收到的项目中的距离d小于路由表中的距离,则进行更新
- 否则什么也不做
- 否则,若收到的项目中的距离d小于路由表中的距离,则进行更新
- 若3分组还没有收到相邻路由器的更新路由表,则把相邻路由器记为不可达的路由器,即把距离设置为16(表示不可达)
- 返回
假定网络中的路由器B的路由表有如下的项目:
目的网络 | 距离 | 下一跳路由器 |
---|---|---|
N1 | 7 | A |
N2 | 2 | C |
N6 | 8 | F |
N8 | 4 | E |
N9 | 4 | F |
现在B收到从C发来的路由信息:
目的网络 | 距离 |
---|---|
N2 | 4 |
N3 | 8 |
N6 | 4 |
N8 | 3 |
N9 | 5 |
路由器B更新后的路由表如下:(距离更新需要算上路由器C这一跳)
目的网络 | 距离 | 下一跳路由器 | |
---|---|---|---|
N1 | 7 | A | 无新信息,不改变 |
N2 | 5 | C | 相同的下一跳,更新 |
N3 | 9 | C | 新的项目,添加进来 |
N6 | 5 | C | 不同的下一跳,距离更短,更新 |
N8 | 4 | E | 不同的下一跳,距离一样,不改变 |
N9 | 4 | F | 不同的下一跳,距离更大,不改变 |
内部网关协议OSPF
开放最短路径优先(最短路径算法SPF)
- 向本自治系统中所有路由器发送消息,洪泛法
- 发送的信息就是与本路由器相邻的所有路由器的链路状态
- 当链路状态发送变化或每隔一段时间,路由器向所有路由器用洪泛法发送链路状态信息
外部网关协议BGP
采用路径向量路由选择协议
选择出一条能够到达目的网络前缀且比较好的路由
运输层
OSI的第四层,负责端到端的通信
端口
对TCP/IP体系的应用进程进行统一的标志,使运行不同操作系统的计算机的应用进程能够互相通信
一个16位的标识符,范围0~65535
套接字 = 主机IP地址 + 端口号
分类:
服务器端使用的端口号
熟知端口号:0~1023,标记常规的服务进程
FTP 21 TELENT 23 SMTP 25 DNS 53 TFTP 69 HTTP 80 SNMP 161 HTTPS 443 RIP 520
登记端口号:1024~49151,标记没有熟知端口号的非常规的服务进程
客户端使用的端口号
短暂端口号:49152~65535,客户进程运行时才动态选择,临时使用
实验:运输层端口观察实验
拓扑如下
IP地址配置:
设备 | 接口 | IP地址 | 子网掩码 | 网关 | DNS |
---|---|---|---|---|---|
PC1 | FastEthernet0 | 192.168.1.11 | 255.255.255.0 | 192.168.1.254 | 192.168.1.1 |
PC2 | FastEthernet0 | 192.168.1.12 | 255.255.255.0 | 192.168.1.254 | 192.168.1.1 |
Server | FastEthernet0 | 192.168.1.1 | 255.255.255.0 | 192.168.1.254 | - |
任务一:观察UDP端口
PC1访问port.com,发送DNS报文给Server
看一下最开始PC1的PDU信息和Server发回报文的PDU信息
观察:SOURCE PORT和DESTINATION PORT字段的取值
访问网页次数 | 报文 | SOURCE PORT | DESTINATION PORT |
---|---|---|---|
第1次 | PC1发给Server | 1025 | 53 |
第1次 | Server发给PC1 | 53 | 1025 |
可知:UDP请求报文的源端口是应答报文的目的端口,UDP请求报文的目的端口是应答报文的源端口
用户数据报协议UDP
使用例:DNS(域名系统),TFTP(简单文件传输协议),RIP(路由信息协议),DHCP(动态主机配置协议),SNMP(简单网络管理协议),NFS(网络文件系统)
特点:
- 无连接服务
- 尽最大努力交付
- 面向报文:保留应用层交下来的报文的边界
- 没有拥塞控制
- 支持一对一、一对多、多对一和多对多的交互通信
- 首部开销小
首部格式
长度为8个字节,由4个字段组成,每个字段的长度都是2字节
- 源端口
- 目的端口
- 长度:UDP用户数据报的长度,最小为8(仅有首部)
- 检验和
一个UDP用户数据的数据字段为8192字节。在数据链路层要使用以太网来传送。试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值。
答:6个,前5个是1480字节(PPP帧不超过1500字节,IP数据报首部20字节),最后一个是800字节(UDP首部8字节)。片偏移字段的值分别是:0,1480,2960,4440,5920和7400
某UDP用户数据报的首部十六进制表示是:06 32 00 45 00 1C E2 17
- 源端口:1586(06 32)
- 目的端口:69(00 45)
- UDP用户数据报总长度:28字节(00 1C)
- 数据部分长度:20字节(28 - 8)
计算检验和
在数据报前增加12个字节的伪首部(不向下传送也不向上递交)
UDP检验和把首部和数据部分一起都检验
仅当标识符相同的 IP 数据报片才能组装成一个 IP 数据报
传输控制协议TCP
面向连接服务,传送数据前必须先建立连接,数据传送结束后要释放连接。不提供广播或多播服务
使用例:IGMP(网际组管理协议),SMTP(简单邮件传送协议),TELNET(远程终端协议),HTTP(超文本传送协议),FTP(文件传送协议)
特点:
- 面向连接
- 点对点
- 可靠交付
- 全双工通信
- 面向字节流
连接
每一条TCP连接都有两个端点——套接字socket/插口
套接字socket = (IP地址:端口号)
比如:127.0.0.1:8080
首部格式
前20个字节固定,即最小长度是20字节
源端口和目的端口:各占2字节,即16位
序号:4字节,即32位,用于计算报文长度
确认号:4字节,即32位,是期望收到对方下一个报文段的第一个数据字节的序号
若确认号 = N,则表明:到序号 N-1 为止的所有数据都已正确收到
数据偏移:只占4位,用于计算首部长度
保留:占6位
接下来是控制位, 用来说明报文段的性质
紧急URG
确认ACK:ACK=1时确认号字段才有效,ACK=0时确认号无效,TCP中连接建立后所有传送的报文段ACK必须为1
推送PSH
复位RST
同步SYN:在连接建立时用来同步序号。SYN=1&ACK=0,表明这是一个连接请求报文段。对方同意,则响应SYN=1&ACK=1
终止FIN:free一个连接。FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接
窗口:2字节,即16位。表明自己的接收窗口大小(从确认号算起,允许对方发送的数据量)
检验和:2字节。计算要加上12字节的伪首部(格式和UDP一样),但其中第4个字段中的17改为6(TCP的协议号为6),第5个字段中的UDP长度改为TCP长度。首部和数据部分均需要检验
紧急指针
选项
TCP可靠传输
TCP发送的报文段是交给IP层传送的,但IP层只能提供尽最大努力服务,即TCP下面的网络所提供的是不可靠的传输
停止等待协议
全双工通信的双方既是发送方也是接收方,设A为发送方,B为接收方
停止等待就是每发送完一个分组(传送的数据单元)就停止发送,等待对方的确认,在收到确认后再发送下一个分组
无差错情况
A发送一个分组给B,B收到然后发送确认给A,A在收到确认后再发下一个分组
出现差错
A超过一段时间没收到确认,就会重传一次前面发送过的分组
要实现这一点就要发送分组时设置一个超时计时器,在计时器到期之前收到对方的确认就撤销已设置的超时计时器
确认丢失和确认迟到
上面提到了一旦计时器到期就会进行重传,但是如果B发送的确认还没到达A超时计时器就到期了,或者在到期后B才接收到这个分组怎么办?
这时候B在接收到了重传的分组时就要丢弃这个重复的分组,不再向上层重复交付
然后依旧向A发送确认
信道利用率
TD:A发送分组需要的时间,等于分组长度除以数据率
RTT:往返时间
TA:发送确认分组需要的时间
设TCP使用的最大窗口为65535字节,而传输信道不产生差错,带宽也不受限制。若报文段的平均往返时延为20ms,问所能得到的最大吞吐量是多少?
在发送时延可忽略的情况下,最大数据率=最大窗口*8/平均往返时间
=26.2Mb/s
通信信道带宽为1Gb/s,端到端时延为10ms。TCP的发送窗口为65535字节。试问:可能达到的最大吞吐量是多少?信道的利用率是多少?
数据长度 L = 65536×8+40×8=524600
信道带宽 C = 109 b/s发送时延(L/C)= 数据长度 / 信道带宽
= 0.0005246s
端到端时延 Td = 10×10-3s总时间 = 发送时延 + 往返时延 = 发送时延 + 2*端到端时延
最大吞吐量 = 数据长度L / 总时间(L/C+2*Td)
= 524600/0.0205246=25.5Mb/s信道利用率 = 最大吞吐量/带宽
= 0.0255
连续ARQ协议
自动重传请求 ARQ (Automatic Repeat reQuest):重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。连续ARQ协议是在发送完一个数据帧后,不是停下来等待应答帧,而是可以连续发送窗口内的数据帧。如果在此过程中又收到了接收端发来的应答帧,窗口可以向前移动,那么还可以接着发送窗口内其他没有发送的数据帧。
发送方设置发送窗口连续发送多个分组,收到一个确认后发送窗口向前滑动一个分组的位置
接收方累积确认,在收到几个分组后,对按序到达的最后一个分组发送确认
假定使用连续ARQ协议,发送窗口大小是3,而序号范围是[0,15],而传输媒体保证在接收方能够按序收到分组。在某一时刻,在接收方,下一个期望收到的序号是5
因为下一个期望收到的序号为5,说明4及以下的报文全部收到
那么发送方的发送窗口中可能出现的序号组合有:
- 若这些确认全部到达发送方,则WT=[5,6,7]
- 若所有的确认都丢失,则WT=[2,3,4]
- 若3号确认丢失,则WT=[3,4,5]
- 若4号确认丢失,则WT=[4,5,6]
接收方已经发送出的、但在网络中(即还未到达发送方)的确认分组可能有:
因为WT=3,ACK=5,所以0、1号报文的确认肯定已经到达发送方,否则不会发送4号分组,所以可能滞留在网络中的确认是2,3,4,是对2,3,4号分组([2, 3 ,4]、[3, 4, 5]、[4, 5, 6])的确认
实现——滑动窗口机制
以字节为单位:
设A收到B发来的确认报文段,窗口为20字节,确认号为31
往返时间(Round-Trip Time,RTT):一个报文发出的时间和收到相应确认的时间之差
超时重传时间(RTO)的选择:
加权平均往返时间RTTS:**每当第一次测量到 RTT 样本时,RTTS 值就取为所测量到的 RTT 样本值,但是以后每测量到一个新的 RTT 样本,就按下式重新计算一次 RTTS**(RFC 6298 推荐 α=0.125)
RTTD:当第一次测量时,RTTD 值取为测量到的 RTT 样本值的一半,以后则按下式计算(RFC 6298 推荐 β=0.25)
最终RTO = RTTS + 4 * RTTD
主机A向主机B连续发送了两个TCP报文段,其序号分别为70和100
- 第一个报文段的数据序号是70到99,共 30字节 的数据
- 主机B收到第一个报文段后发回的确认中的确认号应当是 100
- 如果主机B收到第二个报文段后发回的确认中的确认号是180,则A发送的第二个报文段中的数据有 80字节(100~179)
- 如果A发送的第一个报文段丢失了,但第二个报文段到达了B,B在第二个报文段到达后向A发送确认,则这个确认号为 70
在使用TCP传送数据时,如果有一个确认报文段丢失了,也不一定会引起与该确认报文段对应的数据的重传
因为还未重传就收到了对更高序号的确认
假定TCP在开始建立连接时,发送方设定超时重传时间是RTO=6s
(1)当发送方接到对方的连接确认报文段时,测量出RTT样本值为1.5s。试计算现在的RTO值。
(2)当发送方发送数据报文段并接收到确认时,测量出RTT样本值为2.5s。试计算现在的RTO值。
第一次测量到RTT样本时,RTTs 值就取为这个测量到的RTT样本值,因此 RTTs=1.5s
根据 RFC2988 的建议,当第一次测量时,RTTD值取为测量到的RTT样本值的一半,因此 RTTD=(1/2)*1.5s=0.75s
RTO = RTTs + 4*RTTD = 1.5s+4×0.75s=4.5s
新的RTT样本=2.5s
新的RTTs = (1-α)*(旧的RTTs) + α*(新的RTT样本) = (1-1/8)×1.5s + 1/8×2.5s = 1.625s
新的RTTD = (1-β)*(旧的RTTD) + β*|RTTs-新的RTT样本| = (1-1/4)×0.75s+1/4×|1.625s-2.5s|= 0.78125≈0.78s
RTO = RTTs + 4*RTTD = 1.625s+4×0.78s≈4.75s
已知第一次测得 TCP 的往返时延的当前值 RTT 是 30 ms。现在收到了三个接连的确认报文段,它们比相应的数据报文段的发送时间分别滞后的时间是:26 ms,32 ms 和24 ms。设 α = 0.1。试计算每一次的新的加权平均往返时间值RTTs。
- RTTs=(1-0.1)×30ms+0.1×26ms=29.6ms
- RTTs=(1-0.1)×29.6ms+0.1×32ms=29.86ms
- RTTs=(1-0.1)×29.86ms+0.1×24ms=29.256ms
流量控制
让发送方的发送速率不要太快,要让接收方来得及接收
利用滑动窗口实现:
注:TCP的窗口单位是字节,不是报文段
TCP拥塞控制
拥塞:对资源的需求之和 > 可用资源
作用:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至于过载
四种拥塞控制算法:慢开始、拥塞避免、快重传、快恢复
基于窗口的拥塞控制:发送方让自己的发送窗口等于拥塞窗口 cwnd
慢开始
在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS 的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS 的数值
由小到大逐渐增大注入到网络中的数据字节,即由小到大逐渐增大拥塞窗口数值
发送方的最大报文段SMSS
初始拥塞窗口cwnd
则cwnd每次增加量 = min( N , SMSS )
,(N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数,如下图接收的确认数)如下图类似于复制的增加,除非到了SMSS
为了防止拥塞窗口 cwnd 增长过大引起网络拥塞,还需要设置一个慢开始门限 ssthresh状态变量:
- 当 cwnd < ssthresh 时,使用慢开始算法
- 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法
- 当 cwnd = ssthresh 时,两种算法均可
拥塞避免
当拥塞窗口值大于慢开始门限时,停止使用慢开始算法而改用拥塞避免算法。拥塞避免算法使发送的拥塞窗口每经过一个往返时延RTT 就增加一个 MSS 的大小
让cwnd缓慢增大(线性增长)
乘法减小:是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数。
加法增大:是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd 增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞
快重传&快恢复
快重传:让发送方尽早知道发生了个别报文段的丢失
快恢复:发现只丢了部分,不启动慢开始,调整门限值
设TCP的 ssthresh 的初始值为8(单位为报文段)。当拥塞窗口上升到12时网络发生了超时,TCP使用慢开始和拥塞避免。试分别求出第1次到第15次传输的各拥塞窗口大小。
拥塞窗口大小分别为:1,2,4,8,9,10,11,12,1,2,4,6,7,8,9
1,2,4,8:慢开始
9,10,11,12:拥塞避免,加法增大
1,2,4,6:超时,乘法减小,ssthresh 变为6,慢开始
7,8,9:拥塞避免,加法增大
运输连接管理
连接建立——三次握手
初始序号seq,确认号ack
连接释放——两次二次握手
用 TCP 传送 512 字节的数据。设窗口为 100 字节,而 TCP 报文段每次也是传送 100 字节的数据。再设发送端和接收端的起始序号分别选为 100 和 200
要传送的 512 B 的数据必须划分为 6 个报文段传送,前 5 个报文段各 100 B,最后一个报文段传送 12 B
- 报文段 #1:A 发起主动打开,发送 SYN 报文段,除以 SYN-SENT 状态,并选择初始序号 seq = 100。B 处于 LISTEN 状态。
- 报文段 #2:B 确认 A 的 SYN 报文段,因此 ack = 101(是 A 的初始序号加 1)。B选择初始序号 seq = 200。B 进入到 SYN-RCVD 状态。
- 报文段 #3:A 发送 ACk 报文段来确认报文段 #2,ack = 201(是 B 的初始序号加 1)。A 没有在这个报文段中放入数据。因为 SYN 报文段 #1 消耗了一个序号,因此报文段 #3 的序号是 seq = 101。这样,A 和 B 都进入了 ESTABLISHED 状态