首页 理论教育TCP协议:计算机网络技术及应用

TCP协议:计算机网络技术及应用

【摘要】:TCP是传输控制协议,它是TCP/IP协议簇中的一个重要协议。图2-9显示出了从发送方的高层协议通过TCP到达接收方的高层协议数据传输的完整过程。TCP允许两个应用程序建立一个连接,然后发送完数据并终止连接。总之,TCP协议使两台计算机上的程序通过互联网以类似于电话的方式进行通信成为可能。TCP将自动检测丢失的数据包,并且要求对方计算机在数据丢失时重发数据。

TCP是传输控制协议,它是TCP/IP协议簇中的一个重要协议。它对应于OSI模型的传输层,是在IP协议的基础上,提供一种面向连接的、可靠的(没有数据重复或丢失)数据流传输服务。

图2-9显示出了从发送方的高层协议通过TCP到达接收方的高层协议数据传输的完整过程。

根据图2-9对TCP报文段的传输过程说明如下。

(1)发送方的高层协议发出一个数据流给它的TCP实体进行传输。

(2)TCP将此数据流分成段,然后将这些段交给IP。

(3)IP对这些报文段执行它的服务过程,包括创建IP分组、数据报分割等,并在数据报通过数据链路层和物理层后经过网络传给接收方的IP。

(4)接收方的IP在可能采取分组检验和重组分段的工作后,将数据报变成段的形式送给接收方的TCP。

图2-9 TCP报文段的传输过程

(5)接收方的TCP完成它自己的任务,将报文段恢复成它原来的数据“流”形式,送给接收方的高层协议。

1.TCP提供的3种最重要的服务

(1)可靠地传输消息

应用层提供可靠的面向连接服务,确保发送端发出的消息能够被接收端正确无误地接收到。TCP去掉重复的数据,在数据丢失时重发数据,并且保证精确地按原发送顺序重新组装数据。

TCP允许两个应用程序建立一个连接,然后发送完数据并终止连接。所谓连接,就是两个对等实体为进行数据通信而进行的一种结合。面向连接服务是在数据交换之前,必须先建立连接,当数据交换结束后,则应终止这个连接。面向连接服务具有连接建立、数据传输和连接释放三个阶段。总之,TCP协议使两台计算机上的程序通过互联网以类似于电话的方式进行通信成为可能。一旦两个程序建立了连接,那么它们可以在交换任意大小的数据后再结束通信。

当路由器由于到达的数据包过多而引起超载的时候,它必须将一些数据包丢弃,结果,一个数据包在互联网上传输时就可能丢失。TCP将自动检测丢失的数据包,并且要求对方计算机在数据丢失时重发数据。

互联网结构复杂,每个数据包可以通过多条路径到达同一目的地。当路由器开始沿另外一条新的路径传送数据包,就好像高速公路上的汽车在前方出现问题时会绕道而行一样。由于路径的变化,一些数据包会按它们发送时不同的顺序到达目的地,TCP自动检测到来的数据包,并且将它们按原来的顺序调整过来。

有时,网络硬件故障也会导致重复地发送同一个数据包,结果一个数据包的多个副本可能会重复到达目的地。TCP将自动检测有没有重复的数包报发来,如果有,它只接受最先到达的数据包。

总之,尽管IP协议使计算机能够发送和接收数据包,但IP协议并未解决数据包在传输过程中所有可能出现的问题,因此连上互联网的计算机还需要TCP协议来提供可靠的无差错的通信服务。

(2)流量控制

TCP在其连接的通信过程中,能够调整流量,以防止内部的TCP数据传递出现拥挤,从而导致服务质量下降和出错。

为了控制流量,TCP模块间通信采用了窗口机制。这里,窗口是接收方接收字节数量能力的表示。在ACK应答信息中,加上接收方允许接收数据范围的信息回送给发送方。发送方除非收到来自接收方的最大数据允许接收范围的信息,否则总是使用由接收方提供的这一范围发送的数据。

当建立一个连接时,连接双方的主机都给TCP分配了一定数量的缓存。每当进行一次TCP连接时,接收方主机只允许发送端主机发送的数据不大于缓存空间的大小。如果没有流量控制,发送端主机就可能以比接收端主机快得多的速度发送数据,这使得接收端的缓存出现溢出现象。因此,接收方必须随时通报缓冲区的剩余空间,以便发送方调整流量。

(3)阻塞控制

任何一个网络,当过多的数据进入时,都会导致网络阻塞,互联网也不例外。阻塞发生时会引起发送端超时,虽然超时也有可能是由数据传输出错引起的,但在当前数字化网络环境中,由于传输介质(例如使用光纤)的可靠性越来越高,数据传输出错的可能性很小。因此导致超时的绝大多数原因是网络阻塞。TCP实体就是根据超时来判断是否发生了网络阻塞的。

TCP考虑到网络的处理能力,除了设置接收通告窗口外,还在发送端设置一个阻塞窗口,发送窗口必须是接收通告窗口和阻塞窗口中较小的那一个,即

发送窗口=min(接收通告窗口,阻塞窗口)

与接收通告窗口一样,阻塞窗口也是动态可变的。在连接建立时,阻塞窗口被初始化成该连接支持的最大段长度,然后TCP实体发送一个最大长度的段;如果这个段没有超时,则将阻塞窗口调整成两个最大段长度,然后发送两个最大长度的段;每当发送出去的段都及时地得到应答,就将阻塞窗口加倍,直至最终达到接收窗口大小或发生超时,这种算法称为“慢启动”。如果发生了超时,TCP实体将一个门限参数设置成当前阻塞窗口的一半,然后将阻塞窗口重新初始化成最大段长度,再一次执行慢启动算法,直至阻塞窗口大小达到设定的门限值;这时减慢阻塞窗口增大的速率,每当发送出去的段得到了及时应答,就将阻塞窗口增加一个最大段长度,如此,阻塞窗口呈线性增大,直至达到接收通告窗口大小或又发生超时。当阻塞窗口达到接收通告窗口时,便不再增大,此后一直保持不变,除非接收通告窗口改变或又发生超时;如果发生超时,则使用上述阻塞控制算法重新确定合适的阻塞窗口大小。

TCP确保每次TCP连接不过分加重路由器的负担,当网络上的链路出现拥挤时,经过这个链路的TCP连接将自身调节以减缓拥挤。

采用以上的流量控制和阻塞控制机制后,发送端可以随时根据接收端的处理能力和网络的处理能力来选择一个最适合的发送速率,从而充分有效地利用网络资源。

2.TCP报文段的格式

TCP协议在两台计算机之间传输的数据单元称为报文段。报文段交换涉及建立连接、传输数据、发送确认、通知窗口尺寸,直到关闭连接。TCP报文段的格式如图2-10所示。报文段既可以用来建立连接,也可以运载数据和应答。

(www.chuimin.cn)

图2-10 TCP报文段的格式

每个报文段分为两部分,前面是TCP头,后面是数据。在TCP头中的源端口段和目的端口段各包含一个TCP的端口号,分别标识连接两端的两个应用程序。序列号标识本报文段中的数据在发送者字节流中的位置。确认号标识本报文段的源发方下一个期待接收的字节的编号。

偏移段包含一个整数,指明报文段头的长度,单位是32位。需要这个段是因为TCP头中的任选项段长度可变。因此,这个TCP报头的长度随所选的选项而变化,标有保留的段为6位,留给将来使用。

有些报文段只载送应答,而另外的报文段载送数据。还有的报文段请求建立或关断一条连接。TCP协议使用标有编码位的6位段确定报文段的目的与内容。表2-3列出了这6位编码位段中各位的含义。

表2-3 TCP报文段头中6位编码位段中各位的含义

TCP协议每次发送一个报文段时,通过在窗口段中指定它的缓冲区大小,通告它愿意接收多少数据。该段包含一个网络标准字节顺序表示的32位无符号整数。窗口通告给出了捎带机制的又一例子,因为它们伴随所有的TCP报文段,既包括那些运载数据的报文段,也包括那些仅运载应答确认的报文段。

尽管TCP是面向流的协议,但有时候处于连接的一端的程序也需要立即发送带外数据,而不用等待连接的另一端上的程序消耗完数据流中正传输的数据。为了提供带外信令,TCP允许发送者把数据指定成紧急的,这意味着接收程序应被尽可能快地通知紧急数据到达,而不管紧急数据处于流中什么位置。当在一个报文段中发送紧急数据时用以标志紧急数据的机制由CODE段中的URG位和紧急指针段组成。当URG位置为1时,紧急指针指出窗口中紧急数据结束的位置。紧急指针的值是从序列号段值开始算起的数据段中的正偏移。将紧急指针值与序列号相加就得到最后一个紧急数据字节的编号。

TCP头中的可选项段用来处理其他各种情况。目前被正式使用的可选项可用于定义通信过程中最大报文段长,它只能在连接之时使用。

可选项的长度是可变的,只要求它以字节为单位,因此有可能不是32的整数倍。在不是32位的整数倍的情况下,为使可选项长度成为32位整数倍,可在表示可选项的结束的可选项后面填充一些位来满足要求。

TCP头中的检验与用于头和数据中的所有16位字,检验和也覆盖了在概念上附加在TCP报头前的伪报头(伪头),该伪头含有源地址、目标地址、协议标识符和TCP段长,如图2-11所示。

图2-11 TCP伪报头结构

在伪头内,标有发送方IP地址和接收方IP地址的段分别包含报源互联网地址和报宿互联网地址。这两个地址在发送TCP报文时都要用到,协议标识符段包含IP分组的协议类型码,每段又标明了报文段长度(不包括伪头)。

为了计算检验和,TCP把伪头回到TCP报文段上,再对全部内容(包括伪头、TCP报文段头及用户数据)求出16位的反码之和,检验和的初始值设成0,然后每两个字节为1单位相加,若相加的结果有进位,那么将和加1。如此反复,直到全部内容都相加完为止。将最后的和值对1求补,即取二进制反码,便得到16位的检验和。

3.TCP连接管理

对于面向连接服务,即使是可靠的网络服务,还是需要连接的建立和释放过程。连接管理使连接的建立和释放能正常进行。

建立连接时需要解决每一端都能确知对方的存在,允许通信双方协商可选参数,对运输实体资源进行分配3个问题。

连接的建立采用客户机/服务器方式。主动发送连接的运输实体的进程为客户机,而被动等待连接的运输实体的进程称为服务器。

在连接建立过程中,存在两种方式,要么由运行客户进程的运输实体先向其TCP发出主动打开命令,表示要向某个IP地址的某个端口建立运输连接;要么由运行服务器进程的运输实体先向它的TCP发出一个被动打开命令,要求它准备接收客户进程的连接请求。接着,服务器进程就处于“监听”的状态,从而不断检测是否有客户进程连接请求的到来,如有,则予以响应。

TCP采用如图2-12所示的3次握手过程建立传输连接。

图2-12 传输连接建立的过程

(1)A(客户端进程)发出“请求连接”TCP段,段头的SYN置1,序列号Seq=x(A初始报文序列号)。

(2)B(服务器进程)返回一个TCP段,段头的SYN和ACK均置1,其序列号Seq=y(B初始报文序列号),确认(ACK)域则为x+1,告示A端序列号为x,请求正确收到,并对此做出肯定应答。

(3)A正确收到B的应答后,需要再发送一个ACK置为1的TCP段,在确认(ACK)域中填入y+1,以示对B的初始序号的确认。

此时,运输客户进程的运输实体A向上层应用进程告知连接已建立,而运行服务器进程的运输实体B收到A的确认后,也通知上层应用进程连接已经建立。

TCP使用一种修改的3次握手释放传输连接,如图2-13所示。

图2-13 传输连接释放的过程

用以建立和释放连接的3次握手之间的差别发生在机器接收到初始的FIN报文段之后,TCP不是立即产生第2个FIN报文段,而是发送一个应答,然后将关断连接的请求通知应用程序。将请求通知应用程序并获得响应可能需要相当长的时间。上述确认防止在等待期间发生初始的FIN报文段。最后,当应用程序指示TCP完全关断连接时,TCP发送第2个FIN报文段,并且源场点以自己的第2个报文段即ACK应答。