传输控制协议(TCP)(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)的东西来保存。OPE
N命令还指定这个连接的建立是主动请求还是被动等待请求。下面我们要涉及具体的功能
了,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里有存储了包括发送方,接收方的套接字,
用户的发送和接收的缓冲区指针等变量。除了这些还有一些变量和发送接收序列号有关

发送序列变量
SND.UNA - 发送未确认
SND.NXT - 发送下一个
SND.WND - 发送窗口
SND.UP - 发送优先指针
SND.WL1 - 用于最后窗口更新的段序列号
SND.WL2 - 用于最后窗口更新的段确认号
ISS - 初始发送序列号
 
接收序列号
RCV.NXT - 接收下一个
RCV.WND - 接收下一个
RCV.UP - 接收优先指针
IRS - 初始接收序列号
下图会帮助您了解发送序列变量间的关系:
当前段变量
SEG.SEQ - 段序列号
SEG.ACK - 段确认标记
SEG.LEN - 段长
SEG.WND - 段窗口
SEG.UP - 段紧急指针
SEG.PRC - 段优先级
连接进程是通过一系列状态表示的,这些状态有:LISTEN,SYN-SENT,SYN-RECEIVED,
ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAI
T和 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状态的转换,但这图中没有包括错误的情况和错误处理,不要把这幅
图看成是总说明了。
 
3.3. 序列号
请注意,我们在TCP连接中发送的字节都有一个序列号。因为编了号,所以可以确认它们
的收到。对序列号的确认是累积性的,也就是说,如果用户收到对X的确认信息,这表示
在X以前的数据不包括X)都收到了。在每个段中字节是这样安排的:第一个字节在包
头后面,按这个顺序排列。我们需要认记实际的序列空间是有限的,虽然很大,但是还
是有限的,它的范围是0到2的32次方减1。我想熟悉编程的一定知道为什么要在计算两个
段是不是相继的时候要使用2的32次方为模了。TCP必须进行的序列号比较操作种类包括
以下几种:
(a) 决定一些发送了的但未确认的序列号;
(b) 决定所有的序列号都已经收到了;
(c) 决定下一个段中应该包括的序列号。
对于发送的数据TCP要接收确认,处理确认时必须进行下面的比较操作:
SND.UNA = 最老的确认了的序列号;
SND.NXT = 下一个要发送的序列号;
SEG.ACK = 接收TCP的确认,接收TCP期待的下一个序列号;
SEG.SEQ = 一个数据段的第一个序列号;
SEG.LEN = 数据段中包括的字节数;
SEG.SEQ+SEG.LEN-1 = 数据段的最后一个序列号。
请注意下面的关系:
SND.UNA < SEG.ACK =< SND.NXT
如果一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了。而在接收
数据时下面的比较操作是必须的:
RCV.NXT = 期待的序列号和接收窗口的最低沿;
RCV.NXT+RCV.WND-1 = 最后一个序列号和接收窗口的最高沿;
SEG.SEQ = 接收到的第一个序列号;
SEG.SEQ+SEG.LEN-1 = 接收到的最后一个序列号;
 
上面几个量有如下关系:
RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND 或 RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.N
XT+RCV.WND
测试的第一部分是检查数据段的开始部分是否在接收窗口中,第二部分是检查数据段的
结束部分是否也在接收窗口内;上面两个检查通过任何一个就说明它包括窗口要求的数
据。实际中的情况会更复杂一些,因为有零窗口和零数据段长,因此我们有下面四种情
况:
段长度
接收窗口
测试
0
0
SEG.SEQ = RCV.NXT
0
>0
RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
>0
0
不可接受
>0
>0
RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND或RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NX
T+RCV.WND
请注意接收窗口的大小可以为零,在窗口为零时它只用来接收ACK信息,因此对于一个T
CP来说,它可以使用零大小窗口在发送数据的同时接收数据。即使接收窗口的大小为零
,TCP必须处理所有接收到信息的RST和URG域。
我们也应用计数的方式保护了一些特定的控制信息,这是通过隐式地使用一些控制标记
使数据段能够可靠地重新发送或确认)为达到的。控制信息并不在段数据空间中传送
,因此,我们必须采用隐式指定序列号进行控制。SYN和FIN是需要保护的控制量,这两
个控制量也只在连接打开和关闭时使用。SYN被认为是在第一个实际数据之间的数据,而
FIN是最后一个实际数据之后的数据。段长度SEG.LEN)包括数据和序列号空间,如果
出现了SYN,那么SEG.SEQ是SYN的序列号。
初始序列号选择
协议对于特定连接被重复使用没有什么限制。连接是由一对套接字定义的。新的连接实
例被定义为连接的另一次恢复,这就带来了问题:TCP如果确定多个数据段是从以前连接
的另一次恢复中取得的呢?这个问题在连接迅速打开和关闭,或因为内存原因被关闭然
后又迅速建立后显示特别突出。
为了避免混乱,用户必须避免因此恢复使用某一连接,而使序列号发生混乱。我们必须
保证序列号的正确性,即使TCP失败,根本不知道以前的序列号是什么的情况下也要保证
序列号的正确性。当新的连接被创建时,产生一个新的初始序列号ISN)产生子,它用
来选择一个新的32位ISN。产生子和32位时钟的低度位字节相关,低位字节的刷新频率大
概是4微秒,因此ISN的循环时间大概是4.55小时。因此我们把网络包的最长生存时间
MSL)小于4.55小时,因此我们可以认为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的网络,要4.5小时来耗尽序列空间,因为一个数据段可能的最大生存时间也不
过十几分之一秒,这就留下了足够的空间;而在100M的网络上需要5.4分钟,虽然少了点
,但也可以了。
如果在实现TCP时没有为保存序列号留下空间,那清除多余的包可能就不能实现了,因此
推荐这种类型的TCP实现最好在失败后等待MSL时间,这样保证多余的包被删除。这种情
况有时候也可能会出现在保留序列号的TCP实现中。如果TCP在选择一个另一个TCP连接正
在使用的序列号时,这台主机突然失败了,这就产生了问题。这个问题的实质在于主机
不知道它失败了多久,也不知道多余的复本是不是还在网络中。
处理这种问题的方法是等待MSL时间,如果不这样就要冒着对方错误接收数据的危险,要
等待的时间也就称为“沉默时间”。实现者可以让用户选择是不是等待,但是无论用户
如何也不见得非要等待MSL时间。
3.4. 建立一个连接
建立连接应用的是三消息握手。如果双方同时都发送SYN也没有关系,双方会发现这个S
YN中没有确认,于是就知道了这种情况,通常来说,应该发送一个"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,CL
OSING,LAST-ACK,TIME-WAIT时,放弃连接并通过用户。我们下面就详细说明后一种情
况。
通过上面的例子,我们可以看出TCP连接是如何从过期数据段的干扰下恢复的。请注意第
4行和第5行中的RSTRESET信号)。
半开连接和其它非正常状态
如果一方在未通过另一方的情况下关闭连接,或双方虽然失败而不同步的情况我们称为
半开连接状态。在一方试图发送数据时连接会自动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),而且收到的确认是对
未发出包的确认或是接收到数据段的安全级别与不能连接要求的相一一致时,就发送RS
T。如果SYN未被确认时,而且收到的数据段的优先级比要求的优先级要高,那么要么提
高本地优先级得事先征得用户和系统的许可)要么发送RST;如果接收数据段的优先级
比要求的优先级低,就算是匹配了,当然如果对方发现优先级不对提高了优先级,在下
一个包中提高了优先级,这就不算是匹配了。如果连接已经进入SYN,那么接收到数据段
的优先级必须和本地优先级一样,否则发送RST。如果到达的信息有一个ACK域,返回的
RST信息可以从ACK域中取得序列号,如果没有这个域,就把RST的序列号设置为0,ACK域
被设备为序列号和到达段长度之和。连接仍然处于与原来相同的状态。
如果连接处于同步状态ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSI
NG,LAST-ACK,TIME-WAIT),任何超出接收窗口的序列号的数据段都产生如下结果:发
出一个空确认数据段,此段中包括当前发送序列号,另外还包括一个确认指出希望接收
的下一个数据段的序列号,连接仍然保存在原来的状态。如果因为安全级,优先级之类
的问题,那就发送RST信号然后进入CLOSED状态。
RST过程
除了SYN-SENT状态外的其它状态中,所有的RST数据段可以通过检查SEQ域查明。如果序
列号在接收窗口中,RST是有效的。当连接处于SYN-SENT状态时,如果ACK域确认SYN,那
么RST也是合法的。
RST的接收方首先确认它的合法性,然后进行状态转换。如果接收方处于LISTEN状态,它
就忽略RST包。如果接收方处于SYN-RECEIVED状态,而且以前处于LISTEN状态,接收方返
回LISTEN状态,否则接收方关闭连接进入CLOSED状态。当接收方处于其它状态时,直接
关闭连接回到CLOSED状态。
 
3.5. 关闭连接
CLOSE是一个操作,它的意思就是“本方已经有数据发送”。由于是全双工的,所以会造
成一些麻烦,因为接收方对于处理接收方的连接有点麻烦。我们以一种简单的方式对待
CLOSE,发送CLOSE的一方在接收到对方的CLOSED之前,还要继续接收数据。因此程序可
以在一个CLOSE之后初始化几个SEND,然后开始RECEIVE,直到接收到对方的CLOSED而RE
CEIVE失败为止。我们假设TCP可以通知用户连接关闭,即使仍在RECEIVE也可以,这样用
户就可以正常关闭了。这样,TCP可以在连接关闭前可靠地发送数据。下面列举了三种基
本情况:
情况1:本地用户关闭
这种情况下,可以建立一个FIN段放入发送队列。TCP不再接收用户的SEND指令,TCP进入
FIN-WAIT-1状态。RECEIVE在这种状态下是允许的。所有数据段和FIN在未接收到确认以
前会一直发送。当另一个TCP确认FIN,并发送自己的FIN后,本地的TCP可以确认这个FI
N了。请注意,TCP也可以在确认FIN时不返回自己的FIN,直到用户关闭连接时再返回自
己的FIN。
情况2:TCP从网络上接收到一个FIN
如果在没有请求的情况下收到FIN,TCP可以返回ACK并通知用户连接已经关闭。用户可以
以CLOSE响应,TCP在发送完剩下的数据后发送自己的FIN,然后TCP等待对这个FIN的确认
,在接收到后,它关闭连接。如果确认超时,可以关闭连接并通知用户完事。
情况3:双方同时关闭
双方同时关闭会导致交换FIN。双方会在收到对自己FIN的确认后关闭连接。
 
3.6. 优先和安全
TCP的操作必须在两个优先级相同的端口间进行。TCP使用的优先和安全参数在IP协议中
定义。我们这里所说的安全/间隔就是指的IP中定义的优先,用户组和处理规定。如果不
符合则发送RST。这些内容请大家看上一节中的叙述。TCP在操作过程中也会检查接收数
据段的优先级,还可以在操作中提高优先级。虽然运行在无安全环境中,主机也必须能
够处理安全参数。
3.7. 数据通信
建立了连接以后就是传送数据了,TCP通过重新传送保证每个数据段到达对方,因为有了
重新传送,所以对方可能接收到两个相同的包,那就必须根据内部的序列号判断哪个数
据段是可以接收的。发送方通过使用SND.NXT跟踪下一个要发送的数据段,而接收方则跟
踪RCV.NXT来知道下一个要接收的数据段。发送方要还未确认的最老的序列号保存于SND
.UNA。
当发送方形成数据段并发送它后SND.NXT增大;当接收方接收到数据段后RCV.NXT增大并
发送确认;当发送方接收到确认后SND.UNA增大。它们三者在不同的时间增大,这是因为
传送时延造成的。而增大多少则由数据段中数据的大小决定。注意:连接进入ESTABLIS
HED状态后,所有的段必须包括当前的确认信息。而CLOSE用户操作的性质类型于推操作
,这和在接收到的数据段中的FIN标记一样。
重传超时
因为网络中有不类型的网络,而使用TCP的范围又很广,因此重传超时必须动态决定。下
面给出一个例子,通过例子可以看出确定重传超时的过程。下面有两个变量说明时延的
问题,一个是环路时间RTT),它是由一个序列码得到的,这个序列码在发送时给出,
在接收到确认时被覆盖;另一个平滑环路时间SRTT):
SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)
通过上面的式子,可以得到重传超时RTO):
RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]]
其中UBOUND是超时的上界如1分钟),LBOUND是超时的下界如1秒钟),ALPHA是平滑
因子如0.8到0.9),BETA是延时变量如1.3到2.0)。
传送紧急消息
TCP的紧急机制是允许发送者使接收者接收一些紧急消息,并让接收方在接收到这一消息
后立刻通知用户。这种机制是在数据流是加入一个点,指出这是紧急数据的结束点,当
接收方要接收到这个点之前,它会通知用户进入紧急状态,在接收到这个点的数据后,
它会通知用户进入通常状态。如果这个紧急点在用户进入紧急状态时更新,这个更新必
须对用户透明。
应用一个紧急域的方法可以达到上述目的,而URG控制标记则指明紧急域是否被使用,而
且在数据段中必须加入指示紧急点的序列号,如果没有这个标记则说明没有紧急点。如
果需要发送紧急数据,发送方必须起码发送一个字节。


相关内容

    暂无相关文章