一数据链路层概述

TCP/IP协议族中,链路层有三个主要目的
1)为IP模块发送和接收IP数据报
2)为ARP模块发送ARP请求和接收APR应答
3)为RARP发送RARP请求和接收RARP应答

TCP/IP支持多种不同的链路层协议,这取决于网络使用的硬件如以太网,令牌环网,FDDI(光纤分布式数据接口)及RS-232串行线路等

接下来将详细讨论以太网数据链路层协议,两个串行接口链路层协议(SLIP和PPP)以及大多数实现都包含的环回(loopback)驱动程序。以太网和SLIP是后面大多数情况下用到的数据链路层。对于MTU(最大传输单元)进行介绍。这个概念在后面回多次遇到。同时还会讨论如何为串行线路选择MTU

二 以太网和IEEE802封装

1)以太网技术概述:他是TCP/IP采用的主要的局域网技术,它采用CSMA/CD的媒体接入方法,也就是带冲突检测和载波侦听多路接入,它的速率为10MB/S,地址48bit.
后来。IEEE(电子电器工程师协会)发布了一个稍有不同的标准集,

IEEE标准 针对网络
802.2 下面三者的共同特性 :802网络的逻辑链路控制(LLC)
802.3 CSMA/CD
802.4 令牌总线网络
802.5 令牌环网络

PS:其中802.2和802.3定义了一个与以太网不同的帧格式

在TCP/IP中,以太网IP数据报的封装是在RFC 894[Horing]中定义的,IEEE802网络的IP数据报封装是在RFC 1042[Postel and Reynolds 1988]中定义的。主机需求RFC要求RFC要求每台Internet主机都与一个10Mb/s的以太网电缆连接:

1)必须能发送和接收采用 RFC 894(以太网)封装格式的分组

2)应该能接收与RFC894混合的RFC 1042 (IEEE 802)封装格式的分组

3)也许能发送采用RFC 1042格式封装的分组。即如果主机同时能发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认采用 RFC 894分组
最常用的分组帧的格式是RFC 894定义的格式。下面分别为两种帧的格式,图中每个方框下面的数字是它们的字节长度。

两种格帧的格式都采用48bit(6字节)的目的地址和源地址(802.3允许使用16bit的地址,但是一般是48bit地址)。这就是我们在本书中所称的硬件地址。ARP和RARP协议对32bit的IP地址和48bit的硬件地址进行映射;

IEEE802帧:

以太网帧:

从上图可以看到:
1)以太网的类型字段定义了后续数据的类型。而802标准定义的帧格式中,类型由后续的子网接入协议(SNAP)首部给出。

关于以太网帧或802帧数据类型可以分为3类:RARP请求/应答,ARP请求应/答,IP数据报,三种类型

2)802定义的有效长度和以太网的有效类型值无一相同,这样,就可以对两帧格式进行区分。

3)以太网格式帧中:类型字段之后就是数据;而802帧格式中,跟随在后面的是3字节的802.2LLC和5字节的802.2SNAP.目的服务访问点(DSAP)和源服务访问点(SSAP)值都设为0xaa,ctrl字段值设为3.随后的3个字节org code都置为0;接下来的2个字节类型和以太网帧格式一样(参见RFC 1340)

4)CRC字段用于帧内后续字节差的冗余码校验(校验和)(它被称为FCS和帧检验序列)

5)802.3标准定义的帧和以太网的帧都有最小长度要求。802.3规定数据部分至少为38字节。而以太网,至少46字节。为保证这一点,必须在不足的空间插入填充(pad)字节.在开始观察线路上的分组将遇到这种最小长度的情况。

三尾部封装

PS:以太网的封装不只一种封装格式;即其中一种帧;

RFC 893描述了另一种用于以太网的封装格式:尾部封装;
尾部封装:这样一个早期BSD系统在DEC VAX机上运行时的实验格式,它通过调整IP数据报中字段的次序来提高性能。在以太网数据帧中,开始的那部分是边长的字段(IP首部和TCP首部)。把它们移到尾部在(CRC之前),这样当把数据复制到内核时,就可以把数据帧中的数据本分映射到一个硬件页面,节省内存到内存的复制过程。TCP数据报的长度是512字节的整数倍,正好可以用内核中的页表来处理。两台主机通过协商使用ARP扩展协议对数据帧进行尾部封装。这些数据帧不需要定义不同的以太网帧类型值。
但是现在尾部封装已经遭到反对,被弃用。

四 串行线路IP SLIP(数据链路层)

它是一种在串行线路上对IP数据报进行封装的简单形式,在RFC1055中有详细描述。SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调制解调器接入Internet.
下面是对SLIP协议定义的帧格式规则描述:
1)IP数据报以END(0xc0)的特殊字符结束,同时,为了防止数据报到来之前的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个END字符(如果有线路噪声,那么END字符将结束这份错误的数据报文。这样当前的报文得以争取地传输,而前一个错误报文交给上层后,会发现其内容毫无意义被丢弃)。
2)如果IP报文中某个字符为END,那么就要连续传输两个字节0xdb和0xdc来取代它。0xdb这个特殊字符被称作SLIP的ESC字符,但是它的值与ASCII码的ESC(0x1b)不同
3)如果IP报文中某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb和0xdd来取代它。
PS:这里的ESC代表转义字符的意思
下面是SLIP对IP数据报进行的简单封装的帧格式:

SLIP的缺陷:
1)每一端必须知道对方的IP地址,没有办法把本端的IP地址通知给另一端。
实际上这里的IP不是指IP首部中IP而是路由器本身的IP;关于这一点可以在TCP/IP(三)网络层协议中的IP路由选择中得到体现;

2)数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于SLIP那么它不能同时使用其它协议。

3)SLIP没有在数据帧中加上检验和(类似于以太网中的RCR字段)。如果SLIP传输的报文被线路噪声影响而发生错误,只能通过上层协议来发现(或,使用新型的调制解调器检验并纠正错误报文)。这样,上层协议提供某种形式的CRC就显得很重要。在后面第(17)节我们会看到IP首部和TCP首部及其数据时钟都有校验和。而(11)节中我们将看到UDP首部及其数据的检验是可选的。

虽然SLIP有以上这些缺陷,但是随着调制解调器速率和可靠性的提高,SLIP越来越流行。

但是SLIP主要还有一个问题,就是串行线路的速率比较低(1900b/s),而通信经常是交互的如(Telnet和Rlogin,它们的传输层都是使用的TCP),因此在SLIP线路上有许多小的TCP分组进行交换。而TCP首部和IP首部各占20字节,同时意味着传送1个字节的数据需要传输的字节必定超过40字节;针对这种性能曲线,人们提出了CSLIP(即压缩SLIP)的新协议,它在RFC 1144 (Jacobson 1990a)中被详细描述。CSLIP一般能把上面的40个字节压缩到3或5个字节。它能在CSLIP每端维持多达16个TCP连接,并且直到其中每个连接的首部中的某些字段一般不会发生变化,对于那些发生变化的字段,大多数只是一些小的数字和的改变。这些被压缩的首部大大缩短了交互响应时间。
现在大多数的SLIP产品都支持CSLIP。

五 点对点协议 PPP(数据链路层)

PPP,点对点协议修改了SLIP协议的所有缺陷,PP包括一下三个部分:
1)在串行链路上封装IP数据报的方法。PPP既支持数据为8位和无奇偶检验的异步模式(如大多数计算机都普遍存在的串行接口),还支持面向比特的同步连接。

2)建立,配置和测试数据链路的链路控制协议(LCP),它允通过通信双发进行协商,以确定不同的选项。

3)针对不同网络层协议的网络控制协议(NCP)体系。当前RFC定义的网络层有IP ,OSI网络层,DECent以及AppleTalk.例如,IP NCP允许双方商定是否对报文首部进行压缩,类似于CSLIP(缩写NCP也可用在TCP前面)

RFC 1548 描述了报文封装的方法和链路控制协议,PFC 1332 描述了针对IP的网络控制协议

PPP数据帧的格式看上去很像ISO的HDLC(高层数据链路控制标准)。
下面是一个PPP的数据帧格式:

1)每一帧都以标志0x7e开始和结束。

2)紧接着是个地址字节,值始终是0xff,然后是一个值为0x03的控制字节。

3)接下来是协议字段,类似以太网中类型字段的功能。它的值为为0x0021时,表示信息字段是一个IP数据报;值为0xc021是,表示信息字段是链路控制数据;值为0x8021时,表示信息字段时网络控制数据。

4)CRC字段(或FCS,帧检验序列)是一个循环冗余检验码,以检测数据中的错误。

5)由于标志字符值时0x7e,因此当该字符出现在信息字段时,PPP需要对它进行转义,在同步链路中,该过程是通过一种称为比特填充(bit stuffing)的硬件技术来完成实现的。在异步链路中,该过程中,特殊字符0x7d用作转义字符。当它出现在PPP数据帧中时,那么紧接着的字符的第6个比特要取其补码,具体实现如下:
1)当遇到字符0x7e时,需要连续传送两个字符:0x7d和0x5e,以实现标志字符的转义

2)当遇到转移字符0x7d时,需要连续传送两个字符:0x7d和0x5d,以实现转义字符的转义。

3)默认情况下,如果字符的值小于0x20(比如,一个ASCII控制字符),一般都要进行转义。例如遇到字符0x01时需要连续传送0x7d和0x21两个字符(这时,第6个比特取补码后变为1,而前面两种情况均把它变为0).
这样做的原因:防止它们出现在双方主机的串行接口驱动程序或调制解调器中;
1)有时它们会把这些控制字符解释成特殊的含义
2)另外一种可能用是链路层控制协议来指定是否需要对32个字符的某一些值进行转义。默认情况下是对所有的32个字符进行转义。

与SLIP类似,由于PPP经常用于低速的串行链路,因此减少每一帧的字节数可以降低应用程序的交互时延。
利用链路控制协议,大多数的产品通过协商可以省略标志符和地址字段,并且把协议字段由2个字节减少到1个字节。如果我们把PPP的帧的格式与前面的SLIP的帧格式进行比较,PPP值增加了额外的3个字节:1个字节留给协议字段段,另外2个给CRC字段使用。
另外,使用IP网络控制协议,大多数的产品可以协商采用Van Jacobson报文首部压缩方法(这是一种常见的压缩方法,对应CSLIP压缩),减少IP和TCP首部长度

总结:PPP:点对点协议,解决了SLIP的缺陷,以及借鉴了一些策略,下面是具体的描述

1)PPP每一帧增加冗余检验(CRC字段),从而保证报文被线路噪声影响而发生错误的概率更小;而SLIP对于错误校验和纠正只能依赖新型调制解调器,以及上层协议实现

2)PPP支持8位无奇偶的异步模式,和面向比特的同步连接;
这两者都需要对标志位0x7e进行转义但是这两者对于字符的转义方式有差异:
同步链路,对标志位0x7e进行转义,依赖的是比特填充的硬件技术[Tanenbaum 1989];
异步链路:使用的是特殊字符0x7d用作转移字符,从而实现转移功能,其中需要注意的是如果传输的字符值小于0x20需要转义,例如遇到字符0x01需要连续传输0x7d和0x21这两个字符来替代。实际上就是对需要转义的字符的第6位取反;
例子:0x7e =0111 1110 0x5e=0101 1110 0x01=0x0000 0001 0x21=0x0010 0001
处了小于0x20,还需要转义的字符0x7e和 0x7d

3)PPP支持在单根线路上运行多种协议,不单单只是IP协议

4)通信双方可以进行IP地址的动态协商(使用IP网络控制协议NCP)

5)链路控制协议可以对多个数据链路选项进行设置(使用链路控制协议LCP)

6)与CSLP类似,对TCP和IP报文首部进行压缩(使用网络控制协议NCP)

当然也不是没有代价,与SLIP相比,代价

1)每帧的首部增加3个字节

2)当建立来南路时要发送几帧的协商数据

3)实现更加复杂

通常来说它的优点远远比代价更好,随着产品越来越多,厂家也开始逐渐支持PPP。最终PPP取代SLIP

六 环回接口

大多数的产品都支持环回接口,以允许同一台主机上的客户程序和服务程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的。根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名localhost。一个传给环回接口的IP数据报不饿能在任何网络上出现。
我们想象,一旦传输层检测到目的端地址时环回地址时,应该省略部分传输层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当IP数据报离开网络层时把它返回给自己。
下面是环回接口处理IP数据报的简单过程

图中需要指出的关键点是:
1)传给环回地址(一般是127.0.0.1),的任何数据均作为IP输入

2)传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为广播传送和多播传送送的定义包含主机本身。

3)任何传给主机IP的数据均送到环回接口
看上去用传输层和IP层的方法来处理环回数据似乎效率不高,但是简化了设计,因为环回接口可以被看作是网络层下面的另一链路层。网络层把一份数据报传送给环回接口,就像传给其他链路层一样,只不过环回接口把它返回到IP的输入队列中。
在上图中,另外一个隐含的意思是送给主机本身IP地址的IP数据报一般不出现在相应的网络上。例如,在一个以太网上,分组一般不被传送出去,然后读回来。某些 BSD以太网的设备驱动程序的注释说明,许多以太网接口卡不能读回它们自己发送出去的数据。由于一台主机必须发送给自己的IP数据报,因此上图所示的过程是最为简单的处理办法。
4.4BSD系统定义了遍历useloopback,并初始化为1.但是如果这个值置为1,太网驱动程序就回把本地分组送到网络上,而不是送到环回接口上。它也许不能工作,这取决于所使用的以太网接口卡和设备驱动程序。

总结:
1)从大的方向来看上图将IP层以下的部分分为两个方向:一种是环回接口,一种是非环回接口;

2)针对环回接口和非环回接口这两种类型的接口在IP层以下的部分做了两种不同的处理方式:
对于环回接口的IP数据报直接会被保存到IP输入队列,等待从IP输入队列进入IP层,
而对于非环回接口的IP数据报,数据会被传输到以太网的网络上

3)对于IP地址为广播或者多播的地址,实际上这两种地址广播的目的地址既包含localhost,但是又不只是localhost,所以它既要是环回接口,又是非环回接口,因此两个方向都要包含

4)关于目的IP地址和接口IP地址是否相同这里的判断;实际上就是在判断目的IP是否等于localhost(一般来说是127.0.0.1)

5)如果目的IP和localhost不相等,说明目的IP不是环回地址,如果想要将数据传入以太网,需要使用ARP从而获取以太网地址,然后将数据传到网络上。

6)当以太网接收到数据到数据的时候,并非全是IP数据报,因为在前面我们知道以太网帧类型传输有三类:RARP,ARP,IP,三种类型的数据报所以需要分用。

七 最大传输单元MTU

MTU:最大传输单元,即链路层每一帧传输的数据的最大字节数,注意这里的数据不包含那些杂七杂八的如:RCR,协议类型等,仅仅指数据报的最大字节数;
不同类型的网络大多数都有一个上限,下表是关于数据链路层协议的MTU:

如果网络层要传一个数据报,数据长度比链路层的MTU还大,那么IP层就需要进行分片(framentation),把数据分成若干片,这样每片都小于MTU。分片的具体过程在后面再讨论

上图列处的一些典型的MTU值,它们摘自RFC 1191.点到点的链路层如(SLIP,PPP)的MTU并非是网络媒体种的物理特性。相反,他是一个逻辑限制,目的是为了交互使用提供足够快的响应时间。在后面九串行线路吞吐量计算中会提到它是如何得来的
在后面我们会提到用netstat打印网络接口的MTU

八 网络路径MTU

当一个网络上的两台主机相互进行通信时,该网络的MTU非常重要,但是如果两台主机之间要的通信要用多个网络,那么每个网络的链路层可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它们被称作路径MTU。
两台主机之间MTU不一定是一个常数,它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径MTU在两个方向上不一定是一致的。
RFC 1191[Mogul and Deering 1990]描述了路径MTU的发现机制,即在任何时候确定路径MTU的方法。我们在介绍了ICMP和IP分片方法以后再来看它是如何操作的。再后面我们将看到ICMP的不可到达错误九采用了这种发现方法。除此以外,再后面,我们还会看到,traceroute程序也是用这个方法来去顶达目的节点路径MTU。在后面还介绍当产品支持MTU的发现方法时,TCP和UDP是如何进行操作的。

九 串行线路吞吐计算方法

如果线路速率是9600b/s,而一个字节有8bit,加上一个起始比特和停止比特,那么线路的速率就是960B/s。以这个速率传输1024个字节的分组需要1066ms
这个速率传输一个1 0 2 4字节的分组需要1066 ms。

如果用S L I P链接运行一个交互式应用程序,同时还运行另一个应用程序如 F T P发送或接收1 0 2 4字节的数据,那么一般来说就必须等待一半的时间( 533 ms)才能把交互式应用程序的分组数据发送出去。假定交互分组数据可以在其他“大块”分组数据发送之前被发送出去。大多的 S L I P实现确实提供这类服务排队方法,把交互数据放在大块的数据前面。交互通信一般有 Te l n e t、R l o g i n以及F T P的控制部分(用户的命令,而不是数据)。
这种服务排队方法是不完善的。它不能影响已经进入下游(如串行驱动程序)队列的非交互数据。同时,新型的调制解调器具有很大的缓冲区,因此非交互数据可能已经进入该缓冲区了。
对于交互应用来说,等待 533 ms是不能接受的。关于人的有关研究表明,交互响应时间超过1 0 0~200 ms就被认为是不好的 [Jacobson 1990a]。这是发送一份交互报文出去后,直到接收到响应信息(通常是出现一个回显字符)为止的往返时间。
把S L I P的M T U缩短到2 5 6就意味着链路传输一帧最长需要 266 ms,它的一半是 133 ms(这是一般需要等待的时间)。这样情况会好一些,但仍然不完美。我们选择它的原因(与 6 4或1 2 8相比)是因为大块数据提供良好的线路利用率(如大文件传输)。假设C S L I P的报文首部是5个字节,数据帧总长为 2 6 1个字节,2 5 6个字节的数据使线路的利用率为 9 8 . 1 %,帧头占了1 . 9 %,这样的利用率是很不错的。如果把 M T U降到2 5 6以下,那么将降低传输大块数据的最大吞吐量。
在上图中列出的M T U值中,点对点链路的M T U是2 9 6个字节。假设数据为2 5 6字节,T C P和I P首部占4 0个字节。由于M T U是I P向链路层查询的结果,因此该值必须包括通常的 T C P和I P首部。这样就会导致I P如何进行分片的决策。I P对于C S L I P的压缩情况一无所知。我们对平均等待时间的计算(传输最大数据帧所需时间的一半)只适用于 S L I P链路(或P P P链路)在交互通信和大块数据传输这两种情况下。当只有交互通信时,如果线路速率是9600 b/s,那么任何方向上的 1字节数据(假设有 5个字节的压缩帧头)往返一次都大约需要12.5 ms。它比前面提到的100~200 ms要小得多。需要注意的是,由于帧头从 4 0个字节压缩到5个字节,使得1字节数据往返时间从85 ms减到12.5 ms。
不幸的是,当使用新型的纠错和压缩调制解调器时,这样的计算就更难了。这些调制解调器所采用的压缩方法使得在线路上传输的字节数大大减少,但纠错机制又会增加传输的时间。不过,这些计算是我们进行合理决策的入口点。
在后面的章节中,我们将用这些串行线路吞吐量的计算来验证数据从串行线路上通过的时间。

总结:
1)MTU:需要考虑的不仅仅是物理上限制的最大传输的数据的字节数。同时应该为它的交互性作考虑,换句话说,每次发送数据我们应该考虑响应的时间;即物理特性上支持并不意味着它MTU应该如此。MTU一旦过大,交互性就会降低。MTU过小,那么真正的线路利用率率就会降低(因为每次传输的不仅仅是数据,还包括一些其他的如报文首部字段),

2)我们对于帧首部从40字节压缩到5个字节,虽然会让线路上传输字节的时间大大减少,但是带来的纠错机制又会增加传输时间,也就是说将时间成本从线路传输转嫁到压缩解调和纠错机制上面去了。

TCP/IP详解(二)数据链路层相关推荐

  1. cdt规约报文用程序解析_程序员必备的学习笔记《TCP/IP详解(二)》

    把这三个协议放到一起学习是因为这三个协议处于同一层,ARP 协议用来找到目标主机的 Ethernet 网卡 Mac 地址,IP 则承载要发 送的消息.数据链路层可以从 ARP 得到数据的传送信息,而从 ...

  2. TCP/IP详解 第十二章(10) TCP Socket 编程

    前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林当年校招时常因 TCP 面试题被刷, ...

  3. TCP/IP详解 第十二章(9) TCP断开连接

    前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林当年校招时常因 TCP 面试题被刷, ...

  4. 《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议

    4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络如 ...

  5. TCP/IP详解--第一章

    说明:专栏中的内容是<TCP/IP详解>这本书,博主分享在此. 第1章概     述 1.1   引言 很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但  TCP/IP协 ...

  6. TCP/IP详解--学习笔记(5)-IP选路,动态选路,和一些细节

    1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由.这里就不重复了.首先来看看一个简单的系统 ...

  7. TCP/IP详解学习笔记-基本概念

    为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...

  8. TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节

    1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由.这里就不重复了.首先来看看一个简单的系统 ...

  9. 《TCP/IP详解》学习笔记(五):IP选路、动态选路

    静态 IP 选路 1一个简单的路由表 选路是 IP 层最重要的功能之一.前面的部分已经简单的讲过路由器是如何根据 IP 数据包的 IP 地址来选择路由的. 这里就不重复了. 首先来看看一个简单的系统路 ...

最新文章

  1. 生成对抗网络GAN综述
  2. Andrew Ng 深度学习笔记-01-week2-课程
  3. 数学之路(3)-机器学习(3)-机器学习算法-SVM[9]
  4. 蓝桥杯JAVA省赛2013-----B------3(振兴中华)
  5. then 微信小程序_微信小程序 引入es6 promise
  6. 45 FI配置-财务会计-固定资产-一般评估-指定折旧条件转移
  7. C++基础::shared_ptr 编程细节(一)
  8. 从 JavaScript 到 TypeScript 6 - Vue 引入 TypeScript
  9. 日常笔记(持续更新)
  10. java的四个元注解 @Retention @Target @Document @Inherited
  11. 跳板机+谷歌验证码 ssh 自动登录
  12. 计算机excel宏代码怎么写,教你如何使用Excel VBA VBA新手必看
  13. 目标客户画像_分析目标人群画像的5个步骤
  14. 网站域名被微信/QQ红了(被封锁、被屏蔽、被和谐)后最好的解决方法
  15. 【日拱一卒行而不辍20220921】自制操作系统
  16. 生成自签名证书:生成证书和秘钥
  17. 2012上半年 系统集成项目管理工程师 下午试卷
  18. 【Python】turtle海龟画图练习
  19. avg制作工具 开源_23种开源视听制作工具
  20. 华为发布5G“天罡”“巴龙5000”芯片 5G折叠屏手机2月发布

热门文章

  1. 苹果个人公司类型开发者账号申请(99美元)详解
  2. java 自幂数_JAVA 编程01:用JAVA语言实现所有自幂数的输出
  3. 免费PDF下载网站 Free Pdf Download Engine
  4. APP开发商城时,常说三级分销,你知道什么是分销机制吗?
  5. 经验分享丨自学多久能达到挖漏洞的水平,漏洞奖金有多少?
  6. python_getUniport_从uniport网站中获得指定的字节
  7. 0.96寸OLED屏使用详解
  8. Room cannot verify the data integrity. Looks like you‘ve changed schema but forgot to update the ve
  9. 训练神经网络的详细步骤,如何训练一个神经网络
  10. 字符串查找函数和错误信息报告函数