IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 哈工大计算机网络第四章——网络层复习 -> 正文阅读

[网络协议]哈工大计算机网络第四章——网络层复习

目录

1. 网络层服务

2. 虚电路网络与数据报网络

3. 路由器体系结构

4. IP协议

5. DHCP协议——动态主机配置协议

6. NAT——网络地址转换

7. ICMP协议——互联网控制报文协议

8. IPv6

?9. 路由算法

10. 路由协议


1. 网络层服务

在从发送主机向接收主机传送数据段(segment)的过程中,发送主机的网络层取得传输层的报文段,将报文段封装到数据报(datagram)中,然后向相邻的路由器发送数据报。接收主机的网络层接收来自相邻路由器的数据报,提取传输层报文段,向传输层交付

? 每个主机和路由器都运行网络层协议

? 路由器检验所有穿越它的IP数据报的头部域,问题为决策如何处理IP数据报。路由器不允许应用与传输层协议,只有网络层以下的部分。

路由与转发

转发(forwarding): 将分组从路由器的输入端口转移到合适的输出端口,是路由器本地动作,时间很短。

路由(routing): 确定分组从源到目的经过的路径,需要路由算法 (routing algorithms)。是网络范围的处理过程,时间相对较长。

转发表:路由器检查到达分组的一个或多个字段值,使用这些值在转发表中索引,进而转发分组。

路由算法(协议)确定通过网络的端到端路径,转发表确定在本路由器如何转发分组

网络层核心功能-连接建立

数据分组传输之前两端主机需要首先建立虚拟/逻辑连接,由网络设备(如路由器)参与连接的建立。

传输与网络的对比

网络层连接: 两个主机之间 (?路径上的路由器等网络设备参与其中)

传输层连接: 两个应用进程之间(对中间网络设备透明)

网络层服务模型

?无连接服务(connection-less service),典型:数据报网络(datagram network )

? 不事先为系列分组的传输确定传输路径

? 每个分组独立确定传输路径

? 不同分组可能传输路径不同

?连接服务(connection service),典型:虚电路网络(virtual-circuit network )

? 首先为系列分组的传输确定从源到目的经过的路径 (建立连接)

? 然后沿该路径(连接)传输系列分组

? 系列分组传输路径相同

? 传输结束后拆除连接

2. 虚电路网络与数据报网络

虚电路网络

虚电路:一条从源主机到目的主机,类似于电路的路径(逻辑连接) ,采用分组交换的方式。每个分组的传输利用链路的全部带宽。源到目的路径经过的网络层设备共同完成虚电路功能

通信过程: 呼叫建立(call setup)→数据传输 →拆除呼叫

每个分组携带虚电路标识(VCID),而不是目的主机地址。虚电路经过的每个网络设备 (如路由器)都维护每条经过它的虚电路连接状态。链路、网络设备资源(如带宽 、缓存等)可以面向VC进行预分配。预分配资源=可预期服务性能,如ATM的电路仿真(CBR)

与电路的区别:1. 不进行电路的资源分配。 2. 都需要建立路径 3. 有时会进行网络资源预留,达到电路级的性能。

虚电路包括: 1. 从源主机到目的主机的一条路径 2. 虚电路号(VCID), 沿路每段链路一个编号 3. 沿路每个网络层设备(如路由器),利用转发表记录经过的每条虚电路

VC实现:沿某条虚电路传输的分组,携带对应虚电路的VCID,而不是目的地址。同一条VC ,在每段链路上的VCID通常不同,路由器转发分组时依据转发表改写/替换虚电路号

虚电路网络在连接建立时也需要解决路由选择问题,同时也需要进行虚电路的维护管理。

?虚电路信令协议:用于VC的建立、维护与拆除,应用于虚电路网络中。

数据报网络

网络层无连接,每个分组携带目的地址。路由表根据分组的目的地址转发分组。基于路由协议/算法构建转发表,在分组到达时检索转发表。每个分组独立选路。

路由算法(协议)确定通过网络的端到端路径,转发表确定在本路由器如何转发分组

在转发表中,满足最长前缀匹配优先。在检索转发表时,优先选择与分组目的地址匹配前缀最长的入口(entry)。

数据报网络与虚电路网络的区别:

Internet (数据报网络)

? 计算机之间的数据交换。是“弹性”服务,没有严格时间需求

? 链路类型众多。特点、性能各异,但统一服务困难

? “智能”端系统 (计算机) ,可以自适应、性能控制、差错恢复

? 简化网络, 复杂“边缘”

ATM (VC网络)

? 电话网络演化而来

? 核心业务是实时对话: ? 严格的时间、可靠性需求 ? 需要有保障的服务

? “哑(dumb)” 端系统(非智能) ? 电话机 ? 传真机

? 简化“边缘”, 复杂网络

3. 路由器体系结构

两个核心功能:1. 运行路由算法/协议? 2. 将数据报从入口到输出端口

分为:

1. 输入端口: 终结入物理层链路的物理层功能;与位于入链路层远端的数据链路层交互来执行链路层功能。执行查找功能,通过查询转发表决定路由器的输出端口

2. 交换结构:交换结构将路由器的输入端口连接到输出端口。

3. 输出端口:存储交换结构接收的分组,执行必要的链路层和物理成功能在输出链路上出书分组。

4. 路由选择处理器:执行控制平面功能。在传统路由器中执行路由协议,维护路由选择表与关联链路状态。

4. IP协议

网络层功能:

?IP数据报格式

? 版本号:占4位,IP协议的版本号有?4→IPv4,6 → IPv6

? 首部长度:占4位,以4个字节为单位,如果为5,意味着首部长度为20(5×4)字节

? 服务类型(TOS):字段占8位,指示期望获得哪种类型的服务。只有在网络提供区分服务(DiffServ)时使用,通常IP分组的该字段(第2字节)的值为00H

? 总长度:占16位,为IP分组的总字节数。最大IP分组的总长度:65535B,最小的IP分组首部:20B。IP分组可以封装的最大数据:65535-20=65515B

? 生存时间(TTL):占8位,是IP分组在网络中可以通过的路由器数。每次转发这个分组,TTL减一,如果TTL为0,丢弃分组。

? 协议:占8位,指示IP分组封装的数据包的协议。实现复用分用,6为TCP,表示封装的为TCP段;17为UDP,表示封装的是UDP数据报。

? 首部校验和:占16位,实现IP分组的差错检测。计算时,将此字段置0,计算其他字段之和。采用反码算数运算求和,和的反码作为首部校验和字段。

? 源IP地址、目的IP地址:占32位,标识发送分组的源主机/路由器(网络接口)和接收分组的目的主机/路由器 (网络接口)的IP地址

? 选项字段:长度可变,在1-40B之间,携带安全、源选路径、时间戳和路由记录等内容,实际很少使用。

? 填充:长度可变,范围在0-3B之间,目的在不一起首部,符合32位对其,保障首部长度是4字节的整数倍。

IP分片与重组

MTU(最大传输单元):链路层数据帧可封装数据的上限,不同链路的MTU不同。

大IP分组向较小MTU链路转发时,可以被“分片”,分成多个IP分组,IP分片到达目的主机后进行“重组”。IP首部的相关字段用于标识分片以及确定分片的相对顺序

? 标识字段占16位,标识一个IP分组。IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组的标识

? 标志位:占3位,由保留位,DF (Don't Fragment) 和MF (More Fragment) 组成。

DF =1:禁止分片;

DF =0:允许分片

MF =1:非最后一片;

MF =0:最后一片(或未分片)

? 片偏移:占13位,一个IP分组分片封装原IP分组数据的相对偏移量 ,以8字节为单位进行计算

IP分片过程

假设原IP分组总长度为L,待转发链路的MTU为M。若L>M,且DF=0,则可以分片。分片时每个分片的标识复制原IP分组的标识。通常分片时,除最后一个分片,其他分片均分为MTU允许的最大分片。一个最大分片可封装的数据应该是8的倍数,因此,一个最大分片可封装的数据为:

需要分片数量:

每片的块偏移:

每片的总字段长度:

每片的MF标志位:

IP编址

接口(interface): 主机/路由器与物理链路的连接,实现网络层功能。路由器通常有多个接口,主机通常只有一个或两个接口 (e.g.,有线的以太网接口,无线的802.11接口)

IP地址为32比特(IPv4)编号标识主机、路由器的接口。IP地址与每个接口关联,编址即为接口分配IP地址。IP地址采用以下形式:网络号(NetID) – 高位比特,主机号(HostID) –CID特

IP子网:IP地址具有相同网络号的设备接口,不跨越路由器(第三及以上层网络设备)可以彼此物理联通的接口。

?其中每个标蓝的地方都是一个IP子网,路由器之间的链路为特殊的IP子网,一共6个IP子网。

?“有类”编址

特殊IP地址

子网划分

IP地址:由以下部分组成:网络号(NetID) – 高位比特,子网号(SubID) – 原网络主机号部分比特,主机号(HostID) – 低位比特?

?

子网掩码:NetID、SubID位全取1,HostID位全取0,由子网地址加子网掩码确认子网大小。

应用:将IP分组的目的IP地址与子网掩码按位与运算,提取子网地址

CIDR

无类域间路由(CIDR: Classless InterDomain Routing)

融合子网地址与子网掩码,方便子网划分。采用无类地址格式:a.b.c.d/x,其中x为前缀长度

路由聚合

采用CIDR可以提高IPv4 地址空间分配效率和高路由效率。将多个子网聚合为一个较大的子网,构造超网(supernetting)。

层次编址可以使得路由信息通告更加高效。采用最长前缀匹配优先原则。

5. DHCP协议——动态主机配置协议

主机获得IP地址的方式:

1. 硬编码——静态配置

?2. 动态主机配置协议——DHCP

DHCP允许主机主动获取一个IP地址。主机从服务器动态获取IP地址、子网掩码、默认网关地址 、DNS服务器名称与IP地址。由于DHCP具有将主句连接进入一个网络的网络相关的自动能力,故被称为“即插即用”协议(零配置协议)。DHCP允许地址重用,支持在用地址续租,支持移动用户加入网络。
DHCP是一个客户——服务器协议。客户为新到达的主机,需要获得自身使用的IP地址和相关网络配置信息。每个子网都应该有一个DHCP服务器,如果没有,需要一个DHCP中继代理(路由器),代理需要知道用于该网络的DHCP服务器地址。

对于新到达的主机,有4个步骤

1. DHCP服务器发现。新到达的主机需要发现与之交互的DHCP,使用DHCP发现报文。客户生成的IP数据报使用广播地址进行广播,向端口67发送报文。

2. DHCP服务器提供。DHCP服务器收到发现报文后,用DHCP提供报文进行响应。仍然使用广播地址(主机此时还没IP地址),提供的报文包括发现报文的事务ID、推荐的IP地址、网络掩码和IP地址租用期(IP地址有效时间量)。

3. DHCP请求。新的主机从一个或多个服务器的提供中选一个,并向选择的服务器提供DHCP请求报文进行响应,表示选择这个IP地址,将所有参数传回。

4. DHCP ACK。服务器使用DHCP ACK报文,对主机的请求报文进行响应,表示主机被分配上了这个IP地址,并在报文中证实这些参数。

DHCP协议在应用层 实现,请求报文封装到 UDP数据报中。一直采用IP广播的方式,或链路层广播 (e.g. 以太网广播)

DHCP服务器构造 ACK报文 ? 包括分配给客户的IP地址、子网掩码、默认网关、DNS服务器地址?

6. NAT——网络地址转换

动机

? 只需/能从ISP申请一个IP地址,可能出现IPv4地址耗尽

? 本地网络设备IP地址的变更,无需通告外界网络

? 变更ISP时,无需修改内部网络设备IP地址

? 内部网络设备对外界网络不可见,即不可直接寻址(安全)

NAT的实现

利用(NAT IP地址,新端口号)替换每个外出IP数据报的(源IP地址,源端口号)。将每对(NAT IP地址, 新端口号) 与(源IP地址, 源端口号)的替换信息存储到NAT转换表中。根据NAT转换表,利用(源IP地址, 源端口号)替换每个进入内网IP数据报的(目的IP地址,目的端口号),即(NAT IP地址, 新端口号)。

NAT争议

? 路由器应该只处理第3层功能

? 违背端到端通信原则,应用开发者必须考虑到NAT的存在,e.g., P2P应用

? 地址短缺问题应该由IPv6来解决

NAT穿透

问题:客户期望连接内网地址为 10.0.0.1的服务器,但客户不能直接利用地址 10.0.0.1直接访问服务器。对外唯一可见的地址是NAT 地址: 138.76.29.7

解决方案1: 静态配置NAT ,将特定端口的连接请求转发给服务器,比如?(138.76.29.7, 2500) 总是转发给(10.0.0.1, 25000)。

解决方案2: 利用UPnP (Universal Plug and Play) 互联网网关设备协议 (IGD-Internet Gateway Device ) 自动配置: 学习到NAT公共IP地址 (138.76.29.7) 。在NAT转换表中,增删端口映射

解决方案3: 中继(如Skype) 。NAT内部的客户与中继服务器建立连接,外部客户也与中继服务器建立连接。中继服务器桥接两个连接的分组

7. ICMP协议——互联网控制报文协议

ICMP协议被主机和路由器用来彼此沟通网络层的信息。典型用途为差错报告和网络探询。

ICMP通常被认为是IP的一部分,但体系结构中位于IP之上,因为ICMP报文承载在IP分组中。

两类ICMP报文

(1)差错报告报文(5种)

? 目的不可达

? 源抑制(Source Quench)

? 超时/超期

? 参数问题

? 重定向 (Redirect)

(2)网络探询报文(2组)

? 回声(Echo)请求与应答报文(Reply)

? 时间戳请求与应答报文

不发送ICMP差错报文的特殊情况

? 对ICMP差错报告报文不再发送 ICMP差错报告报文

? 除第1个IP数据报分片外,对所有后续分片均不发送ICMP差错报告报文

? 对所有多播IP数据报均不发送 ICMP差错报告报文

? 对具有特殊地址(如127.0.0.0 或 0.0.0.0)的IP数据报不发送 ICMP 差错报告报文

ICMP报文格式与承载方法

一个ICMP报文包括一个类型字段和一个编码字段,同时有检验和字段,接下来4个字节是ICMP的类型。到此处ICMP的前8个字节确定,之后的数据部分包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节(便于发送方确定引发出错的数据报)。ICMP报文作为IP分组封装的数据承载在IP分组中。

类型和编码列表

(感觉不可能考)

应用举例:Traceroute

源主机向目的主机发送一系列UDP 数据报,第1组IP数据报TTL =1,第2组IP数据报TTL=2, 以此类推,但是设置的目的端口号是不可能使用的端口号。当TTL耗尽时,路由器丢弃数据报,向源主机发送ICMP报文 (type=11, code=0) 。ICMP报文携带路由器名称和IP地址信息。当ICMP报文返回到源主机时, 记录RTT。

停止准则:1. UDP数据报最终到达目的主机 2. 目的主机返回“目的端口不可达” ICMP报文 (type=3, code=3) 3. 源主机停止

8. IPv6

最初动机: 32位IPv4地址空间已分配殆尽

其他动机: 改进首部格式? 1. 快速处理/转发数据报 2. 支持QoS

IPv6数据报格式

固定40字节的基本首部,不允许分片。

优先级(priority): 标识数据报的优先级

流标签(flow Label): 标识同一“流”中的数据报

下一个首部(next header): 标识下一个选项首部或上层协议首部(如TCP首部)

与IPv4相比

彻底移除校验和(checksum),以减少每跳处理时间。允许选项(options)字段,但是从基本首部移出,定义多个选项首部, 通过“下一个首部”字段指示。在ICMPv6这个新版ICMP中,附加报文类型,例如“Packet Too Big”,同时增加多播组管理功能。

表示形式(128位,采用8组4个16进制数的形式表示)

? 一般形式: 1080:0:FF:0:8:800:200C:417A

? 压缩形式: FF01:0:0:0:0:0:0:43 压缩→FF01::43

? IPv4-嵌入形式: 0:0:0:0:0:FFFF:13.1.68.3 或 ::FFFF:13.1.68.3

? 地址前缀: 2002:43c:476b::/48 (注: IPv6不再使用掩码!)

? URLs: http://[3FFE::1:800:200C:417A]:8000

IPv6基本地址类型

? 单播:一对一通信(相当于IPv4的主机与主机通信)

? 多播:一对多通信(相当于IPv4向子网发数据)

? 任意播:一对任意一组之一通信

IPv4向IPv6过渡——隧道

隧道: IPv6数据报作为IPv4数据报的载荷进行封装,穿越IPv4网络

9. 路由算法

网络抽象:图

路由算法:寻找最小路径的算法。

路由算法分类

静态路由: ? 手工配置 ? 路由更新慢 ? 优先级高

动态路由: ? 路由更新快(定期更新,及时响应链路费用或网络拓扑变化)

全局信息: ? 所有路由器掌握完整的网络拓扑和链路费用信息 ? E.g. 链路状态(LS)路由算法

分散信息: ? 路由器只掌握物理相连的邻居以及链路费用 ? 邻居间信息交换、运算的迭代过程 ? E.g. 距离向量(DV)路由算法

链路状态(LS)路由算法

Dijkstra 算法

? 通过“链路状态广播”,所有结点(路由器)掌握网络拓扑和链路费用,所有结点拥有相同信息

? 通过获得该结点的转发表计算从一个结点(“源”) 到达所有其他结点的最短路径

? 迭代: k次迭代后,得到到达k个目的结点的最短路径

距离向量(DV)路由算法

Bellman-Ford方程(动态规划)

重点:结点获得最短路径的下一跳, 该信息用于转发表中!

结点x已知到达每个邻居的费用?c(x,v)和维护其所有邻居的距离向量Dv = [Dv (y): y ? N ]。其中Dx (y) = 从结点x到结点y的最小费用估计。

特点:

1. 异步迭代: 引发每次局部迭代的因素为局部链路费用改变或来自邻居的DV更新

2. 分布式: 每个结点只当DV变化时才通告给邻居,邻居在必要时(其DV更新后发生改变)再通告它们的邻居无穷计数问题

毒性逆转(poisoned reverse): 如果一个结点(Z)到达某目的(X)的最小费用路径是通过某个邻居(Y),则通告给该邻居结点到达该目的的距离为无穷大。

定义最大度量(maximum metric): 定义一个最大的有效费用值,如15跳步为最大有效跳数,16跳步表示无穷

层次路由

聚合路由器为一个区域: 自治系统AS (autonomous systems) 。同一AS内的路由器运行相同的路由协议(算法),即自治系统内部路由协议 (“intra-AS” routing protocol) 。不同自治系统内的路由器可 以运行不同的AS内部路由协议。网关路由器(gateway router)位于AS“边缘” ,通过链路连接其他AS的网关路由器。

转发表由AS内部路由算法与 AS间路由算法共同配置。AS内部路由算法设置AS内部目的网络路由入口 (entries)。AS内部路由算法与AS间路由算法共同设置AS外部目的网络路由入口。

10. 路由协议

?Internet采用层次路由

?AS内部路由协议也称为内部网络协议IGP (interior gateway protocols)

?最常见的AS内部路由协议:

? 路由信息协议:RIP(Routing Information Protocol)

? 开放最短路径优先:OSPF(Open Shortest Path First)

? 内部网关路由协议:IGRP(Interior Gateway Routing Protocol)

RIP

距离向量路由算法

? 距离度量:跳步数 (max = 15 hops), 每条链路1个跳步

? 每隔30秒,邻居之间交换一次DV,成为通告(advertisement)

? 每次通告:最多25个目的子网(IP地址形式)

链路失效与恢复:如果180秒没有收到通告,代表邻居/链路失效,即经过该邻居的路由不可用,需要重新计算路由。向邻居发送新的通告,如果转发表改变,邻居再依次向外发送通告。链路失效信息在快速传播到全网的过程中,可能发生无穷计数问题。毒性逆转技术用于预防乒乓(ping-pong)环路 (另外:无穷大距离 = 16 hops)

RIP路由表是利用一个称作route-d (daemon)的应用层进程进行管理,使用应用进程实现,通告报文周期性地通过UDP数据报发送。

OSPF

open意味着“开放”,即公众可用。采用链路状态路由算法(LS分组扩散(通告),每个路由器构造完整的网络(AS)拓扑图,利用Dijkstra算法计算路由)。OSPF通告中每个入口对应一个邻居。OSPF报文直接封装到IP数据报中,然后OSPF通告在整个AS范围泛洪。与OSPF极其相似的一个路由协议IS-IS路由协议。

OSPF的优点

?安全(security): 所有OSPF报文可以被认证 (预防恶意入侵)

?允许使用多条相同费用的路径 (RIP只能选一条)

?对于每条链路,可以针对不同的TOS设置多个不同的费用度量 (e.g., 卫星链路可以针对“尽力” (best effort) ToS设置“低”费用;针对实时ToS 设置“高”费用)

?集成单播路由与多播路由: ? 多播OSPF协议(MOSPF) 与OSPF利用相同的网络拓扑数据 ?OSPF支持对大规模AS分层(hierarchical)

区边界路由器(Area Border Routers): “汇总” 到达所在区网络的距离, 通告给其他区边界路由器

主干路由器(Backbone Routers): 在主干区内运行OSPF路由算法.

AS边界路由器(AS boundary routers): 连接其他AS.

BGP

? 边界网关协议BGP (Border Gateway Protocol): 事实上的标准域间路由协议

? 将Internet “粘合”为一个整体的关键

? BGP为每个AS提供了一种手段:

? eBGP: 从邻居AS获取子网可达性信息.

? iBGP: 向所有AS内部路由器传播子网可达性信息.

? 基于可达性信息与策略,确定到达其他网络的 “好” 路径

?BGP会话(session): 两个BGP路由器 (“Peers”) 交换BGP报文:

? 通告去往不同目的前缀(prefix)的路径 (“路径向量 (path vector)”协议)

? 报文交换基于半永久的TCP连接

?BGP报文:

? OPEN: 与peer建立TCP连接,并认证发送方

? UPDATE: 通告新路径 (或撤销原路径)

? KEEPALIVE: 在无UPDATE时,保活连接;也用于对 OPEN请求的确认

? NOTIFICATION: 报告先前报文的差错;也被用于关闭连接

? 通告的前缀信息包括BGP属性

? 前缀+属性= “路由”

? 两个重要属性:

? AS-PATH(AS路径): 包含前缀通告所经过的AS序列: e.g., AS 67, AS 17

? NEXT-HOP(下一跳): 开始一个AS-PATH的路由器接口,指向下一跳AS.

? 可能从当前AS到下一跳AS存在多条链路

? 通告的前缀信息包括BGP属性

? 前缀+属性= “路由” ? 两个重要属性:

? AS-PATH(AS路径): 包含前缀通告所经过的AS序列: e.g., AS 67, AS 17

? NEXT-HOP(下一跳): 开始一个AS-PATH的路由器接口,指向下一跳AS.

? 可能从当前AS到下一跳AS存在多条链路、

OSPF和BGP之间的区别

OSPF是AS内部的路由选择,是运行在单一ISP的网络中的路由选择算法。

BGP是一个AS间路由选择协议,是ISP之间的路由选择,称为边界网关协议。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:46:48  更:2021-12-04 13:48:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/6 7:42:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码