《TCP/IP网络原理与应用》之TCP协议介绍2《TCP/IP网络原理与应用》袁巍华中科技大学电信系2012.04《TCP/IP网络原理与应用》之TCP协议介绍2主要内容TCP的流量控制与拥塞控制TCP的重传机制TCP的选项TCP的有限状态机《TCP/IP网络原理与应用》之TCP协议介绍2参考资料《计算机网络》(第四版),谢希仁《TCP/IP详解卷1:协议》,W.RICHARDSTEVENS《下一代INTERNET的网络技术》,李津生等《TCP/IP网络原理与应用》之TCP协议介绍2主要内容TCP的流量控制与拥塞控制TCP的重传机制TCP的选项TCP的有限状态机《TCP/IP网络原理与应用》之TCP协议介绍2TCP的流量控制与拥塞控制0.拥塞的概念在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)。出现资源拥塞的条件:对资源需求的总和可用资源若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。《TCP/IP网络原理与应用》之TCP协议介绍2拥塞控制与流量控制的关系拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制,是局部问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。《TCP/IP网络原理与应用》之TCP协议介绍2TCP的流量控制与拥塞控制1.滑动窗口等概念TCP采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。在TCP报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。《TCP/IP网络原理与应用》之TCP协议介绍2[实验]观察发送窗口大小变化实验步骤:编程实现TCP服务器并运行该服务器在三次握手完成后即进入休眠状态使用Telnet连接该服务器并发送数据使用Windump抓包分析《TCP/IP网络原理与应用》之TCP协议介绍2窗口减小《TCP/IP网络原理与应用》之TCP协议介绍2收到确认即可前移1002003004005006007008009001012013014015016017018011发送窗口可发送不可发送指针发送端要发送900字节长的数据,划分为9个100字节长的报文段,而发送窗口确定为500字节。发送端只要收到了对方的确认,发送窗口就可前移。发送TCP要维护一个指针。每发送一个报文段,指针就向前移动一个报文段的距离。《TCP/IP网络原理与应用》之TCP协议介绍2收到确认即可前移1002003004005006007008009001012013014015016017018011可发送不可发送指针1002003004005006007008009001012013014015016017018011发送窗口可发送不可发送指针发送窗口前移发送端已发送了400字节的数据,但只收到对前200字节数据的确认,同时窗口大小不变。现在发送端还可发送300字节。已发送并被确认已发送但未被确认《TCP/IP网络原理与应用》之TCP协议介绍21002003004005006007008009001012013014015016017018011已发送并被确认已发送但未被确认可发送不可发送指针1002003004005006007008009001012013014015016017018011已发送并被确认可发送不可发送指针发送窗口前移发送窗口缩小发送端收到了对方对前400字节数据的确认,但对方通知发送端必须把窗口减小到400字节。现在发送端最多还可发送400字节的数据。《TCP/IP网络原理与应用》之TCP协议介绍2零窗口探测(1)TCP提供可靠的传输服务,将TCP分组送到目的地,如果需要可进行重发。然而,TCP并不保证接收确认的可靠性。通常,这种操作不会发生严重问题。《TCP/IP网络原理与应用》之TCP协议介绍2零窗口探测(2)不重发接收确认分组会出现以下危险工作站将窗口置成0,处于至少在短时间内一个字节也不能从连接上接收的状态。拥塞消除后,工作站重新发送接收确认分组,再次打开窗口。假定该分组在传输中丢失。PC没有收到该分组,故无法知道窗口又被打开。这时,此连接出现了问题。如果工作站没有要发送的数据,它就没有理由发送其他TCP分组。另一方面,PC误认为窗口被关闭,不允许发送其他分组。《TCP/IP网络原理与应用》之TCP协议介绍2零窗口探测(3)为了消除这种死锁(deadlock)状态,要求PC侧的TCP发起特殊的操作。也就是说,在窗口完全关闭的情况下,TCP总是定时地发送分组。当然,因该分组在窗口之外,所以预料对方会拒绝该分组。其结果不外乎以下二种情况,一种是对方以接收确认分组形式传来拒绝信息,利用它可以确认零窗口(zerowindow)仍然存在,另一种实际上是重发那个丢失的带有打开窗口信息的接收确认分组。在TCP规范中,推荐在该连接当前的重发定时器设定的时间内若窗口处于关闭状态时,发送第一个零窗口探测分组。然后,应以指数增大的间隔发送其后的探测分组直至某一最大值。《TCP/IP网络原理与应用》之TCP协议介绍2零窗口探测(4)《TCP/IP网络原理与应用》之TCP协议介绍2零窗口探测(5)PC收到关闭窗口的第一个接收确认分组后,立即启动定时器。当定时器超时而窗口依然被关闭时,PC发送1字节的数据,即序列号为200的字节。此时,因窗口依然处于关闭状态,工作站可通过对该分组应答进行确认。此后当工作站变为能够接收下一个数据的状态时,就发送接收确认分组以开放窗口。图中此分组丢失。幸好,PC再次进行零窗口探测。在进行该操作时,工作站应收到第200号字节。PC收到它的确认分组时,窗口已经打开。于是连接上的数据流重新流动。《TCP/IP网络原理与应用》之TCP协议介绍2[实验]零窗口现象观察实验步骤:编写服务器并运行客户连接上后,服务器即进入睡眠状态编写客户端并连接上述服务器不停地向服务器发送数据使用WinDump抓包并分析请观看录像《窗口减小至0》《TCP/IP网络原理与应用》之TCP协议介绍2[实验]零窗口探测实验步骤:编写服务器并运行客户连接上后,服务器即进入睡眠状态20秒醒来后,服务器读取数据编写客户端并连接上述服务器不停地向服务器发送数据使用WinDump抓包并分析《TCP/IP网络原理与应用》之TCP协议介绍2[实验]零窗口探测TCP服务器代码《TCP/IP网络原理与应用》之TCP协议介绍2[实验]零窗口探测使用命令windump–i2tcpandhost192.168.88.2061.txt抓包数据部分结果请见《零窗口探测.doc》《TCP/IP网络原理与应用》之TCP协议介绍22.慢开始和拥塞避免发送端的主机在确定发送报文段的速率时,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞。因此,每一个TCP连接需要有以下两个状态变量:接收端窗口rwnd(receiverwindow)又称为通知窗口(advertisedwindow)。拥塞窗口cwnd(congestionwindow)。《TCP/IP网络原理与应用》之TCP协议介绍2接收端窗口rwnd和拥塞窗口cwnd(1)接收端窗口rwnd这是接收端根据其目前的接收缓存大小所许诺的最新的窗口值,是来自接收端的流量控制。接收端将此窗口值放在TCP报文的首部中的窗口字段,传送给发送端。(2)拥塞窗口cwnd(congestionwindow)是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的控制。《TCP/IP网络原理与应用》之TCP协议介绍2发送窗口的上限值发送端的发送窗口的上限值应当取为接收端窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,即应按以下公式确定:发送窗口的上限值Min[rwnd,cwnd](7-1)当rwndcwnd时,是接收端的接收能力限制发送窗口的最大值。当cwndrwnd时,则是网络的拥塞限制发送窗口的最大值。《TCP/IP网络原理与应用》之TCP协议介绍2慢开始算法的原理在主机刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段MSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送端的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。《TCP/IP网络原理与应用》之TCP协议介绍2慢开始和拥塞避免算法的实现举例当TCP连接进行初始化时,将拥塞窗口置为1。图中的窗口单位不使用字节而使用报文段。慢开始门限的初始值设置为16个报文段,即ssthresh=16。246810121416182022004812162024传输次数拥塞窗口cwnd进入拥塞避免发生超时指数规律增长线性规律增长ssthresh=16慢开始慢开始拥塞避免拥塞避免更新后的ssthresh=12进入拥塞避免《TCP/IP网络原理与应用》之TCP协议介绍2慢开始和拥塞避免算法的实现举例发送端的发送窗口不能超过拥塞窗口cwnd和接收端窗口rwnd中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。246810121416182022004812162024传输次数拥塞窗口cwnd进入拥塞避免发生超时指数规律增长线性规律增长ssthresh=16慢开始慢开始拥塞避免拥塞避免更新后的ssthresh=12进入拥塞避免《TCP/IP网络原理与应用》之TCP协议介绍2慢开始和拥塞避免算法的实现举例在执行慢开始算法时,拥塞窗口cwnd的初始值为1,发送第一个报文段M0。246810121416182022004812162024传输次数拥塞窗口cwnd进入拥塞避免发生超时指数规律增长线性规律增长ssthresh=16慢开始慢开始拥塞避免拥塞避免更新后的ssthresh=12进入拥塞避免《TCP/IP网络原理与应用》之TCP协议介绍2慢开始和拥塞避免算法的实现举例246810121416182022004812162024传输次数拥塞窗口cwnd进入拥塞避免发生超时指数规律增长线性规律增长ssthresh=16慢开始慢开始拥塞避免拥塞避免更新后的ssthresh=12进入拥塞避免发送端收到ACK1(确认M0,期望收到M1)后,将cwnd从1增大到2,于是发送端可以接着发送M1和M2两个报文段。《TCP/IP网络原理与应用》之TCP协议介绍2慢开始和拥塞避免算法的实现举例接收端发回ACK2和ACK3。发送端每收到一个对新报文段的确认ACK,就把发送端的拥塞窗口加1。现在发送端的cwnd从2增大到4,并可发送M4~M6共4个报文段。246810121416182022004812162024传输次数拥塞窗口cwnd进入拥塞避免发生超时指数规律增长线性规律增长ssthresh=16慢开始慢开始拥塞避免拥塞避免更新后的ssthresh=12进入拥塞避免《TCP/IP网络原理与应用》之TCP协议介绍2慢开始和拥塞避免算法的实现举例发送端每收到一个对新报文段的确认ACK,就把发送端的拥塞窗口加1,因此拥塞窗口cwnd随着传输次数按指数规律增长。246810121416182022004812162024传输次数拥塞窗口cwnd进入拥塞避免发生超时指数规律增长线性规律增长ssthresh=16慢开始慢开始拥塞避免拥塞避免更新后的ssthresh=12进入拥塞避免《TCP/IP网络原理与应用》之TCP协议介绍2慢开始和拥塞避免算法的实现举例当拥塞窗口cw