·传输控制协议(Transmission Control Protocol,TCP)提供了面向连接、可靠地字节流服务。使用TCP协议的应用程序不必考虑数据可靠性传输问题。

1、TCP报文格式

·TCP报文共分为TCP报头和TCP数据两个部分,如下图所示。TCP报头的前20个字节是固定的,后面有4*N个字节的选项(N为整数),因此TCP报头的最小长度是20字节。

网络层怎么也有tcp协议(-传输层协议-TCP协议)(1)

TCP报头中各字段含义如下:

(1)源端口和目的端口:TCP报文中的源和目的端口加上IP报文中的源和目的IP地址字段,构成一个四元组<源端口,源IP地址,目的端口,目的IP地址>,唯一标识一个TCP连接。

(2)发送序号、确认序号和通告窗口:这几个字段在TCP滑动窗口机制中用到,因为TCP是面向字节流的协议,所以报文段中的每个字节都有编号。发送序号字段给出了该TCP报文段中携带的数据的第一个字节分配的编号(SYN标志位为0),如果在TCP报文中SYN标志位为1,则序号字段表示初始序号(Initial Sequence Number,ISN)。确认序号给出了接收方希望接收的下一个TCP报文段中数据流的第1个字节的编号,确认序号字段只有在ACK标志位为1时有效,而一旦TCP连接建立好,则这个确认序号字段一直有效。通告窗口字段给出了接收方返回给发送方关于接收缓存大小的情况。

(3)头部长度:表示TCP报头长度,以32位为单位。TCP报头之所以需要这个字段,是因为TCP报头有一个选项字段,而选项字段的长度是可变的。头部长度字段为4位,意味着TCP报头的最大长度是60字节;如果TCP报头没有选项字段,则TCP报头的最小长度为20字节。

(4)6位的标志位:用于区分不同类型的TCP报文,目前标志位有SYN、ACK、FIN、RST、PSH和URG。

(5)校验和:通过计算整个TCP报头、TCP数据,以及来自IP报头的源地址、目的地址、协议和TCP长度字段构成的伪头部得来的。

(6)选项:TCP中最常用的选项字段是最大分段长度(MSS),即最大的数据分段长度。每个TCP连接的发起方在第一个报文中就指明了这个选项,其值通常是发送方主机所连接的物理网络的最大传输单元(MTU)减去TCP报头长度(TCP报头长度最小值为20字节)和IP报头长度(IP报头长度的最小值为20字节),这样可以避免发送主机对IP报文进行分段。

MSS字段只能出现在SYN标志位为1的TCP报文(即TCO连接建立请求报文和连接建立响应报文)中,如果TCP连接的另一方不接受发起方各处的MSS值(即协商不成功),则发起方就将MSS设定为默认值536字节(这个MSS值加上20字节TCP报头,再加上20字节IP报头等于576字节,而这正是X.25广域网的MTU)。

2、TCP建立与释放

TCP连接的建立是从客户向服务器发送一个主动打开请求而启动的,如果服务器已经执行了被动打开操作,那么双方就可以交换报文以建立TCP连接。只有在建立TCP连接之后,双方才开始收发数据。而且,当其中一方发送完数据后,就会关闭它这一方的连接,同时向对方发送撤销TCP连接的报文。需要注意的是,TCP连接的建立是一个非对称的活动,即一方执行被动打开另一方执行主动打开;而中止连接则是对称的活动,即每一方都独立地关闭连接。

2.1 TCP建立连接

TCP连接的建立使用了三次握手(Three-way Handshake)机制。三次握手的目的是使数据段的发送和接收同步,同时也向其他主机表明其一次可接收的数据量(窗口大小)并建立逻辑连接。三次握手的过程如下图所示:

网络层怎么也有tcp协议(-传输层协议-TCP协议)(2)

双方通信之前均处于CLOSED状态。

(1)第一次握手

源主机发送一个同步标志位SYN=1的TCP数据段。此段中同时标明初始序号(Initial Sequence Number,ISN)。ISN是一个随时间变化的随机值,即SYN=1,seq=x。源主机进入SYN-SENT状态,若后面没有收到对方的应答,状态变为CLOSED

(2)第二次握手

目标主机接收到SYN后发回确认数据报文。该数据报文ACK=1,同时确认序号字段标明目标主机期待收到源主机下一个数据段的序号,即ACK=x 1(表明前一个数据段已收到且没有错误)。

此外,在此段中设置SYN=1,并包含目标主机的段初始序号y,即ACK=1,确认序号ack=x 1,SYN=1,自身序号seq=y。此时目标主机进入SYN-RCVD状态。(注:ACK表示TCP报文首部的ACK位,ack和seq表示序号)。

(3)第三次握手。

源主机进入ESTABLISHED状态,然后再回送一个确认数据段,同样带有递增的发送序号和确认序号(ACK=1,确认序号ack=y 1,自身序号seq=x 1),当目标主机接收到源主机确认后,进入ESTABLISHED状态。TCP会话的三次握手完成,接下来源主机和目的主机可以互相收发数据。

2.2 TCP释放连接

TCP连接的释放使用了四次挥手机制。

网络层怎么也有tcp协议(-传输层协议-TCP协议)(3)

双方通信之前均处于ESTABLISHED状态。

(1)第一次挥手:源主机发送一个释放报文(FIN=1,自身序号SEQ=x),源主机进入FIN-WAIT状态。

(2)第二次挥手:目标主机接收报文后发出确认报文(ACK=1,确认序号ACK=x 1,自身序号SEQ=y),目标主机进入CLOSE-WAIT状态。此时,源主机停止发送数据,但是目标主机仍然可以发送数据,TCP连接为半关闭状态(HALF-CLOSE)。源主机接收到ACK报文后等待目标主机发出FIN报文,这可能会持续一段时间。

(3)第三次挥手:目标主机确定没有数据,向源主机发送后,发出释放报文(FIN=1,ACK=1,确认序号ACK=x 1,自身序号SEQ=z)。目标主机进入LAST-ACK状态。

注意:由于此时目标主机处于半关闭状态,还会发送一些数据,其序号不一定是y 1,因此设为z。而且,目标主机必须重复发送一次确认序号ACK=x 1。

(4)第四次挥手:源主机接收到释放报文后,对此发送确认报文(ACK=1,确认序号ACK=z 1,自身序号SEQ=x 1),在等待一段时间确定报文达到后,源主机进入CLOSED状态。目标主机在接收确认报文后,也进入CLOSED状态。

3、TCP可靠传输

TCP是可靠的传输层协议,这就表示,应用进程把数据交给TCP后,TCP就能无差错地交给目的端的应用进程。TCP使用差错机制保证数据的可靠传输,TCP的差错控制机制主要是确认和重传。在介绍差错控制机制前,先介绍一下TCP的字节编号。

3.1 字节编号和确认

TCP提供面向连接的字节流传输服务,也就是说,TCP协议将要传送的数据看成是一个个字节组成的字节流,而且接收方返回给发送方的确认是按字节进行的,而不是按照报文段进行。每个TCO连接传输字节流数据的第一个字节序号是建立TCP连接时初始序号加1。

假设每跳TCP要传送5000字节的文件,分为5个TCP报文段进行传送,每个TCP报文携带1000字节。假设TCP连接建立随机选择的初始序号x为10000,则TCP对第一个字节的编号从10001开始。那么每个TCP报文段的字节编号如下所示:报文段1的字节序号为10001(范围从10001~11000);报文段2的字节序号为11001(范围从11001~12000);报文段3的字节序号为12001(范围从12001~13000);报文段4的字节序号为13001(范围从13001~14000);报文段5的字节序号为14001(范围从14001~15000)。

TCP采用差错控制机制是字节确认,一般情况下,接收方确认已收到最长的连续的字节计数,TCP报文的每个确认序号字段指出下一个希望接收到的字节,实际上就是对已经收到的所有字节的确认。

字节确认的优点是即使确认丢失也不一定导致发送方重传。假设接收方TCP发哦是那个的ACK报文段的确认序号是1801,标明字节编码为1800前的所有字节都已经收到。如果接收方TCP前面已经发送过确认序号为1601的ACK报文段,但是如果确认序号为1601的这个AK报文段丢失,也不需要发送方TCP重发这个报文段,这就是所谓的“累计确认”。

3.2 超时重传和重传定时器

发送方TCP为了恢复丢失或损坏的报文段,必须对丢失或损坏的报文段进行重传。事实上,发送方TCP每发送一个TCP报文段,就启动一个重传定时器,如果在规定的时间之内没有收到接收方TCP返回的确认报文,重传定时器超时,于是发送方重传该TCP报文。

影响超时重传最关键的因素是重传定时器的定时宽度,但确定合适的宽度是一件相当困难的事情。因为在互联网环境下,不同主机上的应用进程之间的通信可能在一个局域网上进行,也可能要穿越多个不同的网络,端到端传输延迟的变化幅度相当大,发送方很难把握从发送数据到接收确认的往返时间(Round Trip Time,RTT)。为了解决上述问题,TCP采用了一种适应性重传算法,下面将描述这个算法并讨论它的改进过程。

3.3 超时重传时间计算算法

该算法的大致思想是:动态维持往返时延(RTT)的平均值,然后把TCP重传定时器的值设为RTT的函数,每当TCP发送一个报文表时,它就记录下发送时刻。当该报文段的ACK回来时,TCP记录下ACK返回时刻,同时把ACK返回时刻和TCP报文发送时刻之间的时间差记为SampleRTT。接着,TCP在前一次的RTT估算值EstimatedRTT和当前的新采样值SampleRTT之间通过加权求和计算出新的RTT估算值EstimatedRTT。具体公式如下:

网络层怎么也有tcp协议(-传输层协议-TCP协议)(4)

其中,,因子决定了EstimatedRTT对延迟变化的反应速度。当接近1时,当前的采样值SampleRTT对RTT估算值EstimatedRTT几乎不起作用;而当接近0时,RTT估算值EstimatedRTT紧随延迟的变化而变化,直接采用当前的采样值SampleRTT作为新的RTT估算值EstimatedRTT。作为折中,TCP协议规范推荐取值为0.8~0.9。

TCP重传定时器的值通过下列公式计算出来:

网络层怎么也有tcp协议(-传输层协议-TCP协议)(5)

当接近1时,TCP能迅速检测到报文丢失并及时重传,从而减少等待时间,但可能引起许多不必要的重传。当太大时,重传报文的数目减少,但等待确认的时间增加。作为折中,TCP协议规范推荐取2。

例如,当取0.9,取2时,而且当前的EstimatedRTT等于250,而现在发送一个报文段并且收到确认的SampleRTT是70,则:

网络层怎么也有tcp协议(-传输层协议-TCP协议)(6)

网络层怎么也有tcp协议(-传输层协议-TCP协议)(7)

,