还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
TCP合同是一种面向连接时,为不同主机进程间提供可靠数据传播的合同TCP合同假定其所使用的网络栈下层合同(如IP合同)是非可靠的,其自身提供机制保证数据日勺可靠性传播在目前日勺网络栈合同族中,在需要提供可靠性数据传播的应用中TCP合同是首选的,有时也是唯一的选择TCP合同是在最早由Cerf和Kohn⑴所提出日勺有关网络数据包传播合同日勺概念之上建立日勺TCP合同被设计成符合分层合同构造工作在ISO/OSI七层网络模型中的传播层中,使用网络层合同(如最常见日勺IP合同)提供的服务网络层合同尽最大努力传播上层提供的数据但并不保证数据传播的可靠性可靠性保证必须由上层合同(如TCP合同)提供网络层合同重要完毕日勺工作有1>实现不同网络(主机)间的数据包路由传递2>在发送端(或中转站)提供数据包分片功能以使数据包大小满足PMTU(Path-MTU)o3>在接受端提供数据包分片重组功能4>负责数据包优先级,安全性等问题传播层合同(重要针对TCP合同而言)重要完毕的工作有(并非所有的传播层合同都需要提供这些功能如UDP合同就不提供可靠性数据传播)1>提供多路复用2>实现数据基本传播功能2主机B向主机A确认其发送的初始序列号3主机B向主机A发送其初始序列号4主机A向主机B确认其发送的初始序列号我们将v23两步合为一步,即B向A确认其(A之前发送日勺)初始序列号时同步发送其(即B自己的)初始序列号所谓确认数据包即将数据包的ACK标志位设立为1即可注意这三个(或四个)数据包中SYN标志位设立为1并且SYN标志位也仅在这三个(或四个)数据包中被设立为1此处有一种问题:即AB主机在通报各自初始序列号的同步能否传播某些正常数据,原理上可以(TCP合同规范上并没有说不可以),但是大多数实目前通报初始序列号时都不附带正常数据,而是将其作为一种单独的过程,由此正式确立建立连接一说小结TCP合同声称可靠性数据传播,其底层实现机制重要涉及三个方面使用序列号对传播的数据进行编号,数据超时重传,数据确认应答本文重要论述了此三个方面为什么可以实现可靠性传播并简朴解释了其中的内部机理,此后对TCP合同可靠性数据传播实现提出了其基本原理并在文章最后从保证可靠性数据传播的角度简朴论述了使用TCP合同时为什么需要一种建立连接的过程TCP合同是TCP/IP合同族中较为复杂的一种,其复杂性的最重要来源之一即其需要提供可靠性数据传播,本文旨在对TCP合同保证可靠性数据传播的基本实现原理简介中减少读者对TCP合同理解的复杂度3>建立通信通道4>提供流量控制5>提供数据可靠性传播保证数据可靠性传播保证是其中最为重要日勺方面,也是TCP合同区别于其他合同的最重要特性所谓提供数据可靠性传播不仅仅指将数据成功时由本地主机传送到远端主机,数据可靠性传播涉及如下内容1>可以解决数据传播过程中被破坏问题2>可以解决反复数据接受问题3>可以发现数据丢失以及对此进行有效解决4>可以解决接受端数据乱序达到问题
1.TCP合同可靠性数据传播实现基本原理TCP合同必须提供对所有这些问题的解决方案方可保证其所声称的数据可靠性传播TCP合同规范和目前绝大多数TCP合同实现代码均采用数据重传和数据确认应答机制来完毕TCP合同时可靠性数据传播数据超时重传和数据应答机制的基本前提是对每个传播日勺字节进行编号即我们一般所说时序列号数据超时重传是发送端在某个数据包发送出去,在一段固定期间后如果没有收到对该数据包日勺确认应答,贝弘假定该数据包在传播过程中丢失)重新发送该数据包而数据确认应答是指接受端在成功接受到一种有效数据包后,发送一种确认应答数据包给发送端主机,该确认应答数据包中所涉及日勺应答序列号即指已接受到的数据中最后一种字节日勺序列号加1加1日勺目日勺在于指出此时接受端盼望接受时下一种数据包中第一种字节的序列号数据超时重传和数据确认应答以及对每个传播的字节分派序列号是TCP合同提供可靠性数据传播的核心本质1)数据确认应答数据包中应答序列号的含义应答序列号并非其表面上所显示的意义,其事实上是指接受端但愿接受时下一种字节时序列号因此接受端在成功接受到部分数据后,其发送时应答数据包中应答序列号被设立为这些数据中最后一种字节的序列号加一因此从其含义上来说,应答序列号称为祈求序列号有时更为合适应答序列号在TCP首部中应答序列号字段中被设立而TCP首部中序列号字段表达涉及该TCP首部的数据包中所涉及数据的第一种字节时序列号(令为N)o如果接受端成功接受该数据包,之前又无丢失数据包,则接受端发送时应答数据包中的应答序列号应当为N+LENO其中LEN为接受时数据包的数据长度该应答序列号也是发送端将要发送时下一种数据包中第一种字节的序列号(由此亦可看出上文中将应答序列号称为祈求序列号曰勺因素所在)2)数据确认应答中的累积效应TCP合同中接受端对所接受数据时应答是累积日勺累积的含义有二:1>应答序列号是逐渐递增时这与发送端数据编号是递增日勺相吻合2>不可进行跨越式数据应答所谓不可进行跨越式数据应答,可以以数据包乱序达到为例进行阐明如果由于发送端所选择传播途径的不同,较后发送时序列号较大的数据包先达到接受端,而先发送时序列号较小的数据包由于线路问题(或路由器故障)被临时延迟在网络中,此时接受端不可对这些序列号较大的数据进行应答如果接受端需要发送一种应答数据包,则应答序列号仍然应当设立成对序列号较小日勺数据包日勺祈求(注意应答序列号指的是接受端但愿接受时下一种字节日勺序列号,故在数据传播过程中将应答数据包称为数据祈求数据包更为合适)举例来说,如果接受端目前的应答序列号为201表达接受端正在等待发送端发送从201开始编号的数据,之后发送端持续发送了两个数据包第一种数据包中数据序列号范畴为201-300第二个数据包中数据序列号范畴为301-400如果由于选择了不同的传播途径导致第二个数据包最先达到接受端,而第一种数据包在网络中延迟了一段时间,则接受端不可对第二个数据包进行应答,即不可发送应答序列号为401的确认应答数据包,而是不断发送应答序列号为201时应答数据包直到该序列号的数据达到我们一般所说时迅速重传机制即发送端在持续接受到3个相似序列号时应答数据包后需要立即重传应答序列号所示的数据由于此时表达极有也许浮现了数据包丢失的状况,如上例中第一种数据包如果丢失在网络中并且发送端重传的相似数据包由于选择相似的线路也未能达到接受端,则接受端将不断发送应答序列号为201日勺应答数据包而不会将应答序列号设立为401注意此时接受端已接受到序列号从301-400的数据3)重传应答机制与序列号结合1>可以解决数据在传播过程中被破坏的问题一方面通过对所接受数据包的校验,确认该数据包中数据与否存在错误如果有,则简朴丢弃或者发送一种应答数据包重新对这些数据进行祈求发送端在等待一段时间后,则会重新发送这些数据本质上数据传播错误时解决是通过数据重传机制完毕时2>可以解决接受反复数据问题一方面运用序列号可以发现数据反复问题由于每个传播的数据均被赋予一种唯一的序列号,如果达到的两份数据具有重叠的序列号(如由发送端数据包重传导致),则表达浮现数据反复问题,此时只须丢弃其中一份保存另一份即可多种数据包中数据重叠的状况解决方式类似本质上,数据反复问题时解决是通过检查序列号完毕时3>可以发现数据丢失以及进行有效解决一方面必须阐明,此处数据包丢失的概念是指在一段合理时间内,应当达到日勺数据包没有达到,而非我们平常所理解日勺永远不达到因此数据包丢失与数据包乱序达到有时在判断上和软件解决上很难辨别数据丢失的判断是猜想性时,我们无法拟定一种数据包一定丢失在传播过程中,大多是被延迟在网络中,即实质的问题只是数据包乱序达到将两者辨别开来的一种重要根据是在合理的时间内,由这个也许丢失日勺数据包所导致日勺序列号“空洞“与否可以被弥补上也许日勺数据丢失一种显然的成果是在接受端接受日勺数据浮现序列号不持续现象如接受端只接受到序列号从1到100的数据包,之后又接受到序列号从200至IJ300日勺数据包,并且在一段合理的时间内(由此基本排除乱序问题),序列号从101到199的数据始终未达到,则表达涉及序列号从101至W99的数据包在传播过程中很也许丢失(或者有极不正常日勺延迟)对数据包与否丢失判断日勺此外一种干扰因素是发送端的重传机制,如果一种序列号较前的数据包在网络中丢失,导致序列号较后的数据包提前达到接受端也会临时导致序列号不持续,但由于发送端在没有接受到确认应答时,会重新发送序列号较前的那个数据包,如果此后接受端接受到一种重传的数据包,则仅仅只会在接受端导致数据包乱序达到的表象无论实质如何如果软件实现判断出数据包丢失则接受端将通过不断发送对这些丢失时数据的祈求数据包(也即应答数据包,见前文中对数据应答数据包和数据应答累积效应的阐明)来迫使发送端重新发送这些数据一般发送端自身会自发时重传这些未得到对方确认的数据,但由于重传机制采用指数退避算法,每次重传日勺间隔时间均会加倍,因此通过发送方积极重传机制恢复的时间较长,而接受端通过不断发送对这些丢失数据日勺祈求发送端在接受到三个这样的祈求数据包后(三个祈求数据包中具有同一种祈求序列号--也即前文中所说的应答序列号),会立即触发对这些数据时重新发送,这称为迅速恢复或者迅速重传机制本质上,对于数据丢失问题时解决是通过数据重传机制完毕日勺在此过程中序列号和数据确认应答起着核心的作用4>可以解决接受端数据乱序达到问题如果通信双方存在多条传播途径,则有也许浮现数据乱序问题,即序列号较大的数据先于序列号较小日勺数据达到,而发送端日勺确是按序列号由小到大时顺序发送时数据乱序日勺本质是数据都成功达到了,但达到时顺序不尽如人意对这个问题的解决相对比较简朴,只需对这些数据进行重新排序即可本质上,对数据乱序问题日勺解决是通过排序数据序列号完毕时.TCP合同可靠性数据传播软件实现基本原理由上文可见,序列号,数据超时重传和数据确认应答机制保证了TCP合同可靠性传播时规定由于需要对所发送的数据进行编号,又需要对接受日勺数据进行应答,因此使用TCP合同的通信双方必须通过某种机制理解对方的初始序列号只有在确切懂得对方的初始序列号时状况下,才干从一开始对所接受数据的合法性进行判断此外还需要在本地维护一种对方应答的序列号,以随时跟随对方的数据祈求在最后通信通道关闭时,可以确知本地发送时数与否已被对方完全接受;此外这个对方应答序列号在控制本地数据通量方面也发挥着重要日勺作用用本地发送序列号减去对方应答序列号则可以立即得知目前发送出去的数据有多少没有得到对方时应答综上所述,可靠性传播规定通信双方维护如下序列号SND.NXT本地将要发送时下一种序列号该变量相应TCP首部中序列号字段表达该数据包中所涉及数据的第一种字节的序列号每次发送一种数据包,该变量都需要进行更新SND.NXT=SND.NXT+本次发送的数据包中涉及的数据长度SND.ACKED对方对本地所发送数据到目前为止进行了应答时序列号,换句话说,SND.ACKED+1表达本地已发送出去但尚未得到对方应答日勺数据集中相应的第一种(最小时)序列号RCV.NXT本地但愿接受时下一种序列号该序列号被称为应答序列号,也可称为祈求序列号在本地发送时应答报文中TCP首部中应答序列号字段即设立为该变量时值表达本地但愿从对方接受的下一种字节日勺序列号图1(上图)显示了TCP首部格式序列号字段相应前文中SND.NXT变量,应答序列号字段相应前文中RCV.NXT变量ACK标志位设立为1表达这是一种应答数据包事实上对于TCP合同而言,在成功建立连接后,此后发送的所有数据包的ACK标志位均被设立为1即在传送正常数据的同步传送应答,如此解决可以减少网络中传播的数据包数量.TCP合同建立连接的必要性图1TCP首部格式中SYN标志位仅使用在建立TCP连接的过程中TCP建立连接的过程被称为“三路握手“连接,即一般通信双方共需要传播三个数据包方能成功建立一种TCP连接我们一般将建立连接作为使用TCP合同理所固然的前导过程但很少去质疑这样一种建立连接过程的必要性事实上,在上文中已经做出部分解释,使用TCP合同必须一方面建立一种连接是保证TCP合同可靠性数据传播时基本前提(固然由于TCP合同是一种有状态合同,必须通过某种机制进行通信双方状态上的同步,而建立连接就是这样一种机制)至于为什么需要三个数据包,因素是建立连接过程中信息的互换必须至少使用三个数据包从下文的分析来看,建立连接最多需要使用四个数据包需要再次提到的是SYN标志位只是用在建立连接的三个(或者四个)数据包中,一旦连接建立完毕后,之后发送的所有数据包不可设立SYN标志位单从保证数据可靠性传播角度而言TCP合同需要在正式数据传播之前一方面进行某些信息日勺互换这个信息即是双方的初始序列号(此外的某些信息涉及最大报文长度通报等)诚如前文所述,序列号的使用对于TCP合同而言至关重要在正式数据传播之前,双方必须得到对方的初始字节数据的编号,这样才有也许对其所接受数据的合法性进行判断,才有其他的对数据反复,数据重叠等一系列问题日勺进一步鉴别和解决故互换各自时初始序列号必须在正式数据传播之前完毕,我们美其名日这个过程为连接建立过程至于双方TCP合同各自状态日勺更新重要是软件设计上可靠性保证的一种辅助,并非这个所谓的建立过程所重要关注的问题初始序列号的互换从最直接的角度来说需要四个数据包:1>主机A向主机B发送其初始序列号。