《《计算机网络教学资料》第8章运输层(二).ppt》由会员分享,可在线阅读,更多相关《《计算机网络教学资料》第8章运输层(二).ppt(69页珍藏版)》请在三一办公上搜索。
1、8.6 TCP 可靠传输的实现8.6.1 以字节为单位的滑动窗口,前移,不允许发送,已发送并收到确认,A 的发送窗口=20,允许发送的序号,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,B 期望收到的序号,前沿,后沿,前移,收缩,根据 B 给出的窗口值A 构造出自己的发送窗口,TCP 标准强烈不赞成发送窗口前沿向后收缩,1,不允许发送,已发送并收到确认,A 的发送窗口位置不变,允许发送但尚未发送,26,27,28,29,30,31,32,33,34,35,
2、36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送但未收到确认,56,P1,P2,P3,不允许接收,已发送确认并交付主机,B 的接收窗口,允许接收,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,未按序收到,可用窗口,A 发送了 11 个字节的数据,P3 P1=A 的发送窗口(又称为通知窗口)P2 P1=已发送但尚未收到确认的字节数P3 P2=允许发送但尚未发送的字节数(又称为可用窗
3、口),2,允许发送但尚未发送,A 的发送窗口向前滑动,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送并收到确认,不允许发送,已发送但未收到确认,56,P1,P2,P3,允许接收,B 的接收窗口向前滑动,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送确认并交付主机,不允许接收,56,未按序收到,A 收到新的确认号,发送窗
4、口向前滑动,先存下,等待缺少的数据的到达,3,不允许发送,已发送并收到确认,A 的发送窗口已满,有效窗口为零,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送但未收到确认,56,P1,P2,P3,A 的发送窗口内的序号都已用完,但还没有再收到确认,必须停止发送。,4,发送缓存,最后被确认的字节,发送应用程序,发送缓存,最后发送的字节,发送窗口,已发送,TCP,序号增大,5,接收缓存,接收应用程序,已收到,接收窗口,TCP,接收缓存,下一个读取的字节,序号增大
5、,下一个期望收到的字节(确认号),6,发送缓存与接收缓存的作用,发送缓存用来暂时存放:发送应用程序传送给发送方 TCP 准备发送的数据;TCP 已发送出但尚未收到确认的数据。接收缓存用来暂时存放:按序到达的、但尚未被接收应用程序读取的数据;不按序到达的数据。,7,需要强调三点,A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。,8,8.6.2 超时重传时间的选择,重传机制是
6、TCP 中最重要和最复杂的问题之一。TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。,9,往返时延的方差很大,由于 TCP 的下层是一个互联网环境,IP 数据报所选择的路由变化很大。因而运输层的往返时间的方差也很大。,时间,数据链路层,T1,T2,T3,往返时间的概率分布,10,加权平均往返时间,TCP 保留了 RTT 的一个加权平均往返时间 RTTS(这又称为平滑的往返时间)。第一次测量到 RTT 样本时,RTTS 值就取为所测量到的 RTT 样本值。以后每测量到一个新的 RTT 样本,就按下式重新计算一次 RTTS:新
7、的 RTTS(1)(旧的 RTTS)(新的 RTT 样本)(5-4)式中,0 1。若 很接近于零,表示 RTT 值更新较慢。若选择 接近于 1,则表示 RTT 值更新较快。RFC 2988 推荐的 值为 1/8,即 0.125。,11,超时重传时间 RTO(RetransmissionTime-Out),RTO 应略大于上面得出的加权平均往返时间 RTTS。RFC 2988 建议使用下式计算 RTO:RTO RTTS+4 RTTD(5-5)RTTD 是 RTT 的偏差的加权平均值。RFC 2988 建议这样计算 RTTD。第一次测量时,RTTD 值取为测量到的 RTT 样本值的一半。在以后的测
8、量中,则使用下式计算加权平均的 RTTD:新的 RTTD=(1)(旧的RTTD)+RTTS 新的 RTT 样本(5-6)是个小于 1 的系数,其推荐值是 1/4,即 0.25。,12,往返时间 RTT?,往返时间的测量相当复杂,TCP 报文段 1 没有收到确认。重传(即报文段 2)后,收到了确认报文段 ACK。如何判定此确认报文段是对原来的报文段 1 的确认,还是对重传的报文段 2 的确认?,发送一个TCP 报文段,超时重传TCP 报文段,收到 ACK,时间,1,2,往返时间 RTT?,是对哪一个报文段的确认?,13,Karn 算法,在计算平均往返时间 RTT 时,只要报文段重传了,就不采用其
9、往返时间样本。这样得出的加权平均平均往返时间 RTTS 和超时重传时间 RTO 就较准确。,14,报文段每重传一次,就把 RTO 增大一些:新的 RTO(旧的 RTO)系数 的典型值是 2。当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延 RTT 和超时重传时间 RTO 的数值。实践证明,这种策略较为合理。,修正的 Karn 算法,15,8.6.3 选择确认 SACK(Selective ACK),接收方收到了和前面的字节流不连续的两个字节块。如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。
10、,16,1 1000 1501 3000 3501 4500,确认号=1001,L1=1501,L2=3501,R1=3001,R2=4501,接收到的字节流序号不连续,连续的字节流,第一个字节块,第二个字节块,和前后字节不连续的每一个字节块都有两个边界:左边界和右边界。图中用四个指针标记这些边界。第一个字节块的左边界 L1=1501,但右边界 R1=3001。左边界指出字节块的第一个字节的序号,但右边界减 1 才是 字节块中的最后一个序号。第二个字节块的左边界 L2=3501,而右边界 R2=4501。,17,RFC 2018 的规定,如果要使用选择确认,那么在建立 TCP 连接时,就要在
11、TCP 首部的选项中加上“允许 SACK”的选项,而双方必须都事先商定好。如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息。,18,8.7 TCP 的流量控制8.7.1 利用滑动窗口实现流量控制,一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。流量控制(flow control)就是让发送方的发
12、送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。,19,20,TCP 的流量控制滑动窗口的概念,TCP 采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。在 TCP 报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。,21,收到确认即可前移,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701
13、,801,1,可发送,不可发送,发送端要发送 900 字节长的数据,划分为 9 个 100 字节长的报文段,而发送窗口确定为 500 字节。发送端只要收到了对方的确认,发送窗口就可前移。发送 TCP 要维护一个指针。每发送一个报文段,指针就向前移动一个报文段的距离。,22,收到确认即可前移,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,不可发送,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,发送窗口,可发送,
14、不可发送,发送窗口前移,发送端已发送了 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变。现在发送端还可发送 300 字节。,23,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,已发送并被确认,已发送但未被确认,可发送,不可发送,指针,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,不可发送,指针,发送窗口前移,发送端收到了对方对前 400 字节数据的确认,但对方通知发送端必须把窗口减
15、小到 400 字节。现在发送端最多还可发送 400 字节的数据。,seq=1,DATA,seq=201,DATA,seq=401,DATA,seq=301,DATA,seq=101,DATA,seq=201,DATA,seq=501,DATA,ACK=1,ack=201,rwnd=300,ACK=1,ack=601,rwnd=0,ACK=1,ack=501,rwnd=100,A,B,允许 A 发送序号 201 至 500 共 300 字节,A 发送了序号 101 至 200,还能发送 200 字节,A 发送了序号 301 至 400,还能再发送 100 字节新数据,A 发送了序号 1 至 10
16、0,还能发送 300 字节,A 发送了序号 401 至 500,不能再发送新数据了,A 超时重传旧的数据,但不能发送新的数据,允许 A 发送序号 501 至 600 共 100 字节,A 发送了序号 501 至 600,不能再发送了,不允许 A 再发送(到序号 600 为止的数据都收到了),丢失!,流量控制举例,A 向 B 发送数据。在连接建立时,B 告诉 A:“我的接收窗口 rwnd=400(字节)”。,24,8.8 TCP的拥塞控制8.8.1 拥塞控制的一般原理,在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏产生拥塞(congestion)。出现资源拥
17、塞的条件:对资源需求的总和 可用资源(5-7)若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。,25,拥塞控制与流量控制的关系,拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。,26,拥塞控制所起的作用,提供的负载,吞吐量,0,27,拥塞控制的一般原理,拥塞控制是很难设计的,因为它是一个动态的(而不是静态
18、的)问题。当前网络正朝着高速化的方向发展,这很容易出现缓存不够大而造成分组的丢失。但分组的丢失是网络发生拥塞的征兆而不是原因。在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化甚至发生死锁的原因。这点应特别引起重视。,28,开环控制和闭环控制,开环控制方法就是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。闭环控制是基于反馈环路的概念。属于闭环控制的有以下几种措施:监测网络系统以便检测到拥塞在何时、何处发生。将拥塞发生的信息传送到可采取行动的地方。调整网络系统的运行以解决出现的问题。,29,8.8.2 几种拥塞控制方法1.慢开始和拥塞避免,发送方维持一个叫做拥塞窗
19、口 cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。,30,慢开始算法的原理,在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd=1,即设置为一个最大报文段 MSS 的数值。在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。用这样的方法逐步增大
20、发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。,31,发送方,接收方,发送 M1,确认 M1,发送 M2M3,确认 M2M3,发送 M4M7,确认 M4M7,cwnd=1,cwnd=2,cwnd=4,发送 M8M15,cwnd=8,t,t,发送方每收到一个对新报文段的确认(重传的不算在内)就使 cwnd 加 1。,轮次 1,轮次 2,轮次 3,32,传输轮次(transmission round),使用慢开始算法后,每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间 RTT。“传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都
21、连续发送出去,并收到了对已发送的最后一个字节的确认。例如,拥塞窗口 cwnd=4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。,33,设置慢开始门限状态变量ssthresh,慢开始门限 ssthresh 的用法如下:当 cwnd ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。当 cwnd=ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢
22、增长。,34,当网络出现拥塞时,无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。,35,22,16,慢开始和拥塞避免算法的实现举例,当 TCP 连接进行初始化时,将拥塞窗口置为 1。图中的窗口单位不使用字节而使用报文段。,慢开始门限的初始值设置为 16 个报文段,即 ssthresh=16。,“
23、乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,传输轮次,36,慢开始和拥塞避免算法的实现举例,发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。,22,16,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的
24、 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,传输轮次,37,慢开始和拥塞避免算法的实现举例,在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段 M0。,22,16,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,传输轮次,38,慢开始和拥塞避免算法的实现举例,发送端
25、每收到一个确认,就把 cwnd 加 1。于是发送端可以接着发送 M1 和 M2 两个报文段。,22,16,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,传输轮次,39,慢开始和拥塞避免算法的实现举例,接收端共发回两个确认。发送端每收到一个对新报文段的确认,就把发送端的 cwnd 加 1。现在 cwnd 从 2 增大到 4,并可接着发送后面的 4 个报文段。,22,16,“乘法
26、减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,传输轮次,40,慢开始和拥塞避免算法的实现举例,发送端每收到一个对新报文段的确认,就把发送端的拥塞窗口加 1,因此拥塞窗口 cwnd 随着传输轮次按指数规律增长。,22,16,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数
27、规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,传输轮次,41,慢开始和拥塞避免算法的实现举例,当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(即当 cwnd=16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。,22,16,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,传输轮次,42,22,1
28、6,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,慢开始和拥塞避免算法的实现举例,假定拥塞窗口的数值增长到 24 时,网络出现超时,表明网络拥塞了。,传输轮次,43,22,16,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,
29、慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,慢开始和拥塞避免算法的实现举例,更新后的 ssthresh 值变为 12(即发送窗口数值 24 的一半),拥塞窗口再重新设置为 1,并执行慢开始算法。,传输轮次,44,22,16,“乘法减小”,2,4,6,8,10,12,14,16,18,20,0,0,4,8,12,20,24,拥塞窗口 cwnd,新的 ssthresh 值,网络拥塞,指数规律增长,ssthresh 的初始值,慢开始,慢开始,慢开始,拥塞避免“加法增大”,拥塞避免“加法增大”,慢开始和拥塞避免算法的实现举例,当 cwnd=12 时改为执行拥塞避免算法,拥塞窗口
30、按按线性规律增长,每经过一个往返时延就增加一个 MSS 的大小。,传输轮次,45,乘法减小(multiplicative decrease),“乘法减小“是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数。,46,加法增大(additive increase),“加法增大”是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,
31、以防止网络过早出现拥塞。,47,必须强调指出,“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。,48,2.快重传和快恢复,快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。,49,快重传举例,发送方,接收方,发送 M1,确认 M1,t,确认 M2,发送 M2,发送
32、 M3,发送 M4,?,发送 M5,发送 M6,重复确认 M2,重复确认 M2,重复确认 M2,t,发送 M7,丢失,50,快恢复算法,(1)当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。(2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。,51,24,从连续收到三个重复的确认转入拥塞避免,2,4,6,8,10,12,14,16,18,2
33、0,22,0,0,4,8,12,16,20,传输轮次,拥塞窗口 cwnd,收到 3 个重复的确认执行快重传算法,慢开始,“乘法减小”,拥塞避免“加法增大”,TCP Reno版本,TCP Tahoe 版本(已废弃不用),ssthresh 的初始值,拥塞避免“加法增大”,新的 ssthresh 值,慢开始,快恢复,52,发送窗口的上限值,发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:发送窗口的上限值 Min rwnd,cwnd(5-8)当 rwnd cwnd 时,是接收方的接收能力限制发送窗口的最大值。当 cwnd rwnd
34、 时,则是网络的拥塞限制发送窗口的最大值。,53,8-9 TCP 的运输连接管理1.运输连接的三个阶段,运输连接就有三个阶段,即:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。连接建立过程中要解决以下三个问题:要使每一方能够确知对方的存在。要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。,54,客户服务器方式,TCP 连接的建立都是采用客户服务器方式。主动发起连接建立的应用进程叫做客户(client)。被动等待连接建立的应用进程叫做服务器(server)。,55,用三次握手
35、建立 TCP 连接,CLOSED,CLOSED,A,B,客户,服务器,8.9.1 TCP 的连接建立,A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN=1,并选择序号 seq=x,表明传送数据时的第一个数据字节的序号是 x。,56,用三次握手建立 TCP 连接,CLOSED,CLOSED,A,B,客户,服务器,8.9.1 TCP 的连接建立,B 的 TCP 收到连接请求报文段后,如同意,则 发回确认。B 在确认报文段中应使 SYN=1,使 ACK=1,其确认号ack=x 1,自己选择的序号 seq=y。,57,CLOSED,CLOSED,A,B,客户,服务器,A 收到此报文
36、段后向 B 给出确认,其 ACK=1,确认号 ack=y 1。A 的 TCP 通知上层应用进程,连接已经建立。,58,CLOSED,CLOSED,A,B,客户,服务器,B 的 TCP 收到主机 A 的确认后,也通知其上层 应用进程:TCP 连接已经建立。,59,用三次握手建立 TCP 连接的各状态,CLOSED,CLOSED,A,B,客户,服务器,8.9.1 TCP 的连接建立,60,CLOSED,数据传送,ESTAB-LISHED,ESTAB-LISHED,A,B,客户,服务器,CLOSED,8.9.2 TCP 的连接释放,数据传输结束后,通信的双方都可释放连接。现在 A 的应用进程先向其
37、TCP 发出连接释放 报文段,并停止再发送数据,主动关闭 TCP 连接。A 把连接释放报文段首部的 FIN=1,其序号 seq=u,等待 B 的确认。,61,数据传送,通知应用进程,ESTAB-LISHED,ESTAB-LISHED,A,B,客户,服务器,8.9.2 TCP 的连接释放,B 发出确认,确认号 ack=u 1,而这个报文段自己的序号 seq=v。TCP 服务器进程通知高层应用进程。从 A 到 B 这个方向的连接就释放了,TCP 连接 处于半关闭状态。B 若发送数据,A 仍要接收。,62,数据传送,ESTAB-LISHED,ESTAB-LISHED,A,B,客户,服务器,数据传送,
38、8.9.2 TCP 的连接释放,若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。,63,数据传送,ESTAB-LISHED,ESTAB-LISHED,A,B,客户,服务器,数据传送,8.9.2 TCP 的连接释放,A 收到连接释放报文段后,必须发出确认。,64,数据传送,ESTAB-LISHED,ESTAB-LISHED,A,B,客户,服务器,数据传送,8.9.2 TCP 的连接释放,在确认报文段中 ACK=1,确认号 ack w 1,自己的序号 seq=u+1。,ACK=1,seq=u+1,ack=w 1,65,ACK=1,seq=u+1,ack=w 1,FIN=1
39、,ACK=1,seq=w,ack=u 1,FIN-WAIT-1,CLOSE-WAIT,FIN-WAIT-2,LAST-ACK,被动关闭,数据传送,ESTAB-LISHED,ESTAB-LISHED,A,B,客户,服务器,数据传送,CLOSED,5.9.2 TCP 的连接释放,TCP 连接必须经过时间 2MSL 后才真正释放掉。,66,A 必须等待 2MSL 的时间,第一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B。第二,防止“已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络
40、中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。,67,8.9.3 TCP 的有限状态机,TCP 有限状态机的图中每一个方框都是 TCP 可能具有的状态。每个方框中的大写英文字符串是 TCP 标准所使用的 TCP 连接状态名。状态之间的箭头表示可能发生的状态变迁。箭头旁边的字,表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作。图中有三种不同的箭头。粗实线箭头表示对客户进程的正常变迁。粗虚线箭头表示对服务器进程的正常变迁。另一种细线箭头表示异常变迁。,68,TCP的有限状态机,CLOSED,ESTABLISHED,LISTEN,CLOSE_WAIT,FIN_WAIT
41、_1,SYN_RCVD,FIN_WAIT_2,CLOSING,TIME_WAIT,SYN_SENT,LAST_ACK,主动打开,被动打开,被动关闭,主动关闭,起点,被动打开,主动打开 发送 SYN,同时打开,收到 SYN,发送 SYN,ACK,收到 ACK,数据传送 阶段,关闭发送 FIN,关闭发送 FIN,关闭发送 FIN,收到 RST,收到 SYN发送 SYN,ACK,关闭或超时,收到 ACK,收到 SYN,ACK发送 ACK,收到 ACK,收到 ACK,收到 FIN发送 ACK,收到 FIN,ACK 发送 ACK,收到 FIN发送 ACK,同时关闭,收到 FIN发送 ACK,发送 SYN,定时经过两倍报文段寿命后,关闭,69,