第7章传输控制协议TCP要求:1.掌握TCP的可靠性机制:确认、重传、序号;2.掌握TCP的流控和提高传输效率策略:滑动窗口机制;3.掌握TCP连接的建立与关闭协议:三次握手;4.掌握TCP的报文段格式;5.掌握TCP的拥塞控制技术;6.掌握TCP避免糊涂窗口综合症的技术;7.了解紧急数据发送和强迫数据发送。7.1概述1.可靠性:①防丢失:确认与重传;②防重复:报文段序号;2.传输效率、流量控制:滑动窗口机制;3.拥塞控制:加速递减与慢启动技术;4.建立连接:三次握手协议;5.关闭连接:改进的三次握手协议。要实现可靠的数据流传输服务,必须解决哪几个问题?①面向数据流;②虚电路连接;③有缓冲的传输;④无结构的数据流;⑤全双工连接。可靠传输服务有哪些特点?7.2提供可靠性1.防丢失–带重传的肯定确认技术①接收方收到数据后向源站发确认(ACK);②设置定时器,源站在限定时间内未收到ACK,则重发。数据发送方数据接收方接收确认发送分组接收分组发送确认接收确认发送分组接收分组发送确认超时重传两个问题:如何对待重复的数据?定时器时限设置多长?2.防重复–可捎带的累计确认技术①为每一分组赋予序号。②确认时也指明确认哪个分组。③序号同时保证了分组间的正确顺序。3.RTT与重传定时器问题:超时重传,如何设置定时器的时限?两个概念:①RTT:往返时间,报文段发出到收到确认信息间的时间段。②自适应重传算法:监视每个连接的性能,由此推算出合适的定时时限。当连接的性能变化时,随时修改定时时限。重传定时时限的计算方法:①早期的方法②改进的方法③Karn算法和定时器补偿(1)早期的方法R:RTT的估计值M:本次测量的RTT值RT0:定时时限修改估计值:R←αR+(1-α)M(0≤α1,通常取α=0.9)计算时限:RT0=βR(β早期取2,后改为4)缺陷:在RTT变化较大的场合,说明网络某处处于拥塞状态,但上述方法对此反映不敏感,从而造成不必要的重传,进一步加重网络负担。(2)改进的方法R:RTT的估计值M:本次测量的RTT值RT0:定时时限Diff:差值Dev:平均偏差的估计值Diff←M-RR←R+δ*DiffDev←Dev+ρ*(|Diff|-Dev)(Dev的估计值)RT0←R+η*Devδ、ρ在0—1之间,通常取:δ=1/23,ρ=1/22,η=22(3)Karn算法和定时器补偿确认二义性:对于重传的报文段,收到确认后是对哪一次传输的确认无法确定。结果:RTT样本值无法使用;Karn算法:思想:当超时重传发生时,不再更新RTT估计器,忽略重传样本。定时器补偿:超时重传发生,加大定时时限:RT0←γ*RT0(γ通常取2,即指数避退)。对重传分组的后续分组,定时时限不变,直到获得一个新的有效样本时再更改时限值。7.3传输效率和流量控制-滑动窗口机制1.一般的滑动窗口机制思想:允许发送方不必等确认到来就可继续发送下面的分组,但规定一个上限。若多个分组的确认未到时,则暂停发送。12345678910111213分组流WindowSize=8已发并得到确认不能发送已发未得到确认未发但可以发2.TCP的滑动窗口技术(1)数据流的各字节被编上序号。(2)TCP的滑动窗口按字节操作而不是按报文段或分组操作。(3)TCP窗口大小为字节数。最大为65535字节。(4)通信双方都设有发送和接收缓冲区(相当于发送窗口和接收窗口)。默认大小各系统有差异,如4096、8192、16384等。发送缓冲区大小为默认窗口大小。12..100101102………41004101分组流WindowSize=4000已发并得到确认不能发送已发未得到确认未发但可以发(5)TCP连接两端各有两个窗口(发送窗口和接收窗口)3.TCP端到端流量控制-窗口大小可变技术时机:目的主机缓冲区变小而不能接收源主机更多的数据时,就要进行流量控制。TCP技术:可随时改变窗口大小。目的主机在确认时,还向源主机告知目的主机接收缓冲区的大小。说明:接收方使用0窗口通告来停止所有的传输。此时,除了紧急数据和窗口试探报文外,不发其它数据。窗口试探报文:防止非0窗口通告丢失或造成死锁…101…200201…320321…399发送窗口,初始时400确认(200)窗口通告(120)发送窗口,变为1201.什么是SWS?接收方的小窗口通告造成发送方发送一系列小的报文段,严重浪费网络带宽。2.启发式的避免策略:接收方:(1)避免小窗口通告,在零窗口通告之后,只在可用缓冲区显著增加(缓冲区空间的一半或一个MSS)后才发送新的窗口通告(2)推迟确认(最多500ms),窗口大小不到避免SWS策略所需的尺寸时,不确认。为了使发送方正确估计RTT,至少每隔一个报文段要进行正常的确认。7.4糊涂窗口综合症SWS发送方:避免小报文段发送Nagle算法:自适应推迟传输以便将数据组块(1)连接建立后,最初的数据会立即发送。(2)当缓冲区中数据不足一个报文段,则推迟发送。等到一个确认来到(确认触发)时,发送缓冲区中的小报文段。问题:可能出现死锁吗?确认丢失。3.说明①Nagle算法的两个优点:自适应:确认到达得越快,数据也就发送得越快;计算简单:不需要定时器。②可关闭Nagle算法,应用程序接口一般提供选项TCP-NODELAY来关闭Nagle算法。拥塞:交换节点(如路由器)数据报负载过重的现象。回顾:IP层的拥塞控制技术:(ICMP源站抑制报文),是一种被动机制。TCP拥塞控制的必要性:在TCP层,拥塞造成时延增加,这又会造成超时重传,控制不当会进一步加重拥塞。TCP采用了一种主动控制机制。1.拥塞控制技术:①拥塞窗口cwnd②加速递减技术③慢启动技术7.5TCP拥塞控制技术①拥塞窗口cwnd每个连接都有一个拥塞窗口,该窗口大小以字节为单位,但是增加和减少以MSS为单位;初始大小:1个MSS;临界值:64KB②慢启动技术指数递增:每次成功发送1个MSS长度的报文段,则发送方拥塞窗口加倍;线性递增:增长到临界值后,每次增加1个MSS发送窗口=min(接收方窗口通告,cwnd)③加速递减技术指数级递减:出现超时重传时,将临界值设为当前拥塞窗口的1/2,拥塞窗口恢复为1个MSS大小;指数退避:对保留在发送窗口中的报文段,将重传时限加倍。80KB超时64KB临界值40KB临界值2.IP层对改善TCP性能的支持路由器发生拥塞时,早期的策略是尾部丢弃:当队列满时,丢弃随后到达的每一个数据报。结果造成全局性同步:大量TCP连接只是被丢弃了一两个报文段而进入慢启动状态。解决方案:RED–随机早期丢弃方法:设置Tmin和Tmax,通常Tmax=2Tmin①若队列长度Tmin,则不丢弃。②若队列长度Tmax,则丢弃新数据报。③若队列长度在Tmin—Tmax之间,则以概率P丢弃新报。P是动态变化的,通常正比于队列长度。缺陷:突发数据时造成丢弃过多改进:avg=(1-r)*avg+r*current_queue_sizer=0.02(保证稳定增长)7.6TCP报文1.报文段和序号:报文段是TCP软件间传输数据的基本单元,每个报文段都有一个序号。(1)选取初始序号(2)第n+1段的序号=第n段序号+第n段数据区字节数(相当于每个字节都有一个序号)源端口目标端口序号确认号首部长度保留码元比特窗口校验和紧急指针选项(若有)填充数据首部长度:4字节计数,最大15,TCP首部长度20-60序号:当前报文的序号确认号:希望接收的对方下一报文段序号(已成功接收到的数据字节序+1)说明:(1)序号和确认序号在一起使得确认可捎带进行。(2)TCP采用累计确认策略。问题:采用累计确认,确认丢失不一迫使发送方重传,为什么?(3)TCP采用经受时延的确认(时延一般为200ms)。缺点:发送方无法收到所有成功传输的报文段的确认信息,对往返时间样本的精确测量带来影响。窗口:通告对等端缓冲区大小,使发送方修改窗口的大小,以便进行收发双方的流量控制。问题:初始窗口大小如何确定?默认值,在建立连接时互相通告校验和计算:加入伪首部,必须(UDP可选)源IP目标IP0协议TCP长度码元比特(标识报文段的目的与内容):URG紧急ACK确认PSH强迫RST连接复位SYN序号同步FIN字节流同步带有确认建立连接异常关闭连接正常关闭连接选项:第一版TCP:定义了选项表结束、无操作、MSS(最大报文段长度。选项表结束Kind=0(1byte)MSSKind=2(1byte)len=4(1byte)MSS(2byte)MSS过小:效率低MSS过大:考虑分片,丢失可能性增大MSS接近路径MTU时为最佳(由于路径改变,很难)。说明:只有SYN报文能协商MSS,默认536字节无操作Kind=1(1byte)功能:使得选项达到4字节的整数倍选项:第二版TCP(rfc1323):增加了窗口扩大因子和时间戳。窗口扩大因子Kind=3len=4移位数功能:将TCP窗口定义从16bit扩大到32bit。移位数=R:窗口大小=65535╳2R说明:①只能出现在一个SYN报文段中;②主动建立连接的一方发送这个选项,被动方收到该选项后才能发此选项;③每个方向上的扩大因子可以不同;时间戳选项:kind=8len=10时间戳值(4byte)时间戳回显应答(4byte)时间戳:发送方填时间戳回显应答:接收方确认复制发回功能:更好地估算RTT防止回绕的序号问题:如果接收方发送了一个对两个报文段的确认,那么应该复制哪一个报文的时间戳字段呢?解决:TCP为每个连接保留一个时间戳数值。1.TCP设置两个变量:(1)tsrecent:每个连接的时间戳数值;(2)lastack:最后发送的ACK的确认序号;2.当包含lastack的报文段到达时,其中的时间戳被保存至tsrecent;3.无论何时发送确认,tsrecent将被写入时间戳回显应答字段,确认序号则被保存到lastack。分析:1.若ACK被接收方延迟,则回显的是第一个报文段。例:若包含1~1024和1025~2048字节的两个报文段到达,则:lastack为1025,回显时间戳为1~1024的时戳。原因:发送方在进行重传超时时间的计算时,必须将延迟的ACK也考虑在内。2.若收到的报文失序,则丢失的报文段到达时,它的时间戳被回显。例:收到报文的顺序为1~1024-2049~4072-1025~2048,则处理情况如下:(1)确认号为1025,回显时间戳为1~1024的时戳;(2)确认号为1025,回显时间戳为1~1024的时戳;(3)确认号为4073,回显时间戳为1025~2048的时戳;结果:造成RTT估计过高,比过低好7.7TCP连接的建立与关闭1.建立连接:三次握手功能:1.同意连接协商,做好传输数据的准备;2.各自报文段ISN(初始序列号)协商(不能为‘1’);3.协商MSS(只有SYN报文段能协商MSS)。说明:SYN报文段占用初始序号,发送数据的第一字节序号为ISN+1。接收ACK客户端服务器报文段发送SYNseq=xREQUEST接收SYN发送SYNseq=y,ACKx+1ACCEPTED接收SYN+ACK发送ACKy+1CONFIRM2.关闭连接:改进的三次握手说明:①FIN报文段占用一个序号;单纯的ACK报文段不占用序号。②TCP提供了半关闭能力:连接的一端在结束它的发送后还能接收来自另一端数据。③有些编程接口提供close来关闭TCP连接,提供shutdown加特殊参数来实现半关闭。3.异常时强行关闭连接连接复位–RST,发起端发RST报文段;双方立即停止传输,并退出连接。网点1网点2接收ACK接收ACK发送FINseq=x接收FINACKx+1发送FINseq=yACKx+1接收FIN+ACK发送ACKy+15.同时打开和同时关闭同时打开:交换4个报文段同时关闭:交换4个报文段ESTABLISHEDESTABLISHED主动打开SYN_SENTSYNj主动打开SYN_SENTSYNkSYN_RCVDSYNj,ackK+1SYN_RCVDSYNk,a