TCP协议分析与建模一、基本功能需求TCP提供一种面向连接的、带流量控制的可靠的字节流服务。通过使用序号进行确认、重传机制等保证其可靠性;通过滑动窗口机制实现其传输流控制功能;数据传输功能使用三次握手进行建立连接,使用改进的三次握手释放连接;TCP协议也规定了其报文的具体格式。二、报文格式图2-1TCP报文格式TCP的协议数据单元被称为报文段(Segment),TCP通过报文段的交互来建立连接、传输数据、发出确认、进行差错控制、流量控制及关闭连接。报文段分为两部分,即报文段头和数据,所谓报文段头就是TCP为了实现端到端可靠传输所加上的控制信息,而数据则是指由高层即应用层来的数据。如图2-1所示给出了TCP报文段头的格式。其中有关字段的说明如下:源端口:16位;目的端口:16位;序列码:32位,当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1;确认码:32位,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码;1数据偏移量:4位,指示何处数据开始;保留:6位,这些位必须是0;控制位:6位;窗口:16位;校验位:16位;优先指针:16位,指向后面是优先数据的字节;选项:长度不定;但长度必须以字节记;选项的具体内容结合具体命令来看;填充:不定长,填充的内容必须为0,它是为了保证包头的结合和数据的开始处偏移量能够被32整除;三、基本功能实施过程1、滑动窗口机制与流量控制TCP采用大小可变的滑动窗口机制实现流量控制功能。窗口的大小是字节。在TCP报文段首部的窗口字段写入的数值就是当前给对方设置发送窗口的数据的上限。在数据传输过程中,TCP提供了一种基于滑动窗口协议的流量控制机制,用接收端接收能力(缓冲区的容量)的大小来控制发送端发送的数据量。在建立连接时,通信双方使用SYN报文段或ACK报文段中的窗口字段捎带着各自的接收窗口尺寸,即通知对方从而确定对方发送窗口的上限。在数据传输过程中,发送方按接收方通知的窗口尺寸和序号发送一定量的数据,接收方根据接收缓冲区的使用情况动态调整接收窗口尺寸,并在发送TCP报文段或确认段时稍带新的窗口尺寸和确认号通知发送方。主机A主机BSEQ=1SEQ=101SEQ=201ACK=201,WIN=300丢失!SEQ=301SEQ=401SEQ=201ACK=501,WIN=200SEQ=501ACK=601,WIN=0主机A还能发送300字节主机A还能发送200字节允许A再发送300字节(序号201至500)A还能发送200字节(序号301至500)A还能发送100字节(序号401至500)A超时重发,但不能发送序号500以后的数据允许A再发送200字节(序号501至700)A还能发送100字节(序号601至700)不允许A再发送,(到序号600的数据都收到了)图3-1利用可变滑动窗口进行流量控制2如图3-1所示。设主机A向主机B发送数据。双方确定的的窗口值是400。设一个报文段为100字节长,序号的初始值为1(即SEQ=1)。在图15.8中,主机B进行了三次流量控制。第一次将窗口减小为300字节,第二次将窗口又减为200字节,最后一次减至零,即不允许对方再发送数据了。这种暂停状态将持续到主机B重新发出一个新的窗口值为止。2、建立连接:三次握手功能:1.同意连接协商,做好传输数据的准备;2.各自报文段ISN(初始序列号)协商(不能为‘1’);3.协商接收的报文长度的最大值MSS(只有SYN报文段能协商MSS)。说明:SYN报文段占用初始序号,发送数据的第一字节序号为ISN+1。单纯的ACK报文段不占用序号主机A主机B连接请求确认确认SYN=1,seq=xSYN=1,ACK=1,seq=y,ack=x+1ACK=1,seq=x+1,ack=y+1图3-2三次握手建立TCP连接第一步:源主机A的TCP向主机B发出连接请求报文段,其首部中的SYN(同步)标志位应置为1,表示想与目标主机B进行通信,并发送一个同步序列号X(例:SEQ=100)进行同步,表明在后面传送数据时的第一个数据字节的序号是X+1(即101)。SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号。第二步:目标主机B的TCP收到连接请求报文段后,如同意,则发回确认。在确认报中应将ACK位和SYN位置1,表示客户端的请求被接受。确认号应为X+1,同时也为自己选择一个序号Y。第三步:源主机A的TCP收到目标主机B的确认后要向目标主机B给出确认,其ACK置1,确认号为Y+1,而自己的序号为X+1。TCP的标准规定,SYN置1的报文段要消耗掉一个序号。运行客户进程的源主机A的TCP通知上层应用进程,连接已经建立。当源主机A向目标主机B发送第一个数据报文段时,其序号仍为X+1,因为前一个确3认报文段并不消耗序号。当运行服务进程的目标主机B的TCP收到源主机A的确认后,也通知其上层应用进程,连接已经建立。至此建立了一个全双工的连接。3、释放连接:改进的三次握手说明:①FIN报文段占用一个序号;单纯的ACK报文段不占用序号。②TCP提供了半关闭能力:连接的一端在结束它的发送后还能接收来自另一端数据。③异常时强行关闭连接连接复位–RST,发起端发RST报文段;双方立即停止传输,并退出连接。主机A主机B应用进程释放连接确认确认FIN=1,seq=xACK=1,seq=y,ack=x+1ACK=1,seq=x+1,ack=y+1FIN=1,ACK=1,seq=y,ack=x+1通知主机应用进程应用进程释放连接A不再发送报文B不再发送报文图3-3TCP连接释放过程第一步:源主机A的应用进程先向其TCP发出连接释放请求,并且不再发送数据。TCP通知对方要释放从A到B这个方向的连接,将发往主机B的TCP报文段首部的终止比特FIN置1,其序号X等于前面已传送过的数据的最后一个字节的序号加1。第二步:目标主机B的TCP收到释放连接通知后即发出确认,其序号为Y,确认号为X+1,同时通知高层应用进程。这样,从A到B的连接就释放了,连接处于半关闭状态,相当于主机A向主机B说:“我已经没有数据要发送了。但如果还发送数据,我仍接收。”此后,主机B不再接收主机A发来的数据。但若主机B还有一些数据要发送主机A,则可以继续发送。主机A只要正确收到数据,仍应向主机B发送确认。第三步:若主机B不再向主机A发送数据,其应用进程就通知TCP释放连接。主机B发出的连接释放报文段必须将终止比特FIN和确认比特ACK置1,并使其序号仍为Y,但还必须重复上次已发送过的ack=X+1。主机A必须对此发出确4认,将ACK置1,ack=Y+1,而自己的序号是X+1。这样才把从B到A的反方向的连接释放掉。主机A的TCP再向其应用进程报告,整个连接已经全部释放。四、基本功能状态图1、TCP状态图-正常状态迁移CLOSEDSYN_SENTESTABLISHEDFIN_WAIT_1FIN_WAIT_2TIME_WAITCLOSEDLISTENSYN_RCVDESTABLISHEDCLOSE_WAITLAST_ACK关闭/超时主动打开a!SYNB?SYN,ACKb!ACK关闭c!FINd?ACKe?FINe!ACK2MSL超时被动打开a?SYNb!SYN,ACKb?ACKc?FINd!ACK关闭e!FINe?ACK图4-1TCP正常状态迁移图5客户状态网络事件服务器状态主动打开SYN_SENTESTABLISHED主动关闭FIN_WAIT_1FIN_WAIT_2TIME_WAIT(2MSL超时)CLOSEDLISTEN(被动打开)SYN_RCVDESTABLISHEDCLOSE_WAIT(被动关闭)LAST_ACKCLOSEDSYNJSYNK,ACKJ+1ACKK+1FINMACKM+1FINNACKN+1图4-2TCP连接建立与释放过程1)、建立连接●服务器端首先执行LISTEN原语进入被动打开状态(LISTEN),等待客户端连接;●当客户端的一个应用程序发出CONNECT命令后,本地的TCP实体为其创建一个连接记录并标记为SYNSENT状态,然后给服务器发送一个SYN报文段;●服务器收到一个SYN报文段,其TCP实体给客户端发送确认ACK报文段同时发送一个SYN信号,进入SYNRCVD状态;●客户端收到SYN+ACK报文段,其TCP实体给服务器端发送出三次握手的最后一个ACK报文段,并转换为ESTABLISHED状态;●服务器端收到确认的ACK报文段,完成了三次握手,于是也进入ESTABLISHED状态。在此状态下,双方可以自由传输数据。当一个应用程序完成数据传输任务后,它需要关闭TCP连接。假设仍由客户端发起主动关闭连接。2)、关闭连接●客户端执行CLOSE原语,本地的TCP实体发送一个FIN报文段并等待响应的确认(进入状态FINWAIT1);●服务器收到一个FIN报文段,它确认客户端的请求发回一个ACK报文段,进入CLOSEWAIT状态;●客户端收到确认ACK报文段,就转移到FINWAIT2状态,此时连接在一个方向上就断开了;●服务器端应用得到通告后,也执行CLOSE原语关闭另一个方向的连接,其本地TCP实体向客户端发送一个FIN报文段,并进入LASTACK状态,等待最后一个ACK确认报文段;●客户端收到FIN报文段并确认,进入TIMEDWAIT状态,此时双方连接均已经断开,但TCP要等待一个2倍报文段最大生存时间MSL(Maximum6SegmentLifetime),确保该连接的所有分组全部消失,以防止出现确认丢失的情况。当定时器超时后,TCP删除该连接记录,返回到初始状态(CLOSED)。●服务器收到最后一个确认ACK报文段,其TCP实体便释放该连接,并删除连接记录,返回到初始状态(CLOSED)。