前言
概述
计算机网络由若干节点和连接这些节点的链路组成
网络把许多计算机连接在一起,而互连网则把许多网络通过一些路由器连接在一起。与网络相连的计算机常称为主机
ISP(Internet Service Provider):互联网服务提供者,互联网现在采用三层 ISP 结构(主干 ISP、地区 ISP、本地 ISP)
RFC(Request For Comments):互联网标准发布的文档形式
互联网的组成
边缘部分:由所有连接在互联网上的主机组成,这部分是用户直接使用的,用来进行通信(传送数据、音频或视频)和资源共享
通信方式分为两大类:
客户-服务器方式:客户(client)是服务请求方,服务器(server)是服务提供方
对等连接方式(peer-to-peer,P2P)
核心部分:由大量网络和连接这些网络的路由器组成,这部分是为边缘部分提供服务的(提供连通性和交换)
- 路由器:一种专用计算机(不叫主机),实现分组交换,任务是转发收到的分组
性能
计算
- 速率
- 带宽
- 吞吐量
- 时延
- 时延带宽积
- 往返时间 RTT
- 利用率
计算机网络体系结构
- 应用层:通过应用进程间的交互来完成特定网络应用,协议有 DNS、HTTP、SMTP 等,应用层交互的数据单元称为报文(message)
- 运输层:向两台主机中进程之间的通信提供通用的数据传输服务,协议有 TCP(Transmission Control Protocol,数据传输单位:报文段)和 UDP(User Datagram Protocol,数据传输单位:数据报)
- 网络层:为分组交换网上的不同主机提供通信服务,使用 IP 协议
- 数据链路层:将网络层交下来的 IP 数据包组装成帧
- 物理层:数据单位是比特(0101010)
OSI参考模型把对等层次之间传送的数据单位称为该层的协议数据单元 PDU(Protocol Data Unit)
数据链路层
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
最后,近似认为:凡是接收端数据链路层接收的帧均无差错
点对点PPP协议
目前使用最广泛的数据链路层协议
满足以下条件:
- 简单
- 封装成帧
- 透明性
- 多种网络层协议
- 多种类型链路
- 差错检测
- 检测连接状态
- 最大传送单元
- 网络层地址协商
- 数据压缩协商
帧格式
PPP帧的首部和尾部分别为四个字段和两个字段
F:标志字段,0x7E,表示一个帧的开始或结束,即定界符
协议字段:2字节
0x0021——IP数据报
0xC021——PPP链路控制协议LCP的数据
0x8021——网络层的控制数据
信息字段长度可变,不超过1500字节
字节填充:和前面的透明传输和类似,利用字节填充的方式转义信息中的标志字段(如定界符0x7E)
以太网标准
数据链路层拆成两个子层:逻辑链路控制LLC(已过时)和媒体接入控制MAC
计算机与外界局域网的连接——适配器(网卡NIC):具有过滤功能
为了通信的简便,以太网采用以下措施:
- 无连接,尽最大努力的交付,即不可靠的交付
- 曼彻斯特编码
MAC层
硬件地址/物理地址/MAC地址
每一台计算机中固化在适配器的ROM中的地址
格式
只介绍以太网V2的MAC帧格式
扩展以太网
物理层:加光纤,加Hub
数据链路层:交换机(switch)
交换机
实质上就是一个多端口的网桥,一般工作在全双工方式
相互通信的主机都独占传输媒体,无碰撞地传输数据
内部的帧交换表(地址表):通过自学习算法自动建立
自学习功能:
A先向B发送一帧,从端口1进入交换机。交换机收到帧,先查找交换表,现在表中没有B的地址。于是,交换机把此帧的源地址A和端口1写入到交换表中,并向除了端口1以外的所有端口广播这个帧
由于在交换表中写入了项目(A,1),因此以后不管从哪个端口收到帧,只要其目的地址是A,就把收到的帧从端口1转发出去送交A
注:交换表中的项目还有一列是写入时间,超过预设时间即删除该项目
为了防止广播风暴,有生成树协议STP:不改变网络的实际拓扑,但在逻辑上切断某些链路,使从一台主机到所有其他主机的路径是无环路的树状结构
虚拟局域网VLAN
把一个较大的局域网分割成一些较小的局域网
只是局域网给用户提供的一种服务,并不是一种新型局域网
VLAN标签:前两个字节总是设置为0x8100,称为IEEE 802.1Q标签类型
CSMA/CD协议
载波监听多点接入/碰撞检测
多点接入:说明是总线型网络
载波监听:边发边监听
碰撞检测:
边发送数据边检测信道上信号电压的变化情况
τ:单程端到端传播时延,则检测碰撞的最长时间是两倍的总线端到端的传播时延(2τ)
显然,使用CSMA/CD协议时,一个站不可能同时进行发送和接收,但必须边发送边监听信道,因此为半双工通信
退避算法
让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是退避一个随机的时间
使用集线器的星型拓扑
集线器(Hub):
- 使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是CSMA/CD协议
- 多端口转发器
- 集线器工作在物理层,每个端口仅简单转发比特,不进行碰撞检测
网络层
网络层(Network Layer)是OSI模型中的第三层(TCP/IP模型中的网际层),提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,并具有一定的拥塞控制和流量控制的能力。相当于传送邮件时需要地址一般重要。由于TCP/IP协议体系中的网路层功能由IP协议规定和实现,故又称IP层。
互联网设计思路:网络层要设计得尽量简单,向其上层只提供简单灵活的、无连接的、尽最大努力交付的数据报(即分组)服务
网络在发送分组时不需要先建立连接,每一个分组(IP数据报)独立发送,与其前后的分组无关(不进行编号),网络层不提供服务质量的承诺
主要功能
寻址:使用IP地址来唯一标识互联网上的各个寻址,网络层依靠IP地址进行相互通信
路由:在同一个网络中的内部通信并不需要网络层设备,仅仅靠数据链路层就可以完成相互通信,对于不同的网络之间相互通信则必须借助路由器等三层设备
两种服务
虚电路服务:所有的数据都在此虚电路上传送
数据报服务:数据传送的路径是不确定的
对比:
虚电路服务 | 数据报服务 | |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不需要 |
终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电信号 | 每个分组都有终点的完整地址,即IP地址 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立查找转发表进行转发 |
当节点出故障的时 | 所有通过出故障的节点的虚电路均不能工作 | 出故障的节点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达终点 | 到达终点的顺序不一定按发送的顺序 |
端到端的差错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
网际协议IP
配套使用:
- 地址解析协议ARP:经常使用
- 网际控制报文协议ICMP:要使用协议IP
- 网际组管理协议IGMP:要使用协议IP
IP地址
32位的二进制代码(总共232个地址),指明了连接到某个网络上的一个主机(或路由器)
每个主机的接口分配一个IP地址
第一个字段是网络号,标志主机(或路由器)所连接到的网络,一个网络号在整个互联网范围内必须是唯一的
第二个字段是主机号,标志该主机(或路由器)
一个IP地址在整个互联网范围内是唯一的
IP地址 ::= { <网络号>, <主机号> }
(::=
表示“定义为”)
分类
单播地址:
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%
无分类编址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地址迅速算出网络地址
A类:255.0.0.0或255.0.0.0/8
B类:255.255.0.0或255.255.0.0/16
C类:255.255.255.0或255.255.255.0/24
把二进制的IP地址和地址掩码进行按位AND运算即可得出网络地址
网络地址和IP地址的区别:IP 地址可分配给主机,网络地址不可分配给主机。IP 地址一般是指主机的地址。网络地址是网络地址(网络号)路由器或三层交换机对数据包进行路由选择的
IP地址与MAC地址区别
IP地址是逻辑地址
地址解析协议ARP
已知IP地址怎么找MAC地址?
在主机的ARP高速缓存中存放一个从IP地址到MAC地址的映射表,并且这个映射表还经常动态更新
ARP请求分组:广播发送
ARP响应分组:单播
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 |
数据报片2 | 1420 | 12345 | 1 | 0 | 175 |
数据报片3 | 1020 | 12345 | 0 | 0 | 350 |
生存时间(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位,只检验数据报的首部但不包括数据部分
源地址:占32位
目的地址:占32位
IP层分组转发
基于终点的转发
先查找目的网络(网络前缀),在找到了目的网络之后,就把分组在这个网络上直接交付目的主机
最长前缀匹配
在采用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终点不可达差错报告报文
路由选择协议
分为两大类:
内部网关协议IGP:域内路由选择,如RIP和OSPF
外部网关协议EGP:域间路由选择,如BGP-4
内部网关协议RIP
基于距离向量的路由选择协议
- 仅和相邻路由器交换信息
- 交换自己现在的路由表
- 按固定的时间间隔交换路由信息
距离向量算法
- 对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加1
- 若原来的路由表中没有目的网络Net,则把该项目添加到路由表中
- 否则,若下一条路由器地址是X,则把收到的项目替换原路由表中的项目
- 否则,若收到的项目中的距离d小于路由表中的距离,则进行更新
- 否则什么也不做
- 否则,若收到的项目中的距离d小于路由表中的距离,则进行更新
- 若3分组还没有收到相邻路由器的更新路由表,则把相邻路由器记为不可达的路由器,即把距离设置为16(表示不可达)
- 返回
内部网关协议OSPF
开放最短路径优先(最短路径算法SPF)
- 向本自治系统中所有路由器发送消息,洪泛法
- 发送的信息就是与本路由器相邻的所有路由器的链路状态
- 当链路状态发送变化或每隔一段时间,路由器向所有路由器用洪泛法发送链路状态信息
运输层
OSI的第四层,负责端到端的通信
用户数据报协议UDP
使用例:DNS(域名系统),TFTP(简单文件传输协议),RIP(路由信息协议),DHCP(动态主机配置协议),SNMP(简单网络管理协议),NFS(网络文件系统)
特点:
- 无连接服务
- 尽最大努力交付
- 面向报文:保留应用层交下来的报文的边界
- 没有拥塞控制
- 支持一对一、一对多、多对一和多对多的交互通信
- 首部开销小
首部格式
长度为8个字节,由4个字段组成,每个字段的长度都是2字节
- 源端口
- 目的端口
- 长度:UDP用户数据报的长度,最小为8(仅有首部)
- 检验和
计算检验和
在数据报前增加12个字节的伪首部(不向下传送也不向上递交)
UDP检验和把首部和数据部分一起都检验
传输控制协议TCP
面向连接服务,传送数据前必须先建立连接,数据传送结束后要释放连接。不提供广播或多播服务
使用例:IGMP(网际组管理协议),SMTP(简单邮件传送协议),TELNET(远程终端协议),HTTP(超文本传送协议),FTP(文件传送协议)
特点:
- 面向连接
- 点对点
- 可靠交付
- 全双工通信
- 面向字节流
连接
每一条TCP连接都有两个端点——套接字socket/插口
套接字socket = (IP地址:端口号)
比如:127.0.0.1:8080
首部格式
前20个字节固定,即最小长度是20字节
- 源端口和目的端口:各占2字节,即16位
- 序号:4字节,即32位,用于计算报文长度
- 确认号:4字节,即32位,是期望收到对方下一个报文段的第一个数据字节的序号
- 数据偏移:只占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发送的报文段是交给IP层传送的,但IP层只能提供尽最大努力服务,即TCP下面的网络所提供的是不可靠的传输
停止等待协议/自动重传协议ARQ
全双工通信的双方几十发送方也是接收方,设A为发送方,B为接收方
停止等待就是每发送完一个分组(传送的数据单元)就停止发送,等待对方的确认,在收到确认后再发送下一个分组
无差错情况
A发送一个分组给B,B收到然后发送确认给A,A在收到确认后再发下一个分组
出现差错
A超过一段时间没收到确认,就会重传一次前面发送过的分组
要实现这一点就要发送分组时设置一个超时计时器,在计时器到期之前收到对方的确认就撤销已设置的超时计时器
确认丢失和确认迟到
上面提到了一旦计时器到期就会进行重传,但是如果B发送的确认还没到达A超时计时器就到期了,或者在到期后B才接收到这个分组怎么办?
这时候B在接收到了重传的分组时就要丢弃这个重复的分组,不再向上层重复交付
然后依旧向A发送确认
信道利用率
TD:A发送分组需要的时间,等于分组长度除以数据率
RTT:往返时间
TA:发送确认分组需要的时间
连续ARQ协议
发送方设置发送窗口连续发送多个分组,收到一个确认后发送窗口向前滑动一个分组的位置
接收方累积确认,在收到几个分组后,对按序到达的最后一个分组发送确认
实现——滑动窗口机制
以字节为单位:
设A收到B发来的确认报文段,窗口为20字节,确认号为31
超时重传时间(RTO)的选择:
加权平均往返时间RTTS:(α=0.125)
RTTD:(β=0.25)
最终RTO = RTTS + 4 * RTTD
流量控制
让发送方的发送速率不要太快,要让接收方来得及接收
利用滑动窗口实现:
注:TCP的窗口单位是字节,不是报文段
拥塞控制
拥塞:对资源的需求之和 > 可用资源
作用:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至于过载
四种拥塞控制算法:慢开始、拥塞避免、快重传、快恢复
慢开始
由小到大逐渐增大注入到网络中的数据字节,即由小到大逐渐增大拥塞窗口数值
发送方的最大报文段SMSS
初始拥塞窗口cwnd
则cwnd每次增加量 = min( N , SMSS ),如下图类似于复制的增加,除非到了SMSS
拥塞避免
让cwnd缓慢增大(线性增长)
报文段ssthresh
快重传&快恢复
快重传:让发送方尽早知道发生了个别报文段的丢失
快恢复:发现只丢了部分,不启动慢开始,调整门限值
运输连接管理
连接建立——三次握手
初始序号seq,确认号ack
连接释放——两次二次握手
端口号
一个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请求报文的目的端口是应答报文的源端口