文章目录

  • Framing
    • Byte Count
    • Flag Byte Method
    • Byte Stuffing
  • Medium Access Control (MAC)
    • Static Channel Allocation
    • Dynamic Channel Allocation
      • Independent Traffic
      • Single Channel
      • Observable Collisions
      • Continuous or Slotted Time
      • Carrier Sense or No Carrier Sense
    • Pure ALOHA
    • Slotted ALOHA
    • Carrier Sense Multiple Access (CSMA) Protocols
      • CSMA with Collision Detection
    • Collision-Free Protocols
      • A Bit-Map Protocol
      • Token Passing
    • Multiple Access with Collision Avoidance (MACA)
    • CSMA with Collision Avoidance
      • Virtual channel sensing using CSMA/CA
      • Interframe spacing in 802.11
    • MAC: Energy Consumption Consideration
  • References

数据链路层使用物理层的服务,在通信通道上发送和接收比特。它有许多功能,包括

  • 为网络层提供服务接口
  • 处理传输错误
  • 调节数据流,使慢速接收者不被快速发送者"淹没"

为了实现这些目标,数据链路层从网络层获取数据包,并将其封装成(frames)进行传输。

Framing

每个帧包含一个帧头(frame header),一个用于容纳数据包的有效载荷字段( payload field ),以及一个帧尾(frame trailer)。

物理层所做的是接受一个原始比特流,并试图将其传送到目的地。如果信道有噪声(大多数无线和一些有线链路),物理层将在其信号中添加一些冗余,以将误码率降低到一个可接受的水平。即便这样,也很难保证数据链路层接收到的比特流没有错误。一些比特可能有不同的值(0 变成 1),收到的比特数可能少于、等于或多于传输的比特数。数据链路层需要检测这些错误并在必要时纠正错误。

数据链路层的通常做法是:

  • 将比特流分解成不连续的帧
  • 为每个帧计算校验和(checksum)
  • 在传输时将校验和包含在帧中

当帧到达目的地时,检查和会被重新计算。如果新计算的校验和与帧中包含的校验和不同,数据链路层就知道可能发生了错误,并采取一些措施进行处理。例如直接将错误的帧丢弃,或者返回一个错误报告。

将比特流分解成不连续的帧,听起来好像很简单,但却大有文章。必须使接收机很容易找到新帧的开始,同时使用很少的信道带宽。我们下面就介绍几种组帧方法。

Byte Count

字节计数法使用帧头中的一个字段来指定帧中的字节数。当目的地的数据链路层看到字节数时,它知道后面有多少个字节,从而也知道了帧的终点位置在哪里。

很明显,这个方法最大的问题在于,如果帧头中的字节数字段在传输中出现错误,那后面一系列的定位都会出错,就像下面这个简单的例子:

即使校验和不正确,收端知道该帧是坏的,但仍然没有办法知道下一帧从哪里开始。

Flag Byte Method

将帧的开始和结束字节用特殊字节来标识。通常用相同的字节,称为标志字节,来作为起始和结束分隔符。两个连续的标志字节表示一帧的结束和下一帧的开始。

但如果负载中携带的数据流中含有标志字节,该怎么办?

Byte Stuffing

解决这个问题的一个方法是让发送方的数据链路层在数据中的每个标志字节之前插入一个特殊的转义字符(通常为 ESC)。这就是字节填充法。

然而,如果用来填充的转义字符出现在待发送的数据信息当中,又该如何处理呢?(无限套娃~~)

答案是在出现的这个转义字符前再插入一个转义字符。在接收方,第一个转义字符被移除,留下后面的数据字节。

我们来看一个例子:


Medium Access Control (MAC)

在任何广播网络中,都有一个关键问题,那就是在有竞争的情况下如何确定谁能使用这个信道。

在文献中,广播信道有时被称为多接入信道(multiaccess channels)或随机接入信道(random access channels)。用来决定谁接入多接入信道上的协议属于数据链路层的一个子层,称为 MAC。

MAC 的协议非常多,我们可以大致做个梳理:

Static Channel Allocation

在多个竞争用户之间分配单一信道的传统方法是使用一种复用方法(频分、时分…)。

在频分复用(FDM)中,如果有 N 个用户,带宽会被分成 N 个大小相等的部分,每个用户分配一个部分。由于每个用户都有一个私人频段,用户之间没有干扰。但如果一段时间内这 N 个用户只有少部分在利用带宽资源,那大量的带宽资源就被浪费掉了。

而且,如果超过 N 个用户想进行通信,其中一些用户会因为缺乏带宽而被拒绝,即使一些被分配到一个频段的用户几乎没有发送或接收任何东西。

因此,静态分配并不适合 WSN,因为 WSN 中的流量通常是突发性的。

Dynamic Channel Allocation

动态的信道分配基于以下五个基本假设。

Independent Traffic

该模型由 N 个独立的节点组成,每个节点都有一个程序或用户,生成用于传输的帧。一旦产生了一个帧,节点就什么也不做了,直到该帧被成功传输。且我们假设帧以恒定的速率生成。实际上,这个假设并不是一个特别好的网络流量模型。更常见也更合理的是泊松模型,我们会在下篇文章介绍排队论时详细介绍。

Single Channel

一个单一的信道可用于所有的通信,所有节点可在这个信道上进行传输或接收数据,且不存在其它的通信方式。我们假设这些节点的能力相同,尽管协议可能赋予它们不同的角色(例如,优先级)。

Observable Collisions

如果两个帧同时传输,产生的信号就会出现乱码,这就叫冲突(Collision)。我们认为所有节点都能检测到发生了冲突,冲突的帧必须稍后再进行传输,且除了冲突造成的错误,没有其它错误发生。在无线信道中,冲突可能会很难检测,因此,如果没有收到 ACK 确认信息,我们就可能认为发生了冲突。

Continuous or Slotted Time

时间可以假定是连续的,在这种情况下,数据帧传输可以在任何时刻开始。

另外,时间也可以被划分为不连续的时隙(槽,slots)。在这种情况下,数据帧的传输只能在时隙的起点处开始。一个槽可能包含 0、1 或更多的帧,分别对应空闲状态、一个成功的传输或冲突

Carrier Sense or No Carrier Sense

有了载波监听的假设,节点可以在尝试使用信道之前来监听信道是否在使用。如果检测到信道不是空闲的,那么节点不会发送消息。

如果不进行载波监听,那么节点想发某个包也就发了,爱咋咋地吧。


Pure ALOHA

Pure ALOHA 的基本理念很简单:只要用户有数据需要发送,就让他们进行传输。这种情况下冲突自然不可避免。在每个节点向中心节点发送数据帧后,该中心节点将该帧重新广播给所有的节点。因此节点也就知道自己的数据帧有没有传送成功了。

如果数据帧传输失败了,节点等待一个随机的时间然后再次发送。注意,必须是随机的时间,否则两个冲突的节点都等待相同时间再传输,还是会发生冲突,一直相爱相杀下去。

固定大小的帧可以使 ALOHA 系统的吞吐量达到最大

Pure ALOHA 的效率:
S=Ge−2GS=Ge^{-2G} S=Ge−2G

S 与 G 的含义见下图。

Slotted ALOHA

Slotted ALOHA 将时间划分为不连续的间隔,称为槽,每个间隔对应一个数据帧。这要求每个节点是同步的,即知道每个槽的准确起始时间。

Slotted ALOHA 的效率:
S=Ge−GS=Ge^{-G} S=Ge−G

Slotted ALOHA 可以使信道的最大利用率达到 1e\frac{1}{e}e1​。(导数为 0)

Carrier Sense Multiple Access (CSMA) Protocols

我们前面已经提到过载波监听的概念。CSMA 主要有两种,坚持型(Persistent)和非坚持型(Non-persistent)。

1-Persistent

当一个节点有数据要发送时,它首先监听信道,看是否有其他同志在发送数据。如果信道是空闲的,节点就会发送其数据。否则,节点会等待直到信道空闲,然后再发送数据帧。

如果发生了冲突,那么节点会“静默”随机时间,然后再重复上面的所有流程。

该协议被称为 1-persistent,因为当它发现信道空闲时,会以 100% 的概率传输数据帧。

你可能会觉得奇怪,既然可以监听信道,怎么还会有冲突发生呢?

如果两个节点在第三个节点的传输过程中准备传输帧,但都检测到信道忙,此时两个节点将礼貌地等待,直到传输结束,然后两个节点将同时开始传输,导致冲突。

此外,传输时延(propagation delay)也会导致冲突的发生。 当一个节点发送数据帧后,如果此时另一个节点也刚好准备发送,且第一个节点的信号还没有到第二个节点这儿,那第二个节点会检测到信道空闲,也进行传输,Duang~

Non-Persistent

相比 1-Persistent,Non-Persistent 显得 less greedy。如果节点检测到该信道已经在使用中,那它不会再持续监听信道,来等到信道空闲时立即传输数据。相反,它会等待一个随机的时间段,然后重复之前的流程。

因此,这种算法有更好的信道利用率,但比 1-persistent CSMA 的延迟更长。

p-persistent

p-persistent 被用在 slotted 信道。当监听到信道空闲时,它以概率 ppp 发送数据帧,否则会等到下个时隙的开始。如果该时隙信道也是空闲的,那么继续以概率 ppp 发送数据帧。这个过程重复进行,直到该帧已被传输或另一节点开始传输。如果是后一种情况,那么这个节点属实是老倒霉蛋了,相当于发生了冲突。

如果一开始就监听到信道忙,那么它会直接等到下个时隙再开始所有的算法流程。

下图比较了这几种 CSMA 连同 ALOHA 的信道利用率:

CSMA with Collision Detection

我们已经知道,如果两个节点监听到信道空闲并同时开始传输,会发生冲突。我们想要节点能够快速检测到冲突并立即停止传输而不是继续将整个数据帧传完,因为此时的传输已经受到干扰,数据已经乱码,即使收到也没有意义。这样可以节约大量时间以及带宽成本。

这就有了 CSMA/CD。

节点的硬件设施必须在传输时持续监听信道,如果它读到的信号与它发出的信号不同,它就知道发生了冲突。 具体来说,如果发生冲突,信道上可以检测到超过发送节点本身发送的载波信号幅度的电磁波,由此判断出冲突的存在。如果一个节点检测到冲突,它将中止传输,等待一段随机时间,然后再次尝试。

如果两个节点同时监听到信道空闲,并开始传输,那么检测到冲突的最短时间为信号从一个节点传输到另一个节点所需的时间。

我们考虑如下的最坏情形:

假设信号在两个最远节点之间传输需要的时间为 τ\tauτ。在 t0t_0t0​ 时刻,一个节点开始传输,就在传输即将完成之时,在 t0+τ−ϵt_0 + \tau - \epsilont0​+τ−ϵ 时刻,另一个节点也开始传输,当然它会立刻检测到冲突并停止传输,但对于第一个节点来说,它可能会在 t0+2τ−ϵt_0 + 2\tau - \epsilont0​+2τ−ϵ 时刻才会知道发生冲突了。


Collision-Free Protocols

冲突显然对系统的性能有很大影响,会浪费大量时间、带宽资源,且传输一个数据帧的时间也是不固定的。

我们现在假设以下场景:

有 N 个节点,有从 0 到 N - 1的唯一地址。可以允许部分节点在某个时间段不工作,同时我们也忽略传输时延。基于这些假设,我们还是要考虑相同的问题,哪个节点来使用信道?

A Bit-Map Protocol

我们划分有 N 个时隙,如果节点 0 需要发数据,那么它就在 slot 0 发送 1 比特,其它节点不可以在此时隙发送数据。

不管节点 0 在slot 0 有没有发送数据,节点 1 都可以在 slot 1 发送 1 比特它的数据,当然前提是它有数据帧需要发送的话。

这相当于,要发送数据帧的节点会在它对应的 slot 来发送一比特,告诉大家我有东西要发。在所有的 N 个 slot 过去之后,每个节点都知道了哪个节点要传输数据。这时,需要发送数据的节点便按照节点顺序(0~N-1)传输它们的数据,一个接一个,所以不会发生冲突。

当最后需要传输数据的节点传输完成之后,就再次回到逐一发送比特的阶段了。如果某个节点很不巧,过了它的 slot 之后正好要发数据,那它就得等下一轮了。

像这样的协议被称为保留协议(reservation protocols),因为它们事先保留了信道所有权并避免了冲突。

Token Passing

Bit-Map 协议的本质是,它让每个节点按照预定的顺序依次传送数据帧。

实现这个思路的另一种方法是以相同的预定顺序将一个叫做令牌(token)的信息从一个节点传到下一个节点。谁有这个 token,代表谁就可以进行传输。如果没有信息要传输,就直接将 token 传给下一个节点。

在令牌环协议(token ring protocol)中,网络的拓扑结构被用来定义节点的发送顺序。token 的传递,只需从一个方向进行接收,然后从另一个方向将其传送出去。


Multiple Access with Collision Avoidance (MACA)

Hidden node problem


radio range 指两个节点可能会发生干扰的范围。在上图的情况中,A 和 C 都想给 B 发送数据,但因为 A 和 C 不在彼此的 radio range 内,如果 A 已经发了数据,C 还是会监听到信道空闲,也会发数据,结果两个节点都不能成功传输,在节点 B 处发生了冲突。我们把 A 和 C 叫作 Hidden node。

Exposed Node Problem

现在 B 想给 A 传输数据,而 C 想给 D 传输数据。如果 B 已经发送数据,而因为 B 在 C 的 radio range 之内,C 此时会监测到信道忙,从而放弃给 D 传输数据。但其实 C 给 D 的传输是完全不受影响的。我们把 B 和 C 叫作 Exposed Node。

早期解决这些问题的一个有影响力的协议就是 MACA。

它的基本思想是让发送方“刺激”接收方输出一个短帧,所以附近的站点可以检测到这个短帧,并避免在即将到来的(大)数据帧期间进行传输。

我们看一个具体例子。

现在 A 要给 B 传输数据。A 首先会给 B 发送一个 RTS (Request To Send)帧,这个帧里包含了要发送的数据帧的长度。然后 B 会给 A 回复一个 CTS (Clear To Send)帧,也包含从 RTS 中得到的要发送数据帧的长度。A 接收到 CTS 后,就开始传输。

任何收到 RTS 的节点显然离 A 很近,必须保持足够长的“沉默”,以便 CTS 在不发生冲突的情况下传回给A。而任何收到 CTS 的节点显然接近 B,在即将到来的数据传输中也必须保持“沉默”,它们可以通过检查 CTS 帧来判断要传输的数据帧长度,从而决定要“沉默”的时间。

例如,节点 C 可以收到 RTS,但不会收到 CTS。只要它不干扰 CTS,在数据帧发送时,它就可以自由发送。

尽管这么小心翼翼了,还是有可能发生冲突。例如,当 B 和 C 同时给 A 发送 RTS 时,就会发生冲突,RTS 会丢失。这样,没有收到 CTS 回应的节点会等待随机时间后再进行尝试。


CSMA with Collision Avoidance

CSMA/CD 可以检测冲突,但无法避免冲突;对于 CSMA/CA,在发送包的同时不能检测到信道上有无冲突,只能尽量避免

当节点需要第一个数据帧时,首先检测信道,在持续检测到信道空闲达一个 DIFS 之后,主机发送数据帧。接收节点正确接收到该数据帧,等待一个 SIFS 后马上发出对该数据帧的确认。若源站在规定时间内没有收到确认帧 ACK,就必须重传此帧,直到收到确认 ACK 为止,或者经过若干次重传失败后放弃发送。而如果在发送第一个数据帧时监测到信道忙,就会执行下面的随机退避算法。

在之后发送数据帧时,包括重传等情况,节点都会执行叫作随机退避(random back off)的算法。在 OFDM 物理层中,退避的时隙数在 0 到 15 的范围内选择。在持续检测到信道空闲达一个 DIFS 之后,开始对退避计时器(back off counter)倒计时,在每个时隙,如果监听到信道还是空闲的,就继续倒计时,直到计数器为 0,就开始发送数据帧。而如果在某个时隙监听到信道忙,那么就会冻结退避计时器,等待下一次检测到信道空闲 DIFS 后,再继续开始倒计时。

如果节点没有收到 ACK 确认,那么下次退避时会将退避时隙数翻倍再进行尝试,直到传输成功或者达到了最大重传次数。

节点 A 首先发送了一个数据帧,在此时间段内,节点 B 和 C 也准备要发送数据帧,但它们监测到信道忙,因此会等待信道空闲。在 A 收到 ACK 确认后,信道已经空闲。此时 B 和 C 都开始执行随机退避。因为 C 的随机退避时间比 B 短,所以 C 的计时器倒数到 0 之后率先开始传输数据帧。此时 B 的退避计时器会冻结,直到 C 收到 ACK 确认,B 的退避计时器继续倒计时,计时为 0 后,B 开始传输数据帧。(假设 DIFS 的时间包含在随机退避的时间之内)

Virtual channel sensing using CSMA/CA

802.11 定义的信道监测包括物理监听和虚拟监听两部分。物理监听就是监听信道中是否有有效的信号。而在虚拟监听中,每个节点通过跟踪网络分配向量(NAV)来记录信道的使用状态。每一帧都有一个 NAV 字段,说明后续的传输需要多长时间才能传输完成(包括后续 ACK 的时间)。收到这个帧的节点知道信道将在 NAV 指示的时间段内繁忙,不管它们是否能监测到物理信号,都不会再这段时间传输数据了。

下图中,A 想给 B 发送数据。其中,C 在 A 的 radio range,D 在 B 的 radio range。A 发送的 RTS 请求帧内含有后续传输需要的总时间,这会被 C 也捕捉到,从而在之后的时间保持“静默”;B 回传的 CTS 帧内也包含后续传输的时间,这会被 D 捕捉到。

此外,如果 A 的 ACK 计时器倒计时完成了 ACK 还没有到,那么它会认为发生冲突了,从而重新开始运行整个协议算法。

Interframe spacing in 802.11

我们上面提到的 SIFS、DIFS 都是帧间间隔(Interframe spacing)。常规数据帧之间的间隔为DIFS(DCF Inter Frame Spacing),最短的间隔是 SIFS(Short Inter Frame Spacing),ACK、RTS、CTS 的传输都会经过 SIFS。

两个 AIFS(Arbitration Inter Frame Space)间隔显示了两个不同优先级的例子。

短的 AIFS1,比 DIFS 短,但比 SIFS 长。它可以被 AP 用来将语音或其他高优先级的流量转移到发送线路的前端,先于常规流量发送。而 长的 AIFS4 则会使 AP 要发送的数据后于常规流量。

EIFS(Extended Inter Frame Spacing),仅由刚刚收到坏帧或未知帧的节点使用,以报告问题。由于接收器可能不知道正在发生什么,它应该等待一段较长时间,以避免干扰两个节点之间正在进行的对话。


MAC: Energy Consumption Consideration

MAC 层协议应确保节点以最小的能量消耗传输其信息。我们知道 WSN 中耗能的三个主要来源是感知、处理以及通信。而其中又以通信耗能最多。MAC 层设计又与通信息息相关,因此对能耗的设计考量非常重要。

在通信过程中,能源消耗的主要来源可以分类如下:

  • Idle Listening:在监测信道时,没有从信道中检索到有用的信号。当一个节点收到一个不是发给自己数据包时,它在接收这个数据包时就相当于在浪费能量。
  • Collisions
  • Protocol Overhead:为了协调无线信道中的通信,MAC 协议需要传输控制数据包。尽管这些控制数据包为 MAC 协议的稳定工作做出了贡献,但它们需要尽可能节约能耗以提高能源效率。
  • Transmit vs. Receiver Power

在传统网络中,由于节点的竞争性,每个节点的公平性是MAC层协议的一个重要方面。然而,在 WSN 中,系统对传感器提供的整体信息更感兴趣。因此,MAC 层协议应采取协作的方式,以便利用特定的应用信息来提高性能。例如,对于一些周期性流量的应用,就可以使用类似 token ring 这样的协议。

此外,由于传感器节点的高密度部署,每个节点收集的信息是高度相关的。来自空间上相隔甚远的传感器的数据比来自临近位置的传感器的高度相关的数据对 sink 更有用。在 MAC 层协议中利用传感器节点之间的关联性,可能可以进一步提高整体网络性能。


References

Wireless Sensor Networks, Ian F. Akyildiz, Mehmet Can Vuran. Chapter 5.

无线传感器网络:数据链路层,MAC相关推荐

  1. 基于CSMA/CA无线传感器网络的MAC层研究

    1.无线传感器网络简介及发展现状 无线传感器网络是嵌入式系统.无线通信技术.网络技术及微机电系统等学科互相融合.渗透而产生的新技术,广泛使用在军事国防领域.环境监测.交通管理.医疗健康.工商服务.反恐 ...

  2. 无线传感器网络的MAC协议

    LAN的数据链路层 按功能划分为LLC和MAC 分解目的:分离与硬件相关/无关的部分,降低复杂度 LLC:与介质.拓扑无关 MAC:与介质.拓扑相关 数据链路层--MAC子层 负责对物理媒体的使用进行 ...

  3. 无线传感器网络知识点总结

    第一章:无线传感器网络概述 1.什么是无线传感器网络?与无线局域网的区别?例举三个无线传感器网络的例子? 无线传感器网络:是一种由传感器结点构成的网络,能够实时监测,感知和采集结点部署区的环境或观察者 ...

  4. 无线传感器网络期末考试范围

    无线传感器网络考试范围 填空题 1.传感器节点由传感器模块.处理器模块.无线通信模块和能量供应模块四部分组成. 2.在ASCENT算法中,节点可以处于四种状态:休眠状态,侦听状态,测试状态,活动状态. ...

  5. 基于异步竞争的无线传感器网络MAC层协议介绍(X-MAC ContikiMAC)

    基于异步竞争的无线传感器网络MAC层协议介绍(X-MAC ContikiMAC) 无线传感器网络(wireless sensor networks, WSN)节点由电池供电,其能力非常有限,同时由于工 ...

  6. 无线传感器网络 | 期末复习知识点1

    为什么80%的码农都做不了架构师?>>>    一.基础知识 1.WSN传输介质有哪些,每种介质特性(传播速度.距离.能耗等) 2.传感器灵敏度.方向性等特征,信号频率与响应度关系. ...

  7. 无线传感器网络数据融合技术

    http://www.dzsc.com/data/html/2008-11-28/73975.html 由于大多数无线传感器网络应用都是由大量传感器节点构成的,共同完成信息收集.目标监视和感知环境的任 ...

  8. 无线传感器网络期末复习知识点总结资料

    文章目录 一.无线传感器网络概述? 1.什么是传感器网络 2.WSN特点 3.传感器的节点结构 4.无线传感器网络架构 5.无线传感器网络面临的挑战 二.物理层设计 1.工作状态 2.传输介质 3.编 ...

  9. 物联网与无线传感器网络期末考试复习资料(教材--刘伟荣,何云--电子工业出版社)

    无线传感器网络概述 无线传感器网络介绍 1.无线传感器网络是一种特殊的无线通信网络,它是由多个传感器节点通过无线自组织的方式构成的,应用在人么力所不能及的领域,如战场.环境等地方. 2.WSN和Ad ...

  10. 无线传感器网络复习习题集

    无线传感器网络复习习题集 1.ZigBee无线可使用的频段有(3)个 我国使用的Zigbee协议的无线频段是(2.4G)Hz ZigBee协议是基于IEEE (802.15.4)标准 ZigBee在2 ...

最新文章

  1. 增加CentOS File Descriptors
  2. 户外生活--西湖林至千军台
  3. ubuntu android设备 no permissions
  4. redis cli 删除key 模糊_不同操作系统下,Redis的使用命令
  5. Java 9 中的 GC 调优基础
  6. inside uboot (五) DRAM的构成
  7. PHP header发送各种类型文件下载
  8. Comparable接口
  9. 【从线性回归到BP神经网络】第三部分:Logistic回归
  10. linux查看服务进程发包,11月18日linux服务器后,服务器向外发包,CPU达99%以上
  11. 使用小龙Dev-C++作为Windows下的FORTRAN集成开发环境
  12. 施迈赛151192476 ZQ 700-11拉线开关
  13. 定期年化40%,我把5000多个FIL全部存入了DMEX平台
  14. 杭电计算机专业期末考试助攻,杭电嘻哈:舶来文化亦可玩出小清新
  15. python3 姓名随机生成脚本--random.randrange()用法
  16. 白杨SEO:小红书关键词搜索量怎么查?小红书关键词搜索长尾下拉词如何深处挖掘?
  17. 利用telnet SMTP给QQ邮箱发邮件
  18. php gps定位范围算法,基本的GPS卫星定位算法
  19. 软考信息安全工程师学习笔记六(未完待续)
  20. 学习使用HTML+CSS完成一个私人网页

热门文章

  1. 联合双边滤波-Joint Bilateral Filter
  2. ListControl 拉伸_《自然·材料》:本征可拉伸电致发光弹性体,无线供电点亮软体机器人...
  3. 【vps】如何在vps上安装mirai机器人?
  4. 有关个人账号,公司账号,企业账号的申请
  5. html 下拉列表 select
  6. CPU和GPU计算的优缺点分析
  7. 15. PARTITIONS
  8. (连载)边喝咖啡边学Unity——第二章 预备知识体系
  9. RPKM, FPKM, TPM ????
  10. 100道Python面试题总结