计算机网络复习
计算机网络概述
层次划分
OSI参考模型 | |
---|---|
应用层 | 为用户或应用程序服务的接口 |
表示层 | 负责数据的表示、翻译和格式化 |
会话层 | 会话和对话控制 |
传输层 | 端到端的可靠数据传输服务 |
网络层 | 解决异构网络的问题 |
数据链路层 | 解决可靠性、解决共享信道 |
物理层 | 解决比特流在信道上传输的可行性 |
TCP/IP概念层次 |
---|
应用层 |
传输层 |
网际层 |
网络接口 |
传输层:数据段
网络层:分组
数据链路层:数据帧
物理层:比特
[!TIP]
玛德莫名其妙
因特网采用TCP/IP体系结构
协议
网络协议的三要素
- 语法:数据或控制信息的数据结构
- 语义:协议元素的含义
- 时序:信息的每一个单元或事件的传送或执行顺序
性能指标
速率:b/s bps
带宽:单位Hz,和bps本质一样
吞吐量:单位时间通过网络的实际数据量
信道利用率:有数据通过时间/总时间
物理层
基本概念
信道:向某个方向传输信息的媒体
信号:数据的电气或电磁表现
码元:时间轴上的一个信号编码单元
波特:码元传输速率单位
比特率:数据传输速率
编码方式
曼彻斯特:先低后高为0,先高后低为1
差分曼彻斯特:前半个码元电平与前一个码元后半个相同为1,反之为0。(保持为1,取反为0)
尼奎斯特和香农公式
尼奎斯特:理想低通信道,无噪声
香农公式:非理想信道计算
数据链路层
如何在有差错的线路上,进行无差错传输
组帧,以7E开头(01111110)
基本功能:
- 链路管理:数据链路的建立、维护和释放
- 定界与同步:能够从接受到的比特流当中准确的区分出一帧的开始和结束
- 差错控制:纠错和差错检测
- 流量控制:调节通讯双方通讯速度
- 寻址:确保每一帧能够到达正确的目的端
差错检测和纠正
奇偶校验
原始数据最后增加一个比特位,让结果中1的个数为奇数(奇校验)或者偶数(偶校验)
原始数据11010采用偶校验 👉新数据为110101
循环冗余校验(CRC)
约定一个多项式G(x)假设为x^4+x+1,即10011
在带校验数据后补上4个0(因为Gx最高阶为4)
带校验数据1101011011→11010110110000
用模2除法把带校验数据除以G(x)
[!WARNING]
不是除法!
最后结果为1101,0110,1111,10
数据链路层协议
假设没有出错可以使用:
具有最简单流量控制的协议
发送方:
- 取数据帧
- 送到数据链路层发送缓存
- 发送
- 等待
- 接受到接收节点的确认信息,转到1
接收方
- 等待
- 收到数据帧,存到缓存
- 缓存上交到主机
- 发送确认信息到发送方
- 转到1
停止等待协议
一个比特可表示 0 和 1 两种不同的序号
确认帧带有序号,ACKn表示n-1号帧已经收到,期望接收第 n号帧
ACK1表示收到0号帧;ACK0表示收到1号帧
发送方
接收方
停止等待协议流图
连续ARQ:后退N帧协议GBN
接收端只按序接收数据帧:收到出错的DATA2后,虽然收到了Data3-5但是要丢弃,并且重传ACK2(因为DATA2出错,希望得到DATA2)
发送端计时器超时重传:等不到ACK3,超时后从DATA2开始全部重传
选择重传协议
接收端的滑动窗口大于1,
发送端超时没有收到ACK(n) 就重发 Data(n),不会全部重发
滑动窗口
连续 ARQ协议中,接收窗口大小为1
- 只有当收到的帧的序号与接收窗口一致时才能接收该帧
- 收到一个序号正确的帧,接收窗口就向前滑动,同时发送ACK
接收窗口向前滑动→发送确认→发送窗口可能向前滑动
当用 n 个比特进行编号:滑动窗口最大 2^n - 1
发送窗口 | 接收窗口 | |
---|---|---|
停止等待协议 | 1 | 1 |
连续ARQ(后退N帧协议) | >1 | 1 |
选择重传协议 | >1 | >1 |
信道利用率
T(发送周期):从开始发送数据到收到第一个确认帧为止
HDLC和PPP
主站:负责控制整个链路的操作,由主站发出的帧为命令
从站:在主站的控制下进行操作,由从站发出的帧为响应
链路结构
非平衡:一个主站多个从站
平衡:两个组合站
HDLC
真的。。。会考?吗?
考研不考。
PPP:点对点
不是总线型,不适用CSMA/CD
用于广域网
异步传输采用转义法,填入转义字符0x7D
同步传输采用零比特填充法,连续5个1后填入1个0
局域网的数据链路层
信道共享技术
随缘看看?
静态划分:
- 频分复用:不同频率上传输
- 时分复用:带宽一样,变成多个时间片依次发送
- 波分复用:光的频分复用
- 码分复用:每个端都有个自己的码,互相正交。发1则把码发出去,发0则发取反码。
动态媒体介入控制:
- 随机接入:ALOHA(接收方判断冲突,发送方超时重传)、CSMA
- 轮询:令牌环网传递令牌,有空令牌的才发,收到令牌看是不是给自己的,不是接着传,是的话复制一份接着传,转一圈发现没出错就变成空令牌(负载严重时能较好的工作)
CSMA/CD
CMSA
CS:载波监听,发送前会先检测总线上是否有人发数据
MA:多点接入,多个计算机接在一个总线
1-坚持CSMA:空闲就发,忙则一直监听,冲突则等待一个随机时间再监听
非坚持CSMA:空闲就发,忙则等待一个随机时间再监听
p-坚持CSMA:空闲则以p概率发,1-p概率等下一个时间单位再发;忙则一直监听;冲突则等待一个时间单位再监听
[!NOTE]
这是重点
CD
CD:碰撞检测
为了检测冲突,最小帧长为 2 * Prop * 传输速率(确保传完之前能检测到碰撞)
Prop = 线路长度/电磁波在传播速度
2Prop为争用期,也称碰撞窗口
以太网取51.2μs为争用期,对于10Mb/s的以太网,成勇气可以发送512bit也就是64字节。若前64字节没有冲突,那么后续也不会冲突。
以太网取64字节为最短有效帧长
发生碰撞后,推迟一段时间才能发送,基本退避时间一般取争用期2T
k = min[重传次数, 10],从[0,2^k -1]随机取一个r,重传等待的时间为r倍的2T
当重传达到16次还是不成功,说明网络拥挤,直接抛弃此帧报告出错。
MAC地址
48位Mac地址,每一台主机都有独立标识符,通常是12个十六进制数来表示
mac地址举例(01:23:45:67:89:AB)
目的地址和源地址都是6字节(48位)
类型指明网络层使用的协议,因为64字节为最短有效帧长(上面说了),所以数据段最短为46字节
FCS:采用CRC校验
为什么没有结束的“后导”码:采用曼彻斯特编码,发送的时候1为前高后低,0为前低后高;发完了直接就没信号了,电平不变
局域网和VLAN
VLAN是虚拟局域网
创建VLAN后交换机转发表形如:
MAC地址 | 端口 |
---|---|
A的地址 | 1 |
B的地址 | 2 |
C的地址 | 3 |
VLAN ID | 端口 |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
交换机之间建立VLAN发送数据会在数据帧插入VLAN标记
网桥
网桥会通过数据 学习 不同地址对应的接口。
- 使用网桥能够隔开各个网段的碰撞域
- 扩大物理范围
- 提高可靠性
- 过滤通信量,增大吞吐量
但是只能用于用户不太多的局域网,
- 广播信息过多会产生广播风暴
其他概念
交换机:学习、转发、过滤
冲突域:任意时刻,一个碰撞域中,只能有一个站在发送数据
广播域:同一广播包能到达的所有设备集合
交换机和路由器
交换机能划分冲突域,不划分广播域
路由器可以划分广播域
网络层
网络层功能:
- 路由选择和分组转发,找到最佳路径
- 异构网络的互联
- 拥塞控制
- 尽最大可能交付
- 不可靠传输!
因特网采用数据报形式
为什么要有IP地址和MAC地址两种地址:
IP 地址解决了设备在大规模网络中的定位和路由问题,适用于网络间通信。
MAC 地址解决了局域网中设备的物理标识和直接通信问题。
MAC地址是固定的,无法适应网络位置变化,难以支持跨网络分组转发
IP数据报
- 首部长度:记录数据报头部长度。单位是4Byte也就是32bit。因为报文头部固定部分长度为20B,所以首部长度最少是5(0101),最大为15(1111)
- 区分服务:服务的类型
- 总长度:整个IP数据报文长度。单位是1Byte,所以IP报文理论最大上限长度是2^16-1 = 65535 Byte
- 生存时间:TTL,没经过一个路由器-1
- 协议:
数据报分片
数据链路层有最大长度限制,所以需要把IP数据报文分片。
假如数据长度2200字节,MTU现在设定最大820字节,IP头部20字节,那么需要分成(820,820,620)三个片
-
标识:确定不同分片对应的的数据报文,为了后续拼接
-
标志:占三个位:空位 DF MF;
- DF=1禁止分片,DF=0允许分片;
- MF=1表示后面还有分片,MF=0代表是最后一个分片
-
片偏移以 8Byte 为单位
[!IMPORTANT]
奇奇怪怪的单位
首部长度:以4Byte为单位
总长度:以1Byte为单位
片偏移:以8Byte为单位
IP地址划分
0.0.0.0 | 缺省路由 | 可作为源地址,不可以作为目的地址 |
255.255.255.255 | 广播地址 | 不可作为源地址,可以作为目的地址 |
网络位全0 | 网络内,本机IP地址的主机部份 | 可作为源地址,不可以作为目的地址 |
主机号全0 | 代表网络的地址 | 不可作为源地址,不可以作为目的地址 |
主机号全1 | 网络内广播 | 可作为源地址,不可以作为目的地址 |
127.x.x.x | 本地软件Loopback测试 | 可作为源地址,可以作为目的地址 |
不同网段的私有IP地址:仅能内部使用
地址类别 | 地址范围 | 网段个数 |
---|---|---|
A | 10.0.0.0 - 10.255.255.255 | 1 |
B | 172.16.0.0 - 172.31.255.255 | 16 |
C | 192.168.0.0 - 192.168.255.255 | 256 |
IP子网掩码
子网掩码与IP地址相与,即可获得网络地址
例:
子网掩码255.255.192.0;IP地址141.14.72.24
网络地址为:141.14.64.0
[!WARNING]
易错例题
主机ip为180.80.77.55;掩码255.255.252.0,发送广播分组的目的地址为
1111 1100
0100 1101
0100 1100=76 但是广播地址要给主机号全变成1,所以是:
0100 1111 . 11111111
结果:180.80.79.255
无分类编址CIDR
消除了传统A、B、C类地址和划分子网的概念
全0:本网络;全1:广播
构成超网
- .00100000.
- .00101000.
- .00110000.
- .00111000.
- 最后构成35.230.32.0/19
最长前缀匹配
查路由表若有多个匹配结果,则发给有最长网络前缀的路由
ARP和ICMP协议
ARP
在网络层,发送方只知道对方的IP地址,所以:
首先检查ARP缓存看有没有已经存好的地址,没有就用FF-FF-FF-FF-FF-FF发送广播ARP请求分组,收到请求的主机响应,返回MAC地址,随后发送方得到MAC地址。
如果是跨交换机,发送方得到的是交换机的MAC地址。交换机会再接着发
四种典型情况:
- 主机A发送到本网络主机B:用ARP找到B的硬件地址
- 主机A发送给另一网络的主机B:用ARP找到本网络的一个路由器硬件地址
- 路由器发给本网络主机A:用ARP找到A的硬件地址
- 路由器发送给另一网络的主机B:用ARP找到本网络的另一个路由器硬件地址
**RARP:**很神奇喔,自己不知道自己IP地址,要通过自己的MAC地址询问服务器自己的IP是多少
DHCP
给主机动态分配IP,是应用层协议,用UDP
ICMP
ICMP报文装填在IP报文数据部分,但是是网络层协议
为了报告差错和异常,可以用来ping、traceroute
- 类型
- 代码:拓展
- 检验和:检验首部
ICMP差错报文
- 终点不可达:路由器或主机无法交付报文
- 源点抑制:拥塞而丢弃
- 时间超过:当路由器收到生存时间TTL=0的数据报文时,先丢弃该报文,再向远点发送时间超过报文
- 参数问题:路由器或目的主机收到的首部字段有误,发送参数问题报文
- 改变路由(重定向):路由器发送该报文到主机,让主机知道下次的数据包应该发送给另外的路由器(可能是更好的路由)
差错报文的ICMP数据字段
[!NOTE]
对差错报文不再发送差错报文
对第一个数据分片后的后续分片不发送ICMP差错报文
对具有组播地址的数据报不发送ICMP差错报文
对特殊地址(127.0.0.0或0.0.0.0)不发送ICMP差错报文
ICMP询问报文
- 回送请求和回答报文
- 时间戳请求和回答报文
IGMP
提供带多播组标识的路由,让整个网络都支持多播
用于管理主机与多播组的关系
路由选择协议
内部网关西医:RIP、OSPF
外部网关协议:BGP
RIP协议
距离:跳数。从路由器到直接相连的网络距离为1,经过一个路由器+1
距离最大为16,一条路由最多只能包含15个路由器。RIP只适用于小型网络
格式
网络 | 距离 | 下一跳 |
---|
每30s和邻居交换一次路由信息,交换的信息是本路由器的全部信息。
- 把地址为X的路由器中发来的RIP报文中所有项目,地址改为X,距离为报文中距离+1
- 对修改后的RIP报文中每一个项目进行:
- 路由表没有对应Net,填入
- 路由表有对应Net,
- 若原有下一跳是X,直接替换
- 若原有下一跳不是X,比较距离,保留短的
- 若180s没收到X发来的更新路由表信息,把X对应表项距离设置为16,意思是不可达
IP首部 | UDP首部 | RIP报文 |
---|
RIP报文在UDP的数据报中,所以RIP是应用层协议
一个RIP报文最多传送25个路由表项,如果表项太多需要发多个RIP报文
RIP中好消息传的快、坏消息传的慢,解决方案:
- 水平分割:禁止把一条路由信息从收到这条路由信息的接口广播出去
- 保持:当一个网络不可达后,一段时间内忽略其他路由发来的该网络信息
- 触发更新:一旦网络不可达,直接广播,不等待下一个广周期到
OSPF协议
用了Dijkstra的最短路径SPF算法
OSPF使用洪泛法,向所有服务器发送
直接使用IP报文发,没有UDP包装,是网络层协议
只有链路状态变化,才会发送信息
OSPF不使用RIP的距离,使用“度量”metric
存储全网拓扑结构图
OSPF还会划分区域
BGP
外部通讯协议
用TCP
PPT里没有
传输层
传输层功能:
- 应用进程之间的逻辑通信
- 复用和分用(复用:不同进程可用同一个协议;分用:接收方传输层剥去首部课正确交付)
- 检错检测
- 提供面向连接和无连接的传输协议
端口号
1-65535其中:
1-1024:熟知端口,用于常用应用程序,如ftp 21,smtp 25等
1024-49151:注册端口
49152-65535:客户端进程动态生成
嵌套字Socket格式 = IP地址:端口号
UDP
无连接,不可靠(只会尽最大努力交付),简单,包头小
首部简单:
UDP报文长度:头部加上数据
校验部分添加伪首部校验
UDP常见应用:
- DNS域名服务
- SNMP简单网络协议
- RIP路由信息协议
- P2P点对点通信
TCP
面向连接,可靠有序,不丢失不重复
全双工通信,面向字节流
TCP报文头部
- 每个端口占16位(1-65535)
- 序号:表示本报文发送的数据第一个字节的序号,注意是字节的序号
- 确认号:期望收到的下一个报文的第一个数据字节的序号。若为N,则说明N-1位置的数据都已经收到
- 数据偏移:就是首部长度,单位是4字节
- 保留字段:全为0
- 6个控制位:
- URG紧急位:置为1时,说明是紧急文件,要尽快发送【发送方紧急】
- ACK确认位:=1确认号有效,建立连接后应该一直为1
- PSH推送位:=1时接收方应尽快接受并交付【接收方紧急】(不考)
- RST复位:=1表明连接严重差错,要释放连接(不考)
- SYN同步位:=1时表明这是一个连接请求/接受报文
- FIN终止位:=1时表明发送方数据已经发完,要求释放连接
- 窗口:发送方的接收窗口,即发送放现在允许对方发送的数据量,单位1字节
- 校验和:检验首部+数据,要加上12B伪首部(其中伪首部第四个字段为6)
伪首部长这样
- 紧急指针:URG=1时有意义,本报文段紧急数据的字节数
- 选项:长度可变,可以有最大报文长度、窗口扩大、时间戳等
- 填充:使得首部是4字节(32位)的整数倍
TCP连接管理
连接建立→数据传送→连接释放
TCP连接建立(三次握手协议)
- 客户端发送连接请求【同步位SYN=1,初始序号seq=x(随机)】,无应用层数据,客户端进入SYN-SENT(同步已发送)状态
- 服务器若同意,返回确认报文段【同步位SYN=1,确认位ACK=1,序号seq=y(随机),确认号ack=x+1】,无应用层数据,服务器进入SYN-RCVD(同步收到)状态
- 客户端返回确认的确认【同步位SYN=0,确认位ACK=1,序号seq=x+1,确认号ack=y+1】,客户端为TCP分配缓存和变量,可携带应用层数据
TCP连接释放(四次握手)
- 客户端发送连接释放报文【终止位FIN=1,序号seq=u(等于前面的序号+1)】,进入FIN-WAIT-1状态
- 服务器返回确认报文段【确认位ACK=1,序号seq=v,确认号ack=u+1】,服务器进入CLOSE-WAIT(半关闭状态),这个时候服务器还能向客户端发送数据
- 服务器发完数据,发出连接释放报文【终止位FIN=1,确认位ACK=1,序号seq=w,确认号ack=u+1】,进入LAST-ACK(最后确认)状态
- 客户端返回确认报文段【确认位ACK=1,序号seq=u+1,确认号ack=w+1】,客户端等待2 * MSL(最长报文段寿命)的时间后,彻底关闭
TCP可靠传输
网络层不可靠
传输层TCP实现可靠传输
序号
每个字节都有一个序号
序号字段是第一个字节的序号
确认
发送方发完了数据先放进缓存,直到确认了再删
重传
- **超时重传:**TCP采用一种自适应算法,记录一个报文段发出的时间和确认的时间,时间差为RTT(往返时间),TCP会维护一个加权平均往返时间RTTS,随着样本值变化而变化。超时重传时间略大于RTTs
- **冗余ACK:**每当比期望序号打的失序报文段到达,发送一个冗余ACK,指明期待收到的下一个序号,发送方收到了这个ACK后立刻重传不用等超时
TCP流量控制
哦又是熟悉的协议!
停止等待协议
流水线传输
这不是我们滑动窗口吗
以字节为单位的滑动窗口
- 根据接收方给出的窗口值,构造自己的发送窗口
- 发送数据
- 收到确认前移
发送窗口并不总是和接收窗口一样大(因为时间滞后)
发送窗口取接受窗口和拥塞窗口的最小值
发送缓存用于暂时存放准备发的发送数据和TCP发出但没确认的数据
接收缓存用于存没按序到达的数据和被接受但没被应用读取的数据
报文中窗口参数 rwnd 单位字节
TCP有一个计时器,如果收到rwnd=0后,会启动计时器,一段时间后发送零窗口探测报文段,对方会再次给出当前窗口值
TCP拥塞控制
[!NOTE]
重要喔
未按时收到确认就判定为拥塞
拥塞控制控制多个发送方,流量控制控制单个发送方
发送窗口取接收窗口rwnd和拥塞窗口cwnd较小的一个
慢开始和拥塞避免
慢开始:
先预设一个ssthresh值
发送方A先令cwnd=1,发一个,收到B的确认后cwnd乘以2变成2;再收到变成4
cwnd指数增长,直到cwnd >= ssthresh 即慢开始门限改为使用 阻塞避免算法
*注意:*如果乘以2大于ssthresh,那么只能取ssthresh,不能指数增大超过门限
阻塞避免算法:
每收到1条确认,cwnd只+1,线性增长
遇到网络拥塞:
把ssthresh设置为拥塞时cwnd值的一半,然后让cwnd=1重新慢开始
快重传和快恢复
为了尽早重传:
如果连续收到三个重复的冗余ACK确认,立即重传相应的报文段
ssthresh调整为当前cwnd的一半,这个时候不会慢开始,采用快恢复
快恢复:
直接把cwnd设置为当前cwnd的一半,跳过慢开始阶段,直接开始拥塞避免加法增大
应用层
应用模型
C/S模型
服务器永久提供服务,永久性访问地址/域名
服务器处于接受请求状态,收到客户机请求后处理,发送结果
客户机之间不通信
可扩展性不佳
P2P模型
莫得服务器,全是客户机,都可以请求服务,都可以提供服务
任意两点都可以直接通讯,节点可能改变IP地址
可扩展性好
网络健壮性强,失去一个节点也不会网络失效
域名解析DNS系统
使用UDP
顶级域名:
国家顶级域名:cn、us、jp
通用顶级域名:com、net、org…
二级域名:
上述例子中的baidu
根域名服务器:知道所有顶级域名服务器的IP地址
顶级域名服务器:一个顶级域名有很多顶级域名服务器,可以获取顶级域名下属二级域名
权限域名服务器:负责一个区的域名服务器
本地域名服务器:发送DNS请求的时候会先查询本地域名服务器
- 主机向本地域名服务器查询
- 本地域名服务器向根域名服务器查询,得到顶级域名服务器地址
- 本地域名服务器向顶级域名服务器查询,得到权限域名服务器地址
- 本地域名服务器向权限域名服务器查询,得到最终要访问的IP地址
- 本地域名保存IP地址,返回给主机
FTP文件传送协议
适用于不同操作系统中传输
使用C/S协议模式
使用TCP实现可靠传输
- ftp服务器启动
- 客户端登录ftp服务器,输入用户名密码或者匿名登陆
- 服务器启动一个新的从属进程【包含控制进程和数据传输进程】
- 21号端口控制连接:控制发不发、终止等
- 20号端口数据连接:传文件的
- 主动模式:连接后客户端随机开一个端口,服务器通过端口20连接客户端【默认主动】
- 被动模式:连接后服务器随机开一个端口,客户端连接到服务器端口
- 开始传输
电子邮件
使用TCP
STMP推送邮件到服务器
POP3或IMAP从服务器拉取邮件
STMP步骤:
- 发送方发到发邮件服务器
- 发邮件服务器与接收方建立TCP连接
- 发邮件服务器问STMP服务器是否有收件人
- 传输邮件
- 释放连接
SMTP只能发ASCII码,所以要使用MIME来把非ASCII码转化为7位ASCII码
**POP3或者IMAP协议:**收取邮件
HTTP协议和www.
URL形式
协议://主机:端口/路径
http协议是超文本传输协议,语言HTML
HTTP采用 TCP 为传输层协议,但HTTP协议本身是无连接的
非持久连接:
持久连接:
HTTP请求报文面向文本,所以报文中每一个字段都是ASCII码串
- 浏览器分析URL
- 浏览器向DNS请求解析IP地址
- 获得IP地址
- 浏览器与服务器建立TCP连接
- 浏览器发出取文件命令GET /index.htm
- 服务器给出响应发文件
- TCP连接释放
- 浏览器显示
请求报文
响应报文
1xx表示通知信息
2xx表示成功(如200、202)
3xx表示重定向(如301)
4xx表示客户差错(如404)
5xx表示服务器差错