传统电话是电磁波的通信,当电话技术发展到IP技术事件,SIP协议已经成为了电话通信标准协议,不仅可以通电话、还可以收发信息、视频、开会、放PPT。事实上,今天的通信业已全面采用SIP协议作为通信标准,无论是固定电话、还是移动电话,其后台都是以SIP协议完成通话、交换的。 很多软件也采用SIP协议进行通信,如:Windows Messenger。

分析一下打电话的过程

两个电话之间的一次通话称为一个会话(Session),

首先,通话双方必须有一个电话号码, 通话步骤如下:

1, 电话A拨打电话B的号码, 邀请B通话 (Invite)

2, 电话B振铃(Ring), 同时电话A可以听到电话B在振铃

3, 电话B提机表示确认应答, 双方通话开始

4, 双方通话

5, 通话过程中,如有任何一方挂电话,则通话结束。

上述会话过程 图示如下:

SIP协议

SIP协议,英文为 Session Initiation Protocol, 中文翻译为会话发起协议。顾名思义,就是在网络上发起会话。

协议(Protocol)是计算机与计算机之间的语言。SPI协议的目的就是在IP网络中实现电话功能。在IP网络中,通话两端不是电话机,而是运行在计算机上的软件电话(软电话)。

同传统电话,用SIP协议打一个电话,过程是一样的。两个软电话之间,也有电话号码,也需传递信号。

这时的电话号码是SPI账号,这时的信号不是一个电磁波信号,而是一个IP数据包(称为SIP消息)

1. SIP帐号

首先,通话双方都要有一个SIP帐号(也称为URI, 是网络上的电话号码),

不同于全数字的传统电话号码, SIP帐号采用 URI 表示方法, 例如:

sip:peter@company.com:5060

其中:

(1)  sip: 表示采用sip协议(2) peter是用户名, 也称为帐号.  用字母和数字均可。(3) company.com 是帐号所属的服务器域名( 也可以用IP地址,例如: sip:peter@192.168.1.100)(4) 最后的5060是端口号。 SIP协议默认端口为5060,  默认采用UDP传输:5060的意思是,客户端在名为 company.com的服务器的5060端口号上等待对方连接如果端口号是 5060,也可以省略不写。则,上述SIP帐号写为:   sip: peter@company.com除了sip:这几个字母, SIP帐号就像一个邮件帐号没错,SIP协议设计者的意图就是让SIP帐号与邮件帐号一致,方便与邮箱服务整合。对用户来说方便,你要打电话给我,我的电话号就是邮箱号。

2. SIP 消息

一个通话过程,两端要传递多种信号。在SIP协议中,这些信号是一种约定格式的IP数据包,称为SIP消息。

消息类型

(1)SIP消息有好几种,让我们看一个通话过程理解一下。下图是一个典型的SPI协议发起会话、结束会话的典型过程。


1, 软电话A 向 B 发送一个 SIP消息 INVITE, 邀请B通话

2, 软电话B振铃,向A 回复一个SIP消息 RING, 通知 A 正在振铃中,请A等待

3, 软电话B提机,向A发一个SIP消息 OK, 通知 A 可以通话了

4, 软电话A 向 B 回复一个回应消息 ACK,正式启动通话

5,接下来,双方通话

6,软电话B挂机,向 A 发一个SIP消息 BYE, 通知 A 通话结束

7, 软电话A 向 B 回复一个消息 OK, 通话结束

可以看到,这个过程与人打电话的过程是一模一样的。只不过是采用IP数据包(SIP消息)的形式传递信号而已。

通话过程中有多种SIP消息,每一种消息都是一个IP数据包。

这就是SIP协议,它约定了会话的发起过程 、结束过程。

(2)下面是一些问题:

  1. 为什么SIP消息中没有传送语音数据的消息
  • SIP协议规定了会话的发起过程,但没有规定会话的内容和格式。会话内容可以是文本、语音、视频等。因此,SIP协议要结合其他协议,如:用SDP协议描述要传递的内容格式,用RTP,RTSP流媒体协议传输媒体,才能完成整个通信过程。 SIP协议这样做为了简化协议,留下扩展的灵活性。
  • 对于语音, 处理过程大体是这样:首先把语音录下来成为一组数据,把语音数据进行编码,再发送到对方。对方再解码。
  1. SIP消息数据包会不会被偷听?
  • 答:如同 HTTP协议可以叠加SSL保障传输安全。 SIP协议可以叠加TSL安全传输协议。
  1. 上面过程为什么只是点对点的(P2P)
  • SIP协议规定的是点对点协议(P2P)。 通话过程可以不需要服务器参与
  • 实际运用中,大多数情况都有一个代理服务器(Proxy),每个软电话与服务器进行SIP通信即可。
  • 这个服务器就是电话交换机,所有的消息和话音都可以由这个服务器进行转发。

深入理解解SIP消息的内容和数据格式

SIP协议是由国际互联网协会(IETF)制定的,这个协会也制订了HTTP协议。所以,这两个协议有很多地方是相似的。

与HTTP协议相同,SIP协议也采用Client/Server模式,Client发请求,Server响应,请求和响应消息均采用纯文本方式。

INVITE 是主叫做为Client, 被叫做为Server, 发起的一个请求 (类似HTTP请求,例如POST)

报文结构

请求消息分成几个部分,一是起始行(start line), 二是消息头部(message head),内含一个或多个头字段(head field), 三是一个空行(empty line),表示头部的结束。四是一个消息体(message body).

格式如下:

start-line
message-header
CRLF
[ message-body ]

首行(start-line)

分请求行和状态行。

  • 请求行: 由请求类型、请求目的地址和协议版本号构成。请求类型有:INVITE,ACK,OPTIONS,BYE,CANCEL和REGISTER。
  • 状态行: 是被叫方向主叫方返回的状态信息,如1xx,2xx,3xx,4xx,5xx,6xx。

请求类型:

  • INVITE:用于发起呼叫请求。INVITE消息包括消息头和数据区两部分。INVITE 消息头包含主、被呼叫的地址,呼叫主题和呼叫优先级等信息。数据区则是关于会话媒体的信息,可由会话描述协议SDP 来实现。
  • BYE:当一个用户决定中止会话时,可以使用BYE 来结束会话。
  • OPTIONS:用于询问被叫端的能力信息,但OPTIONS 本身并不能发起呼叫。
  • ACK: 对已收到的消息进行确认应答。
  • REGISTER:用于用户向SIP服务器传送位置信息或地址信息。
  • CANCEL:取消当前的请求,但它并不能中止已经建立的连接。

状态类型:

  • 1xx:临时消息:表示表示请求消息已经收到,后面将继续处理该请求。
  • 2xx:成功消息:表示请求已经被成功的理解、接受或执行。
  • 3xx:重定向消息:表示为了完成请求还需采取更进一步的动作。
  • 4xx:客户机错误:表示该请求含有语法错误或在这个服务器上不能被满足。
  • 5xx:服务器错误:表示该服务器不能处理一个明显有效的请求。
  • 6xx:全局性故障:表示该请求在任何服务器上都不能被实现。

消息头

常见消息头:

  • TO: 格式:TO: 显示名<接收者URI>;tag=n,显示名和tag可选。接收者URI是SIP网络种唯一标识接收终端的标识符。例:TO: Name<SIP:caller@WORK.COM>;TAG=11111TO: sip:caller@work.com
  • FROM: 给出标识会话发起者的URI。比如:FROM: sip:caller@work.com;tag=hyh8,tag是必需的。
  • CALL-ID: 用于全局唯一标识正在建立的会话的标识符。 随机数加UAC标识信息。
  • CSeq: 用于标识同一会话中不同事务的序号,通常由一个用作序号的整型数和消息类型组成。整个会话操作过程由不同的事务组成,每一事务所涉及的消息的CSeq序号必须相同。
  • Via: 为响应消息提供传输路径,当请求消息经过每一跳节点时,每一跳节点都把自身的IP地址信息放入顶层Via中。响应消息则沿着请求消息记录下的传输路径反向传输,首先移走指明自身IP地址信息的顶层消息头

消息体

SIP协议一个最主要的作用就是协商媒体信息。媒体信息通过message-body携带,基于SDP会话描述协议。

对于PSTN语音编码格式,主要有G711A、G711U、G729等。

SIP协商中主叫方会带上自己支持的所有音频编码列表到被叫方,被叫方一般在回铃时从主叫支持的类型中选出一种或多种自己支持的编码,返回主叫后,双人按顺序选出第一个支持的编码。

实例

1. INVITE 消息

下面是一个完整的INVITE消息的数据内容

INVITE sip:some@192.168.31.131:50027 SIP/2.0
Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX
Max-Forwards: 70
To: <sip:some@192.168.31.131:50027>
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 1 INVITE
Content-Length: 215
Content-Type: application/sdp
Contact: <sip:null@192.168.31.131:51971;transport=UDP>v=0
o=user1 685988692 621323255 IN IP4 192.168.31.131
s=-
c=IN IP4 192.168.31.131
t=0 0
m=audio 49432 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv

(1)起始行(start-line):

INVITE sip:some@192.168.31.131:50027 SIP/2.0

请求消息的起始行包括三个参数,格式: Request start-line = Method URI SIP_VERSION

  • Method是请求方法,本例是INVITE, SIP协议规定的Method有六种: INVITE, ACK, CANCEL用于创建对话,BYE用于结束对话, REGISTER用于登记,OPTIONS用于查询服务器能力
  • URI表示所请求的用户或服务器, 也支持 “tel” URI, 本例是sip:some@192.168.31.131:50027,
  • SIP_VERSION是 SIP版本号,本例是 SIP/2.0

(2)消息头部(header)

头部包含一个或多个头字段(head field), 每个字段一行。
一个字段行 = name : value ; value;

一个请求消息头部至少要包含六个字段:Via, To, From, CSeq, Caller-ID, Max-Forwards

Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX
Max-Forwards: 70
To: <sip:some@192.168.31.131:50027>
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 1 INVITE
Content-Length: 215
Content-Type: application/sdp
Contact: <sip:null@192.168.31.131:51971;transport=UDP>

I. Via字段

Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX
  • Via头字段保存所经过SIP网元(客户端或Proxy)的主机名或网络地址(可能还有端口号),消息中的所有Via头字段对请求消息而言,从下至上依次表示到当前所在SIP网元为止,请求消息所经过的路径;对响应消息而言,从上至下依次表示从当前网元开始,响应所应遵循的路径。
  • Via字段包含SIP协议版本以及消息传输所用的传输协议, 此例为: SIP/2.0/UDP
  • branch参数:
    • 在SIP网元(UAC或Proxy)发出或转发请求消息时,在其插入的Via字段中必须包含branch参数,该参数用于标识此请求消息所创建的事务。
    • branch 参数可以用做loop detection,这时参数必须被分成两部分:第一部分符合一般的原则(对于RFC3261,z9hG4bK),第二部分(此例为iYblddPPX)被用来实现loop detection以用来区分loop和spiral。
    • loop和spiral均指Proxy收到一个请求后转发,然后此转发的请求又重新到达该Proxy,区别是loop中请求的Request-URI以及其他影响Proxy处理的头字段均不变,而Spiral请求中这些部分必需有某个发生改变,spiral发生的典型情况是Request-URI发生改变。Proxy在插入Via字段前,其branch 参数的loop.
    • detection部分依据以下元素编码:To Tag,From Tag,Call-ID字段,Request-URI,Topmost Via字段,Cseq的序号部分(即与request method无关),以及proxy-require字段,proxy authorization字段。注意:request method不能用于计算branch参数,比如CANCEL以及非2XX response的ACK与其所cancel的request或对应的INVITE属于同一个事务,即其branch参数相同。见RFC3261 P22 P25 P39 P95 P105

II. Max-Forwards 字段

    Max-Forwards: 70
  • Max-Forwards 字段表示request到达UAS的跳数的限制。是一个整数,经过每一跳时减去一。如果Max-Forwards已经是零,可是request还没有到达目的地,则就会产生一个483(too many hops)响应

III. To字段

   To: <sip:some@192.168.31.131:50027>
  • To字段表示消息的接收者
  • To 字段可以有一个tag参数,to tag代表dialog的对等参与者(peer)。在UAC发出一个初始Dialog的请求(如INVITE)时,即发出out-of-dialog请求时,由于dialog还没有建立,不含to tag参数。当UAS收到INVITE请求时,在其发出的2xx或101-199响应中设置to tag参数,与UAC设置的From Tag参数以及Call-ID(呼叫唯一标识)一起作为一个Dialog ID(对话唯一标识,包含To tag,From Tag,Call-ID)的一个部分。RFC3261规定只有INVITE请求与2xx或101-199响应可以建立Dialog(由101-199响应创建的Dialog称为early dialog)。见RFC3261 P70

IV. From字段

   From: <sip:null@null>;tag=Prf3c3Xc
  • From字段表示消息的发送者
  • From字段必须包含tag参数,在UAC发出一个out-of-dialog请求(对话建立请求)时,必须设置一个唯一的tag参数,作为Dialog ID的一个部分。
    见RFC3261 P37,P159,P172

V. Call-ID字段

   Call-ID: cenXTa4i-1423587756904@appletekiAir
  • 是一个邀请(Invitation)或来自同一个UAC用户的所有登记请求(Registeration,包括更新登记,取消登记)以及由此产生的一组响应的唯一标识。一个邀请可以建立多个Dialog(当被叫用户有多个联系方式时),这成为Forking,因而Call-ID只是一次呼叫邀请的唯一标识,Call-ID与UAC在发出请求中设置的From Tag字段以及UAS在其相映中设置的To Tag字段三者一起作为一个Dialog-ID。
  • 在一个Dialog中,所有的requests和responses的Call-ID必须一致 同一UA的每一个register 的Call-ID必须一致。 见RFC3261 P37,P159,P166

VI. CSeq 字段

   CSeq: 1 INVITE
  • 用于在同一个Dialog中标识及排序事务(transaction)以及区分新的请求 与请求的重发。
  • CSeq包括顺序号和方法(method),方法必须和它所对应的request相匹配。对于out-of-dialog的非register request,取值任意。
  • 对于dialog内的每一个新的request(如BYE,re-INVITE,OPTION),Cseq的序号加1。但是对于CANCEL,ACK除外。对于ACK而言,Cseq的序号必须与其所对应的request相同。对于CANCEL而言,Cseq的序号也必须与其cancel掉的request相同。
  • 注意:在同一个对话中的UAC和UAS分别维护自己的CSeq序号,他们发出请求的CSeq序号是不相关的。见RFC3261 P218 见RFC3261 P38,P159,P170,P218

VII. Contact 字段

Contact: <sip:null@192.168.31.131:51971;transport=UDP>
  • 对于非Register事务,Contact header field 主要提供了UAC或UAS的 直接联系SIP URI,UAC在发出的对话建立(out-of-dialog)INVITE请求的Contact字段中提供自己的直接联系SIP URI,在UAS收到该请求后在其发出响应的Contact字段中提供自己的直接联系SIP URI,这样在建立对话后,UA间可以通过对方的直接联系SIP URI绕过Proxy直接发送请求。
  • 对于Register事务,表示地址绑定中的contact address(vs. address-of-record)

VIII. Content-Type字段

     Content-Type: application/sdp
  • 主要表示发给接收器的消息体的媒体类型。如果消息体不是空的,则Content-type header field一定要存在。如果Content-type header field存在,而消息体是空的,表明该类型的媒体流长度是0。

VIIII. Content-Length字段

    Content-Length: 215
  • 表示消息体的长度。是十进制数。

(3)消息体(message body)

编码方式主要是由头部确定,现在为一般为SDP。

v=0            //版本号为0
o=user1 685988692 621323255 IN IP4 192.168.31.131//建立者用户名+会话ID+版本+网络类型+地址类型+地址
s=-            //会话名
c=IN IP4 192.168.31.131  //连接信息:网络类型+地址类型+地址
t=0 0         //会话活动时间 起始时间+终止时间
m=audio 49432 RTP/AVP 0 8 101//媒体描述:媒体+端口+传送+格式列表音频 + 端口49432 + 传输协议RTP + 格式AVP,有效负荷0(u率PCM编码)
a=rtpmap:0 PCMU/8000//0或多个会话属性: 属性 + 有效负荷+ 编码名称 + 抽样频率。//                                   rtpmap +   0型  +  PCMU  +  8KHz
a=rtpmap:8 PCMA/8000//a 可以有多个, 见SDP协议
a=rtpmap:101 telephone-event/8000
a=sendrecv

2、Ringing 消息

Ringing消息是被叫对主叫INVITE请求消息的响应消息, 表示被叫正在振铃

SIP/2.0 180 Ringing
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 1 INVITE
Via: SIP/2.0/UDP 192.168.31.131:51971;rport=51971;branch=z9hG4bKiYblddPPX
To: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
Contact: <sip:192.168.31.131:50027;transport=UDP>

首行(start-line)格式是: SIP协议号 代码 文本描述

Ring消息的代码是180

消息头部其它字段均复制INVITE消息

3、OK 消息

OK消息是被叫对主叫INVITE请求消息的最终响应消息, 表示被叫已提机接听

SIP/2.0 200 OK
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 1 INVITE
Via: SIP/2.0/UDP 192.168.31.131:51971;rport=51971;branch=z9hG4bKiYblddPPX
To: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
Content-Length: 214
Content-Type: application/sdp
Contact: <sip:192.168.31.131:50027;transport=UDP>v=0
o=user1 77115499 915054303 IN IP4 192.168.31.131
s=-
c=IN IP4 192.168.31.131
t=0 0
m=audio 49434 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv

首行(start-line)格式是: SIP协议号 代码 文本描述

Ring消息的代码是180

消息头部其它字段均复制INVITE消息

消息体是被叫的SDP描述

4、ACK 消息

主叫在接收到OK响应消息后,向被叫发送ACK请求消息的响应消息, 正式启动通话

ACK消息没有消息体

ACK sip:192.168.31.131:50027;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKEfwYu4LbB
To: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 3 ACK
Max-Forwards: 70

5、BYE 消息

通话过程中,主动挂机的一方向另一方发送BYE请示消息,表示请求结束通话

另一方接到BYE消息后,应回复OK消息

BYE sip:null@192.168.31.131:51971;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.31.131:50027;rport;branch=z9hG4bKvtPAT0lfO
To: <sip:null@null>;tag=Prf3c3Xc
From: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 711793880 BYE
Max-Forwards: 70

构建自己的VOIP电话系统

SIP协议是用于在IP网络中实现通话的,也就是VOIP(Voice Over IP)。

有很多开源软件实现了SIP协议,可以很容易的构建一套属于自己的VOIP系统。这样,就可以在IP网络中打电话、发短信、视频了。

一个VOIP系统中最少需要两个部件:一个SIP服务器、多个SIP客户端

  • SIP客户端可以分为SIP软件和SIP话机两种

    • SIP软件可以安装在手机或PC上,用它来打电话。SIP软件手机版的推荐两个: CSipSimple, Linphone。PC端很少用PC打电话.
    • SIP话机外形与普通电话机一样,不同的是它不是连接在电话线上,而是直接连在网络上,像电话一样使用。
  • SIP服务器是相当于电话交换机(PBX), 用于连接各个客户端,可以架在公网上实现随处打电话, 也可以架在局域网上实现办公室内打电话。SIP服务器多用Linux操作系统,安装SIP服务器软件。 软件推荐用 Asterisk,

参考

  • SIP协议笔记

国标28181:从打电话的过程,理解SIP协议相关推荐

  1. 智能会议系统(35)---深入浅出sip协议

    深入浅出sip协议 传统电话是电磁波的通信,当电话技术发展到IP技术时代,SIP协议成为了电话通信标准协议,不仅可以通电话.还可以收发信息.视频.开会.放PPT.事实上,今天的通信业已全面采用SIP协 ...

  2. 国标28181:什么是SIP协议

    前言 对讲设备作为一种专业无线通信工具,能进行一对一,多对多的群组即时通信,在应急调度和突发事故处理中是其他通信工具所不能替代的,在城市治理.公安.运输等行业有广泛的应用. 对讲机按照通信方式分模拟对 ...

  3. 国标28181:接收设备注册

    工具 自从国标28181推出以来,国家安防行业一直在主推这个标准协议.刚开始确实有不少阻力,比如很多厂家还采用私有协议或是ONVIF协议作为主要的对接协议.这样很大的阻碍了安防行业的互联互通,虽然GB ...

  4. 国标28181:IPC信号检索设备目录查询

    待IPC客户端注册了服务端之后,服务端就应该查询设备 设备目录查询 设备目录查询是国标平台对国标设备接入的目录查询,目的是查询该设备带有的监控点和报警设备信息以及语音设备信息. 使用场景: 比如平台国 ...

  5. java使用国标方式取流,一种基于JAIN-SIP的国标28181平台分布式集群实现系统的制作方法...

    本发明涉及国标设备接入相关技术领域,尤其是指一种基于jain-sip的国标28181平台分布式集群实现系统. 背景技术: 在传统安防行业,采用较多的是用c++编写的产品,该类产品存在一些缺陷:该类产品 ...

  6. sip协议详解_SIP协议详解-INVITE消息发送过程

    SIP协议是VoIP中最重要的信令控制协议.SIP中第一件事情就是主叫发送INVITE给被叫,被叫响铃.本文从多角度详细描述INVITE消息发送的全过程. 一.阅读RFC权威描述 关于INVITE消息 ...

  7. 视频监控安防平台-国标28181平台(支持国标28181转RTSP/RTMP/HLS/WEBRTC直播)

    视频监控安防平台-国标28181平台(支持国标28181转RTSP/RTMP/HLS/WEBRTC直播) 发现很久都未更新博客了,最近把小平台的功能做了完善,在原来的功能基础上添加了功能,支持国标28 ...

  8. 实现国标GB/T2818视频流媒体解决方案EasyGBS国标GB28181-2016版的sip协议tcp沾包流程说明介绍

    实现国标GB/T2818视频流媒体解决方案EasyGBS国标GB28181-2016版的sip协议tcp沾包流程说明介绍 参考文章: (1)实现国标GB/T2818视频流媒体解决方案EasyGBS国标 ...

  9. 国标28181:什么是SDP协议

    概述 SIP和其他协议一样都有这样的一个要求:在会话开头时两端要有充分的信息交流.使用的两个协议就是定义在RFC 2974中的SAP(Session Announcement Protocol )和定 ...

最新文章

  1. 代码管理和版本管理的作业流程以及规范是怎样的?
  2. DB天气app冲刺二阶段第十一天(完结)
  3. 树莓派:django,uwsgi,nginx安装与设置
  4. @SuppressWarnings注解用法
  5. jsch设置代理_Java使用JSch组件实现SSH协议代理服务
  6. SQL大圣之路笔记——SQL 创建索引 index
  7. linux定时备份mysql数据库文件脚本
  8. 攻略:如何快速赚取积分,Get云栖大会资料
  9. poj2337 欧拉路径
  10. 搞定网页打印自动分页问题
  11. 深入理解Mysql - 事务与锁原理
  12. 网络编程之 listen()函数的使用与三次握手的理解
  13. body-parser 是一个Http请求体解析中间件
  14. 2017百越杯反序列化writeup
  15. Kubesploit:针对容器化环境的跨平台后渗透利用工具
  16. 线性表2 - 数据结构和算法07
  17. 上海二工大 - 健康日报AutoCheck
  18. Unity2D入门(二) 优化玩家移动手感(一)
  19. 大疆 L1 任务文件格式说明(CLC/CLI/CMI/IMU/LDR/MNF/RTB/RTK/RTL/RTS/JPG/MOV)
  20. 长度短点的uuid_如何压缩UUID长度?

热门文章

  1. 多媒体课件是不是计算机软件,使用Authorware 开发的《多媒体技术》课件属于( )。...
  2. MySQL主从复制和Nginx高级
  3. GolangWeb架构Beego
  4. Python登录淘宝
  5. GAE Blog 部署成功
  6. 1049: 平方和与立方和 ZZULIOJ
  7. 计算机硬件设置和驱动安装,电脑怎么安装驱动程序,如何安装驱动程序
  8. 手机连接蓝牙通过Zigbee无线控制灯珠亮度
  9. Oracle安装后的初始化操作
  10. 全球企业巨头跑马圈地物联网 连接是竞争核心