1、 网络协议是计算机中不可缺少的的一个重要组成部分,它是计算机和计算机之间以及计算机和其他设备之间进行数据通信的必要条件。 TCP协议作为重要的网络协议也是有了很大的发展。 1.1 TCP的发展过程与设计目标 认识来源于实践,而认识的最终目标也正是服务于实践。 只有了解TCP的发展历史以及相应的设计目标,我们才能对TCP拥有较为全面的认识,从而更好地研究TCP技术,满足越来越高的应用需求。 1.1.1 TCP的发展过程 互联网最初源于美国国防部的ARPANET计划。 上世纪60年代中期正是冷战的高峰,美国国防部希望有一个命令和控制网络,以确保在核战争的条件下幸免于难,而传统基于电路交换的电话网络
2、则过于脆弱。 国防部指定其下属的高级研究计划局解决这个问题,从而诞生ARPANET,其最大特点是采用无连接的端到端报文交换服务。 到了80年代中期,演变为互联网。 TCP协议最初只是作为NSFNET的程序规范,即RFC 793,这也是最早的较为完整且齐全的TCP规范。 这个规范简单描述了如何进行主机到主机的可靠传输,并描述了传输控制协议执行的功能,相应的实现程序及程序接口。 TCP协议在设计之初就被赋予了很高的使命,需要成为报文交换计算机网络和这些网络互联系统中的高可靠性传输协议。 需要明确的是,网络中的可靠传输包括两方面:首先是数据的正确,由于以前的传输介质质量很差,所以在传输层及以下各层协
3、议中都实现了校验和计算;其次是数据的完整保序,这个特性需要TCP执行复杂的操作来实现,通常我们强调TCP的可靠传输时主要指后者。 1.1.2 TCP的设计目标 在TCP设计之初,网络技术刚刚起步,相应的硬件设施只能达到很低的水平,应用需求也十分简单,诸多因素导致TCP协议的设计目标从开始就已经先天不足。 在设计TCP协议时,由于人们对网络,尤其是对大型互联网络缺乏本质的认识,从而遗漏了许多TCP协议应该具备的重要特征。 例如,我们现在熟知的拥塞控制,在最初协议设计中就没能得到体现。 TCP最初的设计目标只是在进程间提供可靠、安全的逻辑链路,并在此基础之上提供可靠的传输服务。 需要强调的是,TC
4、P对网络并不做任何假设,它的主要功能就是提供可靠的逻辑链路。 为了能够在不可靠的网络上进行可靠的通信,协议必须提供如下功能:能够进行基本的数据传输、保证数据的可靠性、进行适当的流量控制、维护通信状态的集合、使用并行多路技术以及保证通信的优先级 和安全性。 1.2 论文结构 本文主要围绕下列问题展开研究: 1TCP的结构和数据传输过程 2TCP的流量控制机制 3TCP的拥塞控制与拥塞控制算法 2 TCP协议 TCP 协议是目前互联网上应用最广泛的传输层协议。 它主要提供端到端可靠的字节流传送服务。 TCP 是一个面向连接的协议,即在端系统进行数据传输之前要建立连接,连接属于全双工方式(即数据可以
5、在两个方向上同时进行传输)。 TCP 在不可靠的IP 网络层上提供可靠的数据传输服务,即所有被传输的数据最终都应到达接收端。 在TCP 中,接收端对其所接收的每一个分组都进行确认,在一定时间范围内没有得到确认的分组会被发送方重新进行发送。 接收端如果收到一个重复的分组,将会丢弃该分组,如果收到乱序的分组,则对这个分组进行重新排序。 每个分组都会有自己对应的序列号,发送方可以通过分组确认报文获得接收端所希望接收的下一个分组的序列号。 当通信双方均有数据要发送时,TCP 可以将确认信息放在数据分组中发送以减少控制信息带来的额外流量。 TCP协议对数据单元的传输及重传策略,对于网络的拥塞状况有着深刻
6、的影响。 概括来说,TCP 协议为应用层提供了以下服务: 1流交付服务:TCP 协议允许发送进程以字节流的形式来传递数据,而接收进程也把数据作为字节流来接收。 这样,TCP 协议使得两个进程好像在一个假想的“管道”中传送两个进程的数据。 2全双工服务:即数据可在同一时间双向流动。 每一个TCP 端系统都有发送缓存和接收缓存,而两个方向都可以发送报文段。 3面向连接服务:TCP 通过一条虚拟连接来传送数据。 当TCP 报文被封装成IP 分组后,每一个分组可以走不同的路径来到达目的端,因此收到的IP 分组可能会乱序,可能会丢失,或者受到损伤,并可能经过重传。 但是TCP 创建了面向流的环境,它负责
7、按顺序将完整的数据交付给应用程序。 4流量控制:流量控制定义了发送端在收到从接收端发来的确认之前可以发送的数据量。 TCP 协议在缓存上定义了一个窗口,缓存是用来暂时存放从应用程序传递来并准备发送的数据,TCP 发送端就根据这个窗口的大小来发送数据。 这就是所谓的滑动窗口机制。 5差错控制:TCP 是可靠的传输层协议,这就表示,当应用程序把数据流交付给IP 层后,TCP协议应当把数据流按顺序,没有差错,没有损伤地交付给另一个应用程序。 为了实现差错控制,TCP 协议采用了以下几种机制:检测受到损伤的、丢失的、失序的和重复的数据包;在检测到差错后,能够纠正差错。 6拥塞控制:互联网由许多网络和连
8、接设备组成。 发送端发送的分组要经过多个路由器后才能到达最后的接收端。 路由器为了保证链路的利用率,一般都会提供缓存来暂时存储突发到达的分组,但是当路由器接收过多的分组时,就可能导致路由器缓冲区溢出,即该路由器节点发生拥塞,部分分组就会被丢弃。 当发送端重传这些分组时,会造成更加严重的拥塞,以致于使网络瘫痪。 因此我们必须在端系统采用一些拥塞控制机制来保证网络不会发生拥塞,同时又能充分利用网络的链路资源。 TCP协议采用了慢启动,拥塞避免等算法来对网络拥塞进行控制,从而在一定程度上保证网络的稳定运行。 2.1 TCP的报文段 2.1.1 TCP的报文格式 TCP 软件在两台计算机之间传输的数据
9、单元称为报文段(segment)。 通过报文段的交互来建立连接、传输数据、发出确认、通告窗口大小及关闭连接。 图2.1表示出了TCP 报文段的格式,每个报文段分为两个部分:首部和数据。 报文段既可以用来建立连接,也可以运载数据和应答。 TCP源端口号(16位) TCP目标端口号(16位) 序列号(32位) 确认序列号(32位) 首部长度(4位) 保留 (6位) URG ACK PSH RST SYN FIN 窗口大小(16位) 校验和(16位) 紧急指针(16位) 选项和填充 数据区 图2.1 TCP报文段格式 TCP报文段首部固定部分各字段的意义如下: 源端口和目的端口:各占2个字节,是传输
10、层与高层的接口。 序列号:占4字节,是本报文段所发送的数据部分第一个字节的序号。 在TCP输送的数据流中,每一个字节都有一个顺序号。 例如,在一个报文段中,序号为300,而报文中的数据为100字节,那么,在下一个报文段中,其顺序号就是400。 由此可见,TCP是面向数据流的。 确认序列号:占4字节,是期望收到对方下次发送数据的第一个字节的序号。 首部长度:占4bit,它指出以32bit 为单位的TCP 报文段首部的长度。 在首部字段后面是6bit的保留字段,是为将来的应用而保留的,目前置为0。 紧急比特URG:当URG = 1时,表明此报文段应该尽快发送,而不要按照原来的排队顺序发送。 它通常
11、与紧急指针(位于第5个32bit 字段中的后一半)配合使用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。 紧急指针使接收方可以知道紧急数据共有多长。 需要注意的是,即使窗口大小为0时也可发送紧急数据。 确认比特ACK:只有当ACK = 1时确认序号字段才有意义。 当ACK = 0时,确认序号无意义。 急迫比特PSH:当PSH = 1时,表明请求远地TCP将本报文段立即传送给其应用层,而不要等整个缓冲区都填满之后再向上交付。 复位比特RST:当RST = 1时,表明出现严重差错,必须释放连接,然后再重新建立连接。 同步比特SYN:在连接建立时使用。 当SYN = 1而ACK = 0时
12、,表明这是一个连接请求报文段。 对方若同意建立连接,则应在发回的报文段中使SYN = 1和ACK = 1。 因此SYN置为1,就表示这是一个连接请求或连接接受报文,而ACK 比特的值用来区分是哪一种报文。 终止比特FIN:用来释放一个连接。 当FIN = 1时,表明欲发送的字节串已经发完,并请求释放传输层连接。 窗口:占2字节。 窗口字段提供端到端的流量控制,它表示在确认了字节之后还可以发送多少个字节。 此字段值为0是合法的,表示它已经收到了包括确认号减1(即己发送的所有报文段)在内的所有报文段,但当前接收方急需暂停。 之后通过发送一个带有相同确认号和滑动窗口字段非零值的报文段来恢复原来的传输
13、。 校验和: 校验和字段覆盖的范围包括首部、数据和概念上的伪TCP首部之和。 选项和填充: 为可选部分,用于TCP具体选项。 填充的作用是确保首部大小是一个32位的整倍数。 2.1.2 TCP报文封装 如图2.2所示,TCP报文段封装在IP数据报中,然后再封装成数据链路层中的帧,并通过物理层传输到数据的接收端,在接受端数据链路层剥去帧的首部,然后送到接收端的网络层,剥去IP首部再发送到传输层,所剩下的就是发送段的TCP报文段。 IP首部 TCP首部 TCP数据 IP报文段 TCP报文段 图2.2 报文段的封装 2.2 TCP的数据传输 2.2.1 TCP连接的建立 TCP以全双工的方式传输数据
14、。 当两个机器重的两个TCP建立连接候,他们都能够同时向对方发送报文段。 这就表示,在任何数据传输之前,每一方都必须对通信进行初始化,并得到对方的认可,即TCP的连接。 TCP的连接建立称为“三次握手“。 1.客户发送第一个报文段,SYN报文段,在这个报文段中只有SYN标志置1。 这个报文段的作用是使序号同步。 客户端选择一个随机数SEQ作为第一序号,并把这个序号发给服务器。 2.服务器发送第二个报文段,即SYN+ACK报文段,其中有两个标志置为l。 这个报文段有两个目的,一个是使用SYN同步初始序号,另一个是服务器使用ACK标志确认已经从客户端收到的SYN报文段,同时给出期望从客户端收到的下
15、一个序号。 3.客户端发送第三个报文段。 这仅仅是一个ACK报文段。 它使用ACK标志和确认号字段来确认收到了第二个报文。 实例分析: SYN = 1,SEQ = 800 SYN=1,ACK=1,SEQ=1500,ACK=801 ACK = 1,SEQ = 1501,ACK = 801 主机A 主机B 连接请求 图2.3 TCP连接的建立 下面我们以主机A和主机B两个应用程序为例来分析。 如图2.3所示。 这个过程从服务器开始。 主机A告诉它的TCP,它已经准备好接受连接,这叫做被动打开。 主机B发送请求叫做主动打开。 A的TCP向B的TCP发出连接请求报文段,其首部中的同比特SYN应置1,同
16、时选择一个序号X,我们选取X = 800,表明在后面传输数据的第一个数据字节的序号是X+1,即为801。 B的TCP收到连接请求报文段后,如同意则发回确认。 在确认报文段中将SYN和ACK都置1,确认号为X+1,即为801,同时为自己选择一个序号Y,令Y = 1500。 A的TCP收到B的确认后,要向B给出确认,其ACK置1,确认号为Y+1,即为1501,自己的序号为X+1,为801。 2.2.2 TCP连接的释放 参加交换数据的双方的任何一方都可以关闭连接。 当一方向的连接被终止时,另一方还可以继续向对方发送数据。 建立一个连接需要三次握手,终止连接要经过四次握手。 FIN = 1,SEQ
17、= 1001 ACK = 1,SEQ = 1700,ACK = 1002 FIN=1,ACK=1,SEQ=1700,ACK=1002 主机A 主机B 释放链接 ACK = 1,SEQ = 1002,ACK = 1701 确认 确认 图2.4 TCP连接的释放 实例分析: 如图2.4所示,主机A的应用进程先向其TCP发送连接释放请求,并且不再发送数据。 TCP通知对方要释放从A到B这个方向的连接,将发往主机B的TCP报文段首部的FIN置1,其序号X等于前面已传送过的数据的最后一个字节的序号加1,为X = 1001。 主机B的TCP收到释放链接通知后发出确认,其序号为Y = 1700,确认号为X+
18、1,即1002,同时通知高层应用进程,应用进程通知TCP释放连接。 B发出的连接释放报文段必需将FIN和ACK置1,并使其序号仍为Y,重复上次发送的ACK = X+1。 A对此确认,将ACK置1,ACK=Y+1 = 1701,自己的序号是X+1为1002。 3 TCP协议中的流量控制 如果发送端发送的数据过多或者数据发送速率过快,致使接收端来不及处理,则会造成数据在接收端的丢弃。 为了避免这种现象的发生,通常的处理办法是采用流量控制,即控制发送端发送的数据量及数据发送速率。 时期不超过接收端的承受能力,这个能力主要指接收端的缓存和数据处理速度。 流量控制是与点到点的通信量有关的,是针对端系统中
19、资源受限而设置的。 主要解决快速发送方与慢速接收方的问题。 流量控制的目的是在有限的接收端承受能力的情况下,通过流量约束,减少接收端出的数据丢失,提高数据发送效率,充分利用接收端资源。 3.1 滑动窗口 TCP的特点之一是提供体积可变的滑动窗口机制,支持端到端的流量控制。 TCP的窗口以字节为单位进行调整,以适应接收方的处理能力。 处理过程如下:首先,在TCP连接阶段,双方协商窗口尺寸,同时接收方预留数据缓冲区;其次,发送方根据协商的结果,发送符合窗口尺寸的数据字节流,并等待对方的确认;最后,发送方根据确认信息,改变窗口的尺寸。 1 100 101 200 201 300 301 400 401 500 501 600 发送窗口 已发送并被确认 已发送但未被确认 可继续发送 不可发送 指针 图3.1 滑动窗口 图3.1表示发送窗口为400字节,发送端已发送300字节的数据,但是只收到对前100字节的确认,同时窗口的大小不变,现在发送端还可以发送200字节。 3.2 可变窗口流量控制实例分析 设主机A向主机B发送数据,如图3.2所示,双方规定窗口值是400。 再设每一个报文段是100字节长,序号的初始值为1。 主机B进行3次流量控制,第一次将窗口减少为300字节,第二次减为
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1