1.概述

802.1X起源于无线网络标准802.11协议,802.11协议是标准的无线局域网协议,802.1X协议设计的最初的目的是为了解决无线局域网用户的接入认证问题,但由于其原理对于所有符合IEEE802标准的局域网具有普适性,因此在有线局域网中也得到了广泛的应用。

802.1X,全称为Port-BasedNetworks AccessControl,即基于端口的网络访问控制。“基于端口的网络接入控制”是指在局域网接入设备的端口这一级对所接入的用户设备进行认证和控制(这里的端口可以是一个实实在在的物理端口,也可以是一个类似VLAN的逻辑端口,而对于无线局域网来说一个“端口”就是一条信道)。连接在端口上的用户设备如果能通过认证,就可以访问局域网中的资源;如果不能通过认证,则无法访问局域网中的资源。

2.体系结构

IEEE802.1X协议采用典型的客户端/服务器体系结构,包括三个主要的部分:客户端(SupplicantSystem)、认证系统(AuthenticatorSystem)以及认证服务器(AuthenticationServer System)。图1描述了三者之间的关系以及互相之间的通信。

1.802.1X协议的体系结构

客户端:是需要接入LAN/WLAN,享受switch提供服务的终端设备(比如PC、网络打印机),该终端设备通常需要安装一个客户端软件,用户通过启动这个客户端软件发起802.1X认证,同时客户端必须支持EAPOL协议。

认证系统:通常为支持802.1X协议的网络设备,它为客户端提供接入局域网的端口。认证系统在客户端和认证服务器之间充当代理角色,它跟客户端之间通过EAPOL协议进行通信,跟认证服务器之间通过EAPOver Radius报文或者标准的Radius报文进行通信。

认证服务器:通常为Radius服务器,用于实现对用户进行认证、授权和计费。认证服务器通过检验客户端发送来的身份标识,来判断该用户是否有权使用认证系统所提供的网络服务。当用户通过认证后,认证服务器会把用户的相关信息传递给认证系统,由认证系统构建动态的访问控制列表,用户的后续流量就将接受上述参数的监管。

以上三个部分,除客户端系统外,认证系统和认证服务器之间既可以分布在两个不同的物理实体上,也可以是集中在一个物理实体上,后者指的是由认证系统独立完成用户的认证授权,即本地认证。

3.涉及协议

3.1EAPOL协议

EAPOL(EAPoverLANs)是802.1X协议定义的一种报文封装格式,主要用于在客户端和设备端之间传送EAP协议报文,以允许EAP协议报文在LAN上传送。EAPOL数据包的格式如图2所示:

3.EAPOL的帧结构

PAEEthernet Type2字节,该值表示以太网协议类型,802.1X为其分配的协议类型为0x888E。

ProtocolVersion1字节,表示EAPOL帧的发送方所使用的协议版本号,表1为目前存在的版本号

版本号

含义

0x01

支持IEEEStd 802.1X-2001

0x02

支持IEEEStd 802.1X-2004

0x03

支持IEEEStd 802.1X-2010

1. EAPOL帧使用的版本号

PacketType1字节,表示EAPOL数据帧类型,目前支持的数据类型见表2

类型

说明

EAP-Packet(值为0x00):认证信息帧

表示该EAPOL帧承载了一个EAP数据包

EAPOL-Start(值为0x01):认证发起帧

这两种类型的帧仅在客户端和设备端之间存在

EAPOL-Logoff(值为0x02):退出请求帧

EAPOL-Key(值为0x03):密钥信息帧

支持对EAP报文的加密(无线接入专用)

EAPOL-Encapsulated-ASF-Alert(值为0x04)

用于支持ASF(AlertingStandards Forum)的Alerting消息

2.EAPOL帧类型

PacketBody Length2字节,表示数据域的长度,也就是PacketBody字段的长度,单位为字节。当EAPOL数据帧的类型为EAPOL-Start或EAPOL-Logoff时,该字段值为0,表示后面没有PacketBody字段。

PacketBody表示数据内容,该部分内容由PacketType决定,长度有PacketBody Length决定。

3.2EAP协议

802.1X协议采用EAP(ExtensibleAuthenticationProtocol,可扩展认证协议)来实现客户端、认证系统和认证服务器之间认证信息的交互。通过支持EAP协议,可以使用认证服务器来实现各种认证机制,认证系统仅仅需要传送认证信息,并根据认证返回的结果控制受控端口的状态。EAP数据包的格式如图4所示:

4.EAP的帧结构

Code1字节,该值表示EAP帧类型,共有4种:Request、Response、Success、Failure。

Identifier1字节,该值用于匹配Request消息和Response消息。

Length2字节,该值表示EAP帧的总长度,包含Code、Identifier、Length和Data域,单位为字节。

DataEAP包的内容,由Code类型决定:

Success和Failure类型的包没有Data域,相应的Length域的值为4;

Request和Response类型数据包的Data域的格式如图5所示

5.RequestResponse类型数据包的Data域的格式

Type字段目前支持的类型见表3,前3种表示特殊含义,其余的值表示EAP支持的认证方式

Type

含义

1

Identity(用户名信息)

2

Notification(警告信息)

3

Nak(客户端对Request中的认证方式不支持时回复用)

4

MD5-Challenge

5

OneTime Password (OTP)

6

GenericToken Card (GTC)

13

EAP-TLS

17

EAP-LEAP

18

EAP-SIM

21

EAP-TTLS

23

EAP-AKA

25

EAP-PEAP

26

EAP-MSCHAPV2

33

EAP-TLV

38

EAP-TNC

43

EAP-FAST

46

EAP-PAX

47

EAP-PSK

48

EAP-SAKE

49

EAP-IKEV2

50

EAP-AKA-PRIME

51

EAP-GPSK

254

ExpandedTypes

255

Experimentaluse

3.EAP数据包中Type字段含义

Typedata的内容由Type决定。

与其说EAP是一个认证协议不如说EAP是一个认证框架,因为EAP本身不是认证协议,它自己不支持认证功能,它是为了承载多种认证协议而生的,EAP为扩展和协商认证协议提供了一个标准,让客户端和RADIUS服务器之间直接协商认证数据,将NAS(网络介入系统)网络设备从中解脱出来。

3.3RADIUS协议

RADIUS(RemoteAuthentication Dial In UserService用户远程拨入认证服务)是一种AAA的应用协议,意思就是同时兼顾验证(authentication)、授权(authorization)及计费(accounting)三种服务的一种网络传输协议。RADIUS数据包的格式如图6所示:

6.RADIUS的帧结构

Code1字节,指示RADIUS包的类型,支持的类型见表4

Code

报文类型

报文说明

1

Access-Request

方向Client->Server,Client将用户信息传输到Server以判断是否接入该用户。该报文中必须包含User-Name属性,可选包含NAS-IP-Address、User-Password、NAS-Port等属性。

2

Access-Accept

方向Server->Client,如果Access-Request报文中所有Attribute值都是可以接受(即认证通过),则传输该类型报文。

3

Access-Reject

方向Server->Client,如果Access-Request报文中存在任何Attribute值无法被接受(即认证失败),则传输该类型报文。

4

Accounting-Request

方向Client->Server,Client将用户信息传输到Server,请求Server开始计费,由该报文中的Acct-Status-Type属性区分计费开始请求和计费结束请求。该报文包含属性和Access-Request报文大致相同。

5

Accounting-Response

方向Server->Client,Server通知Client侧已经收到Accounting-Request报文并且已经正确记录计费信息。该报文包含端口上输入/输出字节数、输入/输出包数、会话时长等信息。

11

Access-Challenge

方向Server->Client,Server收到Client上报上来的用户信息后,如果通过,就发送访问质询给Client,让用户提供更多的附加信息以完成认证。

4.RADIUS数据包中Code字段含义

Identifier1字节,取值范围为0~255,用于匹配请求包和响应包。

Length2字节,表示整个报文的有效长度。长度域范围之外的字节被认为是附加的,并在接受的时候超长部分将被忽略。如果包长比长度域给出的短,也必须丢弃,最小长度为20,最大长度为4096。

Authenticator:16字节认证字域,在不同报文中用法不一样。

a).在Access-Request包中的认证字称为请求认证字,是16字节随机数,认证字的值要不能被预测,并且在一个共享密钥的生命期内唯一。

b).在Access-Accept、Access-Reject和Access-Challenge包中的认证字称为访问回应认证字,访问回应认证字的值定义为MD5(Code+ID+Length+请求认证字+Attributes+Secret)

Attributes:属性域,用来在请求和响应报文中携带详细的认证、授权、信息和配置细节,来实现认证、授权、计费等功能,一条RADIUS报文中可以携带多条属性域。每条属性域采用(Type、length、Value)三元组的形式提供。属性域的格式见图7

7.Attributes格式

Type属性号,用来标识本条属性的类型,取值范围1~255,其中26号属性表示厂商私有属性。标准的属性号定义见表5

属性号

属性名

属性号

属性名

1

User-Name

30

Called-Station-ID

2

User-Password

31

Calling-Station-ID

3

CHAP-Password

32

NAS-Identifier

4

NAS-IP-Address

40

Acct-Status-Type

5

NAS-Port

41

Acct-Delay-Time

6

Service-Type

43

Acct-Output-Octets

7

Framed-Protocol

44

Acct-Session-ID

8

Framed-IP-Address

45

Acct-Authentic

9

Framed-IP-Netmask

46

Acct-Session-Time

10

Framed-Routing

48

Acct-Output-Packets

11

Filter-ID

49

Acct-Terminate-Cause

12

Framed-MTU

53

Acct-Output-Gigaword

13

Framed-Compression

55

Event-Timestamp

14

login-IP-Host

60

CHAP-Challenge

15

login-Service

61

NAS-Port-Type

16

login-TCP-Port

64

Tunnel-Type

18

Reply_Message

65

Tunnel-Medium-Type

19

Callback-Number

79

EAP-Message

20

Callback-ID

80

Message-Authenticator

24

State

81

Tunnel-Private-Group-ID

25

Class

87

NAS-Port-ID

26

Vendor-Specific

95

NAS-IPV6-Address

27

Session-Timeout

96

Framed-Interface-ID

28

Idle-Timeout

97

Framed-IPV6-Prefix

29

Termination-Action

5.Attributes中的Type字段含义

Length表示整条属性域的长度,最小值为3

Value记录了这条属性的具体特性,有6中属性值:整数(INT);枚举(ENUM);IP地址(IPADDR);文本(STRING);日期(DATE);二进制字符串(BINARY)。

表5中,属性号79和80是RADIUS为支持EAP认证增加的两个属性:

a). EAP-Message

这个属性用来封装EAP数据包,属性号为79,如果EAP数据包长度大于253字节,可以对其进行分片,依次封装在多个EAP-Message属性中。

b).Message-Authenticator

属性号为80,主要用于在EAP认证过程中验证携带了EAP-Message属性的Radius报文的完整性,避免接入请求包被窜改。在含有EAP-Message属性的数据包中,必须同时也包含

Message-Authenticator,否则该数据包会被认为无效而被丢弃。此外,若接收端对接收到的Radius报文计算出的完整性校验值与报文中携带的Message-Authenticator属性的Value值不一致,该数据包也会被认为无效而丢弃。

4.认证的基本过程

802.1X系统支持EAP中继方式和EAP终结方式与远端RADIUS服务器交互完成认证。以下关于两种认证方式的过程描述,都以客户端主动发起认证为例。

4.1EAP中继方式

这种方式是IEEE802.1X标准规定的,将EAP(可扩展认证协议)承载在其它高层协议中,如EAPover

RADIUS,以便扩展认证协议报文穿越复杂的网络到达认证服务器。一般来说,EAP中继方式需要RADIUS服务器支持EAP属性:EAP-Message和Message-Authenticator,分别用来封装EAP报文及对携带EAP-Message的RADIUS报文进行保护。下面以EAP-MD5方式为例介绍基本认证流程,如图8所示

8.IEEE 802.1X认证系统的EAP中继方式交互流程

a).当用户有网络连接需求时打开802.1X客户端程序,输入已经申请、登记过的用户名和密码,发起连接请求(EAPOL-Start报文)。此时,客户端程序将发出请求认证的报文给NAS,开始启动一次认证过程。

b).认证系统收到开始认证的请求后,将发出一个请求帧(EAP-Request/Identity报文)要求用户的客户端程序发送输入的用户名。

c).客户端程序响应认证系统发出的请求,将用户名信息通过应答帧(EAP-Response/Identity报文)发送给认证系统。

d).认证系统则将客户端送上来的数据帧经过封包处理后(RADIUSAccess-Request报文)转发给认证服务器进行处理。

e).认证服务器收到认证系统转发上来的用户名信息后,将该信息与数据库中的用户名表相比对,找到该用户名对应的密码信息,用随机生成的一个加密字对它进行加密处理,同时也将此加密字通过RADIUSAccess-Challenge报文传送给认证系统,再由认证系统解封包处理后(EAP-Request/MD5Challenge报文)传给客户端程序。

f).客户端程序收到由认证系统传来的加密字后,用该加密字对口令部分进行加密处理,生成

EAP-Response/MD5Challenge报文,并通过认证系统封装为RADIUSAccess-Request报文传给认证服务器。

g).认证服务器将收到的已加密的密码信息(RADIUSAccess-Request报文)和本地经过加密运算后的密码信息进行对比,如果相同,则认为该用户为合法用户,反馈认证通过的消息(RADIUSAccess-Accept报文和EAP-Success报文),并向认证系统发出打开端口的指令,允许用户的业务流通过端口访问网络。否则,反馈认证失败的消息(EAP-Failure报文),并保持认证系统端口的关闭状态,只允许认证信息数据通过而不允许业务数据通过。

h).客户端也可以发送EAPOL-Logoff报文给认证系统,主动要求下线。设备端把端口状态从授权状态改变成未授权状态,并向客户端发送EAP-Failure报文。

4.2EAP终结方式

EAP终结方式将EAP报文在认证系统上终结,并转换成标准的Radius协议完成认证、授权和计费。设备端与Radius服务器之间可以采用PAP(PasswordAuthentication Protocol,密码验证协议)或者CHAP(ChallengeHandshake AuthenticationProtocol,质询握手验证协议)认证方法。以下以CHAP认证方式为例介绍认证流程,如图9所示

9.IEEE 802.1X认证系统的EAP终结方式交互流程

ac).认证过程的前3步与EAP中继方式完全相同。

d).认证系统收到客户端送上来的数据帧(EAP-Response/Identity报文)后,没有上传至认证服务器,而是本地随机生成一个加密字,并将将此加密字的通过数据帧(EAP-Request/MD5Challenge报文)交给客户端程序。

e).客户端程序收到加密字(EAP-Request/MD5Challenge报文)后,用该加密字对口令部分进行加密处理,生成EAP-Response/MD5Challenge报文发送给认证系统。

f).认证系统收到加密密码(EAP-Response/MD5Challenge)后,用CHAP协议对用户名、加密口令、加密字等认证信息重新封装成标准的Radius报文(RADIUSAccess-Requeset报文),送给认证服务器进行处理。

g).认证服务器收到的认证信息(RADIUSAccess-Requeset报文)后,根据收到的用户名信息在数据库中查找对应的密码信息,用收到的加密字对密码信息进行加密处理得到自己的加密密码。然后和收到的加密密码信息进行对比,如果相同,则认为该用户为合法用户,反馈认证通过的消息(RADIUSAccess-Accept报文)给认证系统。

h).认证系统向客户端程序反馈认证通过消息(EAP-Success报文),将端口状态改为授权状态,允许用户通过该端口访问网络。

i).客户端也可以发送EAPOL-Logoff报文给认证系统,主动要求下线。设备端把端口状态从授权状态改变成未授权状态,并向客户端发送EAP-Failure报文。

4.3两种方式的对比

EAP中继方式与EAP终结方式的认证流程十分类似,不同之处主要在于加密字的生成处理及传递方式。在EAP中继方式中,用来对用户口令信息进行加密处理的随机加密字由认证服务器生成,认证系统只是负责将EAP报文透传认证服务器,整个认证处理都由认证服务器来完成。而在EAP终结方式中,用来对用户密码信息进行加密处理的随机加密字由认证系统生成,认证系统会把用户名、随机加密字和客户端加密后的密码信息一起送给认证服务器,进行相关的认证处理。

从上面可以看出,由于认证流程中对于加密字的生成处理及传递方式不同,因此EAP中继与EAP终结两种认证方式其优缺点也很明显:

EAP中继方式优点是认证系统处理更简单,EAP上面承载的认证协议对认证系统是透明的,NAS设备不需要了解,也不需要支持,它只需要支持EAP即可,所以可以支持更多的认证方式,缺点则是认证服务器必须支持EAP;而EAP终结方式的优点是认证服务器无需升级,现有的Radius服务器可以继续使用,缺点是NAS设备处理更复杂。

5.具体实现原理

图10就是采用分层的方法为802.1X的实现划分出来的总框架图,交换机作为认证者角色,要实现的就是右边半张,很明显它被划分为上下两层:HigherLayer和LowerLayer。

LowerLayer层就是图中的802.1X模块,我们更习惯称为EAPOL层;相对应的,HigherLayer层我们通常也统称为EAP层。这样,实现802.1X认证者,实际上就变成了实现EAP层和EAPOL层,以及两者的交互。




10.基于EAPOL层和EAP层的802.1X实现框架

802.1X认证EAPOL层的实现被定义在IEEE802.1X文档里(该标准到目前一共经历了3版,IEEE802.1X-2001、IEEE802.1X-2004、IEEE802.1X-2010,这里准备基于2004版本进行开发),而EAP层的实现被定义在RFC4137里(StateMachines for EAP Peer and Authenticator)。

IEEE802.1X-2004标准为EAPOL层总共定义了10个状态机,见表6

是否需要支持(Y–需要;N–不需要;O-可选)

状态机名

认证者

请求者

PortTimers

Y

Y

AuthenticatorPAE

Y

N

TheAuthenticator Key Transmit

O

N

TheSupplicant Key Transmit

N

O

ReauthenticationTimer

Y

N

BackendAuthentication

Y

N

ControlledDirections

Y

N

SupplicantPAE

N

Y

SupplicantBackend

N

Y

TheKey Receive

O

O

6.EAPOL层状态机汇总

对于交换机来说,就是认证者角色,上表中标记了“O”的状态机一般不用于LAN环境下也不用考虑,所以作为认证者,实际需要实现的状态机一共5个。

5.1Port Timers state machinePort定时器状态机,以下都简称PTSM

11. Authenticator Port Timers state machine

PTSM功能比较简单,就是每秒钟触发一次以从ONE_SECOND状态进入TICK状态。TICK状态的EA中,它将递减定时器变量的值,这些变量都是被其他状态机初始化和使用的。这些定时器变量的定义见表7

定时器变量名

含义

aWhile

和BEAUTH SM直接相关,用于计时EAPOL层传递eap-resp报文给EAP层,然后等待EAP层回复的时间,超时值为serverTimeout

quietWhile

和AUTHPAE SM直接相关,在quietWhile时间里,认证者不接受任何来自请求者的认证消息,超时值为reAuthPeriod

reAuthWhen

和RTSM直接相关,定义了认证者发起重认证的间隔,超时值为reAuthPeriod

7.Authenticator PT SM定时器变量

5.2Authenticator PAE state machine(认证者PAE状态机,以下都简称AUTHPAE SM

图 12.Authenticator PAE state machine

AUTHPAESM是802.1X在EAPOL层最核心的状态机之一,它主要负责处理接收到的EAPOL报文,这其实也表示它的工作是面向请求者的;同时它又负责执行认证的结果,归根到底也就是对PORT的管理。AUTHPAE SM整个运转过程基本如下:

a).首先受控端口被触发802.1X认证进入INITIALIZE,这里的主要EA是:portMode设置为Auto

b).从INITIALIZE无条件进入DISCONNECTED状态,这里的主要EA是:

authPortStatus设置为Unauthorized;

reAuthCount清0;

清除eapolLogoff标志

c).从DISCONNECTED会继续无条件进入RESTART状态,这里的主要EA是:

eapRestart设置为TRUE,用于通知EAP层状态机进入INITIALIZE

d).AUTH PAESM会一直处于RESTART状态,直到EAP层清除了eapRestart标志,这时候就会进入CONNECTING状态,主要的EA是:

清除reAuthenticate标志;

累加reAuthCount计数器

e).AUTH PAESM会一直处于CONNECTING状态,直到EAP层设置了eapReq标志,意味着需要发送一个eapol-request-identifier,这时候就会进入AUTHENTICATING状态,主要的EA是:

authStart设置为TRUE,用于通知BEAUTH SM

f).

802.1x认证详细剖析相关推荐

  1. Win10 无线网络802.1X认证 PEAP问题

    无线网络802.1X认证故障 问题现象: 当升级Windows10 后,无法连接到的 WPA-2 企业网络(尤其是校园网),即使用证书进行服务器端或相互身份的验证 (EAP-TLS,PEAP TTLS ...

  2. 无线802.1x认证服务器,TP-Link无线路由器+Radius认证服务器实现无线终端802.1X认证...

    本文档详细介绍了如何在windows 2008上安装CA.NPS并配置NPS为radius服务器,实现无线客户端基于802.1X认证的步骤,其中还介绍了家用无线路由器Radius相关一些配置方法. 实 ...

  3. 无线AP配服务器,胖AP结合远程radius服务器做802.1X认证的典型配置

    (1)胖AP配置 #和三层交换机互联地址 interface Vlan-interface1 ip address 192.168.0.50 255.255.255.0 #缺省路由,下一跳指向三层交换 ...

  4. 无线路由器上安装OpenWRT,在需要标准802.1x认证的网络中无线上网

    学校一直用H3C客户端上网,因此无法直接使用无线路由器.后来去一些论坛时常看见DD-WRT和OpenWrt这两个词,也初步了解到wpa_supplicant.njit-client.mentohust ...

  5. android 802.1x认证,清华大学无线校园网802.1x认证登录.PDF

    清华大学无线校园网802.1x认证登录.PDF 清华大学无线校园网802.1x 认证登录 客户端配置说明 信息化技术中心 2018 年9 月 目录 一.注册802.1x 密码3 二.配置用户端设备4 ...

  6. 802.1x认证EAP包结构

    当用户需要访问外部网络时打开802.1X客户端程序,输入已经申请.登记过的用户名和密码,发起连接请求.此时,客户端程序将向设备端发出认证请求报文(EAPoL-Start),开始启动一次认证过程. 设备 ...

  7. Windows Server 2008 R2Cisco2960 配置Radius服务 实现802.1x认证 实战

    实战配置Windows Server 2008 R2 Radius服务 与Cisco 2960 实现 802.1x认证 实验拓扑 1.Radius服务器 安装 dc  域名 wjl.com ,和ca  ...

  8. server2012 AD域 radius 802.1x认证

    server2012 AD域 radius 802.1x认证 原创泠泠七弦2020-11-25 17:40:06 保姆级教程:WINserver2012 AD域 radius 802.1x认证. 觉得 ...

  9. android 802.1x 认证,802.1X认证基础

    802.1X认证基础 802.1X认证简介 定义 802.1X协议是一种基于端口的网络接入控制协议(Port based networkaccess control protocol)."基 ...

最新文章

  1. 【搜索专题】BFS中的多源BFS-双端队列BFS
  2. python3.7 6如何安装-redhat7.6 安装Python 3
  3. FireWork 制作android 应用程序 icon
  4. 吴恩达机器学习(第二章)——单变量线性回归
  5. SAP 采购订单税金抓取方法
  6. 【opencv系列07】OpenCV4.X图像基本操作
  7. 包头轻工计算机工程学院,包头轻工职业技术学院高职招生
  8. 计算机网络基础昆明理工大学,昆明理工大学 计算机网络基础 实验四
  9. Android 弹出 Toast 时取消上一个 Toast(完美方案)增加同步
  10. kotlin学习笔记——单元测试
  11. Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
  12. xcode5 ios7 64位 iphone5s引用第三方库报错的解决办法
  13. vscode运行vue时,显示loader. js SyntaxError: Unexpected identifier
  14. 《GO并发编程实战》—— 临时对象池
  15. mvc 执行action 获取html,Mvc--Html.ActionLink()用法
  16. 抢占自动驾驶「制高点」,传统Tier1巨头「砸钱入场」
  17. html 打开 app,h5页面打开app
  18. 00007__js自执行函数(function(){})()前加个分号是什么意思
  19. STM32——软件SPI控制AD7705
  20. C随机数生成通用公式

热门文章

  1. Python爬虫入门教程【3】:美空网数据爬取
  2. 如何安装使用“聚宽” --- JQData
  3. JavaScript 中的 hoisting 到底是甚麼 ?
  4. 关于IDataParameter[]接口与Parameter[]
  5. JAVA计算真太阳时和地方时间
  6. 什么是锚(anchor)
  7. 为什么要抛弃Pact?如何快速实现契约测试(CDC)
  8. 使用Python读取csv文件并进行分类存储
  9. js数据类型-2-从零开始的js
  10. Java API——容器(二)Queue