【计算机网络】内容整理
概述
分组交换
分组交换则采用存储转发(整个包必须到达路由器,然后才能在下一个链路上传输)技术。
在发送端,先把较长的报文划分成较短的、固定长度的数据段。
电路交换
在端系统间通信会话期间,预留了端系统间沿路径通信所需要的资源(缓存、链路传输速率)
- 建立连接:建立一条专用的物理通路,以保证双方通话时所需的通信资源在通信时不会被其他用户占用;
- 通信:主叫和被叫双方就能互相通电话;
- 释放连接:释放刚才使用的这条专用的物理通路(释放刚才占用的所有通信资源)。
时延计算
吞吐量
应用层
体系结构
C/S
客户(client)和服务器(server)都是指通信中所涉及的两个应用进程。
客户-服务器方式所描述的是进程之间服务和被服务的关系。
客户是服务的请求方,服务器是服务的提供方。
服务请求方和服务提供方都要使用网络核心部分所提供的服务。
P2P
没有永远在线的服务器
任意终端系统直接通信
对等方向其他对等方请求服务,向其他对等方提供服务
对等体间歇连接并更改IP地址
Socket
进程间通信利用套接字(Socket)发送和接受消息来实现
URL
统一资源定位器
<协议>://<主机>:<端口>/<路径>
HTTP
超文本传输协议
基于web的应用层协议
C/S结构
- client-----browser:请求接受和展示web对象
- server-----Web server:响应客户的请求,发送对象
连接
-
非持续连接
- 每个TCP连接最多发送一个对象然后关闭连接
- 多个对象需要多个TCP连接
- HTTP1.0版本使用非持续连接
缺点:
每个对象需要两个RTT
每个TCP连接有开销
浏览器经常打开多个并行TCP连接来获取网页所需的对象
-
持续连接
- 客户端和服务器之间的单个TCP连接可以传输多个对象
- HTTP1.1版本使用持续连接
- 非流水线
- 客户在收到前一个响应后才能发出
下一个请求。 - 这比非持续连接的两倍RTT的开销节省了建立TCP连接所需的一个RTT时间。
- 服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
- 流水线
- 服务器在发送响应后保持连
接打开 - 同一客户机/服务器之间的后续HTTP请求和响应报文通过已打开的TCP连接发送
- 客户机在遇到被引用对象时立即发送请求
- 对于所有被引用的对象,只有一个RTT
响应时间
RTT(往返时延):从客户机发送一个很
小的包到服务器并返回所经历的时间
HTTP响应时间:
- 发起、建立TCP链接需要一个RTT
- 发送HTTP请求消息到HTTP相应消息的前几个字节到达需要一个RTT
- 文件发送时延
非持续HTTP响应时间=2RTT+文件发送时延
请求报文
请求方法:
响应报文
首部
通用首部
Cache-Control:通过指定指令来实现缓存机制。
- max-age=<\seconds>设置缓存存储的最大周期,超过这个时间缓存被认为过期
- 指定no-cache或max-age=0表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。
Connection:决定当前的事务完成后,是否会关闭网络连接 “keep-alive”“closed”
Keep-Alive:允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数
Date:表明创建HTTP报文的日期和时间。其中时间GMT代表格林威治标准时间
请求头
Host:指明了请求将要发送到的服务器主机名和端口号(可选)
User-Agent:指明用户代理,即浏览器的类型
Accept:列举用户代理希望接收的媒体资源的MIME类型
Accept-Language:用来提示用户期望获得的文档自然语言的优先顺序
Accept-Encoding:明确说明了(接收端)可以接受的内容编码形式(所支持的压缩算法)
Accept-Charset:用于告知服务器该客户代理可以理解何种形式的字符编码(如今UTF-8编码已经得到了广泛的支持,成为首选的字符编码类型。为了通过减少基于配置信息的信息熵来更好地保护隐私信息,大多数浏览器会将Accept-Charset首部移除:Internet Explorer8、Safari5、0pera11以及Firefox10都已经不再发送该首部。)
响应头
Server:包含了处理请求的源头服务器所用到的软件相关信息
Last-Modified:包含源头服务器认定的资源做出修改的日期及时间
ETag:资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内
容没有改变,Wb服务器不需要发送完整的响应。如果给定URL中的资源更改,则一
定要生成新的Etag值
Accept–Ranges:标识自身支持范围请求,字段的具体值用于定义范围请求的单位
Expires:响应头包含日期/时间,即在此时候之后,响应过期。如果在Cache
Controll响应头设置了"max-age”或者"s-max-age”指令,那么Expires头会被
忽略。
实体头
Content-Type:用于指示资源的MIME类型(媒体类型)
Content-Length:用来指明发送给接收方的消息主体的大小,十进制数字表示的八位字节的数目
Content-Language:用来说明访问者希望采用的语言或语言组合,这个首部还可以用来描述不同媒体类型的文件,而不单单局限于文本型文档。
Content-Encoding:用于对特定媒体类型的数据进行压缩。当这个首部出现的时候,它的值表示消息主体进行了何种方式的内容编码转换。这个消息首部用来告知客户端应该怎样解码才能获取在Content-Type中标示
的媒体类型内容。
响应状态码
1xx表示通知信息的,如请求收到了或正在进行处理。
2xx表示成功,如接受或知道了。
3xx表示重定向,表示要完成请求还必须采取进一步的行动。
301永久移动,域名重定向
302临时性重定向,资源被分配到新的URI,希望用户本次可以使用新的URI访问
303请求对应的资源存在另一个URI,应使用GET方法重定向获取资源。
304找到资源了,但是不符合条件,一般用于缓存,代表缓存资源不符合需求
307临时性重定向,与302有着相同的含义,不会从P0ST方法换成GET方法
客户端响应:
4xx表示客户的差错,如请求中有错误的语法或不能完成
400 Bad Request
404 Not Found
服务器端响应:
5xx表示服务器的差错,如服务器失效无法完成请求
505 HTTP Version Not Supported
Cookie
- Cookie实际上是一小段的文本信息。
- 客户端请求服务器,如果服务器需要记录该用户状态,就使用responsel向客户端浏览器颁发一个Cookie
- 客户端浏览器会把Cookie保存起来。
- 当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。
- 服务器检查该Cookie,以此来辨认用户状态。
- 服务器还可以根据需要修改Cookie的内容
Session
- Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式(内存中、redis、Memcached)记录在服务器上。这就是Session.客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
- Session基于cookie的,服务器会把一个sessionid以cookie形式种植给浏览器。以后客户端在访问服务端时候,http请求会带着sessionid,服务器会先检查这个客户端的请求里是否已包含了一个session标识(sessionid)。如果已包含这个 sessionId,则说明以前已经为此客户端创建过session,服务器就按照sessionId把这个session检索出来使用。
Web缓存
条件GET
HTTP2
HTTP1.1发送一个Web页面的所有对象存在队首阻塞。HTTP2把每个报文分成小帧交错传输,解决阻塞。
邮件服务
SMTP
基于TCP在客户和服务器之间传递email,端口号为:25
直接传输:发送服务器到接收服务器
传输的三个阶段
- 握手(greeting)
- 传输消息
- 关闭
命令/响应交互式(HTTP) - 命令:ASCII文本
- 响应:状态码和语句
email消息只包含7位的ASCII码
邮件访问协议
DNS
基于UDP
迭代查询
被查询服务器返回域名解析服务器的名字
递归查询
将域名解析的任务交给所联系的服务器
P2P
- 没有服务器
- 任意终端系统直接通信
- 对等点间断续连接并更改IP地址
- 在P2P工作方式下,所有的音频/视频文件都是在普通的互联网用户之间传输
Napster
有一个集中式目录服务器,用户X询问Napster谁有资源m,服务器回应a,b,c。X再随机选一个请求。
全分布式
洪泛法在用户之间查询
CDN
CDN的基本原理是依靠放置在各地的缓存服务器,通过全局调度,内容分发等功能模块,将用户需要的那部分内容部署到贴近用户的地点,将原本低效、不可靠的IP网络转变成高效、可靠的智能网络,满足用户对内容访问质量的更高要求,改善互联网网络拥塞问题,提高用户访问网站的响应速度。
传输层
提供应用进程之间的通信机制
- 位于网络层之上
- 依赖于网络层服务
- 对网络层服务进行增强
多路复用:在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息,从而生成报文段,然后将报文段传到网络层。(发送过程)
多路分用:检查传输层报文段,根据目的端口号标识出接收套接字,交付给正确的套接字。(接收过程)
UDP
- 无需建立连接(减少延迟)
- 实现简单:无需维护连接状态
- 头部开销小
- 没有拥塞控制:应用可以更好地控制发送时间和速率
报文段结构
报文头8字节
检验和
发送方UDP对报文段所有16比特字的和求反,放在检验和字段。求和时如果最高位有进位就进到末位。
可靠数据传输
参考https://blog.csdn.net/qq_53144843/article/details/120896557
rdt_send():被上层应用调用,将数据交给rdt以发送给接收方
udt_send():被rdt调用,在不可靠的信道上发送数据给接收方
deliver_data():被rdt调用,向上层应用交付数据
rdt_rcv():数据包到达接收方时被调用
rdt1.0
假设以下理想条件:
- 不会发生错误
- 不会丢弃分组
有限状态机FSM描述:
发送方:一个状态,等待上层调用,若上层调用,则产生rdt_send,创建packet活动,调用信道上的udt_send(),发送分组,可确定百分百发送,然后回到之前状态,继续等待调用
接收方:一个状态,等待下层调用,当传入一个分组,rdt_rcv接收,extract提取,交付给上层deliver_data
rdt2.0
底层信道可能传输错误比特
自动重传请求协议ARQ:使用ACK和NAK通知发送方接收状态。
- 差错检测
- 接收方反馈ACK/NAK
- 重传
发送方在等待ACK/NAK时无法处理上层新的数据,所以这样的协议也叫停等协议
发送方:若上层调用,则产生rdt_send,创建packet活动并加入校验和,调用信道上的udt_send(),发送分组。同时进入等待ACK/NAK状态,若为NAK,则重传分组,继续等待ACK/NAK,一直处于该状态,直到传回ACK才进入等待调用状态
接收方:当传入一个分组,rdt_rcv接收并且进行判断,如果没有错误extract提取,交付给上层deliver_data并返回ACK,如果发生错误,则直接返回NAK,并处于等待接收状态
时序图:
rdt2.1
如果ACK/NAK损坏,发送方重新传输当前pkt
发送方给每个pkt增加序列号
接收者丢弃重复的pkt
发送方:
接收方:
发送方:等待上层调用,序列号为0,若上层调用,则产生rdt_send,创建packet活动(此处加入序列号)并加入校验盒,调用信道上的udt_send(),发送分组,同时进入等待ACK/NAK状态,若为NAK,则重传分组,继续等待ACK/NAK,一直处于该状态,若传回ACK,则进入等待调用状态,并改变序列号为1
接收方:当传入一个分组,rdt_rcv接收并且进行判断,如果分组没有错误,并且期望收到分组序列号与当前序列号相同,则extract提取,交付给上层deliver_data并返回ACK;如果发生错误,则直接返回NAK,并处于等待接收状态;若接收分组没错,序列号不匹配,则必须发一个ACK,表示正确接收
时序图:
rdt2.2
不需要NAK
接收方发送最后一次正确接收到的分组的ACK来代替NAK
- 接收方发出的ACK消息中,必须明确包含被确认的分组序列号
- 发送方的收到重复ACK会采取与NAK相同的操作:重新传输当前分组
rdt3.0
信道也可能丢失分组,增加了超时处理
发送方等待ACK合理时间,如果到时未收到ACK,则重新传输;
如果分组或ACK仅仅延迟而没有丢失:
- 重传则会产生重复,利用序列号可以解决
- 接收方需在ACK中显式告知所确认的分组
发送方:
接收方没变。
流水线协议
发送方在收到ACK之前可以连续发送多个分组,从而提高利用率。
- 需要更大序号空间
- 发送方和/或接收方需要更大的存储空间以缓存分组
GBN
- 发送方在管道中最多可以有N个未确认的数据包
- 接收方只发送累积确认
- 如果有间隔就不会确认数据包
- 发送方有未确认数据报的计时器
- 当计时器超时,重传所有未确认的数据包
发送方
接收方
SR
接收方单独确认所有正确收到的分组
- 设置缓存机制,缓存乱序到达的分组,最终交给上层
发送方只重传那些没收到ACK的分组 - 为每个分组设置定时器
发送方窗口 - N个连续的序号
- 限制已发送且未被确认的分组
TCP
报文结构
序列号:
- TCP报文段中第一个字节的编号
- 建立TCP连接时,双方随机选择序号
ACKs: - 期望收到的下一个字节的序列号
- 累计确认,该序号之前的所有字节都已正确接收
重传
累积确认
快速重传:如果sendert收到对同一数据的3个ACK,则假定该数据之后的段已经丢失,在定时器超时之前即进行重传
流量控制
接收方通过在接收方到发送方的TCP报头中包含rwnd值来“通告”空闲缓冲区空间
发送方限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲RcvWindow尺寸
连接管理
三次握手
四次挥手
拥塞控制
太多的主机发送太多数据或者速度太快,网络无法处理
表现形式:
- 数据包丢失(路由器缓冲区溢出)
- 延迟过长(在路由器缓冲区中排队)
TCP从观察到的丢失、延误推断出拥堵
AIMD
原理:发送方增加传输速率(窗口大小),探查可用带宽,直到发生丢失
事件:Timeout或3个重复的ACK
丢失事件细节:
- 通过三重重复ACK(TCP Reno)检测到丢失时将其减半(TCP Reno)
- 当超时(TCP Tahoe)检测到丢失时,切至1MSS(最大段大小)(TCP Tahoe)
慢启动
连接开始时,以指数2^n方式增加速率(窗口大小cwnd),直到发生第一次丢失事件
LOSS处理
超时导致loss:
- 窗口大小cwnd设为1MSS
- 窗口然后按指数增长(如慢启动)到阈值,然后线性增长
由3个重复确认导致的loss(TCP RENO): - 3个重复ACKs表示网络还能够传输一些segments
- cwnd切到一半;然后线性增长 此时会加上三个ack的时间段,实际上是从一半+3开始,但阈值是一半。
TCP Tahoe不管是超时还是3个ACK,都把cwnd设为1MSS
阈值变量sthresh
loss事件发生时,sthresh被设置为loss事件前的cwnd值的1/2
cwnd上升到sthresh后开始线性增长。
线性增长也叫拥塞避免
TCP CUBIC
Wmax:检测到拥塞丢失的发送速率
瓶颈链路的拥塞状态可能变化不大
在切割速率/窗口减半后,最初更快地斜坡到Wmax,但随后更缓慢地接近Wmax
网络层
功能:
转发:将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作
路由选择:确定分组从源到目的地所选用的网络路径
数据平面
- 每台路由器的本地功能
- 确定如何将到达路由器输入端口的数据报转发到输出端口
- 转发功能
转发方式
基于目的地转发
仅根据目的地IP地址的转发
最长前缀匹配: 根据目的地址查找转发表条目时,选择与目标地址匹配的最长地址前缀。
通用转发
根据任意首部字段值的集合的转发
交换结构
内存交换
- 采用传统的计算机,交换是在CPU的直接控制下完成
- 分组被复制到系统内存中
- 速度受限于内存带宽
总线交换
- 报文通过一条共享总线从输入端口内存发送到输出端口
- 总线争用:交换速度受限于总线带宽。
互联网状交换
- 克服了总线带宽的限制
- 高级设计:将报文分片为固定长度单元以通过交换结构。
缓存管理
先来先服务FIFO/FCFS
- 加权公平排队
- 弃尾:丢弃到达的分组
- 低优先权丢弃:基于优先级的丢弃/移除
- 随机丢弃:随机丢弃/移除
优先级调度
- 到达流量分类,按类别排队
- 任何标题字段都可以用于分类,如:IP源/目的,端口号等
- 多种类别,具有不同的优先级
- 发送最高优先级的队列分组
循环排队RR
循环扫描类别队列,依次从每一个类别发送一个完整分组(如果有的话)
加权公平排队WFQ
在每一轮循环中,每一类i获得加权数量wi的服务
IPv4
分片/重组
一个大的报文会被拆成多个报文,在目的地进行重组。IP首部字节用于识别排序分片。
最大传送单元MTU:一个链路层帧能承载的最大数据量
编址
IP地址:32bit主机ID/路由器接口
每一类地址都由两个固定长度的字段组成,其中一个字段是网络号net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号host-id,它标志该主机(或路由器)。
特殊IP地址:
子网
设备接口,无需通过中间路由器即可物理连接到彼此
DHCP 动态主机配置协议
允许主机加入网络时从网络服务器中动态获取其IP地址。
DHCP可以提供:
- 在子网中分配的IP地址
- 客户端的第一跳路由器地址
- DNS服务器的名字和IP地址
- 网络掩码
NAT 网络地址转换
本地网络中的所有设备在“专用”IP地址空间(10/8、172.16/12、192.168/16前缀)中都有32位地址,但只能在本地网络中使用
- 外出数据报:替换每一个外出数据报的(源IP地址,端口号)为(NAT IP地址,新的端口号)
远程客户端/服务器的回复数据报采用(NAT IP地址,新的端口号)作为目的地址 - 记住(在NAT转换表中) 每一个(源IP地址,端口号)到(NAT IP地址,新的端口号)的对应关系
- 到达报文:根据存储的NAT表,替换每一个到达报文目的字段(NAT IP地址,新的端口号)为相应的(源IP地址,端口号)
IPv6
- 固定长度40字节首部
- 不允许分片
- 去掉了校验和
IPv4 to IPv6
OpenFlow
流表:
控制平面
- 网络范围的逻辑
- 决定数据报从源主机到目的主机的端到端路径中路由器之间的路由方式
- 实现控制平面的两种途径:
- 传统路由算法:运行在路由器中
- 软件定义网络SDN:运行在(远程)控制器中
路由选择算法
链路状态LS
使用迪杰斯特拉算法,每一次迭代都选最短的一条的节点。所有路由器掌握网络拓扑和链路费用
距离向量DV
自治系统内部的路由选择 OSPF
域内路由选择:
- 在同一自治域(“网络”)内的主机,路由器之间的路由选择
- 在一个自治域内的所有路由器必须运行相同的域内路由选择。
- 在不同自治域内的路由器可以运行不同的域内路由协议。
- 网关路由:位于其所在自治域的“边界”,通过链路与其位于其他自治域的路由器相连
域间路由选择: - 自治域间的路由选择
- 网关执行域间路由选择(与域内路由选择类似)。
OSPF - 链路状态发生变化时,路由器洪泛OSPF链路状态消息到整个AS中的所有其他路由器中,使用网络层IP协议。
- 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。
- 使用迪杰斯特拉算法
链路状态数据库
- 由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。
- 这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)
- OSPF的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表
- OSPF的更新过程收敛得快是其重要优点。
区域划分
为了使OSPF能够用于规模很大的网络,OSP将一个自治系统再划分为若干个更小的范围,叫做区域。
区域边界路由器:“汇总”到达区域内内部网络的距离信息,并广播到其他区域边界路由器
主干路由器:仅在主干路由器中运行OSPF
边界路由器:连接到其他的自治域。
在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。
主干区域(Area 0)是所有其他OSPF区域(非零区域)的中心枢纽,起到了路由信息分发和汇聚的作用。
区域边界路由器负责在OSPF的主干区域和其他区域之间传递路由信息。
主干路由器
区域边界路由器
域间路由选择 BGP
eBGP:从邻居自治域获取子网可达信息
iBGP:传播可达信息到所有自治域内部的路由器
路径通告
热土豆算法
选择具有最小域内开销的本地网关(烫手山芋)
软件定义网络SDN
- 维护网络状态信息
- 通过北向API与“上面的”网络控制应用交互。
- 通过南向API与“下面的”网络交换机交互。
网络控制应用
eg:ryu
ICMP
主机及路由器使用ICMP以交互网络层面的信息。
IP数据报承载ICMP消息
数据链路层
结点(nodes):主机和路由器
链路(links):一条无源的点到点的物理线路段,中间没有任何其他的交换结点。
数据链路(data-link layer):除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
帧(frame):数据链路层数据单位,封装网络层数据报
封装成帧
头尾添加开始符,结束符。中间冲突字符转义。
差错检测
奇偶校验
CRC校验
校验和
- 将“数据”(校验内容)划分为16位的二进制“整数”序列
- 求和:补码求和(最高位进位的“1”,返回最低位继续加)
- 校验和为sum的反码
- 发送方将校验和放入分组(UDP、TCP、IP)的校验和字段
多路访问链路协议MAC
时隙ALOHA
假定:
- 所有帧大小相同
- 时间被划分为等长的时隙(每个时隙可以传输1个帧)
- 结点只能在时隙开始时发送帧
- 结点间时钟同步
- 如果2个或2个以上结点在同一时隙发送帧,结点即检测到冲突
运行:
当结点有新的帧时,在下一个时隙发送 - 如果无冲突:该结点可以在下一个时隙继续发送新的帧
- 如果冲突:该结点在下一个时隙以概率p重传该帧,直至成功
效率:
长期运行时成功发送帧的时隙所占比例
假设:N个结点有很多帧待传输,每个结点在每个时隙均以概率p发送数据
对于给定的一个结点,在一个时隙将帧发送成功的概率=p(1-p)^(N-1)
对于任意结点成功发送帧的概率Np(1-p)^(N-1)
最大效率:N->无穷时,最大效率 = 1/e = 0.37
纯ALOHA
- 非时隙Aloha:更加简单,无需同步
- 当有新的帧生成时,立即发送
效率:
CSMA
发送帧之前,监听信道
- 信道空闲:发送完整帧
- 信道忙:推迟发送
CSMA/CD
载波监听多点接入/碰撞检测
- 短时间内可以检测到冲突
- 冲突后传输中止,减少信道浪费
最先发送数据帧的站,在发送数据帧后至多经过时间2τ(两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。
如果两端想要成功碰撞检测,那么传播时延要小于传输时延。
争用期:端到端往返时延2τ
二进制指数类退避算法
发生碰撞的站在停止发送数据后,要推迟一个随机时间才能再发送数据。
- 基本退避时间取为争用期2τ。
- 从整数集合[0,1,…,(2^k-1)]中随机地取出一个数,记为r。重传所需
的时延就是r*512比特时间。 - 参数k按下面的公式计算:
k=Min[重传次数,10] - 当k≤10时,参数k等于重传次数。
- 当重传达16次仍不能成功时即丢弃该帧,并向高层报告。
交换局域网
ARP
- A想要给同一局域网内的B发送数据报而B的MAC地址不在A的ARP表中。
- A广播ARP查询分组,其中包含B的IP地址目的MAC地址为:FF-FF-FF-FF-FF-FF;LAN中所有结点都会接收
- B接收ARP查询分组,IP地址匹配成功,利用单播帧向A发送应答B的MAC地址
- A在其ARP表中,缓存B的IP-MAC地址对,直至超时,超时后,再次刷新
寻址过程
A通过路由器R向B发送数据报:
- 主机A构造IP数据报,其中源IP地址是A的IP地址,目的IP地址是主机B的IP地址
- 主机A构造链路层帧,其中源MAC地址是A的MAC地址,目的MAC地址是R(左)接口的MAC地址,封装A到B的IP数据报。
- 数据帧从主机A发送至路由器R
- 路由器R接收数据帧,提取IP数据报,传递给上层IP协议
- R转发IP数据报(源和目的IP地址不变)
- R创建链路层帧,其中源MAC地址是R(右)接口的MAC地址,目的MAC地址是B的MAC地址,封装A到B的IP数据报。
以太网
有线LAN技术
- 不可靠
- 无连接
- MAC协议采用CSMA/CD
链路层交换机
- 存储-转发以太网帧
- 检验到达帧的目的MAC地址,选择性向一个或多个输出链路转发帧,利用CSMA/CD访问链路,发送帧
- 透明传输,主机感知不到交换机的存在
- 即插即用,自学习
目的MAC未知时泛洪,已知时选择性转发
无线网络
IEEE 802.11
CSMA/CA
带碰撞避免的CSMA(CSMA/CD是碰撞检测)
交换RTS和CTS帧来实现碰撞避免
会对正确接收到的数据帧ack确认
帧结构:
相关文章:

【计算机网络】内容整理
概述 分组交换 分组交换则采用存储转发(整个包必须到达路由器,然后才能在下一个链路上传输)技术。 在发送端,先把较长的报文划分成较短的、固定长度的数据段。 电路交换 在端系统间通信会话期间,预留了端系统间沿路径通信所需…...

【K12】Python写分类电阻问题的求解思路解析
分压电阻类电路问题python程序写法 一个灯泡的电阻是20Ω,正常工作的电压是8V,正常工作时通过它的电流是______A。现在把这个灯泡接到电压是9V的电源上,要使它正常工作,需要给它______联一个阻值为______的分压电阻。 解决思想 …...

数据库面经---10则
数据库范式有哪些: 第一范式(1NF): 数据表中的每一列都是不可分割的原子值。每一行数据在关系表中都有唯一标识,通常是通过主键来实现。第二范式(2NF): 满足第一范式。…...

深度学习基本介绍-李沐
目录 AI分类:模型分类:广告案例: bilibili视频链接:https://www.bilibili.com/video/BV1J54y187f9/?p2&spm_id_frompageDriver&vd_sourcee6a6e7fec41c59c846c142eb5ef1da0b AI分类: 模型分类: 图…...

【上分日记】第369场周赛(分类讨论 + 数学 + 前缀和)
文章目录 前言正文1.3000. 对角线最长的矩形的面积2.3001. 捕获黑皇后需要的最少移动次数3.3002. 移除后集合的最多元素数3.3003. 执行操作后的最大分割数量 总结尾序 前言 终于考完试了,考了四天,也耽搁了四天,这就赶紧来补这场周赛的题了&a…...

CMake Error at CMakeLists.txt:14 (project): The CMAKE_CXX_COMPILER:
报错 CMake Error at CMakeLists.txt:14 (project):The CMAKE_CXX_COMPILER:arm-none-eabi-g 解决办法1 Arm GNU Toolchain Downloads – Arm Developer x86_64 linux上: x86_64 Linux hosted cross toolchains AArch32 bare-metal target (arm-none-eabi)arm-g…...

Sqoop与其他数据采集工具的比较分析
比较Sqoop与其他数据采集工具是一个重要的话题,因为不同的工具在不同的情况下可能更适合。在本博客文章中,将深入比较Sqoop与其他数据采集工具,提供详细的示例代码和全面的内容,以帮助大家更好地了解它们之间的差异和优劣势。 Sq…...

Pandas实战100例 | 案例 31: 转换为分类数据
案例 31: 转换为分类数据 知识点讲解 在处理包含文本数据的 DataFrame 时,将文本列转换为分类数据类型通常是一个好主意。这可以提高性能并节省内存。Pandas 允许将列转换为 category 类型。 分类数据类型: category 类型适用于那些只包含有限数量不同值的列&…...

椋鸟C语言笔记#33:文件的顺序读写
萌新的学习笔记,写错了恳请斧正。 目录 光标(文件位置指示器) 文件的顺序读写 fgetc 使用实例 fputc 使用实例 fgets fputs 使用实例 fscanf fprintf fread fwrite 使用实例 光标(文件位置指示器) 我们…...

Transformer - Attention is all you need 论文阅读
虽然是跑路来NLP,但是还是立flag说要做个project,结果kaggle上的入门project给的例子用的是BERT,还提到这一方法属于transformer,所以大概率读完这一篇之后,会再看BERT的论文这个样子。 在李宏毅的NLP课程中多次提到了…...

安装配置Flink
安装配置Flink 1.上传安装包到Linux 2.解压到指定路径 tar -zxf ./flink-1.14.0-bin-scala_2.12.tgz /usr/local/src/3.修改环境变量 vi ~/.bashrc#往最后加入 export FLINK_HOME /usr/local/src/flink-1.14.0/ export PATH$PATH:$FLINK_HOME/bin#激活环境变量 source ~/.…...

解决Spss没有创建虚拟变量的选项的问题
这个是今天用spss想创建虚拟变量然后发现我的spss没有。 然后能怎么办我就百度呗, 说是在扩展里连接扩展中心 天哪,谁能连上,我连不上 于是就找到了从github上下载到本地,然后安装到spss中 目录 解决方法 点击code 再点击D…...

wxWidgets实战:使用mpWindow绘制阻抗曲线
选择模型时,需要查看model的谐振频率,因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示: mpWindow 左侧使用mpWindow,右侧使用什么? wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…...

深度学习15—(迁移学习)冻结和解冻神经网络模型的参数
冻结与解冻代码: def freeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad Falsedef unfreeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad True 这段代码定义了两个函数:freeze_net 和 unfree…...

强化学习应用(八):基于Q-learning的无人机物流路径规划研究(提供Python代码)
一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…...

常见面试题之HTML
行内元素有哪些?块级元素有哪些? 空(void)元素有那些? HTML 中的行内元素(inline elements)通常用于在一行内显示,不会独占一行的空间。常见的行内元素有: <span>:用于对文本…...

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)六
第三部分、栈(Stack)和队列(Queue)详解 栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解。 使用栈…...

使用Docker部署PDF多功能工具Stirling-PDF
1.服务器上安装docker 安装比较简单,这种安装的Docker不是最新版本,不过对于学习够用了,依次执行下面命令进行安装。 sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docker 查看是否安装成功 $ docker …...

linux安装系统遇到的问题
这两天打算攻克下来网络编程,发现这也确实是很重要的一个东西,但我就奇了怪了,老师就压根没提,反正留在我印象的就一个tcp/ip七层网络。也说正好,把linux命令也熟悉熟悉,拿着我大一课本快速过过 连接cento…...

groovy XmlParser 递归遍历 xml 文件,修改并保存
使用 groovy.util.XmlParser 解析 xml 文件,对文件进行修改(新增标签),然后保存。 是不是 XmlParser 没有提供方法遍历每个节点,难道要自己写? 什么是递归? 不用说,想必都懂得~ …...

小程序基础学习(多插槽)
先创建插槽 定义多插槽的每一个插槽的属性 在js文件中启用多插槽 在页面使用多插槽 组件代码 <!--components/my-slots/my-slots.wxml--><view class"container"><view class"left"> <slot name"left" ></slot>&…...

爬虫补环境jsdom、proxy、Selenium案例:某条
声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、简介 爬虫逆向补环境的目的是为了模拟正常用户的行为,使爬虫看起来更像是一个真实的用户在浏览网站。这样可以…...

电子学会C/C++编程等级考试2021年09月(四级)真题解析
C/C++编程(1~8级)全部真题・点这里 第1题:最佳路径 如下所示的由正整数数字构成的三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径…...

DevExpress历史安装文件包集合
Components - DevExpress.NET组件安装包此安装程序包括所有 .NET Framework、.NET Core 3 和 .NET 5、ASP.NET Core 和 HTML/JavaScript 组件和库(Web和桌面应用程序开发只需要安装此文件即可)。 注意:自DevExpress21.1版本之后,该…...

科技云报道:“存算一体”是大模型AI芯片的破局关键?
科技云报道原创。 在AI发展历史上,曾有两次“圣杯时刻”。 第一次发生在2012年10月,卷积神经网络(CNN)算法凭借比人眼识别更低的错误率,打开了计算机视觉的应用盛世。 第二次是2016年3月,DeepMind研发的…...

watch监听一个对象中的属性 - Vue篇
vue中提供了watch方法,可以监听data内的某些数据的变动,触发相应的方法。 1.监听一个对象 <script>export default {data() {return {obj: {name: ,code: ,timePicker:[]}}},watch: {obj: {handler(newVal, oldVal) {//todo},immediate: true,deep…...

Spark---RDD序列化
文章目录 1 什么是序列化2.RDD中的闭包检查3.Kryo 序列化框架 1 什么是序列化 序列化是指 将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的…...

Xtuner大模型微调
Xtuner大模型微调 一、课程笔记 文档链接:https://github.com/InternLM/tutorial/blob/main/xtuner/README.md 视频链接: https://www.bilibili.com/video/BV1yK4y1B75J/ 大模型微调 大模型的训练利用了各类数据,可以说是一个通才ÿ…...

JavaScript基础04
1 - 数组 1.1 数组的概念 数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式。 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅…...

HarmonyOS@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
Observed装饰器和ObjectLink装饰器:嵌套类对象属性变化 上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数…...