很多朋友对于tcp时间戳和tcp参数都有啥不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
本文目录
一、windows *** 下的tcp参数优化
通常会采用修改注册表的方式改进Windows的 *** 参数。下面将为大家介绍Windows *** 下的TCP参数优化方式,适用于Windows 2003、Windows XP、Windows 7以及Server版。对于具体的 *** 环境与 *** 能需求,优化方式会有所差异,效果也不尽相同,仅是个人的建议。所有的优化 *** 作都通过修改注册表实现,需要使用regedit命令进入注册表并创建或修改参数,修改完成后需要重启 *** ,以使之生效。以下使用的参数值均为10进制。
TCPWindowSize的值表示TCP的窗口大小。TCP Receive Window(TCP数据接收缓冲)定义了发送端在没有获得接收端的确认信息的状态下可以发送的更大字节数。此数值越大,返回的确认信息就越少,相应的在发送端和接收端之间的通信就越好。此数值较小时可以降低发送端在等待接收端返回确认信息时发生超时的可能 *** ,但这将增加 *** 流量,降低有效吞吐率。TCP在发送端和接收端之间动态调整一个更大段长度MSS(Maximum Segment Size)的整数倍。MSS在连接开始建立时确定,由于TCP Receive Window被调整为MSS的整数倍,在数据传输中完全长度的TCP数据段的比例增加,故而提高了 *** 吞吐率。
缺省情况下,TCP将试图根据MSS来优化窗口大小,起始值为16KB,更大值为 *** KB。TCPWindowSize的更大值通常为65535字节( *** KB),以太网更大段长度为1460字节,低于 *** KB的1460的更大整数倍为62420字节,因而可以在注册表中将TCPWindowSize设置为62420,作为高带宽 *** 中适用的 *** 能优化值。具体 *** 作如下:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TCPWindowSize的REG_DWORD值,该值的范围是从0到65535,将该值设置为62420。
为了更高效地利用高带宽 *** ,可以使用比上述TCP窗口大得多的TCP窗口大小,此特 *** 是Windows 2000和Windows Server 2003中的新特 *** ,称为TCP Window Scaling,它将以前的65535字节( *** KB)的 *** 提高到了1073741824字节(1GB)。在带宽与延迟的乘积值很高的连接上(例如卫星连接),可能需要将窗口的大小增加到 *** KB以上。使用TCP Window Scaling, *** 可以允许确认信息间更大数据量的传输,增加了 *** 吞吐量及 *** 能。发送端和接收端往返通信所需的时间被称为回环时间(RTT)。TCP Window Scaling仅在TCP连接的双方都开启时才真正有效。TCP有一个时间戳选项,通过更加频繁地计算来提高RTT值的估测值,此选项特别有助于估测更长距离的广域网上连接的RTT值,并更加精确地调整TCP重发超时时间。时间戳在TCP报头提供了两个区域,一个记录开始重发的时间,另一个记录接收到的时间。时间戳对于TCP Window Scaling,即确认信息收到前的大数据包传送特别有用,激活时间戳仅仅在每个数据包的头部增加12字节,对 *** 流量的影响微乎其微。数据完整 *** 与数据吞吐率更大化哪个更为重要是个需要评估的问题。在某些环境中,例如 *** 流传输,需要更大的TCP窗口,这是最重要的,而数据完整 *** 排在第二位。在这种环境中,TCP Window Scaling可以不打开时间戳。当发送端和接收端均激活TCP Window Scaling和时间戳时,此特 *** 才有效。不过,若在发包时加入了时间戳,经过NAT之后,如果前面相同的端口被使用过,且时间戳大于这个连接发出的SYN中的时间戳,就会导致服务器忽略该SYN,表现为用户无 *** 常完成TCP的3次握手。初始时生成小的TCP窗口,之后窗口大小将按照内部算法增大。具体 *** 作如下:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TCP1323Opts的REG_DWORD值,该值的具体含义为:0(缺省值)表示禁用TCP Window Scaling和时间戳;1表示只启用TCP Window Scaling;2表示只启用时间戳;3表示同时启用TCP Window Scaling和时间戳。TCP1323Opts设置为激活TCP Window Scaling后,可以将上文中的注册表项TCPWindowSize的值增大,更大能达到1GB,为了达到更佳 *** 能,这里的值更好设置成MSS的倍数,推荐值为256960字节。
对于每个TCP连接,控制变量保存在一个称为TCP控制块(TCB)的内存块中。TCB表的大小由注册表项MaxHashTableSize控制。在活动连接很多的 *** 中,设定一个较大的表可以降低 *** *** TCB表的时间。在TCB表上分区可以降低对表的访问的争夺。增加分区的数量,TCP的 *** 能会得到优化,特别是在多处理器的 *** 上。注册表项NumTcbTablePartitions控制分区的数量,默认是处理器个数的平方。TCB通常预置在内存中,以防止TCP反复连接和断开时,TCB反复重新 *** 浪费时间,这种缓冲的方式促进了内存管理,但同时也 *** 了同一时刻允许的TCP连接数量。注册表项MaxFreeTcbs决定了处于空闲等待状态的TCB重新可用之前的连接数量,在NT架构中常设置成高于默认值,以确保有足够的预置的TCB。从Windows 2000开始添加了一个新特 *** ,降低超出预置TCB运行的可能 *** 。如果处于等待状态的连接多于MaxFreeTWTcbs中的设置,所有等待时间超过60秒的连接将被强制关闭,以后再次启用。此特 *** 合并到Windows 2000 Server和Windows Server 2003后,MaxFreeTcbs将不再用于优化 *** 能。具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为MaxHashTableSize的REG_DWORD值,该值的范围是从1到65536,并且必须为2的N次方,缺省值为512,建议设为81 *** 。然后在Parameters子键下创建或修改名为NumTcbTablePartitions的REG_DWORD值,该值的范围是从1到65536,并且必须为2的N次方,缺省值为处理器个数的平方,建议设为处理器核心数的4倍。
TcpTimedWaitDelay的值表示 *** 释放已关闭的TCP连接并复用其资源之前,必须等待的时间。这段时间间隔就是以前的Blog中提到的TIME_WAIT状态(2MSL,数据包最长生命周期的两倍状态)。如果 *** 显示大量连接处于TIME_WAIT状态,则会导致并发量与吞吐量的严重下降,通过减小该项的值, *** 可以更快地释放已关闭的连接,从而为新连接提供更多的资源,特别是对于高并发短连接的Server具有积极的意义。
该项的缺省值是240,即等待4分钟后释放资源; *** 支持的最小值为30,即等待时间为30秒。具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TcpTimedWaitDelay的REG_DWORD值,该值的范围是从0到300,建议将该值设置为30。
MaxUserPort的值表示当应用程序向 *** 请求可用的端口时,TCP/IP可分配的更大端口号。如果 *** 显示建立连接时出现异常,那么有可能是由于匿名(临时)端口数不够导致的,特别是当 *** 打开大量端口来与Web service、数据库或其他远程资源建立连接时。
该项的缺省值是十进制的5000,这也是 *** 允许的最小值。Windows默认为匿名(临时)端口保留的端口号范围是从1024到5000。为了获得更高的并发量,建议将该值至少设为32768以上,甚至设为理论更大值65534,特别是对于模拟高并发测试环境的Client具有积极的意义。具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为MaxUserPort的REG_DWORD值,该值的范围是从5000到65534,缺省值为5000,建议将该值设置为65534。
动态储备的值使 *** 能自动调整其配置,以接受大量突发的连接请求。如果同时接收到大量连接请求,超出了 *** 的处理能力,那么动态储备就会自动增大 *** 支持的暂挂连接的数量(即Client已请求而Server尚未处理的等待连接数,TCP连接的总数包括已连接数与等待连接数),从而可减少连接失败的数量。 *** 的处理能力和支持的暂挂连接的数量不足时,Client的连接请求将直接被拒绝。
缺省情况下,Windows不启用动态储备,可以通过以下 *** 作进行开启和设置:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\AFD\Parameters注册表子键,在Parameters子键下创建或修改下列名称的REG_DWORD值。
EnableDynamicBacklog,值为1,表示开启动态储备。
MinimumDynamicBacklog,值为128,表示支持的最小暂挂连接的数量为128。
MaximumDynamicBacklog,值为2048,表示支持的更大暂挂连接的数量为2048。对于高并发短连接的Server,建议更大值设为1024及以上。
DynamicBacklogGrowthDelta,值为128,表示支持的暂挂连接的数量的增量为128,即数量不足时自增长128,直到达到设定的更大值,如2048。
KeepAliveTime的值控制 *** 尝试验证空闲连接是否仍然完好的频率。如果该连接在一段时间内没有活动,那么 *** 会发送保持连接的信号,如果 *** 正常并且接收方是活动的,它就会响应。如果需要对丢失接收方的情况敏感,也就是说需要更快地发现是否丢失了接收方,请考虑减小该值。而如果长期不活动的空闲连接的出现次数较多,但丢失接收方的情况出现较少,那么可能需要增大该值以减少开销。
缺省情况下,如果空闲连接在7200000毫秒(2小时)内没有活动, *** 就会发送保持连接的消息。通常建议把该值设为1800000毫秒,从而丢失的连接会在30分钟内被检测到。具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为KeepAliveTime的REG_DWORD值,为该值设置适当的毫秒数。
KeepAliveInterval的值表示未收到另一方对“保持连接”信号的响应时, *** 重复发送“保持连接”信号的频率。在无任何响应的情况下,连续发送“保持连接”信号的次数超过TcpMaxDataRetran *** issions(下文将介绍)的值时,将放弃该连接。如果 *** 环境较差,允许较长的响应时间,则考虑增大该值以减少开销;如果需要尽快验证是否已丢失接收方,则考虑减小该值或TcpMaxDataRetran *** issions值。
缺省情况下,在未收到响应而重新发送“保持连接”的信号之前, *** 会等待1000毫秒(1秒),可以根据具体需求修改,具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为KeepAliveInterval的REG_DWORD值,为该值设置适当的毫秒数。
TcpMaxDataRetran *** issions的值表示TCP数据重发, *** 在现有连接上对无应答的数据段进行重发的次数。如果 *** 环境很差,可能需要提高该值以保持有效的通信,确保接收方收到数据;如果 *** 环境很好,或者通常是由于丢失接收方而导致数据的丢失,那么可以减小该值以减少验证接收方是否丢失所花费的时间和开销。
缺省情况下, *** 会重新发送未返回应答的数据段5次,可以根据具体需求修改,具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TcpMaxDataRetran *** issions的REG_DWORD值,该值的范围是从0到4294967295,缺省值为5,根据实际情况进行设置。
10.TcpMaxConnectRetran *** isstions
TcpMaxConnectRetran *** isstions的值表示TCP连接重发,TCP退出前重发非确认连接请求(SYN)的次数。对于每次尝试,重发超时是成功重发的两倍。在Windows Server 2003中默认超时次数是2,默认超时时间为3秒(在注册表项TCPInitialRTT中)。速度较慢的WAN连接中超时时间可相应增加,不同环境中可能会有不同的更优化设置,需要在实际环境中测试确定。超时时间不要设置太大否则将不会发生 *** 连接超时时间。具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TcpMaxConnectRetran *** isstions的REG_DWORD值,该值的范围是从0到255,缺省值为2,根据实际情况进行设置。然后在Parameters子键下创建或修改名为TCPInitialRTT的REG_DWORD值,同样根据实际情况进行设置。
TcpAckFrequency的值表示 *** 发送应答消息的频率。如果值为2,那么 *** 将在接收到2个分段之后发送应答,或是在接收到1个分段但在200毫秒内没有接收到任何其他分段的情况下发送应答;如果值为3,那么 *** 将在接收到3个分段之后发送应答,或是在接收到1个或2个分段但在200毫秒内没有接收到任何其他分段的情况下发送应答,以此类推。如果要通过消除应答延迟来缩短响应时间,那么建议将该值设为1。在此情况下, *** 会立即发送对每个分段的应答;如果连接主要用于传输大量数据,而200毫秒的延迟并不重要,那么可以减小该值以降低应答的开销。
缺省情况下, *** 将该值设为2,即每隔一个分段应答一次。该值的有效范围是0到255,其中0表示使用缺省值2,可以根据具体需求修改,具体 *** 作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\C *** rentControlSet\Services\TCPIP\Parameters\Interfaces\xx(xx由 *** 适配器决定)注册表子键,在xx子键下创建或修改名为TcpAckFrequency的REG_DWORD值,该值的范围是从1到13,缺省值为2,根据希望每发送几个分段返回一个应答而设置该值,建议百兆 *** 设为5,千兆 *** 设为13。
二、目 *** 络时间服务有哪几种协议
杭州元帅
在一个局域网中,许多 *** 都要求每台计算机能够保持时间的一致 *** ,WIN2000 *** 提供了与主域服务器时间同步功能,即工作站只要登录到主域服务器,工作站 *** 的时间自动与主域服务器时间一致,但接下来的问题是我们如何使主域服务器的时间同步世界标准时间。如要获得世界标准时间,比较精确的做法是使用GPS卫星时钟获得毫秒级精度的标准时间,但这是要money的哦。如果我们在时间精度上只需要秒级的,又能够连接到Internet,则我们可以利用Internet上的标准时间服务器获得标准时间。
事实上在Internet上有三个不同的时间服务,每一个都由Request for Comment(RFC)定义为Internet日期时间标准。这三个标准分别为:RFC-867、RFC-868和RFC-1305。下面就先介绍RFC-867:
RFC867 Daytime协议(RFC867 Daytime Protocol)
本RFC规范了一个ARPA Internet community上的标准。在ARPA Internet上的所有主机应当采用和实现这个标准。
一个有用的测量和调试工具就是daytime服务。它的作用就是返回当前时间和日期,格式是字符串格式。
daytime服务是基于TCP的应用,服务器在TCP端口13侦听,一旦有连接建立就返回ASCII形式的日期和时间(接收到的任何数据被忽略),在传送完后关闭连接。
daytime服务也可以使用UDP协议,它的端口也是13,不过UDP是用数据报传送当前时间的。接收到的数据被忽略。
对于daytime没有特定的格式,建议使用ASCII可打印字符,空格和回车换行符。daytime应该在一行上。
一种流行的格式是:Weekday, Month Day, Year Time-Zone
例子:Tuesday, February 22, 1982 17:37:43-PST
另一种流行的格式用于 *** TP中:dd mmm yy hh:mm:ss zzz
注意:对于机器来说,有用的时间采用了时间协议(Time Protocol RFC-868)
接下来我们用VB程序实现通过RFC867协议设置我们自己的计算机 *** 时间,为使程序简化,程序未进行日期校正,只进行时间校正。在FORM1中添加1个Winsock控件,将下面代码剪贴到FORM1的代码窗体中即可:
'采用RFC867 Daytime协议获取标准时间例程
' *** time.ac *** 为中科院国家授时中心,采用北京时间
'时间格式:Mon Jul 26 09:58:57 2004
'time.nist.gov为美国标准技术院,采用格灵威时间
'时间格式:53212 04-07-26 02:00:12 50 0 0 488.3 UTC(N *** T)*
Private Declare Sub Sleep Lib"kernel32"(ByVal dwMilliseconds As Long)
Winsock1.Protocol= sckTCPProtocol'采用TCP协议
NetTime" *** time.ac *** "'首先取中科院国家授时中心时间
If NoSrv Or TimeFromNet="" Then
'若未取到中科院国家授时中心时间,则取美国标准技术院时间
If NoSrv Or TimeFromNet="" Then
'若不能取美国标准技术院时间,则报错
MsgBox"检测不到 *** 标准时间服务器time.nist.gov!"
'为使 *** 传输误差减小,第2次再取美国标准技术院时间
MsgBox" *** 标准时间服务器time.nist.gov超时!"
TimeFromNet= Mid(TimeFromNet, 17, 8)
TimeFromNet= TimeSerial((Ho *** (TimeFromNet)+ 8) Mod 24, Minute(TimeFromNet), Second(TimeFromNet))
Time= TimeFromNet'设置 *** 时间
'为使 *** 传输误差减小,第2次再取中科院国家授时中心时间
MsgBox" *** 标准时间服务器 *** time.ac *** 超时!"
Time= Mid(TimeFromNet, 12, 8)'设置 *** 时间
If Winsock1.State<> sckClosed Then
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
TimeFromNet= String(bytesTotal,"")
Winsock1.GetData TimeFromNet, vbString, bytesTotal
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal So *** ce As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'从互联网上标准时间提供网站获取标准时间
Private Sub NetTime(TimeSrv As String)
If Winsock1.State<> sckClosed Then Winsock1.Close
Winsock1.RemoteHost= TimeSrv'" *** time.ac *** "或"time.nist.gov"
Do While TimeFromNet=""'循环等待标准时间网站返回时间数据
If NoSrv Then Exit Do'若Winsock出错,则跳出循环等待
If Winsock1.State<> sckClosed Then Winsock1.Close
搜索更多相关主题的帖子: internet标准
上面介绍了RFC-867标准和VB例程,显然RFC-867标准采用返回当前时间和日期的格式是字符串格式以及对于daytime没有特定的格式(例如:中科院国家授时中心为"Mon Jul 26 09:58:57 2004",而美国标准技术院为"53212 04-07-26 02:00:12 50 0 0 488.3 UTC(N *** T)"),这2点似乎都不是太舒服,因此我们希望Internet上的标准时间服务器更好能够返回具有标准格式的数字类型数据,其实RFC在制定RFC-867标准时已经考虑了我们的意见,因为他同时还推出了RFC-868标准,下面就介绍RFC-868:
本RFC规范了一个ARPA Internet community上的标准。在ARPA Internet上的所有主机应当采用和实现这个标准。
此协议提供了一个 *** 于站点的,机器可读的日期和时间信息。时间服务返回的是以秒数,是从1900年1月1日午夜到现在的秒数,天哪,也不小呢。
设计这个协议的一个重要目的在于, *** 上的许多主机并没有时间的观念,在分布式的 *** 上,我们可以想一想,北京的时间和东京的时间如何分呢?主机的时间往往可以人为改变,而且因为机器时钟内的误差而变得不一致,因此需要使用时间服务器通过 *** 方式得到 *** 时间,让服务器有一个准确的时间观念。不要小看时间,这对于一些以时间为标准的分布运行的程序简单是太重要了。
这个协议可以工作在TCP和UDP协议下。下面是通过TCP协议工作的时间协议的工作过程:这里S *** 服务器,U *** 客户。
服务器在端口37上 *** 连接。当连接建立后,服务器返回一个32位的时间值,然后关闭连接。这个过程也不难,如果服务器不能决定现在是什么时间,服务器会拒绝连接或不发送任何数据而直接关闭连接。
下面我们看看使用UDP协议的情况:这里S *** 服务器,U *** 客户。
S:发送包含32位二进制数(用于表示时间)的数据报
服务器在端口37上 *** 数据包。当一个数据包来后,服务器返回一个包含32位的时间的数据包。这个过程也不难,如果服务器不能决定现在是什么时间,服务器会抛弃接收到的数据报而不作出任何应答。
时间是由32位表示的,是自1900年1月1日0时到当前的秒数,我们可以计算一下,这个协议只能表示到2036年就不能用了。(但是我们也知道计算机发展速度这么快,可能到时候就会有更好的协议代替这个协议,或者有已经想出有效的解决办法了。)
the time 2,208,988,800 corresponds to 00:00 1 Jan 1970 GMT,
2,398,291,200 corresponds to 00:00 1 Jan 1976 GMT,
2,524,521,600 corresponds to 00:00 1 Jan 1980 GMT,
2,629,584,000 corresponds to 00:00 1 May 1983 GMT,
以及-1,297,728,000 corresponds to 00:00 17 Nov 1858 GMT.
接下来我们用VB程序实现通过RFC868协议设置我们自己的计算机 *** 时间,为使程序简化,程序未进行日期校正,只进行时间校正。不过这个例程比上面的程序要完善得多,首先他可以读取全球20个标准时间服务器的时间数据,第二他采用了 *** 延时的补偿,第三对 *** 延时超过3秒的标准时间服务器进行了过滤。在FORM1中添加1个Winsock控件,将下面代码剪贴到FORM1的代码窗体中即可:
'时间协定(RFC-868)提供了一个32位元的数字,用来表示从1900年1月1日至今的秒数。
'该时间是UTC(不考虑字母顺序,它表示世界时间座标(CoordinatedUniversalTime)),
'它类似於所谓的格林威治标准时间(GreenwichMeanTime)或者GMT-英国格林威治时间。
'用TCP获得准确时间的程式应该有如下步骤:
'1连结到提供此服务的端口37;
Private Declare Sub Sleep Lib"kernel32"(ByVal dwMilliseconds As Long)
Dim TimeFromNet'存放从时间网站读取的秒数
Dim TimeURL(19) As String'20个时间提供网站的URL
Dim HH As Integer, MM As Integer, SS As Integer'时、分、秒
CDec(TimeFromNet)'转换为 Deci *** l子类型,28位整数
TimeURL(0)=" *** time.ac *** "'首先取中科院国家授时中心时间
TimeURL(1)="time.nist.gov"'美国标准技术院
TimeURL(2)="time-a.timefreq.bldrdoc.gov"
TimeURL(4)="nist1-dc.glassey *** "
TimeURL(5)="nist1-ny.glassey *** "
TimeURL(6)="nist1-sj.glassey *** "
TimeURL(7)="utcnist.colorado.edu"
TimeURL(8)="time-b.timefreq.bldrdoc.gov"
TimeURL(9)="time-c.timefreq.bldrdoc.gov"
TimeURL(12)="nist1.aol-va.truetime *** "
TimeURL(13)="nist1.aol-ca.truetime *** "
TimeURL(14)="time-nw.nist.gov"
TimeURL(15)="Time-b.timefreq.bldrdoc.gov"
TimeURL(16)="Time-c.timefreq.bldrdoc.gov"
TimeURL(18)="clock.cmc.ec.gc.ca"
Me.Caption="正在联接—"& TimeURL(i)
NetTime TimeURL(i)'首次读取授时中心时间
If(Not NoSrv) And TimeFromNet> 0 Then'如果时间读取成功
'为使 *** 传输误差减小,二次再取授时中心时间
T0= Timer'为减小 *** 延时引起的误差,先读取当前时间
NetTime TimeURL(i)'二次读取授时中心时间
If(Not NoSrv) And TimeFromNet> 0 Then'如果第二次时间读取成功
TimeFromNet= TimeFromNet+ Int((Timer- T0)/ 2+ 0.5)'加上 *** 延时补偿(延时/2为延时补偿)
TimeFromNet= TimeFromNet- 8 *** 00* Int(TimeFromNet/ 8 *** 00)'以天取模(8 *** 00秒)
SS= TimeFromNet Mod 60'取秒
MM= TimeFromNet Mod 60'取分
HH=((TimeFromNet 60)+ 8) Mod 24'取小时(北京时间+8)
' MsgBox" *** 延时:"&(Timer- T0)
Time= TimeSerial(HH, MM, SS)'设置 *** 时间
Exit For'取时完毕,退出循环
If Winsock1.State<> sckClosed Then
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
TimeFromNet= TmpData(3)+ TmpData(2)* 256+ TmpData(1)* 256* 256+ TmpData(0)* 256* 256* 256
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal So *** ce As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'从互联网上标准时间提供网站获取标准时间
Private Sub NetTime(TimeSrv As String)
Dim i As Integer'超时计数器
If Winsock1.State<> sckClosed Then Winsock1.Close
Winsock1.RemoteHost= TimeSrv'时间提供网站的URL
Winsock1.RemotePort= 37'时间协定(RFC-868)指定端口
If NoSrv Or i> 50 Then Exit Do'若Winsock出错或超时约3秒,则时间获取失败
If Winsock1.State<> sckClosed Then Winsock1.Close
最精确的 *** 时间协议应该是RFC 1305—NTP(Network Time Protocol)了,它能够1-50 ms的时间精确度,但该协议非常复杂,另外很抱歉我手头没有RFC 1305中文翻译资料,不过后来RFC又出了一个RFC1769—SNTP(Simple Network Time Protocol),简化了一些RFC 1305要求的 *** 作和使用范围,下面就介绍RFC1769—SNTP:
Network Working Group D. Mills
Request for Comments: 1769 University of Delaware
(RFC1769——Simple Network Time Protocol)
本备忘录为Internet community提供了信息,但不规定任何一种类型的 Internet标准。本备忘录的分发没有 *** 。
本备忘录描述简单 *** 时间协议(SNTP),这是 *** 时间协议(NTP)的一个改写本,NTP协议适用于同步因特网上的计算机时钟。当不须要实现RFC 1305所描述的NTP完全功能的情况下,可以使用SNTP。它能用单播方式(点对点)和广播方式(点对多点) *** 作。它也能在IP多播方式下 *** 作(可提供这种服务的地方)。SNTP与当前及以前的NTP版本并没有大的不同。但它是更简单,是一个无状态的远程过程调用(RPC),其准确和可靠 *** 相似于UDP/TIME协议在RFC868描述中所预期的。
本备忘录淘汰相同的标题的RFC 1361。它的目的是解释用广播方式 *** 作的协议模式,提供某些地方的进一步说明并且改正一些印刷上的错误。在NTP版本3 RFC 1305中说明的工作机理对SNTP的实现不是完全需要的。本备忘录的分发没有 *** 。
RFC 1305 [MIL *** ]指定 *** 时间协议(NTP)来同步因特网上的计算机时钟。它提供了全面访问国家时间和频率传播服务的机制,组织时间同步子网并且为参加子网每一个地方时钟调整时间。在今天的因特网的大多数地方, NTP提供了1-50 ms的精确度,精确度的大小取决于同步源和 *** 路径等特 *** 。
RFC 1305指定了NTP协议机制中的事件,状态,传输功能和 *** 作,另外,还有可选择的算法,它改进测时质量并且减少了一些同步源中可能存在的错误。为了获得因特网上主要路径的延时精确到毫秒级,使用一些复杂的算法或者他们的等价算法是必要的。但是,在许多场合这样的精确度是不要求,或许精确到秒已足够了。在这样的情况下,更简单的协议例如“时间协议”[POS83 ]已被使用。这些协议通过基于RPC交换:客户端请求此刻时间,然后服务器回传从某个已知时间点到现在的秒钟数。
NTP被设计成了 *** 能差异很大的客户端及服务器均能适用,且适用于客户端及服务器所在网路有大范围的 *** 延迟和抖动的情况。今天的因特网上的NTP同步子网的大多数用户使用一个软件包包括了一整套的NTP的选择和算法,是一个比较复杂,实时的应用 *** 。软件要适用于多种硬件平台:从巨型计算机到个人计算机。要在这样的范围都适用,它的庞大尺寸和复杂 *** 就不适合于很多应用了。按照要求,探求一些可供选择的访问策略(使用适合于精确度要求不是
本备忘录描述简单 *** 时间协议(SNTP),它是一个简化了的NTP服务器和NTP客户端策略。SNTP在协议实现上没有什么更改,在最近也不会有什么变动。访问范例与UDP/TIME协议是一致的,实际上,SNTP应该更容易适用于使用个人计算机的 UDP/TIME客户。而且,SNTP也被设计在一个专门的服务器(包括一台集成的 *** 电时钟)里 *** 作。由于在 *** 里的那些各种各样反应机制的设计和控制,交付调节时间精确到微秒是可能的。这样的专门设计是切实可行的。
强烈建议SNTP仅仅在同步子网的末端被使用。 SNTP客户端应该仅在子网的叶子(更高的阶层) *** 作并在配置过程中没有依靠其它NTP或者SNTP客户端来同步。SNTP服务器应该仅在子网的根(阶层1) *** 作并在配置过程中,除一台可靠的 *** 电时钟外中没有其它同步源。只有使用了有冗余的同步源及不同的子网路径及整套NTP实现中的crafted算法,主服务器通常期望的可靠 *** 才有可能达到。这种做法使主同步源在 *** 电时钟通信失败或者交付了错误时间时,还能用到其它几个 *** 电时钟和通向其它主要服务器的备份路径。因此,应该仔细考虑客户端中SNTP的使用,而不是在主服务器里的NTP的使用。
象NTP一样,SNTP能在单播(点向点)或者广播(点对多点)模式中 *** 作。单播客户端发送请求到服务器并且期望从那里得到答复,并且(可选的),得到有关服务器的往返传播延迟和本地时钟补偿。广播服务器周期 *** 地送消息给一指定的IP广播 *** 或者IP多播 *** ,并且通常不期望从客户端得到请求,广播客户端 *** *** 但通常并不给服务器发请求。一些广播服务器可能选择对客户端作出反应请求以及发出未经请求广播消息;同时一些广播客户端可能会送请求仅为了确定在服务器和客户端之间的 *** 传播延迟。
在单播方式下,客户端和服务器的IP *** 按常规被分配。在广播方式下,服务器使用一指定的IP播送 *** 或者IP多播 *** ,以及指明的媒介访问播送 *** ,客户端要在这些 *** 上帧听。为此,IP广播 *** 将 *** 在一个单独的IP子网范围,因为路由器不传播IP广播数据报。就以太网而论,例如,以太网媒介访问广播 *** (主机部分全部为1)被用于表示IP广播 *** 。
另一方面,IP多播 *** 将广播的潜在有效范围扩展到整个因特网。其真实范围,组会员和路由由因特网组管理协议(IGMP)确定 [DEE *** ],对于各种路由协议,超出了这份资料的讨论范围。就以太网而论,例如,以太网媒介访问播送 *** (全部为1)要和分配的224.0.1.1的IP多播 *** 合用。除了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广播 *** 将使用在IP子网和局域网部分(指有完整功能的NTP服务器和SNTP客户端在同一子网上的局域网),而对于IP多播 *** 来说,将只能用在为达到以上相同目而设计的特例中。尤其,只有服务器实现了RFC 1305描述的NTP认证时(包括支持MD5消息位的算法),在SNTP服务器里的IP多播 *** 才被使用。
sntp使用在RFC 1305及其以前的版本所描述标准NTP时间戳的格式。与因特网标准标准一致, NTP数据被指定为整数或定点小数,位以big-endian风格从左边0位或者高位计数。除非不这样指定,全部数量都将设成unsi *** ed的类型,并且可能用一个在bit0前的隐含0填充全部字段宽度。
因为SNTP时间戳是重要的数据和用来描述协议主要产品的,一个专门的时间戳格式已经建立。 NTP用时间戳表示为一 *** bits unsi *** ed定点数,以秒的形式从1900年1月1日的0:0:0算起。整数部分在前32位里,后32bits(seconds Fraction)用以表示秒以下的部分。在Seconds Fraction部分,无意义的低位应该设置为0。这种格式把方便的多精度算法和变换用于UDP/TIME的表示(单位:秒),但使得转化为ICMP的时间戳消息表示法(单位:毫秒)的过程变得复杂了。它 *** 的精度是大约是200 picoseconds,这应该足以满足更高的要求了。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
注意,从1968年起,更高有效位(整数部分的0 bit位)已经被确定, *** 位比特字段在2036年将溢出。如果NTP或者SNTP在2036年还在使用的话,一些外部 *** 将有必要用来调整与1900年及2036年有关的时间(136年的其它倍数也一样)。用这样的 *** 使时间戳数据变得很讲究(要求合适的 *** 可容易地被找到)。从今以后每136年,就会有200picosecond的间隔,会被忽略掉, *** 个比特字段将全部置为0,按照惯列它将被解释为一个无效的或者不可获得的时间戳。
NTP和SNTP是用户数据报协议( UDP)的客户端 [POS80 ],而UDP自己是网际协议( IP) [DAR81 ]的客户端. IP和UDP报头的结构在被引用的指定资料里描述,这里就不更进一步描述了。UDP的端口是123,UDP头中的源断口和目的断口都是一样的,保留的UDP头如规范中所述。
以下是SNTP报文格式的描述,它紧跟在IP和UDP报头之后。SNTP的消息格式与RFC-1305中所描述的NTP格式是一致的,不同的地方是:一些SNTP的数据域已被风装,也就是说已初始化为一些预定的值。NTP消息的格式被显示如下。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|LI| VN|Mode| Stratum| Poll| Precision|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
三、tcp的确认号怎么计算
(1)之一个报文段携带了多少字节的数据?数据为从70-99
(2)主机B收到之一个报文段后发回的确认号应当是多少?发回受到的确认号为100。
(3)如果B收到第二个报文段后发回的确认号是180,试问A发送的第二个报文段的数据有多少字节?确认号为180,则数据为180-100=80。
(4)如果A发送的之一个报文段丢失了,但第二个到达B,B在第二个报文段到达后向A发送了确认。试问这个确认号应为多少?由于没有收到之一个报文段,则确认号为70。
socket中的mss相关的成员进行数据同步,其基本的一个算法是:
1、当前的MSS正常情况下应该为mtu-IP首部-TCP首部(不包括选项)。
tcp_sock->rx_opt->mss_clamp中含有对端通告的能够接受的MSS值,如果该值小于之一步计算所得到的MSS,则以该值为准。
3、IP首部如果带有IP选项,则MSS中要减去选项长度。
4、如果MSS已经小于48了,则令其等于48。
6、如果MSS当前已经大于滑动窗口大小的1/2,则取滑动窗口大小的1/2作为MSS值(但不能小于48)。
7、成员mss_cache用于缓存下刚刚计算所得的MSS。
所以,说本地以太网中MSS为1460的说法并不正确,它还会动态变化,如果IP首部和TCP首部 *** 现选项,则MSS要相应的减小,一般TCP首部中会有12字节的时间戳选项(外加两字节的填充选项),这时的MSS就等于1448。
参考资料来源:百度百科—TCP报文格式
文章到此结束,如果本次分享的tcp时间戳和tcp参数都有啥的问题解决了您的问题,那么我们由衷的感到高兴!