最近有很多小伙伴咨询stratum协议,边肖结合多年经验整理了一些相应的资料,分享给大家。
stratum协议是目前矿机与矿池之间最常用的TCP通信协议。。先简要说明挖矿的网络架构。
杭州元帅;Highlight=
在局域网中,许多系统要求每台计算机保持时间一致。WIN2000系统提供与主域服务器的时间同步,即工作站只需登录主域服务器即可。工作站系统的时间自动与主域服务器的时间保持一致,但接下来的问题是如何将主域服务器的时间与世界标准时间同步。如果想得到世界标准时间,用GPS卫星钟得到毫秒级精度的标准时间更准确。但这是为了钱。如果我们只需要秒的时间精度,并且可以连接到互联网,我们可以使用互联网上的标准时间服务器来获取标准时间。
事实上,互联网上有三种不同的时间服务,每一种都由请求评论(RFC)定义为互联网日期和时间标准。。这三个标准是RFC-867、RFC-868和RFC-1305。让';我们先介绍RFC-867:[XY002][XY001]RFC867日间协议。
本RFC规定了ARPA互联网社区的标准。ARPA互联网上的所有主机都应采用并执行该标准。
一个有用的测量和调试工具是日间服务。它的功能是以字符串格式返回当前时间和日期。
*基于TCP的日间服务
日间服务是基于TCP的应用。服务器监听TCP端口13,一旦建立连接,就以ASCII格式返回日期和时间(忽略任何接收到的数据),并在传输后关闭连接。
*基于UDP的日间服务
日间服务也可以使用UDP协议,其端口也是13,但UDP使用数据报来传输当前时间。接收到的数据被忽略。
*日间格式
日间没有特定的格式。建议使用ASCII可打印字符、空格和回车。白天应该在一行上。
这里有两种流行的格式:
Apopularformatis:workingday,monthandday,yeartimezone
Example:Tuesday,February22nd,1982,17:37:43-PacificStandardTime
.SMTP中使用了另一种流行的格式:DDmmyyhh:mm:sszzz
示例:02feb8207:59:01PST
注意:对于机器,有用时间采用时间协议RFC-868[XY002][XY001]接下来我们用VB程序通过RFC867协议设置自己的计算机系统时间。为了简化程序,程序没有做日期修正。,只有时间修正。向FORM1添加一个Winsock控件,并将以下代码剪切并粘贴到FORM1的代码表单中:
OptionExplicit
。';通过RFC867日间协议
';中国科学院国家授时中心,北京时间
';时间格式:2004年7月26日星期一09:58:57 。';time.nist.gov是美国标准技术协会,采用格林威治时间
';时间格式:5321204-07-2602:00:125000488.3UTC(NIST)*
。私有声明子睡眠库"内核32"(ByValdw毫秒一样长)
DimnoSRVAsBoolean
Dimtimefromnet
PrivateSubForm_Load()
Winsock1protocol=scktcpprotocol'采用TCP协议
nettime';'先拿中科院国家授时中心
的时间来说。如果没有SRV或timefromnet=""然后
';如果没有获得中科院国家授时中心的时间,则取美国标准技术研究院
的时间。NetTime";时间。NIST。gov"
如果没有SRV或来自网络的时间=""然后
';若不能取美国标准技术院时间,则报错
MsgBox";无法检测到网络标准时间服务器time.nist.gov!"
else
';为了减少网络传输误差,第二次采取美国标准与技术协会时间
。NetTime";时间。NIST。gov"
如果时间来自网络=""然后
MsgBox";网络标准时间服务器time.nist.gov超时!"
Else
离网时间=Mid(离网时间,17,8)
timefromnet=时间序列((Hour(timefromnet)8)Mod24,Minute(TimeFromNet),Second(TimeFromNet))'Time=TimeFromNet'Setthesystemtime'If
ends,if
ends,if
otherwise
'Inordertoreducethenetworktransmissionerror第二次取
nettime
iftimefromnet=[then
msgbox";网络标准时间服务器超时!"
'elseTime=Mid(Timefromnet,12,8)';设置系统时间
结束If
结束If
结束
endSub
'Closethenetworkprogramminginterfacesubroutine
privateSubWinsock1_Close()
如果Winsock1.状态sck关闭,然后
Winsock1.如果
EndSub
,则关闭结束
';网络编程接口接收数据事件
私有SubWinsock1_数据到达(ByValbytesTotalAsLong)
timefromnet=String(bytestotal,"")
Winsock1.GetDataTimeFromNet,vbString,bytesTotal
末端接头
';网络编程接口出错事件
私有SubWinsock1_Error(ByVal号为整数,描述为字符串,ByValScode为长,ByVal源为字符串,ByVal帮助文件为字符串,ByValHelpContext为长,取消显示为布尔型)
noSRV=true
endsub
';从互联网上的标准时间提供网站获取标准时间
PrivateSubnettime(timeSRVAsString)
noSRV=False
timefromnet=";"
IfWinsock1.StateclosesandWinsock1.Close
Winsock1.RemoteHost=TimeSrv'""或"时间。NIST。gov"Winsock1.RemotePort=13
Winsock1.本地端口=0
Winsock1.连接
DoWhiletimefromnet=";"'循环等待标准时间网站返回时间数据
Ifnot,exittheDo'Ifthereisanerrorinthenetworkprogramminginterface,jumpoutoftheloopandwaitfor
Sleep55
Doevents
Loop
.IfWinsock1.StateclosesandWinsock1.Closethe
endconnector
andsearchformorepostsonrelatedtopics:Internetstandards.
上面介绍了RFC-867标准和VB例程。显然,RFC-867标准中返回当前时间和日期的格式是字符串格式,没有针对白天的特定格式(例如,中科院国家授时中心是"2004年7月26日09时58分57秒"。,而美国标准与技术协会是"5321204-07-2602:00:125000488.3UTC(NIST)";),这两点好像不太舒服。因此,我们希望互联网上的标准时间服务器能够最好地返回标准格式的数字数据。事实上,RFC在制定RFC-867标准时已经考虑了我们的意见,因为它也引入了RFC-868标准。ThefollowingisanintroductiontoRFC-868:
RFC868timeprotocol
(RFC868timeprotocol)
.本RFC规定了ARPA互联网社区的标准。ARPA互联网上的所有主机都应采用并执行该标准。
该协议提供了独立于站点的机器可读的日期和时间信息。时间服务以秒为单位返回,而不是从1900年1月1日午夜到现在。哦,我的上帝,这';它不小。
设计此协议的一个重要目的是网络上的许多主机没有时间概念。在分布式系统上,我们可以考虑如何划分北京和东京的时间。主机的时间往往是可以人为更改的,由于机器时钟的误差而变得不一致,所以需要使用时间服务器通过选举获得网络时间。让服务器有一个准确的时间概念。唐';不要低估时间,对于一些简单的基于时间的分布式程序来说,时间太重要了。
该协议可以在TCP和UDP协议下工作。。下面是时间协议通过TCP协议工作的工作流程:这里s代表服务器,u代表客户端。
S:检测端口37
U:连接端口37
S:发送时间用32位二进制数
。U:接收时间
U:关闭连接
S:关闭连接
服务器监听端口37上的连接。当连接建立后,服务器返回一个32位时间值,然后关闭连接。这个过程并不难。如果服务器可以';t决定现在是什么时间,服务器会拒绝连接或者直接关闭连接而不发送任何数据。
Let';让我们来看看UDP协议的用法:这里s代表服务器,u代表客户端。
S:检测端口37
U:向37端口发送一个空数据报
S:接收这个空数据报
S:发送一个包含32位二进制数(用来表示时间)的数据报
U:服务器监听端口37上的数据包。当一个数据包到来时,服务器返回一个包含32位时间的数据包。这个过程也不难。如果服务器可以';它将丢弃收到的数据报,而不作任何回复。
*Time
时间用32位表示,是从1900年1月1日零时到现在的秒数。我们可以算一算,这个协议只能意味着2036年才能使用。但是我们也知道计算机发展如此之快。也许会有更好的协议来取代这个协议,或者已经制定出有效的解决方案。)
下面是一些例子:
Thetimeof2,208,988,800correspondsto00:00GMT
onJanuary1,1970.2,398,291,200correspondsto00:00GMTonJanuary1,1976,
2,524,521,600correspondsto00:00GMTonJanuary1,1980,
2,629,584,000correspondsto00:00GMTonMay1,1983,
and-1,297,728,000correspondto00:00GMTonNovember17th,1858.
接下来我们用VB程序通过RFC868协议设置自己的计算机系统时间。为了简化程序,程序不修正日期,只修正时间。不过这个套路比上面的程序完美多了。首先,他可以读取全球20个标准时间服务器的时间数据。第二,他用网络延迟的补偿。第三,他过滤网络延迟超过3秒的标准时间服务器。向FORM1添加一个Winsock控件。,只需将下面的代码剪切粘贴到FORM1的代码表单中:
OptionExplicit
';时间协议(RFC-868)提供了一个32位的数字来表示从1900年1月1日到现在的秒数。
';时间是UTC(它代表CoordinatedUniversalTime,不考虑字母顺序),
';它类似于所谓的GreenwichMeanTime或GMT-英国格林威治时间。
';使用TCP获得准确时间的程序应该有以下步骤:[XY002]
';1连接到提供此服务的端口37;
';2次接收32位;
';3关闭链接。
私有声明子睡眠库"内核32"(ByValdw毫秒一样长)
DimnoSRVAsBoolean
Dimtimefromnet';存放从时间网站读取的秒数
DimTimeURL(19)asthecharacterstring'20timetoprovidetheURLofthewebsite
'ProgramEntry
PrivateSub-Form_Load()
Dimi为长,T0为单个
DimHH为整数,毫米为整数,SS为整数';时、分、秒
我。show
cdec(timefromnet)';转换为Decimal子类型,28位整数
timeURL(0)=";"先拿中科院国家授时中心的时间
来说。'timeURL(1)=";time.nist.gov";'美国标准技术院时间URL(2)=";时间a。时间频率。blrdoc。gov"
时间URL(3)=";NIST1号。数据。com"
时间URL(4)=";NIST一号DC。格拉塞。com"
timeURL(5)=";NIST1-ny.glassey.com";
timeURL(6)=";NIST1-SJ.glassey.com";
时间URL(7)=";utcNIST公司。科罗拉多。edu";
时间URL(8)=";时间-b.时间频率。blrdoc。gov"
时间URL(9)=";时间频率。blrddoc。gov"
时间URL(10)=";时间a。NIST。gov"
时间URL(11)=";时间-NIST。gov"
时间URL(12)=";NIST1号。美国在线弗吉尼亚州。真实时间。com"
时间URL(13)=";NIST1号。美国在线-加州。真正的时间。com"
时间URL(14)=";时间-西北。NIST。gov"
时间URL(15)=";时间-b.时间频率。bldrdoc。gov"
时间URL(16)=";时间频率。bldrdoc。gov"
时间URL(17)=";PTB时间1。PTB。德"
时间URL(18)=";时钟。军委。欧共体。GC。ca"
时间URL(19)=";克洛诺斯。企业社会责任。net"I=0时的
到我来了.标题="正在联接—"时间网址(一)
nettimetimeurl(I)';首次读取服务中心时间
if(非nosrv)和timefromnet0then';如果时间读取成功
。';为了减少网络传输误差,取服务中心时间
t0=timer';为了减少网络延迟带来的误差,先读取当前时间
。nettimetimeurl(I)';二级阅读服务中心time
if(非nosrv)和timefromnet0then';如果第二次读取成功
。timefromnet=timefromnetint((timert0)/20.5)';加上网络延迟补偿(delay/2就是延迟补偿)
来自网络的时间=来自网络的时间86400*Int(来自网络的时间/86400)';以天取模(86400秒)
SS=timefromnetMod60';取秒
离网时间=离网时间60
MM=离网时间Mod60'取分
HH=((timefromnet60)8)Mod24'Takethehour(Beijingtime8)
"MsgBox"Networkdelay:(timert0)
'Time=TimeSerial(HH,MM,SS)'Setthesystemtimeandexittheloop
endif
endif.
下一个我
如果我19岁,则
MsgBox";无法取得网络时间!"
EndIf
End
EndSub
';关闭网络编程接口事件
私有subWinsock1_Close()
如果Winsock1.状态sck关闭然后
Winsock1.关闭
EndIf
EndSub
';网络编程接口接收数据事件
私有SubWinsock1_数据到达(ByVal字节总数为Long)
DimTmpData
Winsock1.GetDataTmpData
timefromnet=TmpData(3)TmpData(2)*256TmpData(1)*256*256TmpData(0)*256*256*256
末端接头
';网络编程接口出错事件
私有SubWinsock1_Error(ByVal号为整数,描述为字符串,ByValScode为长,ByVal源为字符串,ByVal帮助文件为字符串,ByValHelpContext为长,取消显示为布尔型)
noSRV=true
endsub
';从互联网上的标准时间提供网站获取标准时间
PrivateSubNetTime(TimeSrvAsString)
DimIAsInteger';超时计数器
i=0
如果Winsock1,则noSRV=False
timefromnet=0
.状态关闭然后Winsock1.关闭
Winsock1。'RemoteHost=TimeSrv'TheURL
Winsock1ofthetimeprovidingwebsite.Remoteport=37'TimeProtocol(RFC-868)specifiestheport
Winsock1.本地端口=0
Winsock1.connect
DoWhiletimefromnet=0
I=I1
ifitisNoSrvori50,exitDo'Ifthereisanerrorinthenetworkprogramminginterfaceorthetimeoutisabout3seconds,thetimeacquisitionfails
Sleep55
Doevents
loop.
IfWinsock1.StateclosesandWinsock1.Close
EndSub
Editor:MarshalHangzhou
最精确的网络时间协议应该是RFC1305-NTP(网络时间协议),可以达到1-50ms的时间精度,但是这个协议非常复杂。另外,我';对不起,我不知道。我手头没有RFC1305的中文翻译,但后来RFC推出了RFC1769-SNTP(简单网络时间协议)。,简化了RFC1305要求的操作和应用范围。这里是RFC1769-SNTP:[XY002][XY001]网络工作组D.Mills[XY002]。
forcomments:1769UniversityofDelaware
ObsoleteDate:March1361,1995
Category:Information
(RFC1769——SimpleNetworkTimeProtocol)
Statusofthismemo:
ThismemoprovidesinformationfortheInternetcommunity.,但没有规定任何类型的互联网标准。本备忘录的分发没有任何限制。
摘要
本备忘录描述了简单网络时间协议(SNTP),它是对网络时间协议(NTP)的改编。NTP协议适用于在互联网上同步计算机时钟。当不需要实现RFC1305中描述的NTP的全部功能时,可以使用SNTP。它可以在单播模式(点对点)和广播模式(点对多点)下工作。。它也可以在IP多播模式下工作(在这种模式下可以提供这种服务)。SNTP与当前和以前的NTP版本没有太大的不同。但是它更简单,它是一个无状态的远程过程调用(RPC)其准确性和可靠性类似于RFC868中UDP/TIME协议所期望的。
本备忘录删除了相同标题的RFC1361。其目的是解释广播操作的协议模式。在一些地方提供进一步的解释,并纠正一些印刷错误。NTP版本3RFC1305中描述的工作机制对于SNTP的实现并不完全必要。本备忘录的分发没有任何限制。
目录
1。介绍
2。工作模式和地址分配
3。NTP时间戳格式
4。NTP消息格式
5。SNTP客户端操作
6。7。参考文献
8。安全注意事项
9。作者';s地址
1。简介
。RFC1305[MIL92]指定网络时间协议(NTP)来同步互联网上的计算机时钟。它提供对国家时间和频率传播服务机制的全面访问,组织时间同步子网并调整参与子网中每个本地时钟的时间。。在今天的大部分地区';美国互联网,NTP提供1-50毫秒的精度,这取决于同步源和网络路径的特性。
RFC1305指定了NTP协议机制中的事件和状态。、传输函数和运算,此外还有可选算法,提高了时间测量的质量,减少了同步源可能出现的一些误差。需要使用一些复杂的算法或者它们的等价算法,才能获得互联网上主路径到毫秒级的延迟精度。但是在许多情况下,不需要这样的精度,也许精确到秒就足够了。在这种情况下,更简单的协议如"时间协议"[POS83]已被使用。这些协议基于RPC进行交换:客户端请求当前时间。然后服务器发回从已知时间点到现在的秒数。
NTP被设计成既适用于性能差别很大的客户端和服务器,也适用于客户端和服务器所在网络存在大范围网络延迟和抖动的情况。。如今,互联网上的NTP同步子网的用户大多使用一个软件包,其中包含一套NTP选择和算法。这是一个复杂的实时应用系统。软件应该适用于各种硬件平台:从超级计算机到个人电脑。以适用于这样的范围。其巨大的尺寸和复杂性不适合许多应用。根据需求,探索一些可供选择的访问策略是有用的(使用适合精度要求且不严格的简单软件
)。
本备忘录描述了简单网络时间协议(SNTP),这是一种简化的NTP服务器和NTP客户端策略。《SNTP议定书》的执行没有变化,近期也不会有变化。访问范例与UDP/TIME协议一致。事实上,SNTP应该更适合使用个人电脑的UDP/TIME客户。此外,SNTP还被设计为在一个特殊的服务器上运行(包括一个集成的无线电时钟)。。由于系统中各种反应机制的设计和控制,有可能将调整时间精确到微秒。这样的特殊设计是可行的。强烈建议仅在同步子网的末端使用SNTP。。SNTP客户端应仅在子网的叶子(最高层次)中运行,并且在配置期间不依赖其他NTP或SNTP客户端进行同步。SNTP服务器应该只在子网的根(1级)运行,并且正在配置中。除了可靠的无线电时钟,没有其他同步源。只有在整个NTP实现中使用冗余的同步源、不同的子网路径和精心制作的算法,才能达到主服务器通常期望的可靠性。。当无线电时钟通信失败或传递错误时间时,这种方法使主同步源能够使用几个其他无线电时钟和到其他主服务器的备用路径。因此,我们应该仔细考虑在客户端使用SNTP,而不是在主服务器上使用NTP。
2。工作模式和地址分配
与NTP一样,SNTP可以采用单播(点对点)或广播(点对多点)模式。单播客户端向服务器发送请求,并期待来自服务器的回复,并且(可选地)上面文章的内容是服务器的往返传播延迟和本地时钟补偿。广播服务器定期向指定的IP广播地址或IP多播地址发送消息,通常不会收到客户端的请求。广播客户端监听地址,但通常不向服务器发送请求。。一些广播服务器可能选择响应客户端请求并发送未经请求的广播消息;同时,一些广播客户端可能仅发送请求来确定服务器和客户端之间的网络传播延迟。
在单播模式下,客户端和服务器的IP地址照常分配。在广播模式下,服务器使用指定的IP广播地址或IP组播地址和指定的媒体访问广播地址,客户端将在这些地址监听帧。为此IP广播地址将被限制在一个IP子网内,因为路由器不广播IP广播数据报。例如,就以太网而言,以太网媒体访问广播地址(全1';主机部分的s)用于表示IP广播地址。另一方面,IP多播地址将广播的潜在有效范围扩展到整个互联网。它的实际范围、组成员和路由由互联网组管理协议(IGMP)[DEE89]决定,各种路由协议不在本文讨论范围之内。例如,在以太网的情况下以太网媒体访问广播地址(全1)应与分配的IP组播地址224.0.1.1共享。除了IP地址规范和IGMP之外,在服务器上运行IP广播地址或IP多播地址没有区别。
广播客户端监听广播地址,例如,在以太网的情况下,所有主机地址都是1。就广播地址的IP而言,不需要进一步规定。在IP多播的情况下,主机可能需要实现IGMP。以便让本地路由器拦截消息并将其发送到224.0.1.1多播组。这些考虑超出了本信息的范围。
就当前指定的SNTP而言。它真正的弱点是,多播客户端可能会被互联网上其他地方的一些行为不端或敌对的SNTP/NTP多播服务器所瘫痪,因为所有这些服务器都使用相同的IP多播地址:224.0.1.1组地址。所以这是必要的访问控制应该基于客户端信任的服务器的源地址,即客户端选择只有自己知道的服务器。或者,根据习惯的和非正式的协议,所有NTP多播服务器现在应该在每个消息中包含用MD5加密的加密位。以便客户端可以确定消息在传输过程中没有被修改。原则上,SNTP客户有可能实现那些必要的加密和密钥分发计划,但这不能在那些为SNTP设计的简单系统中考虑。
考虑到没有完整的SNTP规范,在IP子网和局域网(指完整的NTP服务器和SNTP客户端在同一子网的局域网)中会用到IP广播地址,而对于IP组播地址将仅用于旨在实现上述相同目的的特殊情况。特别是SNTP服务器中的IP组播地址,只有在服务器实现RFC1305中描述的NTP认证(包括支持MD5消息位的算法)时才使用。
3。ntp时间戳格式
sntp使用RFC1305及其早期版本中描述的标准NTP时间戳格式。与互联网标准一致,NTP数据被指定为整数或定点小数。,以大端方式从左0位或高位开始计数。除非未指定,否则所有数量都将设置为无符号类型,并且整个字段宽度可以在bit0之前用隐含的0填充。
因为SNTP时间戳是重要的数据,用于描述协议的主要产品,所以建立了特殊的时间戳格式。NTP被表示为带有时间戳的64位无符号定点。,从1900年1月1日0:0:0开始以秒计算。在整数部分的前32位中,后32位(秒的分数)用于表示秒以下的部分。以秒为单位。,无意义的低位应该设置为0。这种格式使用方便的多精度算法和转换进行UDP/TIME表示(单位:秒),但是它使将其转换为ICMP时间戳消息表示(单位:毫秒)的过程变得复杂。。它所代表的精度在200皮秒左右,应该足以满足最高要求。012345678901234567890123344545456789012345678901
-
|秒|
-
|secondpart(0padding)|
-
注意,从1968年开始,最高有效位(整数部分的位0)已经确定,64位字段将在2036溢出。如果2036年还在用NTP或者SNTP。一些外部方法将是必要的,以调整1900年和2036年(以及136的其他倍数)以上文章的时间。有了这些限制,时间戳数据就变得非常特殊(需要适当的方法才能容易找到)。。从现在开始,每隔136年,会有一个200皮秒的间隔,这个间隔会被忽略,所有64位字段都会被设置为0,按照约定会被解释为无效或不可用的时间戳。
4。NTP消息格式
NTP和SNTP是用户数据报协议(UDP)[POS80]的客户端。,而UDP本身就是互联网协议(IP)[DAR81]的客户端。IP和UDP报头的结构在引用的特定资料中有所描述,在此不再赘述。UDP的端口是123。UDP头中的源fracture和目的fracture是相同的,保留的UDP头如规范中所述。
以下是对SNTP消息格式的描述,它位于IP和UDP报头之后。。SNTP的报文格式与RFC-1305中描述的NTP格式一致,但不同的是,SNTP的一些数据字段被风加载了,即被初始化为一些预定值。NTP消息的格式如下所示。
123
012345678901234567890123344545456789012345678901
-
|LI|VN|Mode|Stratum|Poll|Precision|
-
|根延迟|
-
|根差|
-
|参考标识符|
-
|||
|参考时间戳(64)|
||
-
|||
|原始时间戳(64)|
||
-
|||
|接受的时间戳(64)|
||
-
|||
|传输时间戳(64)|
||
-
||
||
|Authenticator(可以是
*由于Reaper不支持地层协议,请使用地层挖掘代理。,然后点Reaper在127.0.0.1:8332,挖矿期间保持运行。
NTP和SNTP是用户数据报协议(UDP)[POS80]的客户端。,而UDP本身就是互联网协议(IP)[DAR81]的客户端。IP和UDP报头的结构在引用的特定资料中有所描述,在此不再赘述。UDP的端口是123。UDP头中的源fracture和目的fracture是相同的,保留的UDP头如规范中所述。
以下是对SNTP消息格式的描述,它位于IP和UDP报头之后。。SNTP的报文格式与RFC-1305中描述的NTP格式一致,但不同的是:
SNTP的一些数据字段被封装了,也就是被初始化为一些预定值。NTP消息的格式如下所示。
123
012345678901234567890123456789013567890123578901
-
|LI|VN|Mode|Stratum|Poll|Precision|
-
|根延迟|-
|根方差|-
|参考标识符|-
||
|参考时间戳(64)|
||
-
||
|原始时间戳(64)|
||
-
||
|接受时间戳(64)|
||
-
||
|传输时间戳(64)|
||
-
||
||
|验证器(可选)(96)||
||
|||
-
在下面部分描述。在SNTP,这些字段大多由预先指定的数据赋予初始值。为了完整起见,下面简要总结了每个字段的功能。
1。闰秒标记:这是一个两位数的代码,预测在一天的最后一分钟插入或删除闰秒。。用1/0表示,分别解释如下:
LI值有意义
——33333333333333、354333333333
011最后一分钟有61秒
102最后一分钟有59秒
113警告状态(时钟不同步)
2。版本号:这是一个三位的整数。一个,表示NTP的版本号,现在是3。
3。模式:这是一个三位的整数,表示模式,定义如下:
模式含义
0保留
1对称激活
。2被动对称
3客户端
4服务器
5广播
6预留给NTP控制系统
7自用。,客户端机器在请求中将该字段设置为3,服务器在回复中将该字段设置为4;在广播模式下,服务器在应答时将该字段设置为5。
4。stratum:这是一个8位整数(无符号)。,它表示本地时钟的层次级别。数值定义如下:
地层含义
0未指定或难以获得
1主参考(如电波时钟)
。2-15秒参考(通过NTP/SNTP)
16-255保留
5。测试间隔:八位有符号整数,表示连续消息之间的最大间隔,精确到秒的平方和。。该字段的值从4(16s)到14(16284s);但是,大多数应用程序使用6(64秒)到10(1024秒)。
6。精度:八位有符号整数,表示本地时钟的精度,精确到秒的平方。。值的范围从-6(主要级别)到-20(细微级别时钟)。
7。根延迟:32位有符号定点小数,表示主参考源之间的总往返延迟,小数点后15~16位。根据相关的时间和频率,数值可以是正的或负的。,从负的毫秒到正的几百毫秒。
8。根离散度:32位有符号定点小数,表示上述文章内容在主要参考源中为名义误差,小数点后15~16位。范围:0~几百毫秒。
9。参考时钟标识符:32位,用于标识一个特殊的参考源。在层0(未指定)或层1(基本参考)的情况下,该字段由四个八位字节表示,左对齐,零填充字符串。。当没有NTP枚举时,使用以下ASCII标识符:分层代码含义为
——333——3333——335433333333——333——-
,如ATOM(原子钟),PPS代表(
脉冲精密源每秒)等。一般NTP时间服务之外的
1服务,如ACTS
(计算机自动时间服务)。、时间(UDP/时间协议)、
TSP(Unix时间服务协议)、DTSS。
(数字时间同步服务),以此类推
1无线电通用无线电服务。,有呼号,如楚、
DCF77、无国界医生、WWVB、等。
1nav无线电导航系统,如OMEG(欧米茄导航系统)、
LORC(远程无线电导航系统),等等
卫星通用服务,比如GOES(地球同步轨道环境卫星),
GPS(全球定位服务),等等
。2地址二级引用(NTP服务器的Internet
地址,用四个八位字节表示)
——33333333333333333333333333333333333333333333333
10。参考时间戳:64位时间戳,本地时钟被修改的最后时间。
11。原始时间戳:客户端发送的时间,64位。
12。接受时间戳:服务器收到的时间。,64位.
13。传输时间戳:服务器发送回复的时间,64位。
14。认证器(可选):当NTP的认证机制已经运行时,该字段包含认证者的信息(参见RFC1305中的附录C)。在SNTP,该字段通常被传入消息忽略,并且不在传出消息中使用。
转自:
getblocktemplate协议诞生于2012年中期,当时矿石池已经出现。矿池使用getblocktemplate协议与节点客户端交互,使用stratum协议与矿工交互。这是最典型的矿井水池建设模式。
与getwork相比,getblocktemplate协议最大的不同在于,getblocktemplate协议允许矿工构造自己的块。因此,,节点和挖掘完全分离。对于网络来说,区块链是黑暗的,网络对区块链一无所知。他只知道修改数据字段的4个字节。对于getblocktemplate,整个区块链是透明的。,getblocktemplate掌握了上述文章关于区块链和挖矿的所有信息,包括待确认的事务池,getblocktemplate可以自行选择块中包含的事务。
挖矿有两种方式。一种叫单人开采,一种是去矿池开采。如上所述,直接在节点客户端启动CPU挖矿,直接将节点客户端与getworkcgminer驱动的显卡连接,都属于SOLO挖矿。SOLO本身就像买彩票一样。中奖不容易,收益全归自己。在矿池中采矿就像一起买彩票。大家可以一起出钱,买一堆彩票。中奖后,收益将按照投资比例进行分配。理论上,矿机可以借助getblocktemplate协议链接节点客户端SOLO进行开采。但事实上,很久以前没有矿工会这么做。写这篇文章的时候,比特币的计算能力是1600P,而最先进的矿机的计算能力是10t左右,所以,单个矿机单挑挖块的概率不到16万分之一。矿工(人)投资真金白银买矿机,交电费,不会做这种高风险的投资。显然,投资矿池更适合降低风险,获得稳定收益。因此,矿池的出现是不可避免的,是无法消除的,无论它是否破坏了制度的分权原则。
矿池的核心工作是给矿工分配任务,统计工作量,分配收入。矿池把方块难度分成很多难度较小的任务,发给矿工计算。矿工在完成一项任务后,将工作量提交给矿池,称为提交份额。。如果全网分块难度要求哈希运算结果的前70位全为0,那么矿池分配给矿工的任务可能只要求前30位为0(根据矿工调整';计算能力),矿工完成指定难度的任务后上交分成。在满足前30位都是0的基础上,重新检查矿池,看是否恰好前70位都是0。
矿池会根据每个矿工的计算来分配不同难度的任务。矿池如何判断矿工的计算来分配合适的任务难度??调整思路和比特币区块难度一样。矿井需要矿工的帮助';分享率。矿池希望分配给每个矿工的任务足够矿工计算一段时间,比如一秒钟。如果矿工在一秒钟内完成几个任务,说明矿池当前难度低,需要提高。,反之亦然。这样经过一段时间的调整,矿池就可以给矿工分配合理的难度,计算出矿工的计算力。
矿池通过getblocktemplate协议与网络节点交互,获取区块链的最新信息。通过地层协议与矿工互动。另外,为了让以前用getwork协议挖矿的软件连接到矿池进行挖矿,矿池一般都支持getwork协议。,通过分层挖掘代理机制。需要说明的是,矿池刚出现的时候,显卡挖矿还是主力,getwork用起来非常方便。另外,早期的一些FPGA矿机是用getwork实现的。地层以TCP方式与矿池通信,数据以JSON格式封装。
Let';下面说说getblocktemplate遗留的一些问题:
矿工驱动:在getblocktemplate协议中,矿工仍然主动调用RPC接口通过HTTP向节点申请挖掘数据,这意味着矿工可以';不能及时获知网络中最新的块变化,导致计算能力的丧失。
数据加载:如上所述,一个正常的getblocktemplate调用节点会反馈1.5M左右的数据,其中主要数据是事务列表,矿工和矿池需要频繁交换数据。显然,你可以';不要每次分配工作时都给矿工附上这么多信息。而且巨大的内存需求会极大的影响矿机的性能,增加成本。
Stratum协议彻底解决了上述问题。
Stratum协议采用主动分配任务的方式,也就是说矿池可以随时给矿工分配新的任务。对于矿工来说,如果接到矿池分配的新任务,要立即无条件切换到新任务;矿工也可以主动用矿池申请新任务。
现在的核心问题是如何让矿工获得更大的搜索空间。如果按照getwork协议只能为矿工更改nNonce和nTime字段,交互数据量很小,但搜索空间肯定不够。想增加搜索空间,只能在hashMerkleroot努力了。如果矿工自己构造coinbase,搜索空间的问题就解决了,但代价是把块中包含的所有事务都给矿工,矿工可以构造事务列表的Merkleroot。这对矿工来说压力更大,对矿池的带宽要求更高。
Stratum协议巧妙地解决了这个问题。成功的实现不仅可以为矿工增加足够的搜索空间,而且只需要少量的交互数据。这也是Stratum协议最创新的地方。
Let';让我们回顾一下80字节数据块报头的六个字段。这一点非常重要。nVersion、nBits和hashPrevBlock这三个字段是固定的,没有。nTime这个词现在可以被矿工改了。增加搜索空间只能通过hashMerkleroot完成,它可以';不要被绕过。Stratum协议允许矿工自己构造coinbase事务。coinbase的scriptSig字段有很多字节是矿工可以自由填充的,coinbase的变化意味着hashMerkleroot的变化。从coinbase构造hashMerkleroot不需要所有的事务。,
如上图所示,如果块将包含13个事务,矿池将首先处理这13个事务,最后只将图中的4个黑点(哈希值)交付给矿工,同时将构造coinbase所需的信息交付给矿工。,矿工可以自己构造HashMerkleroot(图中绿点都是矿工自己算出来的。成对合并哈希时,规定下一个黑点代表的哈希值总是放在右边)
。这样,如果块包含n个事务。矿池可以浓缩成log2(N)哈希值交付给矿工,大大减少了矿池和矿工之间的数据交互量。
Stratum协议严格规定了矿工与矿池交互的接口数据结构和交互逻辑,如下:
1。矿工订阅任务
启动矿机,链接mining.subscribe方法返回的数据非常重要。矿工需要在整个采矿过程中使用的本地记录,其中:
extranonce1和Extranonce2对于挖掘非常重要,增加的搜索空间在这里。现在,我们至少有8个字节的搜索空间,即4个字节的nNonce和4个字节的Extranonce2。。
2。矿池授权
在矿池注册账号,添加矿工。矿井池允许任何数量的矿工被添加到每个帐户,并采取不同的名字来区分他们。矿工使用mining.authorize方法申请授权。只有矿池授权的矿工才能接收矿池分配的任务。
3。矿池分配任务
以上各字段必不可少,其中:
有了以上信息,,加上之前得到的Extranonce1和Extranonce2_size,就可以挖掘了。
4。挖掘
1)构造coinbase事务
使用的信息包括coinb1、extranonce1、extranonce2_size和Coinb2。结构很简单:
为什么会这样?因为矿池为矿工做了很多工作。比特币基地交易已建在矿池中。序列化后在指定位置分为coinb1和coinb2。coinb1和coinb2包含指定的信息,例如,coinb1包含块高度。Coinb2包含矿工';收入地址和收入金额,但这些信息与矿工无关,矿工挖的地方只有4个字节的Extranonce2。另外,Extranonce1是矿池的写入块的指定信息。一般来说,每个矿池都会写自己矿池的信息,比如矿池的名称或者域名。基于这些信息,我们将统计全网各矿池的计算能力占比。2)构建Merkleroot
使用coinbase和merkle_branch,hashMerkleroot字段的构造如上图所示。
3)构建基块标题
填充剩余的五个字段。现在,这个矿池可以随时寻找,以便开采。如果搜索空间不够,可以通过多加几个字节的Extranonce2_size轻松解决。
5。矿工提交的工作量
矿工找到符合难度的a股,提交给矿池。提交的信息量很少,而且都是必备字段:
矿池拿到以上五个字段后,首先根据任务ID,找出分配任务前存储的信息(主要是构造的coinbase事务和事务列表等。),然后重构块,再验证份额的难度,再检查满足难度要求的份额是否满足全网难度。
6。矿池为矿工调整难度
矿池记录每个矿工的难度,并根据份额率不断调整,以指定合适的难度。。矿池可以通过采矿随时向矿工发送消息。set_difference方法,即mining.set_difference。
如上所述,Stratum协议的核心概念基本清晰。在getblocktemplate协议和Stratum协议的配合下,矿池终于可以大声对矿工们说,让计算力来得更猛烈些吧。
NTP提供准确的时间,首先要有一个准确的时间源。这个时间应该是UTC。NTP获取UTC的时间源可以是原子钟、天文台、卫星或互联网。这样就有了准确可靠的时间来源。时间根据NTP服务器的级别进行传播。。根据服务器与外部UTC源的距离,所有服务器都被分为不同的层。Stratum-1位于顶层,具有外部UTC访问权限,而Stratum-2从Stratum-1获取时间。,Stratum-3从Stratum-2获取时间,依此类推,但地层总层数限制为15层。所有这些服务器在逻辑上以阶梯式结构相互连接,Stratum-1的时间服务器是整个系统的基础。。计算机主机一般与多个时间服务器相连,使用统计算法过滤来自不同服务器的时间,以便选择最佳路径和源来校正主机时间。即使主人能';长时间不与服务器联系,NTP服务仍然有效。。为了防止对时间服务器的恶意破坏,NTP使用一种认证机制来检查传入的信息是否真的来自所声称的服务器以及数据的返回路径,从而提供一种防止干扰的保护机制。。NTP时间同步消息中包含的时间是格林威治标准时间,即从1900年开始计算的秒数。
stratum协议和的介绍到此结束。不知道你有没有从中找到你需要的信息?