下面的资料希望对你有用
TCP/IP 是很多的不同的协议组成,实际上是一个协议组,TCP 用户数据报表协议(也
称作TCP 传输控制协议,Transport Control Protocol。可靠的主机到主机层协议。这里要先
强调一下,传输控制协议是OSI 网络的第四层的叫法,TCP 传输控制协议是TCP/IP 传输的
6 个基本协议的一种。两个TCP 意思非相同。)。TCP 是一种可靠的面向连接的传送服务。
它在传送数据时是分段进行的,主机交换数据必须建立一个会话。它用比特流通信,即数据
被作为无结构的字节流。通过每个TCP 传输的字段指定顺序号,以获得可靠性。是在OSI
参考模型中的第四层,TCP 是使用IP 的网间互联功能而提供可靠的数据传输,IP 不停的把
报文放到网络上,而TCP 是负责确信报文到达。在协同IP 的 *** 作中TCP 负责:握手过程、
报文管理、流量控制、错误检测和处理(控制),可以根据一定的编号顺序对非正常顺序的
报文给予从新排列顺序。关于TCP 的RFC 文档有RFC793、RFC791、RFC1700。
在TCP 会话初期,有所谓的“三握手”:对每次发送的数据量是怎样跟踪进行协商使
数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完
毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP 在发送新的数据之前,以
特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP 总是用来
发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。由于TCP 需要
时刻跟踪,需要额外开销,使得TCP 的格式有些显得复杂。下面就让我们看一个TCP 的
经典案例,这是后来被称为MITNICK 攻击中KEVIN 开创了两种攻击技术:
TCP 会话劫持
SYN FLOOD(同步洪流)
在这里我们讨论的时TCP 会话劫持的问题。
先让我们明白TCP 建立连接的基本简单的过程。为了建设一个小型的模仿环境我们假
设有3 台接入互联网的机器。A 为攻击者 *** 纵的攻击机。B 为中介跳板机器(受信任的服务
器)。C 为受害者使用的机器(多是服务器),这里把C 机器锁定为目标机器。A 机器向B
机器发送SYN 包,请求建立连接,这时已经响应请求的B 机器会向A 机器回应SYN/ACK
表明同意建立连接,当A 机器接受到B 机器发送的SYN/ACK 回应时,发送应答ACK 建立
A 机器与B 机器的网络连接。这样一个两台机器之间的TCP 通话信道就建立成功了。
B 终端受信任的服务器向C 机器发起TCP 连接,A 机器对服务器发起SYN 信息,使
C 机器不能响应B 机器。在同时A 机器也向B 机器发送虚假的C 机器回应的SYN 数据包,
接收到SYN 数据包的B 机器(被C 机器信任)开始发送应答连接建立的SYN/ACK 数据包,
这时C 机器正在忙于响应以前发送的SYN 数据而无暇回应B 机器,而A 机器的攻击者预
测出B 机器包的序列号(现在的TCP 序列号预测难度有所加大)假冒C 机器向B 机器发送
应答ACK 这时攻击者骗取B 机器的信任,假冒C 机器与B 机器建立起TCP 协议的对话连
接。这个时候的C 机器还是在响应攻击者A 机器发送的SYN 数据。
TCP 协议栈的弱点:TCP 连接的资源消耗,其中包括:数据包信息、条件状态、序列
号等。通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽。
通过攻击者有意的不完成建立连接所需要的三次握手的全过程,从而造成了C 机器的
资源耗尽。序列号的可预测性,目标主机应答连接请求时返回的SYN/ACK 的序列号时可预
测的。(早期TCP 协议栈,具体的可以参见1981 年出的关于TCP 雏形的RFC793 文档)
TCP 头结构
TCP 协议头最少20 个字节,包括以下的区域(由于翻译不禁相同,文章中给出
相应的英文单词):
TCP 源端口(Source Port):16 位的源端口其中包含初始化通信的端口。源端口和
源IP 地址的作用是标示报问的返回地址。
TCP 目的端口(Destination port):16 位的目的端口域定义传输的目的。这个端口指
明报文接收计算机上的应用程序地址接口。
TCP 序列号(序列码,Sequence Number):32 位的序列号由接收端计算机使用,重
新分段的报文成最初形式。当SYN 出现,序列码实际上是初始序列码(ISN),而第一个数
据字节是ISN+1。这个序列号(序列码)是可以补偿传输中的不一致。
TCP 应答号(Acknowledgment Number):32 位的序列号由接收端计算机使用,重
组分段的报文成最初形式。,如果设置了ACK 控制位,这个值表示一个准备接收的包的序
列码。
数据偏移量(HLEN):4 位包括TCP 头大小,指示何处数据开始。
保留(Reserved):6 位值域,这些位必须是0。为了将来定义新的用途所保留。
标志(Code Bits):6 位标志域。表示为:紧急标志、有意义的应答标志、推、重置
连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、
RST、SYN、FIN。
窗口(Window):16 位,用来表示想收到的每个TCP 数据段的大小。
校验位(Checksum):16 位TCP 头。源机器基于数据内容计算一个数值,收信息机
要与源机器数值结果完全一样,从而证明数据的有效性。
优先指针(紧急,Urgent Pointer):16 位,指向后面是优先数据的字节,在URG
标志设置了时才有效。如果URG 标志没有被设置,紧急域作为填充。加快处理标示为紧急
的数据段。
选项(Option):长度不定,但长度必须以字节。如果没有选项就表示这个一字节
的域等于0。
填充:不定长,填充的内容必须为0,它是为了数学目的而存在。目的是确保空
间的可预测性。保证包头的结合和数据的开始处偏移量能够被32 整除,一般额外的零以保
证TCP 头是32 位的整数倍。
标志控制功能
URG:紧急标志
紧急(The urgent pointer) 标志有效。紧急标志置位,
ACK:确认标志
确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。
TCP 报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同
时提示远端系统已经成功接收所有数据。
PSH:推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用
处理。在处理telnet 或rlogin 等交互模式的连接时,该标志总是置位的。
RST:复位标志
复位标志有效。用于复位相应的TCP 连接。
SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立
TCP 连接时有效。它提示TCP 连接的服务端检查序列编号,该序列编号为TCP 连接初始端
(一般是客户端)的初始序列编号。在这里,可以把TCP 序列编号看作是一个范围从0 到4,
294,967,295 的32 位计数器。通过TCP 连接交换的数据中每一个字节都经过序列编号。
在TCP 报头中的序列编号栏包括了TCP 分段中第一个字节的序列编号。
FIN:结束标志
带有该标志置位的数据包用来结束一个TCP 回话,但对应端口仍处于开放状态,
准备接收后续数据。
服务端处于监听状态,客户端用于建立连接请求的数据包(IP packet)按照TCP/IP
协议堆栈组合成为TCP 处理的分段(segment)。
分析报头信息: TCP 层接收到相应的TCP 和IP 报头,将这些信息存储到内存中。
检查TCP 校验和(checksum):标准的校验和位于分段之中(Figure:2)。如果检验
失败,不返回确认,该分段丢弃,并等待客户端进行重传。
查找协议控制块(PCB{}):TCP 查找与该连接相关联的协议控制块。如果没有找
到,TCP 将该分段丢弃并返回RST。(这就是TCP 处理没有端口监听情况下的机制) 如果该
协议控制块存在,但状态为关闭,服务端不调用connect()或listen()。该分段丢弃,但不返
回RST。客户端会尝试重新建立连接请求。
建立新的socket:当处于监听状态的socket 收到该分段时,会建立一个子socket,
同时还有socket{},tcpcb{}和pub{}建立。这时如果有错误发生,会通过标志位来拆除相应
的socket 和释放内存,TCP 连接失败。如果缓存队列处于填满状态,TCP 认为有错误发生,
所有的后续连接请求会被拒绝。这里可以看出SYN Flood 攻击是如何起作用的。
丢弃:如果该分段中的标志为RST 或ACK,或者没有SYN 标志,则该分段丢弃。
并释放相应的内存。
发送序列变量
SNDUNA : 发送未确认
SNDNXT : 发送下一个
SNDWND : 发送窗口
SNDUP : 发送优先指针
SNDWL1 : 用于最后窗口更新的段序列号
SNDWL2 : 用于最后窗口更新的段确认号
ISS : 初始发送序列号
接收序列号
RCVNXT : 接收下一个
RCVWND : 接收下一个
RCVUP : 接收优先指针
IRS : 初始接收序列号
当前段变量
SEGSEQ : 段序列号
SEGACK : 段确认标记
SEGLEN : 段长
SEGWND : 段窗口
SEGUP : 段紧急指针
SEGPRC : 段优先级
CLOSED 表示没有连接,各个状态的意义如下:
LISTEN : 监听来自远方TCP 端口的连接请求。
SYN-SENT : 在发送连接请求后等待匹配的连接请求。
SYN-RECEIVED : 在收到和发送一个连接请求后等待对连接请求的确认。
ESTABLISHED : 代表一个打开的连接,数据可以传送给用户。
FIN-WAIT-1 : 等待远程TCP 的连接中断请求,或先前的连接中断请求的确认。
FIN-WAIT-2 : 从远程TCP 等待连接中断请求。
CLOSE-WAIT : 等待从本地用户发来的连接中断请求。
CLOSING : 等待远程TCP 对连接中断的确认。
LAST-ACK : 等待原来发向远程TCP 的连接中断请求的确认。
TIME-WAIT : 等待足够的时间以确保远程TCP 接收到连接中断请求的确认。
CLOSED : 没有任何连接状态。
TCP 连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,
RECEIVE,CLOSE,ABORT 和STATUS。传送过来的数据段,特别那些包括以下标记的数
据段SYN,ACK,RST 和FIN。还有超时,上面所说的都会时TCP 状态发生变化。
序列号
请注意,我们在TCP 连接中发送的字节都有一个序列号。因为编了号,所以可以
确认它们的收到。对序列号的确认是累积性的。TCP 必须进行的序列号比较 *** 作种类包括
以下几种:
①决定一些发送了的但未确认的序列号。
②决定所有的序列号都已经收到了。
③决定下一个段中应该包括的序列号。
对于发送的数据TCP 要接收确认,确认时必须进行的:
SNDUNA = 最老的确认了的序列号。
SNDNXT = 下一个要发送的序列号。
SEGACK = 接收TCP 的确认,接收TCP 期待的下一个序列号。
SEGSEQ = 一个数据段的第一个序列号。
SEGLEN = 数据段中包括的字节数。
SEGSEQ+SEGLEN-1 = 数据段的最后一个序列号。
如果一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了。而
在接收数据时下面的比较 *** 作是必须的:
RCVNXT = 期待的序列号和接收窗口的最低沿。
RCVNXT+RCVWND:1 = 最后一个序列号和接收窗口的最高沿。
SEGSEQ = 接收到的第一个序列号。
SEGSEQ+SEGLEN:1 = 接收到的最后一个序列号。概念性的东西就是以下内容:简单的来说,就是一种传输协议发出的一段数据源传输控制协议(Transmission Control Protocol, TCP)
TCP协议主为了在主机间实现高可靠性的包交换传输协议。本文将描述协议标准和实现的一些方法。因为计算机网络在现代社会中已经是不可缺少的了,TCP协议主要在网络不可靠的时候完成通信,对军方可能特别有用,但是对于政府和商用部门也适用。TCP是面向连接的端到端的可靠协议。它支持多种网络应用程序。TCP对下层服务没有多少要求,它假定下层只能提供不可靠的数据报服务,它可以在多种硬件构成的网络上运行。下面的图是TCP在层次式结构中的位置,它的下层是IP协议,TCP可以根据IP协议提供的服务传送大小不定的数据,IP协议负责对数据进行分段,重组,在多种网络中传送。
TCP的上面就是应用程序,下面是IP协议,上层接口包括一系列类似于 *** 作系统中断的调用。对于上层应用程序来说,TCP应该能够异步传送数据。下层接口我们假定为IP协议接口。为了在并不可靠的网络上实现面向连接的可靠的传送数据,TCP必须解决可靠性,流量控制的问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,同时TCP必须解决连接问题,这样TCP才能称得上是面向连接的,最后,TCP也必须能够解决通信安全性的问题。
网络环境包括由网关(或其它设备)连接的网络,网络可以是局域网也可以是一些城域网或广域网,但无论它们是什么,它们必须是基于包交换的。主机上不同的协议有不同的端口号,一对进程通过这个端口号进行通信。这个通信不包括计算机内的I/O *** 作,只包括在网络上进行的 *** 作。网络上的计算机被看作包传送的源和目的结点。特别应该注意的是:计算机中的不同进程可能同时进行通信,这时它们会用端口号进行区别,不会把发向A进程的数据由B进程接收的。
进程为了传送数据会调用TCP,将数据和相应的参数传送给TCP,于是TCP会将数据传送到目的TCP那里,当然这是通过将TCP包打包在IP包内在网络上传送达到的。接收方TCP在接收到数据后会通信上层应用程序,TCP会保证接收数据顺序的正确性。虽然下层协议可能不会保证顺序是正确的。这里需要说明的是网关在接收到这个包后,会将包解开,看看是不是已经到目的地了,如果没有到,应该走什么路由达到目的地,在决定后,网关会根据下一个网络内的协议情况再次将TCP包打包传送,如果需要,还要把这个包再次分成几段再传送。这个落地检查的过程是一个耗时的过程。从上面,我们可以看出TCP传送的基本过程,当然具体过程可能要复杂得多。
在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些 *** 作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,IP向TCP提供所有TCP需要的服务。通过下图我们可以更清楚地看到TCP协议的结构。
上面已经说过了,TCP连接是可靠的,而且保证了传送数据包的顺序,保证顺序是用一个序号来保证的。响应包内也包括一个序列号,表示接收方准备好这个序号的包。在TCP传送一个数据包时,它同时把这个数据包放入重发队列中,同时启动记数器,如果收到了关于这个包的确认信息,将此包从队列中删除,如果计时超时则需要重新发送此包。请注意,从TCP返回的确认信息并不保证最终接收者接收到数据,这个责任由接收方负责。
每个用于传送TCP的通道都有一个端口标记,因为这个标记是由每个TCP终端确定的,因此TCP可能不唯一,为了保证这个数值的唯一,要使用网络地址和端口号的组合达到唯一标识的目的,我们称这个为了套接字(Socket),一个连接由连接两端的套接字标识,本地的套接字可能和不同的外部套接字通信,这种通信是全双工的。
通过向本地端口发送OPEN命令及外部套接字参数建立连接,TCP返回一个标记这个连接的名称,以后如果用户需要使用这个名称标记这个连接。为了保存这个连接的信息,我们假设有一个称为传输控制块(Transmission Control Block,TCB)的东西来保存。OPEN命令还指定这个连接的建立是主动请求还是被动等待请求。下面我们要涉及具体的功能了,TCP段以internet数据报的形式传送。IP包头传送不同的信息域,包括源地址和目的地址。TCP头跟在internet包头后面,提供了一些专用于TCP协议的信息。下图是TCP包头格式图:
源端口:16位;
目的端口:16位
序列码:32位,当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1;
确认码:32位,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码;
数据偏移量:4位,指示何处数据开始;
保留:6位,这些位必须是0;
控制位:6位;
窗口:16位;
校验位:16位;
优先指针:16位,指向后面是优先数据的字节;
选项:长度不定;但长度必须以字节记;选项的具体内容我们结合具体命令来看;
填充:不定长,填充的内容必须为0,它是为了保证包头的结合和数据的开始处偏移量能够被32整除;
我们前面已经说过有一个TCB的东西了,TCB里有存储了包括发送方,接收方的套接字,用户的发送和接收的缓冲区指针等变量。除了这些还有一些变量和发送接收序列号有关:
发送序列变量
SNDUNA - 发送未确认
SNDNXT - 发送下一个
SNDWND - 发送窗口
SNDUP - 发送优先指针
SNDWL1 - 用于最后窗口更新的段序列号
SNDWL2 - 用于最后窗口更新的段确认号
ISS - 初始发送序列号
接收序列号
RCVNXT - 接收下一个
RCVWND - 接收下一个
RCVUP - 接收优先指针
IRS - 初始接收序列号
下图会帮助您了解发送序列变量间的关系:
当前段变量
SEGSEQ - 段序列号
SEGACK - 段确认标记
SEGLEN - 段长
SEGWND - 段窗口
SEGUP - 段紧急指针
SEGPRC - 段优先级
连接进程是通过一系列状态表示的,这些状态有:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT和 CLOSED。CLOSED表示没有连接,各个状态的意义如下:
LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT - 在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED - 代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求;
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
CLOSING - 等待远程TCP对连接中断的确认;
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;
TCP连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS;传送过来的数据段,特别那些包括以下标记的数据段SYN,ACK,RST和FIN;还有超时,上面所说的都会时TCP状态发生变化。
下面的图表示了TCP状态的转换,但这图中没有包括错误的情况和错误处理,不要把这幅图看成是总说明了。
33 序列号
请注意,我们在TCP连接中发送的字节都有一个序列号。因为编了号,所以可以确认它们的收到。对序列号的确认是累积性的,也就是说,如果用户收到对X的确认信息,这表示在X以前的数据(不包括X)都收到了。在每个段中字节是这样安排的:第一个字节在包头后面,按这个顺序排列。我们需要认记实际的序列空间是有限的,虽然很大,但是还是有限的,它的范围是0到2的32次方减1。我想熟悉编程的一定知道为什么要在计算两个段是不是相继的时候要使用2的32次方为模了。TCP必须进行的序列号比较 *** 作种类包括以下几种:
(a) 决定一些发送了的但未确认的序列号;
(b) 决定所有的序列号都已经收到了;
(c) 决定下一个段中应该包括的序列号。
对于发送的数据TCP要接收确认,处理确认时必须进行下面的比较 *** 作:
SNDUNA = 最老的确认了的序列号;
SNDNXT = 下一个要发送的序列号;
SEGACK = 接收TCP的确认,接收TCP期待的下一个序列号;
SEGSEQ = 一个数据段的第一个序列号;
SEGLEN = 数据段中包括的字节数;
SEGSEQ+SEGLEN-1 = 数据段的最后一个序列号。
请注意下面的关系:
SNDUNA < SEGACK =< SNDNXT
如果一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了。而在接收数据时下面的比较 *** 作是必须的:
RCVNXT = 期待的序列号和接收窗口的最低沿;
RCVNXT+RCVWND-1 = 最后一个序列号和接收窗口的最高沿;
SEGSEQ = 接收到的第一个序列号;
SEGSEQ+SEGLEN-1 = 接收到的最后一个序列号;
上面几个量有如下关系:
RCVNXT =< SEGSEQ < RCVNXT+RCVWND 或 RCVNXT =< SEGSEQ+SEGLEN-1 < RCVNXT+RCVWND
测试的第一部分是检查数据段的开始部分是否在接收窗口中,第二部分是检查数据段的结束部分是否也在接收窗口内;上面两个检查通过任何一个就说明它包括窗口要求的数据。实际中的情况会更复杂一些,因为有零窗口和零数据段长,因此我们有下面四种情况:
段长度
接收窗口
测试
0
0
SEGSEQ = RCVNXT
0
>0
RCVNXT =< SEGSEQ < RCVNXT+RCVWND
>0
0
不可接受
>0
>0
RCVNXT =< SEGSEQ < RCVNXT+RCVWND或RCVNXT =< SEGSEQ+SEGLEN-1 < RCVNXT+RCVWND
请注意接收窗口的大小可以为零,在窗口为零时它只用来接收ACK信息,因此对于一个TCP来说,它可以使用零大小窗口在发送数据的同时接收数据。即使接收窗口的大小为零,TCP必须处理所有接收到信息的RST和URG域。
我们也应用计数的方式保护了一些特定的控制信息,这是通过隐式地使用一些控制标记使数据段能够可靠地重新发送(或确认)为达到的。控制信息并不在段数据空间中传送,因此,我们必须采用隐式指定序列号进行控制。SYN和FIN是需要保护的控制量,这两个控制量也只在连接打开和关闭时使用。SYN被认为是在第一个实际数据之间的数据,而FIN是最后一个实际数据之后的数据。段长度(SEGLEN)包括数据和序列号空间,如果出现了SYN,那么SEGSEQ是SYN的序列号。
初始序列号选择
协议对于特定连接被重复使用没有什么限制。连接是由一对套接字定义的。新的连接实例被定义为连接的另一次恢复,这就带来了问题:TCP如果确定多个数据段是从以前连接的另一次恢复中取得的呢?这个问题在连接迅速打开和关闭,或因为内存原因被关闭然后又迅速建立后显示特别突出。
为了避免混乱,用户必须避免因此恢复使用某一连接,而使序列号发生混乱。我们必须保证序列号的正确性,即使TCP失败,根本不知道以前的序列号是什么的情况下也要保证序列号的正确性。当新的连接被创建时,产生一个新的初始序列号(ISN)产生子,它用来选择一个新的32位ISN。产生子和32位时钟的低度位字节相关,低位字节的刷新频率大概是4微秒,因此ISN的循环时间大概是455小时。因此我们把网络包的最长生存时间(MSL)小于455小时,因此我们可以认为ISN是唯一的。对于每个连接都有发送序列号和接收序列号,初始发送序列号(ISS)由发送TCP选择,而初始接收序列号是在连接建立过程中产生的。
对于将要连接或初始化的连接,两个TCP必须和对方的初始序列号同步。这通过交换一个控制位SYN和初始序列号完成。我们把带有SYN的数据段称为"SYNs"。同步的获得过程这里就不重复了,每方必须发送自己的序列号并返回对对方序列号的确认。
1) A --> B SYN 本方序列号是X
2) A <-- B ACK 本方序列号被确认
3) A <-- B SYN 对方序列号是Y
4) A --> B ACK 确认对方序列号
上面的第2步和第3步可以合并,这时可以成为3阶段,所以我们可以称它为三消息握手。这个过程是必须的,因为序列号不和全局时钟关联,TCP也可以有不同的机制选择ISN。接收到第一个SYN的接收方不可能知道这个数据段是不是被延时,除非它记住了在连接上使用的最近的序列号(这通常是不可能的),因此它必须要求发送者确认。
为了保证TCP获得的确认是刚才发送的段产生的,而不是仍然在网络中的老数据段产生的,因此TCP必须在MSL时间之内保持沉默。在本文中,我们假设MSL=2小时,这是出于工程的需要,如果用户觉得可以,他可以改变MSL。请注意如果TCP重新初始化,而内存中的序列号正在使用,不需要等待,但必须确认使用的序列号比当前使用的要大。
如果一台主机在未保留任何序列号的情况下失败,那么它应该在MSL时间之内不发出任何数据段。下面将会这一情况进行说明。TCP的实现可以不遵守这个规定,但是这会造成老数据被当成新数据接收,而新数据被当成老数据拒绝的情况。
每当数据段形成并进入输出队列,TCP会为它指定序列空间中的一个值。TCP中多复本检测和序列算法都依赖于这个地址空间,在对方发送或接收之前不会超过2的32次方个包存在于输出队列中。所有多余的数据段都会被删除。如果没有这个规定,会出现多个数据段被指定同一个序列号的情况,会造成混乱。数据段中序列号的多少和数据段中的字节数一样多。
在通常情况下,TCP保留下一个要发送的序列号和还未确认的最老的序列号,不要在没有确认的时候就再次使用,这样会有些风险,也正是因为这样的目的,所以序列空间很大。对于2M的网络,要45小时来耗尽序列空间,因为一个数据段可能的最大生存时间也不过十几分之一秒,这就留下了足够的空间;而在100M的网络上需要54分钟,虽然少了点,但也可以了。
如果在实现TCP时没有为保存序列号留下空间,那清除多余的包可能就不能实现了,因此推荐这种类型的TCP实现最好在失败后等待MSL时间,这样保证多余的包被删除。这种情况有时候也可能会出现在保留序列号的TCP实现中。如果TCP在选择一个另一个TCP连接正在使用的序列号时,这台主机突然失败了,这就产生了问题。这个问题的实质在于主机不知道它失败了多久,也不知道多余的复本是不是还在网络中。
处理这种问题的方法是等待MSL时间,如果不这样就要冒着对方错误接收数据的危险,要等待的时间也就称为“沉默时间”。实现者可以让用户选择是不是等待,但是无论用户如何也不见得非要等待MSL时间。
34 建立一个连接
建立连接应用的是三消息握手。如果双方同时都发送SYN也没有关系,双方会发现这个SYN中没有确认,于是就知道了这种情况,通常来说,应该发送一个"reset"段来解决这种情况。三消息握手减少了连接失败的可能性。下面就是一个例子,在尖括号是的就是数据段中的内容和标记。其它的就不多说了。
在第2行,TCP A发送SYN初始化序列号,表示它要使用序列号100;第3行中,TCP B给出确认,并且期待着A的带有序列号101的数据段;第4行,TCP A给出确认,而在第5行,它也给出确认,并发送了一些数据,注意第4行的序列号与第5号的一样,因为ACK信息不占用序列号空间内的序列号。同时产生请求的情况如下图所示,只复杂一点。
使用三消息握手的主要原因是为了防止使用过期的数据段。为了这个目的,必须引入新的控制消息,RESET。如果接收TCP处理非同步状态,在接收到RESET后返回到LISTEN状态。如果TCP处理下面几种状态ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT时,放弃连接并通过用户。我们下面就详细说明后一种情况。
通过上面的例子,我们可以看出TCP连接是如何从过期数据段的干扰下恢复的。请注意第4行和第5行中的RST(RESET信号)。
半开连接和其它非正常状态
如果一方在未通过另一方的情况下关闭连接,或双方虽然失败而不同步的情况我们称为半开连接状态。在一方试图发送数据时连接会自动RESET。然而这种情况毕竟属于不正常情况。应该做出相应的处理。如果A处的连接已经关闭,B处并不知道。当B希望发送数据到A时,就会收到RESET信号,表示这个TCP连接有误,要中止当前连接。
假设A和B两个进程相互通信的时候A的TCP发生了失败,A依靠 *** 作系统支持TCP的存在,通常这种情况下会有恢复机制起作用,当TCP重新恢复的时候,A可能希望从恢复点开始工作。这样A可能会试图OPEN连接,然后在这个它认为还是打开的连接上传送数据,这时A会从本地(也就是A的)TCP上获得错误消息“未打开连接”。A的TCP将发送包括SYN的数据段。下面的例子将显示这一过程:
上面这个例子中,A方收到的信息并没有确认任何东西,这时候A发现出了问题,于是发送了RST控制信息。另一种情况是发生在A失败,而B方仍然试图发送数据时,下面的例子可以表示这种情况,请注意第2行中A对B发送来的信息不知所云。
在下面的例子中,A方和B方进行的被动连接,它们都在等待SYN信息。过期的包传送到B方使B回应了,而收到回应的A却发现不对头,传送RST控制信息,B方返回被动LISTEN状态。
现实中的情况太多了,我们列举一些产生RST控制信息的规则如下:通常情况下,RST在收到的信息不是期待的信息时产生。如果在不能确定时不要轻易发送RST控制信息。下面有三类情况:
如果连接已经不存在,而发送来的消息又不是RST,那么要返回RST。如果想拒绝对不存在的连接进行SYN,可以使用这种办法。如果到达的信息有一个ACK域,返回的RST信息可以从ACK域中取得序列号,如果没有这个域,就把RST的序列号设置为0,ACK域被设备为序列号和到达段长度之和。连接仍然处于CLOSE状态。
如果连接处于非同步状态(LISTEN,SYN-SENT,SYN-RECEIVED),而且收到的确认是对未发出包的确认或是接收到数据段的安全级别与不能连接要求的相一一致时,就发送RST。如果SYN未被确认时,而且收到的数据段的优先级比要求的优先级要高,那么要么提高本地优先级(得事先征得用户和系统的许可)要么发送RST;如果接收数据段的优先级比要求的优先级低,就算是匹配了,当然如果对方发现优先级不对提高了优先级,在下一个包中提高了优先级,这就不算是匹配了。如果连接已经进入SYN,那么接收到数据段的优先级必须和本地优先级一样,否则发送RST。如果到达的信息有一个ACK域,返回的RST信息可以从ACK域中取得序列号,如果没有这个域,就把RST的序列号设置为0,ACK域被设备为序列号和到达段长度之和。连接仍然处于与原来相同的状态。
如果连接处于同步状态(ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT),任何超出接收窗口的序列号的数据段都产生如下结果:发出一个空确认数据段,此段中包括当前发送序列号,另外还包括一个确认指出希望接收的下一个数据段的序列号,连接仍然保存在原来的状态。如果因为安全级,优先级之类的问题,那就发送RST信号然后进入CLOSED状态。哪个翻译软件最好?
Trados:翻译辅助工具(CAT)领域的领头羊,部分原因是她强大的功能,但成为领头羊最重要的原因是起步早。当其他CAT工具如雨后春笋般出现的时候,连shine on you都是青出于蓝而胜于蓝。但是Trados已经占据了最大的市场份额,无人能及。但是,在使用它翻译文档的过程中,我们经常会遇到各种各样的问题,有时会导致无法翻译,或者无法将翻译后的文档导入到原始格式,给翻译人员和项目经理带来了极大的不便。Trados这个名字来自三个英语单词。它们是翻译、文档和软件。其中三个字母“TRA”用于“翻译”,两个字母“do”用于“文档”,字母“S”用于“软件”。把这些字母组合起来,你就会得到“TRADOS”。在翻译Word文件的时候,它是以依赖的情况存在的,但是它的Tageditor非常强大,可以作为翻译大部分文件格式的平台。但是它在2005年6月被SDL收购的真正原因仍然未知。
SDLX:也是一款不错的翻译工具,功能强大,但是起步比Trados晚很多。作为一个独立的翻译所有文件格式的平台,原文和译文对称显示,让人感觉很直观,所有 *** 作在一个界面完成,并且可以时时查看源文件和目标文件。该功能相对于Trados有很多优点,但有些地方还是存在不足,比如只有MDB格式的TM,有时文件中的代码比较复杂,对整句的识别能力不强。成功收购Trados后,更是如虎添翼。借助Trados的销售网络和名气,成功开拓了自己的市场和知名度,有大把的钱。2009年初,结合了SDLX和Trados优势的SDL工作室2009推出。具体可以参考我的另一篇原创文章。对了,2009自带的Trados 2007中的Tageditor真的很烂。很难想象版本更高,但速度极其缓慢——有时打开一个TTX文件需要3-4个小时。
dejavu:CAT领域的后起之秀,强大的文件处理功能,独立的 *** 作平台,对称直观的界面,可以接受TMX格式的TM。最好的是自带的QA功能,最大的缺点是代码太多,不好处理。优点是准备翻译文件的过程简单易学,文件生成速度快,一个界面可以翻译多个文件,不用担心一致性问题。还有文件导出导入校对功能。使用时很少出错,比Trados好多了。 *** 作界面没有“保存”按钮,因为保存是自动的,所以不用担心断电、死机等意外故障。因为起步晚,功夫高于前辈,也因为起步晚,市场份额小。我强烈推荐使用这个软件。
MemoQ:和似曾相识很像。刚开始的时候,我已经尝试过几次了。感觉很好。在某些方面高于似曾相识,但因为代码的原因还是很头疼。据说可以让使用其他CAT工具的用户直接过渡到MemoQ,但是没有尝试过。
Logoport:Lionbridge的免费产品嵌入了Word工具,但其RTF文件是如何制作的就不得而知了。它使用在线TM服务器,很多翻译人员可以同时翻译一个文件,TM可以一直共享。这个和免费使用可以说是Logoport最大的优势。但是因为在线TM,可能是他们服务器在国外的原因。每打开一个翻译单元,都要一两秒钟,翻译人员抱怨个不停。第一次看到分析的日志文件,可能会被误导,以为那些100%匹配的就不需要翻译了。事实上,Logoport会分析未翻译的文件,并从该文件中翻译出TM结果。乍一看,好像匹配的很多,其实都是需要翻译的“生词”。但是匹配部分的算钱方法是合理的,比Trados匹配部分高很多。
Wordfast:少数能和SDL·特拉多斯竞争的猫之一。最初的版本和Logoport一样,嵌入在Word中,但不是免费的。翻译效果和Trados Workbench翻译的一样。不干净文件的代码非常相似。Trados Clean或TM可以升级。后来2008年底发布的版本先进很多,也是独立平台。PM做的文件是TXML格式的,一般需要连接online TM才能读出匹配的,所以至今没有发现盗版。
Transit:据说这个工具广泛应用于欧洲语言之间的翻译,韩语是我所知道的唯一使用过这个工具的东方语言。虽然功能还不错,但是 *** 作起来很麻烦。显然,没有其他工具可以使用。每次见到她,我就头疼。此外,该文件只能在PM端生成并导出到目标文件。最近有了新的NXT版本。不知道用起来会是什么样。
成语:是免费工具, *** 作简单,易学。翻译界面类似《似曾相识》,但也有代码问题。谷歌的翻译项目规定了软件的使用(以前叫Trados)。发送用于翻译的文件由客户端制作,并且最终翻译的文件也在客户端生成。其本身的强大功能也不容小觑。
Transmate:Transmate系列软件是计算机辅助翻译软件(CAT)的工具,由成都优译信息技术有限公司研发,是目前国内自主研发的第一款翻译辅助软件。其单机版免费使用,可提高翻译速度132倍,更适合中国人的习惯,更懂中国人。答:原因如下:
原因1:服务器不兼容自己整合包里的mod
原因2:服务器整合包里的工会插件错误
原因3:客户端问题
如果服务器不兼容自己整合包里的mod,就要联系服务器管理员了
整合包里的插件错误很常见(2333),你只要重新下载就可以了,下载地址:>Trados:翻译辅助工具(CAT)领域的老大,部分原因是因为她强大的功能,但成为老大最重要的原因是因为它起步早。当别的CAT工具如雨后春笋般的出现时,甚至大有青出于蓝而胜于蓝之势,然而Trados 早已占领了最大的市场份额,无人能敌。但是使用它翻译文件的过程中经常会遇到各种问题,有时候导致翻译无法进行,或者翻译完的文件无法导回原来的格式,给翻译和项目经理带来很大不便。Trados这一名称取自三个英语单词。它们分别是:Translation、document和Software。其中,在“Translation”中取了"TRA"三个字母,在"document"中取了"do"两个字母,在"Software"中取了“S”一个字母。把这些字母组合起来就是"TRADOS"了。翻译Word文件时,以依附形势存在,但是它的Tageditor功能十分强大,可以作为翻译绝大多数文件格式的平台。但至于它在2005年6月被SDL 收购的真正原因,至今不得而知。\x0d\\x0d\SDLX:也是不错的翻译工具,功能也很强大,但起步比Trados 晚得多。可以作为翻译所有文件格式的独立平台,原文和译文对称显示,给人感觉很直观,所有 *** 作在一个界面完成,并可以时时察看源文件和目标文件。功能较Trados 有很多过人之处,但个别地方还有不足,比如只能用MDB格式的TM,文件中的码有时候比较复杂,识别整句能力不强等。在成功收购了Trados之后,如虎添翼,借助Trados的销售网络和名气,顺利开拓自己的市场和知名度,银子大大地有。2009 年年初推出了SDL Studio 2009,结合了SDLX 和 Trados 优势于一身,具体内容可参考我的另一篇原创。顺便说一句,2009自带的Trados 2007 中的Tageditor 实在是差劲的很,很难想象版本高了,速度反而却慢得要命---打开一个TTX文件有时候甚至需要3-4个小时。\x0d\\x0d\Deja Vu:CAT 领域的后起之秀,有强大的文件处理功能,独立的 *** 作平台,左右对称的直观界面,可以接受TMX格式的TM。最出色的是自带的QA功能,最大的缺点是码多,不太好处理。好处是准备翻译文件过程简单易学,文件生成速度快,多个文件在一个界面内进行翻译 *** 作,不用担心一致性问题。还有文件导出导入校对功能。 使用时极少出错,这点比Trados强的多。 *** 作界面没有“保存”按钮,因为保存是自动进行的,所以不用担心断电,死机等意外故障。因为起步太晚,所以功夫比前辈们要高一些,但也因为起步晚,占有的市场份额不大。个人极力推荐使用本软件。\x0d\\x0d\MemoQ:和Deja Vu 十分相像,刚刚起步,个人也试着用过几次,感觉还不错,某些方面比Deja Vu 还要高,但是还是码的问题让人头疼。据说它可以让使用其他CAT工具的用户直接过渡到MemoQ上,没有试过。\x0d\\x0d\Logoport:Lionbridge 的免费产品,嵌入Word工具中,至于它的RTF文件是怎么做出来的,不得而知。它使用在线的TM服务器,可以很多译员同时翻译一个文件,TM时时共享,这和免费使用可以说是Logoport最大的优势,但是因为使用在线的TM,可能是他们服务器在国外的原因,每打开一个翻译单元格,都要花费一两秒钟的时间,译员怨声不断。初次看到分析出来的Log文件,可能会受到误导,认为那些100%匹配不用翻译,其实Logoport是用本文件将要翻译出来的TM结果分析未曾翻译的文件,乍一看好似很多匹配,实际上都是需要翻译的“新词”,不过,匹配部分算钱的办法还算合理,比Trados匹配部分要高很多。\x0d\\x0d\Wordfast:能和SDL Trados 抗衡的为数不多的CAT 之一,最初的版本和Logoport一样,是嵌入Word中的,但是他不是免费的,翻译的效果和用Trados Workbench翻译出来的东西一样,Unclean 文件的码也十分相近,可以用Trados Clean 或升级TM。后来2008年年末出的版本就高级多了,也是个独立的平台,PM做出来的文件是TXML格式的,一般需要连接在线的TM才能读出匹配来,所以盗版至今没有发现。\x0d\\x0d\Transit: 据说欧洲语言之间翻译很多用这个工具,我所知道的东方语言只有韩语用过这个工具。虽然功能也不差,但是 *** 作起来很是麻烦,明显没有其他工具好用,每次看见她都头疼。而且文件只能在PM端生成并导出目标文件。最近新出了一个NXT版本,不知道用起来会怎么样。\x0d\\x0d\Idiom:是个免费的工具, *** 作简单易学,翻译界面类似Deja Vu,也有码的问题。Google 产品的翻译项目指定使用软件(之前是Trados)。发给翻译的文件由客户端制作,最终翻译文件也是在客户端生成。自身功能强大,不可小视。\x0d\\x0d\Transmate:Transmate系列软件是计算机辅助翻译软件(CAT)工具,由成都优译信息技术有限公司研发,也是目前中国首个自主研发的翻译辅助软件。其单机版是免费使用,可以提升翻译速度132倍,更适合中国人的习惯,更懂中国人。
那是因为无法连接SQL服务器,解决的方法和详细的 *** 作步骤如下:
1、第一步,在“开始”程序中,展开SQL2012 —配置工具— SQL Server配置管理器,然后双击以打开SQL Server配置管理器,见下图,转到下面的步骤。
2、第二步,执行完上面的 *** 作之后,双击SQL Server服务,以检查SQL Server(MSSQLSERVER)是否正常运行,见下图,转到下面的步骤。
3、第三步,执行完上面的 *** 作之后,如果显示已停止,则只需手动启动即可,见下图,转到下面的步骤。
4、第四步,执行完上面的 *** 作之后,可以重新连接到SQL Server以正常登录,见下图。这样,就解决了这个问题了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)