工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表2017年01月的文章

SSDP 简单服务发现协议

 SSDP 简单服务发现协议,是应用层协议,是构成UPnP(通用即插即用)技术的核心协议之一。它为网络客户端(network client)提供了一种发现网络服务(network services)的机制,采用基于通知和发现路由的多播方式实现。

SSDP多播地址:239.255.255.250:1900(IPv4),FF0x::C(IPv6)

两种类型的SSDP请求消息会通过SSDP多播地址发送:

1. 发现请求(Discovery request 或查询请求)。SSDP客户端向此地址发送HTTP UDP 发现请求,查询某种类型的服务。SSDP服务在此地址上监听服务发现请求。当服务监听到的HTTP UDP 发现请求和它自己提供的服务匹配时,它以单播方式发送HTTP UDP 响应。

2. 存在通知(notification)。SSDP服务向此多播地址发送HTTP UDP 通知消息来宣布自己的存在。

 

发现结果(discovery results)和存在通知消息(presence announcements)提供的信息包括:

服务的类型URI

服务名称USN:唯一标识一种服务实例。

位置信息:发现结果和存在通知可包含一个或多个位置URI,客户端利用位置信息可以找到它需要的服务。

期限信息:客户端在自己的cache中保存此服务多长时间。如果期限过了,关于此服务的信息会被从cache中拿掉。当客户端接收到的发现结果或存在通知包含的USN和cache中的某条匹配,则更新。

客户端的服务缓存像下面这样:

【SSDP发现请求】ssdp:discover

ssdp:discover 必须包含一个ST头,客户端使用ST头来表明他们想发现的服务类型。ssdp:discover 必须包含一个带 *  的请求URI。

M-SEARCH * HTTP/1.1

S: uuid:ijklmnop-7dec-11d0-a765-00a0c91e6bf6

Host: 239.255.255.250:1900

Man: "ssdp:discover"

ST: ge:fridge

MX: 3

各HTTP协议头的含义:

HOST:设置为协议保留多播地址和端口,必须是:239.255.255.250:1900(IPv4)或FF0x::C(IPv6)

MAN:设置协议查询的类型,必须是:ssdp:discover

MX:设置设备响应最长等待时间。设备响应在0和这个值之间随机选择响应延迟的值,这样可以为控制点响应平衡网络负载。

ST:设置服务查询的目标,它必须是下面的类型:

-ssdp:all 搜索所有设备和服务

-upnp:rootdevice 仅搜索网络中的根设备

-uuid:device-UUID 查询UUID标识的设备

-urn:schemas-upnp-org:device:device-Type:version 查询device-Type字段指定的设备类型,设备类型和版本由UPNP组织定义。

-urn:schemas-upnp-org:service:service-Type:version 查询service-Type字段指定的服务类型,服务类型和版本由UPNP组织定义。

 

SSDP服务发现自己的服务类型和ST中指明的服务类型匹配时,可以向ssdp:discover来自的IP地址/端口响应。响应消息应该包含服务的位置信息(Location 或AL头),ST和USN头。响应消息应该包含cache控制信息(max-age 或者 Expires头),如果两者都包含了,Expires 头优先,如果两者都缺失,那么这条服务消息不能被cache。

HTTP/1.1 200 OK

S: uuid:ijklmnop-7dec-11d0-a765-00a0c91e6bf6

Ext:

Cache-Control: no-cache="Ext", max-age = 5000

ST: ge:fridge

USN: uuid:abcdefgh-7dec-11d0-a765-00a0c91e6bf6

AL: <blender:ixl><http://foo/bar>

各HTTP协议头的含义简介:

CACHE-CONTROL:max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认为设备不存在

DATE:指定响应生成的时间

EXT:向控制点确认MAN头域已经被设备理解

LOCATION:包含根设备描述得URL地址

SERVER:饱含操作系统名,版本,产品名和产品版本信息

ST:内容和意义与查询请求的相应字段相同

USN:表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力。

 

【SSDP存在通知消息】

SSDP服务通过存在通知消息来向客户端宣布自己的存在,更新期限信息,更新位置信息。

ssdp:alive 消息必须将 NT 设置成自己的服务类型,USN头设置成自己的USN。ssdp:alive 应该包括Location或者AL头,如果没有DNS支持的话,使用SSDP服务的IP地址来代表位置。ssdp:alive还应该包括cache控制信息,max-age或者Expires头。

NOTIFY * HTTP/1.1

Host: 239.255.255.250:reservedSSDPport

NT: blenderassociation:blender

NTS: ssdp:alive

USN: someunique:idscheme3

AL: <blender:ixl><http://foo/bar>

Cache-Control: max-age = 7393

ssdp:alive 没有响应消息。

 

SSDP服务可以发送ssdp:byebye 来宣布自己下线。ssdp:byebye 必须将NT设置成自己的服务类型,将USN头设置成自己的USN。ssdp:byebye 也没有响应消息。当客户端接收到ssdp:byebye 消息,删掉cache里面的相关条目。

NOTIFY * HTTP/1.1

Host: 239.255.255.250:reservedSSDPport

NT: someunique:idscheme3

NTS: ssdp:byebye

USN: someunique:idscheme3

 

【SSDP Auto-Shut-Off Algorithm】

A mechanism is needed to ensure that SSDP does not cause such a high level of traffic that it overwhelms the network it is running on.

【ssdp:all】

A mechanism is needed to enable a client to enumerate all the services available on a particular SSDP multicast channel/port.

 

【参考】

SSDP 协议原文:http://tools.ietf.org/html/draft-cai-ssdp-v1-03

http://www.cnblogs.com/debin/archive/2009/12/01/1614543.html

SSDP协议基础详解

 SSDP协议基础详解

 
SSDP协议,不知道大家是否听说过呢?这个协议的使用多出现在端口当中。下面我们就来了解一下这个协议的具体内容吧。什么是SSDP协议呢?SSDP就是简单服务发现协议(SSDP,Simple Service Discovery Protocol)是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。
    
简单服务发现协议提供了在局部网络里面发现设备的机制。控制点(也就是接受服务的客户端)可以通过使用简单服务发现协议,根据自己的需要查询在自己所在的局部网络里面提供特定服务的设备。设备(也就是提供服务的服务器端)也可以通过使用简单服务发现协议,向自己所在的局部网络里面的控制点宣告它的存在。
 
实现
简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。
按照协议的规定,当一个控制点(客户端)接入网络的时候,它可以向一个特定的多播地址的SSDP端口使用M-SEARCH方法发送“ssdp:discover”消息。当设备监听到这个保留的多播地址上由控制点发送的消息的时候,设备会分析控制点请求的服务,如果自身提供了控制点请求的服务,设备将通过单播的方式直接响应控制点的请求。
 
类似的,当一个设备接入网络的时候,它应当向一个特定的多播地址的SSDP端口使用NOTIFY方法发送“ssdp:alive”消息。控制点根据自己的策略,处理监听到的消息。考虑到设备可能在没有通知的情况下停止服务或者从网络上卸载,“ssdp:alive”消息必须在HTTP协议头CACHE-CONTROL里面指定超时值,设备必须在约定的超时值到达以前重发“ssdp:alive”消息。如果控制点在指定的超时值内没有再次收到设备发送的“ssdp:alive”消息,控制点将认为设备已经失效。    
 
当一个设备计划从网络上卸载的时候,它也应当向一个特定的多播地址的SSDP协议端口使用NOTIFY方法发送“ssdp:byebye”消息。但是,即使没有发送“ssdp:byebye”消息,控制点也会根据“ssdp:alive”消息指定的超时值,将超时并且没有再次收到的“ssdp:alive”消息对应的设备认为是失效的设备。
 
在IPv4环境,当需要使用多播方式传送相关消息的时候,SSDP一般使用多播地址239.255.255.250和UDP端口号1900。
根据互联网地址指派机构的指派,SSDP字而已在IPv6环境下使用多播地址FF0X::C,这里的X根据scope的不同可以有不同的取值。

新生代开源区块链技术

 区块链的技术发展一日千里,几乎每天都有区块链技术或应用的新消息和进展,每个月都有新的区块链相关技术出来,各类区块链技术体系层出不穷,除了Elwin在《区块链主流开源技术体系介绍》提到的目前几大主流的开源区块链技术体系(包括比特币体系、以太坊、fabric、比特股、公证通、瑞波、未来币、锯齿湖、布比、小蚁等技术体系介绍,有兴趣可以搜索旧文看看)在不断完善发展外,市场上很快又涌现了很多新生代的区块链技术体系,本文将会一一进行介绍。

 

一、恒星网络

恒星网络,stellar,一个由前瑞波(Ripple)创始人Jed McCaleb发起的区块链接项目,用于搭建一个数字货币与法定货币之间传输的去中心化网关。最近,乐视金融与恒星基金会签约,共建NBiLe与Lumens两个平行网络,实现通缩与通胀并行。

 

恒星网络是基于Ripple基础上进行开发,在比特币和瑞波的技术基础上做了的很多改进,特别是相关的共识机制和验证算法,恒星网络运行节点性能得到提高,并节点资源需求非常低。众多改进其中,最大改动的是恒星支付系统的支撑算法SCP(恒星共识协议),号称是目前最安全的类拜占庭算法。SCP共识机制应用“集合块”,即各节点选择其可信任的其他节点。所有这些个体选择之和便是系统层面的共识集合。这些集合块将整个系统联结起来,正如个体网络的决策统一了互联网一样。SCP对计算能力以及经济成本消耗要求适度,降低了进入门槛并潜在地把金融系统开放给新的参与者,同时也是一种最佳的对抗恶性行为参与者使得系统恢复的构建方法。

 

开源代码地址为https://github.com/stellar/stellar-core,系统主要开发语言为C++,共识机制为SCP,支持智能合约,适用于公链和联盟链。

 

 

二、Tendermint

美国公司推出的Tendermint作为第二代区块链架构,已经超越了受限制的基于代币/类比特币的单片系统,是第一个实施分片技术的公共区块链。

 

Tendermint是一种开源的区块链套接字协议,消除了区块链之前的复杂性,为区块链开发提供了模块化结构,并且在区块链核心提供了一个开源的区块链引擎,使得各种机构和开发团队都能够轻松且高效地创建属于他们自己的区块链技术。Tendermint主核心将会管理所有的区块链分区,你可以有比特币分区或以太坊分区,具有很大的灵活性。在Tendermint平台上可以搭建基于任何编程语言的应用开发界面,主核心管理所有分片,分片包含很多类型,可以是比特币分片、或者以太坊分片。

 

 

Tendermint共识引擎通过Tendermint套接字协议(TMSP)与应用程序进行连接。Tendermint通过在应用程序进程和共识形成过程之间设置一个非常简单的应用程序接口,可以对区块链设计进行分解。并且TMSP不依赖于某一特定的编程语言,所以开发人员可以使用任意一种编程语言来编写智能合约。用户同样还能够利用现有的代码库,工作流和开发生态系统来创建复杂的应用程序。

 

开源代码地址为https://github.com/tendermint/tendermint,系统主要开发语言为GO,所使用的是拜占庭容错共识机制,支持智能合约,具有去中心化控制、低延时、渐进安全的特效,大大提高扩展性和速度,每秒钟可以完成超过10,000笔交易,适用于公链和联盟链、私链。

 

三、Openchain

Openchain是由区块链技术公司Coinprism开源分布式总账区块链工具,主要提供给大型企业和金融机构,Openchain 在处理大型企业和金融机构的数据的时候,相较于传统的区块链工具,能大大的降低计算速度,并能降低成本和交易方风险。

 

不同于比特币,Openchain基于一种独特的分布式账本技术,它可帮助用户部署自己版本的区块链,减少用户的交易成本和结算时间。Openchain去除了区块,交易和交易之间直接连通,这意味着交易可以得到即时确认。任何人都可以连接到一个验证的节点,并收到一份交易验证的实时复制本,Openchain还通过数字签名来保护交易的安全性,使交易不可伪造。另外,通过挂钩模块,基于Openchain的token可以作为侧链挂钩到比特币网络上。

 

开源代码地址为https://github.com/openchain/,系统主要开发语言为C#开发,他是DNX应用,可以支持跨平台运行,支持智能合约,适用于联盟链。

 

四、多链MultiChain

多链Multichain,他是一个区块链软件平台,任何人都可以在上面创建和部署私链(permission chain)。隐私与控制的争议是比特币成为行业性金融机构的障碍,而用MultiChain创建的私有链则克服了这个困难。Multichain支持快速部署,两步就可以生成自已的区块链,三步就可以连接上其它区块链。

 

MultiChain是采用PoW共识机制,通过对用户权限的综合管理解决了挖矿,隐私和公开性问题。MultiChain提供了一种创新性的可信决策网络实体的方法来解决私有区块链的挖矿问题。该平台可将挖矿活动限制在一套可供验证的实体内,并且避免了单一方对挖矿过程的垄断。这种被成为“多样性挖矿”的方案通过限定给定窗口内同一矿工的区块数量来解决挖矿问题。“多样性挖矿”取消了工作量证明的重要性和本地加密货币的必要性,并且可使处理交易的矿工以随机轮转的方式认可交易。

 

MultiChain向后兼容比特币,因此用户能够把现存的比特币应用导入到 MultiChain。不是支持像比特币内核的单一链, MultiChain可被配置以同时支持同一网络的不同区块链。MultiChain能够支持很多第三方资产,能够使私有区块链和比特币区块链相互转换。

 

MultiChain开源代码即将发布中。

 

五、Corda

R3的区块链软件Corda,旨在为参与其中的70多家银行研发解决方案,专为金融服务所设计的新分散式的分类帐平台。他号称自己不是区块链,而用以记录和管理金融合约的分布式账本。但Elwin认为,Cordar的系统核心还是是基于区块链技术的,他包含区块链的五大特性,共识、有效性、唯一性、不可更改性和认证,Corda採用许多区块链技术的优势与特性,同时捨弃掉让区块链技术无法融进大多数金融领域的设计理念,排除了一些不适合银行业应用场景的设计思路。

 

Corda平台基于产业标准工具所打造,不包含原生虚拟货币,主要特性包括能可支援各种共识机制、自动编排跨组织之间的工作流,不需仰赖单一中心化的控制机构,Corda用非常精确的时间界限来处理交易而非区块挖掘时平均大致的时间界限,且能直接设计出负责监管与监督观察作业的节点,并经由特定交易方来验证,不需由一大群与该交易无关的验证者。

 

Corda在智能合约,数据处理等方面也做了创新,而且也符合通过协作以保持金融数据协议的准确和共享。自然隐私和监管也在它的专用平台设计之中。Corda关注可互操作性和增量部署,不对第三方泄露机密信息。公司可以查看与对手方达成的协议,并确保双方看到的信息一致并向监管机构报备。Corda系统引入了法律语言体系,并包含管理金融协议的作用,该系统必须使企业逻辑编写简单化并与现有代码兼容,还必须支持协议相关企业间的行为协调。

 

针对金融使用场景和面向银行为主要使用者,Corda系统主要特点:

l   没有多余的全局数据共享:只有有合法需求的参与方可以按照协议获取数据;

l   Corda编写和配置在企业间流转,无中心控制者;

l   Corda在企业间单个交易水平达成共识,而不是在系统水平上;

l   系统设计直接支持监管观察员节点;

l   交易直接由交易双方验证,而不是由一大群不相干的验证者进行;

l   支持多种共识机制;

l   记录了智能合约代码和人类语言法律文件的清晰联系;

l   用行业标准工具创建;

l   没有原始加密货币。

 

Corda适用于联盟链,特别为金融业务打造,下个月将发布开源代码。

 

六、龙链

龙链(Dragonchain)是迪士尼打造的,他是将其混合公有/私有区块链的区块链平台。

 

龙链是另一种用来保持记录和处理交易的区块链。它与比特币的底层技术十分相似,但又有一点不同。龙链是一种多币制的区块链,节点就可以随之定义一种货币并支持其使用。该网络上可以同时使用多种货币。龙链的共识机制可以支持一种或多种现有的共识机制(Trust,PoW,PoS),甚至是可以支持自己定义和创建一种新的共识机制。

 

龙链的目标特性:

l   易于集成现有的系统

l   便于传统的工程师和程序员开发,不一定需要熟悉的区块链、分布式系统和密码密码学技术

l   C/S客户服务器方式和RESTful方式集成

l   简单灵活的架构

l   默认情况下提供对业务数据的保护

l   允许业务集中控制过程

l   固定长度和周期,短和高速的区块

l   多货币支持

l   没有基础货币

l   与其他公共和私人blockchains的互操作性

 

开源代码地址为https://github.com/dragonchain/dragonchain,系统主要开发语言是Python,支持智能合约,适合联盟链和私链。

 

七、量子链

量子链Qtum是中国社区原创的区块链公链。Qtum通过价值传输协议(Value Transfer Protocol)来实现点对点的价值转移,并根据此协议,构建一个支持多个行业的(金融、物联网、供应链、社交游戏等)去中心化的应用开发平台(DAPP Platform)。

 

量子链的定位是,做一个符合行业监管的区块链去中心化应用开发平台。为了符合以后的行业监管,量子链团队在设计的时候,为监管者的角色设计了很多可选项,引入数字身份和第三方征信平台,设计一种新的合约类型—主控合约,把监管者的角色引入,同时监管者可以作为 Qtum系统中的喻言和数据源的提供者。

 

量子链采用可插拔的共识机制:Qtum系统包括 Qtum 公链和Qtum联盟链,因为网络环境和参与者的不同,考虑到公链的去中心化程度、参与门槛、安全性和可靠性,量子链开发团队采用IPOS(Incentive Proof of Stake)机制作为区块链网络的共识机制。因为联盟链大多参与者都是受限的节点、身份已知的对手方,对共识机制的考量不同于公链网络,在联盟链中,量子链将采取Proof of Time 和Raft结合的共识协议,实现高速的区块链共识网络。

 

Qtum的开源代码地址Elwin未找到,支持EVM的虚拟机(EVM/EVM2.0),支持智能合约,适合公链和联盟链。

 

 

八、Chain

Chain是由一家刚成立两年的美国创业公司Chain推出,是一个企业级的区块链平台架构,可以让机构构造从零开始更好的金融服务。

 

作为区块链供应商,Chain在过去的两年多时间中获得了极好的信用。Chain通过将专属区块链和分布式总账的源代码进行开放,可以让更多的人在其软件上增加应用或是建立专属网络。Chain核心开发者版本的创建花费了数年时间,它是区块链供应商和金融机构合作的直接产物。由于这个开源软件针对的是金融领域,因此它允许用户创建和发行他们自己认为合适的数字资产。

 

Chain 开放标准在以下方面实现突破:

l   全新的共识模型在不到一秒的时间里实现交易的最终完成,即便是交易量非常大也能支持

l   私密解决方案对区块链数据进行加密,并让相关对手方和监管者进行有选择的读取

l   智能合约框架和虚拟机支持简单的规则执行,以及进行键值存储的图灵完整程序

l   可伸缩的数据模型可以为网络参与者降低运行负荷

l   丰富的元数据层可支持满足KYC(了解你的客户)和 AML(反洗钱)要求

 

开源代码地址为https://github.com/chain/chain,系统主要开发语言是GO,共识协议采用联邦拜占庭协议,支持多种数字资产,适合联盟链。

区块链共识小记

 共识(Consensus)过程是一个非常有趣的过程。

在我们的日常生活中,几乎所有的事情都是达成共识的过程。

达成共识越分散的过程,其效率就越低,但满意度越高,因此也越稳定;相反,达成共识越集中的过程,效率越高,也越容易出现独裁和腐败现象。

  • 达成共识常用的一种方法就是通过物质上的激励以对某个事件达成共识;但是这种共识存在的问题就是容易被外界其它更大的物质激励所破坏。
  • 还有一种就是群体中的个体按照符合自身利益或整个群体利益的方向来对某个事件自发地达成共识;当然形成这种自发式的以维护群体利益为核心的共识过程还是需要时间和环境因素的,但是一旦达成这样的共识趋势,其共识结果也越稳定,越不容易被破坏。

 

在比特币和其它区块链币中,也存在如何达成共识的问题。或者说,比特币或其它区块链币最核心的问题也是如何在去中心化的环境中达成共识。

 

区块链是比特币背后的核心技术,也是支撑比特币的基础架构。因此在谈区块链共识,就必然要谈比特币的共识。

比特币最核心的突破是在去中心化的情况下对交易事件达成了共识,即在没有中心组织的情况下对某个交易的有效性达成了一致。

比特币实现这个共识的方法主要包括两个部分:

  1. 激励;即通过每个区块产生一定量的新比特币来激励参与者;
  2. 引入外部资源确保安全;即通过大量的外部计算来确保共识的安全性,也就是工作量证明(Proof of Power);

这也是几乎所有PoW币种所采用的的方法。

而这套方法要能持续长期运行下去的前提就是:

  1. 这种激励对参与者要有足够的吸引力;也就是说比特币要一直涨价,才能吸引参与者持续参与挖矿计算,以维护整个网络的运行;否则就会导致参与的人减少,破坏网络安全;
  2. 没有外部攻击;由于比特币引入了外部计算来确保安全,因此只要有足够的挖矿算力(超过维护系统算力的51%)就能对系统成功进行攻击,这也是比特币长期存在的安全隐患之一;因为只要有钱,就能买到设备和算力。

 

正是由于比特币存在的问题,例如消耗大量的资源、外部51%攻击等,出现了PoS(Proof of Stake)共识机理。

总体上,PoS共识理论和实践目前仍处在探索阶段。

最原始的PoS机理就是用股权代替PoW中的挖矿算力,来模拟比特币的挖矿过程。请注意,这个过程没有引入外部资源,而是仅仅依靠自身的币种股份来维护网络安全,因此其不需要消耗大量能源来进行计算;而且由于其没有引入外部的资源,因此不会担心外部攻击,例如外界的算力攻击。

看起来PoS是很完美的,但是它存在一个严重漏洞。

PoS存在内部的Nothing-at-Stake攻击。

什么是Nothing-at-Stake(常写作N@S)攻击?

假设系统中出现了两个分支链,那么对于持有币的”挖矿者“来讲,最佳的操作策略就是同时在两个分支上进行“挖矿”,这样,无论哪个分支胜出,对币种持有者来讲,都会获得本属于他的利益,即不会有利益损失。而且由于不需要算力消耗,因此PoS中在两个分支上挖矿是可行的。

这导致的问题是,只要系统存在分叉,“矿工们”都会同时在这几个分支上挖矿;因此在某个情况下,发起攻击的分叉链是极有可能成功的,因为所有人也都在这个分叉链上达成了共识;而且甚至不用持有51%的币量,就可以成功发起分叉攻击;

而这在PoW中是不可行的,因为挖矿需要消耗算力,矿工只能在一个分支上进行挖矿。

第二个问题是重写历史攻击;即攻击者可以通过购买原始持有币种的账户来从头发起攻击,重新分叉一个区块链。因为原始的币种持有者可以将币转移至其它账户,因此他是可以在没有损失的情况下将原始账户出售给攻击者的。攻击者需要的就是有足够数量币的原始账户;当然了,这也只是概率问题,因为有可能原始账户持有者不会出售他们的账户,但是理论上确实存在这种攻击。

第三个问题是,尽管PoS中的挖矿不用消耗算力,运行成本很低,但是也存在如何激励矿工的问题。因为一般的PoS系统是没有新币产生的,矿工只能赚取交易费,而且在交易费不高的情况下,对矿工的激励也是很有限的。

当然了,也有很多PoS币种解决这个问题的办法就是持续的再产生新币来激励挖矿者,这导致的问题就是通胀。

上述3个问题是PoS要解决的,尤其是N@S的问题尤为重要,因为如果没有其它约束机制,这种攻击是完全有可能实现的。

 

从以上可以看出,无论是PoW还是PoS机理的共识过程,其必要条件有两个:

  1. 信息公开共享;
  2. 个体参与;

以现实为例,事件的信息越透明、所涉及到的人员参与度越高,最终形成的共识也就越稳定、越持久。这与区块链共识是一致的。

 

【参考阅读】