SIP初步
http://blog.sina.com.cn/s/blog_6b10255301012db7.html
1、什么是SIP
SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用。会话(Session)指两方或多方用户之间的语音、视频、及其他媒体形式的通信,具体可能是IP电话、会议、即时消息等等。
SIP是一个信令协议,它对应于传统电话网络中的呼叫信令协议(比如SS7 ISUP)。构建一个完整多媒体通信架构还需要结合其他一些协议,必要的有:RTP,用于媒体传输;RSVP,用于QOS保证等等。
2、基本功能
2.1 会话的发起与管理
SIP主要用于创建、修改和终止一个会话。
一个创建会话的简单的例子如下图所示:
- 发起方向目的方发送一个SIP请求消息(INVITE),其中包含提议的会话参数的描述,请求在二者之间建立一个会话;
- 目的方返回一个SIP响应消息(200 OK),其中包含接受的会话参数的描述,接受会话建立请求
- 发起方发送一个SIP请求消息(ACK)确认会话的建立。
一个修改会话的简单例子如下图所示:
- 会话中的任意一方可以发送一个SIP请求消息(reINVITE),其中包含提议的新的会话参数,请求修改二者之间的会话;
- 另一方返回一个SIP响应消息(200 OK),其中包含接受的新的会话参数,接受会话修改请求
一个结束会话的简单的例子如下图所示:
- 会话中的任意一方可以发送一个SIP请求消息(BYE),请求结束会话;
- 另一方返回一个SIP响应消息(200 OK),接受会话结束请求
2.2 用户位置管理
SIP支持用户(终端)的移动性。
SIP要求终端定期向网络发送注册请求(REGGISTER),报告自己的当前位置。这样SIP服务器中始终存储了用户(终端)的当前地址。当用户被呼叫时,SIP服务器能够将SIP请求发送到用户的当前地址。
3、实体 & 网络
SIP UA(User Agent,用户代理)是最基本的SIP实体,它通常就是用户终端。理想情况下,通过SIP UA就可以完成用户之间会话的建立。(参见第2节 SIP基本功能中的会话发起与管理)。
但是为了支持SIP的移动性,以及其他高级功能,比如运营商对呼叫的控制等等,会话发起及管理的信令过程不能直接在两个SIP UA之间完成,而是需要经过由若干SIP服务器构成的SIP信令网络。
这些SIP服务器可以分为两类:注册服务器和路由服务器。
SIP注册服务器(registrar)的主要功能是接受SIP UA的注册请求,维护用户名-地址映射。
路由服务器的主要功能是将SIP消息路由到目标SIP UA。路由服务器有SIP重定向服务器(redirect server)和SIP代理服务器(proxy)两种。前者以重定向方式路由SIP请求消息,后者以代理方式路由SIP请求消息。
在重定向方式下(如下图所示),SIP重定向服务器收到了SIP请求消息,查询到目标SIP UA的当前地址后,通过SIP响应消息(302 Moved temporarily)返回给发起方SIP UA。之后的SIP消息交互与重定向服务器无关,发起方SIP UA直接向目标SIP UA的当前地址发送请求消息。
在代理方式下(如下图所示),SIP代理服务器收到了SIP请求消息,查询到目标SIP UA的当前地址后,将SIP请求消息转发到目标SIP UA的当前地址。之后的SIP消息交互都要经过SIP代理服务器。这使得SIP代理服务器可以对会话进行控制,比如结束会话等等。
4、SIP操作与SIP消息
SIP所提供的功能是通过一些原子性的基本功能(比如注册(registration),发起会话(Initiation)、会话结束等)组合而成的。每个原子性基本功能是通过一个SIP操作完成的。
SIP操作基于类似HTTP的请求/响应事务模型,每个操作的调用过程体现为一个所谓事务 – 包含一个SIP请求和一个或多个相应的SIP响应。其中SIP请求消息中的方法(Method)指示出调用的操作。
下表是在RFC 3261中定义的方法及其对应的SIP操作。
方法Method |
SIP操作 |
INVITE |
会话邀请 |
ACK |
确认会话邀请 |
CANCEL |
取消会话邀请 |
BYE |
结束会话 |
REGISTER |
注册 |
OPTIONS |
查询服务器能力 |
SIP是一个基于文本(text-based)的协议,使用 UTF-8 字符集。SIP消息与HTTP/1.1非常类似,同样可以包含消息体(message body),通常是会话描述(session descriptions),也可能是其他内容。
SIP 消息有两类:从客户机到服务器的请求消息(request),从服务器到客户机的响应消息(response)。
除了第一行分别是请求行(Request-Line)和状态行(Status-Line)以外,SIP请求消息和SIP响应消息的剩下部分的组成基本类似,包括消息头域(message header)和消息体(message body)两部分(如下图所示)。
4.1 SIP请求消息
根据请求行中的方法(method)的不同,SIP请求消息有很多种,分别完成各种操作的调用,实现各种功能,下面进行简单的介绍。
- INVITE/reINVITE:INVITE 发起会话邀请。reINVITE(在一个已存在的对话中发送的INVITE称为reINVITE)修改已建立会话的参数。
- ACK:完成会话建立的3次握手 [INVITE-200-ACK],仅仅用于INVITE
- BYE :结束会话。
- CANCEL:取消正在建立中会话(INVITE已发送,但尚未收到最终响应(final response))。
- UPDATE:更新会话参数。它被建议用于替代 re-INVITE,与 re-INVITE不同在于:它可以在初始INVITE未完成时发送,能用于在早对话(early dialog)中更新会话参数。
上面的4个请求用于会话建立与管理。
- REGISTER:登记UA当前的联系地址(contact)
- OPTIONS:查询服务器或对端UA的能力,具体包括支持的方法(method),扩展(extensions)、编解码(codecs)等。
- PRACK:临时响应(Provisional Response)确认。用于确认收到了临时响应,例如 “183 Session Progress”,以支持临时响应的可靠传送。它不能应用于“100 Trying ”,只有101~199 临时响应需要可靠传送。如果没有收到 PRACK,响应消息将被重传。
- NOTIFY:事件通知,具体的事件包括、业务状态的改变(MWI,...),用户状态的改变等等。
- SUBSCRIBE:订阅/取消(Expires=0)事件通知。
- PUBLISH:发布事件状态。PUBLISH 与 REGISTER 的相似之处在于:允许用户在另一个实体(状态管理实体/registrar)中创建、修改和移除自己的状态。对PUBLISH 请求的寻址与对于SUBSCRIBE 请求的寻址是一样的,PUBLISH 请求的Request-URI 中填入的是用户希望发布其事件状态的资源地址。
上面的3个请求构成SIP事件发布-订阅-通知机制
- INFO:用于传送 mid-call 信令信息,同一时刻只能有一个 INFO 事务存在。通常用于携带 PSTN 信令消息(作为 MIME 附件),例如,ISDN UUI (用户到用户信息)。
- MESSAGE:针对即时消息 (IM)的扩展,用于传送即时消息。MESSAGE请求通过MIME附件中携带内容。MESSAGE 请求自身不发起 SIP 对话,在正常的用法中,每个即时消息都是单独存在的,非常类似 pager 消息。MESSAGE 请求可以在其他SIP请求发起的对话上下文中发送。
- REFER:指示接收者 (Request-URI所标识的) 应该使用请求中提供的信息联系第三方。典型应用:Call Transfer features 。Allowed outside an established dialogue。
4.2 SIP响应消息
状态码 |
描述 |
例子 |
1xx |
Informational 请求收到,处理中 |
180 Ringing 181 Call is Being Forwarded |
2xx |
Success 操作已成功完成 |
200 OK |
3xx |
Redirection 请求被重定向 |
300 Multiple Choices 302 Moved Temporarily |
4xx |
Client Error 请求包含错误的文法,或者无法在本服务器上完成 |
401 Unauthorized 408 Request Timeout |
5xx |
Server Error 请求有效,但服务器无法完成 |
503 Service Unavailable 505 Version Not Supported |
6xx |
Global Failure 请求在任何服务器上都无法完成 |
600 Busy Everywhere 603 Decline |
4.3 SIP消息头域
根据请求行中的方法(method)的不同,SIP请求消息有很多种,分别完成各种操作的调用,实现各种功能,下面进行简单的介绍。
- Call-ID:用于唯一标识一个特定的会话或注册消息。应该具有随机性,保证全球唯一。
例子:Call-ID:31415926535@uunet.com - From:源端SIP URL,标识请求发送方;UAC本地标签。
例子:From: sip:+1-314-342-7360 @gateway.wcom.com; tag=1234567 - To:目标SIP URL,标识请求接受方;UAS本地标签。
例子:To: sip:10109000@operator.mci.com; tag=314 - Via:用于记录请求经由的路径
例子:Via: SIP/2.0/TCP uunet.com - Max-Forwards:消息最大转发次数。服务每次转发消息时将此域值减1,当变成0时,服务器发送 483响应(Too Many Hops response)。
例子:Max-Forwards: 10 - Cseq:请求序列号,用于区分同一个会话中的不同请求。
例如:CSeq: 1 INVITE
CSeq: 4325 BYE
CSeq: 1 REGISTER
上面6个头域是所有SIP消息中的必需的头域。
- Contact 另一个SIP URL用于直接消息路由。
例如:Contact: W. Riker, Acting Captain riker@starfleet.gov
Record-Route 需要自己处在后继消息的路径上时,proxy将自己的地址加插在请求消息中
例子:Record Route: sip.mci.com - Route 确定消息的选路
例子:Route: orinoco.brooks.net - Content-Length:消息体中的 Octet 数
例子:Content-Length: 285 - Content-Type:消息体内容类型
例子:Content-Type: application/sdp
5、详细的例子 (摘自IETF RFC 3261)
实际的例子可以帮助大家进一步地认识和理解前面的内容。这里的两个例子分别是关于SIP的两个最基本的功能:注册和会话建立。每个例子中给出了消息交互过程,以及必要的消息内容细节。
出于简明性的考虑,这里给出的消息的内容忽略了消息体及相应的头域(Content-Length 和 Content-Type)。另外,还有一些头域比如Allow 和 Supported 通常也会出现,但这里并未给出。
5.1 注册
Bob在开机时注册。消息流如下图所示。注意为了简化流程,这里没有给出在注册时通常所必需的鉴权过程。
消息细节:
F1 REGISTER Bob -> Registrar
REGISTER sip:registrar.biloxi.com SIP/2.0
Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Bob <sip:bob@biloxi.com>;tag=456248
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:bob@192.0.2.4>
Expires: 7200
Content-Length: 0
这次注册的有效期为2个小时(7200秒)
注册服务器返回 200 OK 响应。
F2 200 OK Registrar -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7;received=192.0.2.4
To: Bob <sip:bob@biloxi.com>;tag=2493k59kd
From: Bob <sip:bob@biloxi.com>;tag=456248
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:bob@192.0.2.4>
Expires: 7200
Content-Length: 0
5.2 会话建立与拆除
会话建立是SIP的最基本的功能。
消息流如下图所示。
消息内容:(注意这里并未给出会话媒体参数SDP的细节)
F1 INVITE Alice -> atlanta.com proxy
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未显示)
F2 100 Trying atlanta.com proxy -> Alice
SIP/2.0 100 Trying
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F3 INVITE atlanta.com proxy -> biloxi.com proxy
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
Max-Forwards: 69
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未显示)
F4 100 Trying biloxi.com proxy -> atlanta.com proxy
SIP/2.0 100 Trying
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F5 INVITE biloxi.com proxy -> Bob
INVITE sip:bob@192.0.2.4 SIP/2.0
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
Max-Forwards: 68
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未显示)
F6 180 Ringing Bob -> biloxi.com proxy
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F7 180 Ringing biloxi.com proxy -> atlanta.com proxy
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F8 180 Ringing atlanta.com proxy -> Alice
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F9 200 OK Bob -> biloxi.com proxy
SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未显示)
F10 200 OK biloxi.com proxy -> atlanta.com proxy
SIP/2.0 200 OK
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未显示)
F11 200 OK atlanta.com proxy -> Alice
SIP/2.0 200 OK
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未显示)
F12 ACK Alice -> Bob
ACK sip:bob@192.0.2.4 SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 ACK
Content-Length: 0
现在Alice和Bob之间的媒体会话被建立。
Bob首先挂机。注意Bob的SIP 话机维护自己的 CSeq 编号空间,在这里是从231开始。因为是Bob 发送的请求,To 和 From 头域的URIs和tags参数被掉换。
F13 BYE Bob -> Alice
BYE sip:alice@pc33.atlanta.com SIP/2.0
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
Max-Forwards: 70
From: Bob <sip:bob@biloxi.com>;tag=a6c85cf
To: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 231 BYE
Content-Length: 0
F14 200 OK Alice -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
From: Bob <sip:bob@biloxi.com>;tag=a6c85cf
To: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 231 BYE
Content-Length: 0
SIP初步的更多相关文章
- 【转】SIP初步
1.什么是SIP SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用.会话(Session)指两方或多方用户之间的语音.视频.及其他媒体形式的通信,具体可能是IP电话.会议.即 ...
- Sipdroid实现SIP(六): SIP中的请求超时和重传
目录 一. Sipdroid的请求超时和重传 二. SIP中超时和重传的定义 三. RFC中超时和重传的定义 一. Sipdroid的请求超时和重传 Sipdroid实现SIP协议栈系列, 之前的文章 ...
- 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言
基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...
- 对SIP摘要认证方案的理解
一.口令认证常见机制 基于口令认证的系统一般有以下几种口令验证方式: 1.客户端以明文形式将用户名密码通过网络发送到服务器,服务器与已经保存在服务端的用户名密码进行比较,一致则通过验证: HTTP基本 ...
- 介绍一个开源的SIP(VOIP)协议库PJSIP
本文系转载,出处不可考. 假设你对SIP/VoIP技术感兴趣,哪希望你不要错过:),假设你对写出堪称优美的Code感兴趣 ,那么你也不可错过:) 这期间我想分析一下一个实际的协议栈的设计到实现的相关技 ...
- 移动端之Android开发的几种方式的初步体验
目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...
- CSharpGL(29)初步封装Texture和Framebuffer
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...
- Android自定义View初步
经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...
- 初步认识Node 之Node为何物
很多人即便是在使用了Node之后也不知道它到底是什么,阅读完本文你应该会有一个初步的.具体的概念了. Node的目标 提供一种简单的构建可伸缩网络程序的方法.那么,什么是可伸缩网络程序呢?可伸缩 ...
随机推荐
- c c++面试c工程开发之宏定义和条件编译
多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意 ...
- ABAP术语-Business Framework
Business Framework 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/28/1017922.html Integrated, ...
- 在Windows系统上使用压缩归档文件安装MySQL流程
最近需要做个小小的验证实验,需要安装MySQL,网上一搜发现教程繁多,bug也多,所以直接把官网的流程翻译过来,注意是压缩文件,不是安装版的,解压直接能用的,下面直接把流程贴过来: 使用压缩文档安装在 ...
- JavaScript实现Tab切换
在网页开发中,常常会遇见很多Tab切换,Tab切换增加网页浏览的舒适性,对于开发人员特别常见,本文使用JS实现tab切换效果,仅对学习中遇到的知识点做一个总结. 效果图如下: 实现思路: 1. ...
- mysql的数据操作和内置功能总结
一.数据的增删改查 1.插入数据 a.插入完整数据(顺序插入) INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); INSERT INTO 表名 ...
- react初学
react和vue一样都是mvvm的这种开发模式. 下载js文件 引入HTML文件里 <!DOCTYPE html> <html> <head> <scrip ...
- Hello,移动WEB—px,dp,dpr像素基础
问题点1:iphone5分辨率:640 * 1136 dp,为什么chrome浏览器F12中显示的320 *568?? iPhone5 分辨率640 * 1136指的是物理像素,而实际 ...
- djangorestframework怎么这么好用!
一年前就已经用过restframework, 当时觉得这个只是给web框架打辅助的, 他能实现的我也都实现(可能没有那么好用, 嘿嘿) 但是我有一种东西叫做效率, 时间就是金钱, 别人造好的就直接用就 ...
- Hadoop(25)-高可用集群配置,HDFS-HA和YARN-HA
一. HA概述 1. 所谓HA(High Available),即高可用(7*24小时不中断服务). 2. 实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的HA ...
- scala成长之路(6)函数入门
众所周知,scala作为一门极客型的函数式编程语言,支持的特性包括: 函数拥有“一等公民”身份: 支持匿名函数(函数字面量) 支持高阶函数 支持闭包 部分应用函数 柯里化 首先需要指出,在scala中 ...