TCP传输机制

上一篇 / 下一篇  2011-08-31 16:06:41

TCP传输机制简介

摘要:传输层是计算机网络中重要的一层,它负责连接下层物理结构和上层的应用程序,TCP协议是运输层的重要协议之一,本文对TCP协议做一个简单的介绍,然后为了介绍TCP传输机制,首先介绍TCP报文段的结构,而后介绍TCP协议可靠传输的实现方法以及TCP协议的流量控制和TCP协议的拥塞控制,最后介绍TCP协议整个的传输过程,从连接的建立一直到连接的释放。

关键词:TCP协议;TCP报文段;流量控制;拥塞控制

1   引言

运输层是整个网络体系结构中的关键层次之一,为应用进程之间提供端到端的逻辑通信。TCPTransport Control Protocol,传输控制协议)协议是运输层两个重要的协议之一(另一个是UDP协议)。它是提供面向连接的服务,为用户提供一条可靠的通信信道,这在一些场合(比如说文件传输,电子邮件等)中是必须的。本文对TCP协议做一个简要的介绍,重点叙述TCP报文的结构以及TCP是如何实现可靠传输的,包括流量控制和拥塞控制,帮助初学者更好的了解TCP传输机制。

2   TCP协议概述

        传输控制协议TCP是运输层的重要协议之一,当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只是提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。它提供一种点对点的面向连接的服务,在传输数据之前必须先建立连接,数据传输结束后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多开销,如确认、流量控制、计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。

TCP提供可靠的交互服务的含义是,通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。

TCP提供全双工通信的含义是,TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接受缓存,在发送时将数据发送到缓存中,而后TCP在合适的时候将数据发送出去;接受时将数据先存入缓存中,上层的程序在合适的时候读取缓存中的数据进行处理。

TCP是点对点的通信的含义是,TCP连接有两个端点,这个端点叫做套接字(Socket)接口。根据RFC793的定义:端口号拼接到(contatenated withIP地址即构成套接字。因此套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开,即:

套接字Socket=IP地址:端口号)

        每一条TCP连接唯一地被通信的两端的两个端点(即两个套接字)所确定。

        此外TCP是面向字节流的传输,即把数据块看成无结构的字节流并将字节流以报文段为单位传输。

3   TCP报文结构

        TCP虽然是面向字节流的,但是TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两个部分,而TCP的全部功能都体现在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP工作原理。下面就讨论TCP报文段的首部格式。

        TCP报文段首部的前20个字节是固定的(Figure 1),后面有4N个字节是根据需要而增加的选项(N是整数)。因此TCP首部的最小长度是20字节。

        首部固定部分各个字段的意义如下:

(1)  源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。

(2)  序号:占4字节。序号范围是[0,232-1],共232个序号。序号增加到232-1后,下一个序号又回到0TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段则指的是本报文段所发送的数据的第一个字节的序号。这个字段的名称也叫做报文段序号。

Figure1.TCP报文段的首部格式

(3)  确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到A发送过来的一个报文段,去序号字段值是501,而数据长度是200字节(序号501-700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。总之若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。

(4)  数据偏移:占4,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。但注意,“数据偏移”的单位是32位字。由于4位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度。

(5)  保留:占6位,保留为今后使用,但目前应置为0

下面有6个控制位说明本报文段的性质,它们的意义见下面的(6~11)。

(6)  紧急URGURGent):当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(优先级较高),这时发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针字段配合使用。

(7)  确认ACKACKnowlegment):仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1

(8)  推送PSHPuSH):当两个应用进程进行交互式的通信时,有时在一端的应用程序希望在键入一个命令后立即就能够收到对方的回应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送发TCPPSH置为1,并立即创建一个报文段发送出去。接受方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付给接受应用进程,而不再等到整个缓存都填满了再向上交付。但是该方法很少使用。

(9)  复位RSTReSeT):当RST=1时,表明TCP连接中出现严重差错(如主机崩溃等),必须释放连接,然后再重新建立运输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。

(10) 同步SYNSYNchronization):在建立连接时用来同步序号。当SYN=1ACK=0时,表明这是一个连接请求的报文段。若对方同意建立连接,则应在响应报文段中使SYN=1ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。

(11) 终止FINFINis):用来释放一个连接。当FIN=1时,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。

(12) 窗口:占2个字节。窗口值是[0~216-1]之间的整数。窗口指的是发送本报文段的一方的接受窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接受方目前允许对方发送的数据量。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据,窗口字段明确的支出了现在允许对方发送的数据量。窗口值经常是在动态变化着的。

(13) 检验和:占2个字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段前面加上12字节的伪首部。

(14) 紧急指针:占2个字节。紧急指针仅在URG=1是才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可发送紧急数据。

(15) 选项:长度可变,最长达40字节。当没有使用选项时,TCP的首部长度是20字节。选项内容有最大报文长度MSS、窗口扩大、时间戳和选择确认等。具体的作用可以参考相关的文章,在此不再详述。

4   TCP可靠传输的实现

        我们知道,TCP发送的报文段是交给IP层传输的。但IP层只能提供尽最大努力的服务,也就是说,TCP下面的网络所提供的是不可靠的传输。因此,TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。下面从最简单的停止等待协议讲起。

4.1停止等待协议

        全双工通信的双方既是发送方也是接收方。下面为了讨论问题的方便,我们仅考虑A发送数据而B接受数据并发送确认。“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

4.1.1无差错情况

        最简单的无差错情况是A发送分组M1,发送完就暂停发送,等待B的确认。B收到M1就像A发送确认。A收到对M1的确认后,就再发送下一个分组M2。同样,在收到BM2的确认后,在发送M3

4.1.2出现差错

        在传输过程中B接受M1时检测出了差错,就丢弃M1其他什么也不做(不通知A收到有差错的分组)。也可能是M1在传输过程中丢失了,这时B当然什么都不知道。在这两种情况下,B都不会发送任何消息。可靠传输协议是这样设计的:A只要超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失,因而重传前面发送过的分组。这就叫做超时重传。要实现超时重传,就要在每发送完一个分组设置一个超时计时器。

4.1.3丢失确认和确认迟到

        另一种情况,B发送的对M1的确认丢失了。A在设定的超时重传时间内没有收到确认,因此A在超时计时器到期后就要重传M1,假定B又收到了重传的分组M1,这时应采取两个行动。

第一,丢弃这个重复的分组M1,不向上层交付。

第二,向A发送确认。不能认为已经发送过确认就不在发送,因为A之所以重传M1就表示A没有收到对M1的确认。

4.2以字节为单位的滑动窗口

        TCP的滑动窗口是与报文段中窗口值对应的,即接收方最多能够接受多长字节的数据或是发送方最多允许发送多长字节的数据。

        发送方A根据接收方B发来的确认报文段段中窗口值和确认号构建确认号开头,以窗口值为长度的一个允许发送窗口,其中序号最小的位置称为后沿,最大的称为前沿。后沿后面的数据表示B已经全部收到,不用再发送。在设置一个指针P2表示已经发送数据的最大序号,在后沿到P2之间表示已经发送但没有收到确认的数据。当收到确认报文中确认值大于现在的后沿,那么应向前滑动窗口,使得后沿等于确认值。如果发送窗口中的数据全部发送出去,但是没有收到B的确认,那么A在超时计时器过期时会重传这些数据,保证B能够收到全部的数据。(有关超时重传时间的选择,可以参考相关的文献,这里不再叙述)

        B在收到数据时,如果没有收到期望的数据(接收窗口中编号最小的数据),即使收到其他数据(编号可能更大),那么在发送确认报文时也需要将确认值置为接收窗口中编号最小的数据,这样保证能够收到完整的数据。

4.3选择确认SACK

        可以看到上面的过程会重复传输大量数据,那么能不能在收到正确的、但是没有按序号排列的报文段时,能否设法只传输缺少的数据而不重传已经正确到达接收方的数据?答案是可以的,方法就是选择确认。

        当接收方收到了和前面的字节流不连续的两个字节块时,如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确的告诉发送方,使发送方不再重复发送这些数据。这就要求在建立TCP连接时在首部加上“允许SACK”选项,而且双方必须事先商定好,具体内容可以参见RFC2018

5   TCP流量控制

        一般来说,我们总是希望数据传输得更快一些。但如果发送方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

        利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。发送方的发送窗口不能超过接收方给出的接受窗口的数值(注意TCP的窗口单位是字节,不是报文段)。这样可以使得发送速率有接收方来确定,使得接收方能够接受到数据。

        但当某一次接收方的窗口值为0,这是发送方不会发送数据,等待接收方发送新的确认报文,但是接收方的新的确认报文在网络中丢失,那么发送方就可能一直等待下去。为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带一字节数据),而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口仍然是0,那么收到这个报文段的一方就重新设置持续计时器。如果窗口不是0,那么死锁的僵局就可以打破了。

6   TCP的拥塞控制

6.1拥塞和拥塞控制的概念

在计算机网络中的链路容量(即带宽)、交换节点中的缓存和处理机等,都是网络的资源。在某段时间按,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。

拥塞常常趋于恶化。如果一个路由器没有足够的缓存空间,他就会丢弃一些新到的分组。但当分组被丢弃时,发送这一分组的源点就会重传这一分组,甚至可能还要重传多次。这样会引起更多的分组流入网络和被网络中的路由器丢弃。课件拥塞引起的重传并不会缓解网络的拥塞,反而会加剧网络的拥塞。

所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程涉及所有的主机、路由器和降低网络传输性能的有关的所有因素。另外进行拥塞控制需要付出代价,在设计拥塞控制策略时必须全面衡量得失。

6.2拥塞控制方法


TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-05-20  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 7926
  • 日志数: 15
  • 建立时间: 2011-08-19
  • 更新时间: 2012-10-25

RSS订阅

Open Toolbar