《华中科技大学计算机网络课件-第3章-运输层教学内容.ppt》由会员分享,可在线阅读,更多相关《华中科技大学计算机网络课件-第3章-运输层教学内容.ppt(131页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、华中科技大学计算机网络华中科技大学计算机网络课件课件-第第3 3章章-运输层运输层第三章 运输层目 录n概述和运输层服务n多路复用与多路分解n无连接传输:UDPn可靠数据传输的原理n面向连接的传输:TCPn拥塞控制原理nTCP拥塞控制2022/11/182第三章 运输层3.1 概述和运输层服务n运输层的功能运输层的功能q为不同主机上运行的应用进程之间提供逻辑通信(logical communication)n运输层协议的工作内容运输层协议的工作内容q发送方:把应用数据划分成 报文段(segments),交给网络层q接收方:把报文段重组成应用数据,交付给应用层2022/11/183第三章 运输层
2、3.1 概述和运输层服务n运输层和网络层的区别运输层和网络层的区别q网络层:不同主机之间的逻辑通信q运输层:应用进程之间的逻辑通信类似于家庭间通信:12个孩子要与另一个家庭的12个孩子相互通信n进程=孩子们n进程间报文=信封中的信笺n主机=家庭的房子n运输协议=张三 和 李四n网络层协议=邮局提供的服务2022/11/184第三章 运输层3.1 概述和运输层服务n上例中的几种特殊场景上例中的几种特殊场景q张三和李四生病了,无法工作,换成张五和李六n不同的运输层协议可能提供不一样的服务q邮局不承诺信件送抵的最长时间n运输层协议能够提供的服务受到底层网络协议的服务模型的限制q邮局不承诺平信一定安全
3、可靠的送达,可能在路上丢失,但张三、李四可在较长时间内没有受到对方的回信时,再次誊写信件,寄出n在网络层不提供某些服务的情况下,运输层自己提供2022/11/185第三章 运输层3.1 概述和运输层服务n因特网上的运输层协议因特网上的运输层协议q用户数据报协议UDP(数据报)q传输控制协议TCP(报文段)q所提供的服务n进程间数据交付n差错检测n可靠的数据传输n拥塞控制2022/11/186第三章 运输层3.2 多路复用与多路分解应用层运输层网络层TCP 报文段UDP用户数据报应用进程TCP 复用IP 复用UDP 复用TCP 报文段UDP用户数据报 应用进程端口端口TCP 分用UDP 分用IP
4、 分用发送方接收方2022/11/187第三章 运输层3.2 多路复用与多路分解n端口端口q端口的作用就是让应用层的各种应用进程都能将其数据通过端口向下交付给运输层,以及让运输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程(或者线程)q从这个意义上讲,端口是用来标志应用层的进程(或者线程)q端口用一个 16 bit 端口号进行标志2022/11/188第三章 运输层3.2 多路复用与多路分解n套接字套接字qTCP 使用“连接”(而不仅仅是“端口”)作为最基本的抽象,同时将 TCP 连接的端点称为套接字(socket)。q套接字和端口、IP 地址的关系是:IP 地址131.6.2
5、3.13 端口号1500 131.6.23.13,1500套接字(socket)2022/11/189第三章 运输层3.2 多路复用与多路分解n报文段(数据报)的投送报文段(数据报)的投送q主机收到IP包n每个数据包都有源IP地址和目的IP地址n每个数据包都携带一个传输层的数据报文段n每个数据报文段都有源、目的端口号q主机根据“IP地址端口号”将报文段定向到相应的套接字源端口#目的端口#32 位应用数据(报文)其他首部字段TCP/UDP 报文段格式2022/11/1810第三章 运输层3.2 多路复用与多路分解n面向连接到复用和分用面向连接到复用和分用qTCP 套接字由一个四元组来标识(源IP
6、地址,源端口号,目的IP地址,目的端口号)q接收方主机根据这四个值将报文段定向到相应的套接字q服务器主机同时支持多个并发的TCP套接字:n每一个套接字都由其四元组来标识qWeb服务器为每一个客户连接都产生不同的套接字n非持久HTTP对每一个请求都建立不同的套接字(会影响性能)2022/11/1811第三章 运输层3.2 多路复用与多路分解n举例:多线程的举例:多线程的WEB服务器服务器P1客户 IP:A客户IP:BP2服务器IP:CP4P3SP:9157DP:80S-IP:AD-IP:CSP:9157DP:80D-IP:CS-IP:BSP:5775DP:80D-IP:CS-IP:B2022/1
7、1/1812第三章 运输层3.3 无连接传输:UDPn一个最简单的运输层协议必须提供一个最简单的运输层协议必须提供q多路复用/多路分解服务q差错检查实际上这就是实际上这就是UDP所提供的功能(所提供的功能(RFC 768)2022/11/1813第三章 运输层3.3 无连接传输:UDPnUDP处理数据的流程处理数据的流程q发送方n从应用进程得到数据n附加上为多路复用/多路分解所需的源和目的端口号及差错检测信息,形成报文段(数据报)n递交给网络层,尽力而为的交付给接收主机q接收方n从网络层接收报文段(数据报)n根据目的端口号,将数据交付给相应的应用进程UDP通信事先无需握手,是通信事先无需握手,
8、是无连接的无连接的2022/11/1814第三章 运输层3.3 无连接传输:UDPnUDP的优势的优势q无需建立连接建立连接会增加时延q简单发送方和接收方无需维护连接状态q段首部开销小TCP:20Byte vs UDP:8Byteq无拥塞控制UDP 可按需要随时发送2022/11/1815第三章 运输层3.3 无连接传输:UDPn部分采用部分采用UDP协议的应用协议的应用q远程文件系统(NFS)q流式多媒体q因特网电话q网络管理(SNMP)q选路协议(RIP)q域名解析(DNS)2022/11/1816第三章 运输层3.3 无连接传输:UDPnUDP大量应用可能导致的严重后果大量应用可能导致的
9、严重后果q路由器中大量的分组溢出q显著减小TCP通信的速率,甚至挤垮TCP会话n使用使用UDP的可靠数据传输的可靠数据传输q在应用层实现数据的可靠传输q增加了应用进程的实现难度2022/11/1817第三章 运输层3.3 无连接传输:UDPnUDP报文段(报文段(数据报数据报)的结构)的结构源端口源端口#目的端口目的端口#32 位位应用数据应用数据(报文报文)长度长度检查和检查和包括首部在内的包括首部在内的UDP报文段长度报文段长度,(以字节为单位)(以字节为单位)2022/11/1818第三章 运输层3.3 无连接传输:UDPnUDP的检查和的检查和q目标n检测收到的报文段的“差错”(例如,
10、出现突变的比特)q发送方n把报文段看作是16比特字的序列n检查和:对报文段的所有16比特字的和进行1的补运算n发送方将计算校验和的结果写入UDP校验和字段中n增加伪首部:(源IP地址(4字节)、目的IP地址(4字节)、0(1字节)、17(UDP协议号,1字节)、UDP长度(2字节))q接收方n计算接收到的报文段的校验和n检查计算结果是否与收到报文段的校验和字段中的值相同q不同 检测到错误q相同 没有检测到错误(但仍可能存在错误)2022/11/1819第三章 运输层3.3 无连接传输:UDPn例子例子:将两个将两个16比特字相加比特字相加1 1 1 1 0 0 1 1 0 0 1 1 0 0
11、1 1 01 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 11 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 11 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 01 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1回卷和检查和注意:注意:最高有效位的进位要回卷加到结果当中2022/11/1820第三章 运输层3.4 可靠数据传输的原理n可靠数据传输可靠数据传输q在应用层、运输层和链路层都很重要q网络中最重要的top-10问题之一!2022/11/1821第三章 运输层3.4 可靠数据传输的原理不可靠信道的特性决定了可靠数据传输协议不可
12、靠信道的特性决定了可靠数据传输协议(rdt)的复杂性。的复杂性。2022/11/1822第三章 运输层3.4 可靠数据传输的原理发送方接收方rdt_send():由上层(如应用层)调用,将数据发送给接收方的上层udt_send():由 rdt调用,将分组通过不可靠信道传给接收方rdt_rcv():当分组到达接收方时调用deliver_data():由 rdt 调用,将数据交付上层2022/11/1823第三章 运输层3.4 可靠数据传输的原理我们将要:n逐步地开发可靠数据传输协议(rdt)的发送方和接收方n只考虑单向数据传输(unidirectional data transfer)的情况q但
13、控制信息是双向传输的n用有限状态机(FSM)来描述发送方和接收方状态1状态2事件引起状态变迁状态转换过程中的动作状态:由事件引起一个状态到另一个状态的变迁。事件动作2022/11/1824第三章 运输层3.4 可靠数据传输的原理n可靠信道上的可靠传输可靠信道上的可靠传输 rdt 1.0q底层信道完全可靠n不会产生比特错误n不会丢失分组q分别为发送方和接收方建立FSMn发送方将数据发送给底层信道n接收方从底层信道接收数据packet=make_pkt(data)udt_send(packet)rdt_send(data)extract(packet,data)deliver_data(data)
14、等待来自下层的调用rdt_rcv(packet)发送方发送方接收方接收方等待来自上层的调用2022/11/1825第三章 运输层3.4 可靠数据传输的原理n信道可能导致比特出现差错时信道可能导致比特出现差错时rdt 2.xq第一个版本rdt 2.0n假设q分组比特可能受损q所有传输的分组都将按序被接收,不会丢失n处理机制q如何判断分组受损差错检测q如何通知发送方分组是否受损接收方反馈(ACK和NAK)q在得知分组受损后,发送方如何处理出错重传2022/11/1826第三章 运输层3.4 可靠数据传输的原理nrdt 2.0的有限状态机FSM等待来自上层的调用snkpkt=make_pkt(dat
15、a,checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)rdt_rcv(rcvpkt)&isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt)&isNAK(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt)&corrupt(rcvpkt)等待 ACK 或 NAK等待来自下层的调用发送方发送方接收方接收方rdt_send(data)L2022/11/1827第三章 运输层3.4
16、 可靠数据传输的原理等待来自上层的调用snkpkt=make_pkt(data,checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)rdt_rcv(rcvpkt)&isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt)&isNAK(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt)&corrupt(rcvpkt)等待 ACK 或 NAK等待来自下层的调用rdt_send(da
17、ta)L发送方发送方接收方接收方rdt2.0:无差错的情况无差错的情况2022/11/1828第三章 运输层3.4 可靠数据传输的原理等待来自上层的调用snkpkt=make_pkt(data,checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)rdt_rcv(rcvpkt)&isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt)&isNAK(rcvpkt)udt_send(NAK)rdt_rc
18、v(rcvpkt)&corrupt(rcvpkt)等待 ACK 或 NAK等待来自下层的调用rdt_send(data)L发送方发送方接收方接收方rdt2.0:有差错的情况有差错的情况2022/11/1829第三章 运输层3.4 可靠数据传输的原理n如何实现重传q使用缓冲区缓存已发出但未收到反馈的报文段n新的问题q需要多大的缓冲区呢?n接收方和发送方各一个报文段大小的缓冲区即可2022/11/1830第三章 运输层3.4 可靠数据传输的原理q第二个版本rdt 2.1n问题的引入qACK和NAK分组可能受损,而rdt 2.0没有考虑该情况n解决问题的几种思路q在人类的对话中,如果听不清楚对方所述
19、,会回问一句“刚才你说什么来着?”但如果这句话仍然没有听清楚呢?怎么办?双方对着问“刚才你说什么来着?”这就可能进入了一个难以解困的死循环q增加足够的检查和比特,使发送方不仅可以检查比特差错,还可以恢复比特差错q收到出错的反馈时,不管三七二十一,直接重发当前数据分组,但这就需要对数据分组进行编号,以示识别2022/11/1831第三章 运输层3.4 可靠数据传输的原理nrdt 2.1的发送方等待来自上层的调用0sndpkt=make_pkt(0,data,checksum)udt_send(sndpkt)rdt_send(data)等待 ACK 或 NAK 0udt_send(sndpkt)r
20、dt_rcv(rcvpkt)&(corrupt(rcvpkt)|isNAK(rcvpkt)sndpkt=make_pkt(1,data,checksum)udt_send(sndpkt)rdt_send(data)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt)&(corrupt(rcvpkt)|isNAK(rcvpkt)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&isACK(rcvpkt)等待来自上层的调用1等待ACK 或 NAK 1LL2022/11/18
21、32第三章 运输层3.4 可靠数据传输的原理nrdt 2.1的接收方等待来自下层的0rdt_rcv(rcvpkt)¬ corrupt(rcvpkt)&has_seq0(rcvpkt)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&has_seq1(rcvpkt)extract(rcvpkt,data)deliver_data(data)sndpkt=make_pkt(ACK,chksum)udt_send(sndpkt)等待来自下层的1rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&has_seq0(rcvpkt)extract(rcvpkt,
22、data)deliver_data(data)sndpkt=make_pkt(ACK,chksum)udt_send(sndpkt)rdt_rcv(rcvpkt)&(corrupt(rcvpkt)sndpkt=make_pkt(ACK,chksum)udt_send(sndpkt)rdt_rcv(rcvpkt)¬ corrupt(rcvpkt)&has_seq1(rcvpkt)rdt_rcv(rcvpkt)&(corrupt(rcvpkt)sndpkt=make_pkt(ACK,chksum)udt_send(sndpkt)sndpkt=make_pkt(NAK,chksum)udt_s
23、end(sndpkt)sndpkt=make_pkt(NAK,chksum)udt_send(sndpkt)2022/11/1833第三章 运输层3.4 可靠数据传输的原理q第三个版本rdt 2.2n针对rdt 2.1的改进q只使用ACKq取消NAK,接收方对最后一个正确收到的分组发送 ACK接收方必须明确指出被确认的分组的序号q发送方收到的重复的ACK将按照NAK来进行处理重传正确的分组2022/11/1834第三章 运输层3.4 可靠数据传输的原理等待来自上层的调用0sndpkt=make_pkt(0,data,checksum)udt_send(sndpkt)rdt_send(data)
24、udt_send(sndpkt)rdt_rcv(rcvpkt)&(corrupt(rcvpkt)|isACK(rcvpkt,1)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&isACK(rcvpkt,0)等待ACK0发送方部分发送方部分FSM等待来自下层的0rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&has_seq1(rcvpkt)extract(rcvpkt,data)deliver_data(data)sndpkt=make_pkt(ACK1,chksum)udt_send(sndpkt)rdt_rcv(rcvpkt)&(corrupt(r
25、cvpkt)|has_seq1(rcvpkt)udt_send(sndpkt)接收方部分接收方部分 FSML2022/11/1835第三章 运输层3.4 可靠数据传输的原理q针对rdt 2.x的进一步讨论nrdt 2.x实际上也解决了流控问题2022/11/1836第三章 运输层3.4 可靠数据传输的原理n信道不但出错,而且丢包时信道不但出错,而且丢包时rdt 3.0q假设n底层信道不但可能出现比特差错,而且可能会丢包q需解决的问题n怎样检测丢包n发生丢包后,如何处理q检查和技术、序号、ACK、重传如何判断数据报丢失了呢?如何判断数据报丢失了呢?最简单的方法就是:最简单的方法就是:耐心的等待耐
26、心的等待2022/11/1837第三章 运输层3.4 可靠数据传输的原理sndpkt=make_pkt(0,data,checksum)udt_send(sndpkt)start_timerrdt_send(data)等待ACK0rdt_rcv(rcvpkt)&(corrupt(rcvpkt)|isACK(rcvpkt,1)等待来自上层的调用1sndpkt=make_pkt(1,data,checksum)udt_send(sndpkt)start_timerrdt_send(data)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&isACK(rcvpkt,0)rdt_
27、rcv(rcvpkt)&(corrupt(rcvpkt)|isACK(rcvpkt,0)rdt_rcv(rcvpkt)¬corrupt(rcvpkt)&isACK(rcvpkt,1)stop_timerstop_timerudt_send(sndpkt)start_timertimeoutudt_send(sndpkt)start_timertimeoutrdt_rcv(rcvpkt)等待来自上层的调用0等待 ACK1Lrdt_rcv(rcvpkt)LLLRdt 3.0的发送方的发送方2022/11/1838第三章 运输层3.4 可靠数据传输的原理qrdt 3.0举例2022/11/18
28、39第三章 运输层3.4 可靠数据传输的原理d)过早超时过早超时c)丢失丢失ACKpkt 0ACK 0pkt 1pkt 0ACK 0发送方发送方接收方接收方发送分组发送分组0接收接收ACK0发送分组发送分组1接收接收ACK1发送分组发送分组0接收分组接收分组0发送发送ACK0接收分组接收分组1发送发送ACK1接收分组接收分组0发送发送ACK0pkt 1超时超时重发分组重发分组1pkt 0ACK 0ACK 1pkt 0ACK 0发送方发送方接收方接收方发送分组发送分组0接收接收ACK0发送分组发送分组1接收接收ACK1发送分组发送分组0接收分组接收分组0发送发送ACK0接收分组接收分组1(检测冗
29、余检测冗余发送发送ACK1)发送发送ACK1接收分组接收分组0发送发送ACK0pkt 1丢失丢失超时超时重发分组重发分组1pkt 1ACK 1接收分组接收分组1发送发送ACK1ACK 1ACK 1接收接收ACK1什么也不做什么也不做接收分组接收分组1(检测冗余发送检测冗余发送ACK1)发送发送ACK12022/11/1840第三章 运输层3.4 可靠数据传输的原理nrdt 3.0的性能分析的性能分析q1Gbps 的链路,15ms 的端到端延迟,分组大小为1KB Ttransmit=8kb/pkt109 b/sec=8 sL(比特为单位的分组大小)R(传输速率,bps)=n每30ms内只能发送1
30、KB:1 Gbps 的链路只有33kB/sec 的吞吐量n网络协议限制了物理资源的利用率!2022/11/1841第三章 运输层3.4 可靠数据传输的原理qrdt 3.0性能低下的原因首个分组的第首个分组的第1个比特被传输个比特被传输,t=0发送方发送方接收方接收方RTT 首个分组的最后首个分组的最后1比特被传输比特被传输,t=L/R首个分组的第首个分组的第1个比特到达个比特到达首个分组的最后首个分组的最后1个比特到达个比特到达,发送发送ACKACK 到达到达,发送下一个分组发送下一个分组,t=RTT+L/R2022/11/1842第三章 运输层3.4 可靠数据传输的原理q提高性能的一种可行方
31、法:流水线技术n允许发送方发送多个分组而无需等待确认q必须增大序号范围q协议的发送方和接收方必须对分组进行缓存2022/11/1843第三章 运输层3.4 可靠数据传输的原理n流水线技术对性能提升的原理图发送方发送方接收方接收方RTT 利用率提高3倍!首个分组的第首个分组的第1个比特被传输个比特被传输,t=0首个分组的最后首个分组的最后1比特被传输比特被传输,t=L/RACK 到达到达,发送下一个分组发送下一个分组,t=RTT+L/R首个分组的第首个分组的第1个比特到达个比特到达首个分组的最后首个分组的最后1个比特到达个比特到达,发送发送ACK第第2个分组的最后个分组的最后1个比特到达个比特到
32、达,发送发送ACK第第3个分组的最后个分组的最后1个比特到达个比特到达,发送发送ACK2022/11/1844第三章 运输层3.4 可靠数据传输的原理n流水线技术工作原理q分组首部用k比特字段表示序号q已被传输但还未确认的分组的许可序号范围可以看作是一个在序号范围内大小为N的“窗口(window)”2022/11/1845第三章 运输层3.4 可靠数据传输的原理q问题:当流水线技术中丢失一个分组后,如何进行重传nGo-Back-N(GBN)协议:其后分组全部重传n选择重传(SR)协议:仅重传该分组2022/11/1846第三章 运输层3.4 可靠数据传输的原理GBN时序图时序图2022/11/
33、1847第三章 运输层3.4 可靠数据传输的原理nGo-Back-N协议协议q特点nACK(n):接收方对序号n之前包括n在内的所有分组进行确认 -“累积 ACK”n对所有已发送但未确认的分组统一设置一个定时器n超时(n):重传分组n和窗口中所有序号大于n的分组n失序分组:q丢弃(不缓存)-接收方无缓存q重发按序到达的最高序号分组的ACK2022/11/1848第三章 运输层3.4 可靠数据传输的原理nGo-Back-N协议协议等待start_timerudt_send(sndpktbase)udt_send(sndpktbase+1)udt_send(sndpktnextseqnum-1)t
34、imeoutrdt_send(data)if(nextseqnum SendBase)SendBase=y if(there are currently not-yet-acknowledged segments)start timer /*end of loop forever*/从应用程序接收数据n将数据封装入报文段中,每个报文段都包含一个序号n序号是该报文段第一个数据字节的字节流编号n启动定时器n超时间隔:TimeOutInterval 超时n重传认为超时的报文段n重启定时器收到ACKn如果是对以前的未确认报文段的确认q更新SendBaseq如果当前有未被确认的报文段,TCP还要重启定时
35、器2022/11/1882第三章 运输层3.5 面向连接的传输:TCPnTCP的几种重传情况的几种重传情况由于由于ACK丢失而重传丢失而重传时间时间由于超时过短而重传,由于超时过短而重传,只重传第一个只重传第一个主机 ASeq=92,8 字节数据ACK=100丢失超时主机 BXSeq=92,8 字节数据ACK=100SendBase=100主机 ASeq=100,20 字节数据ACK=100主机 BSeq=92,8 字节数据ACK=120Seq=92,8 字节数据Seq=92 超时ACK=120Seq=92 超时SendBase=120SendBase=120Sendbase=1002022/
36、11/1883第三章 运输层3.5 面向连接的传输:TCP主机 ASeq=92,8 字节数据ACK=100丢失超时累积确认避免了第一个报文的重传累积确认避免了第一个报文的重传主机 BXSeq=100,20 字节数据ACK=120时间2022/11/1884第三章 运输层2022年11月18日853.5 面向连接的传输:TCPn超时间隔加倍q每一次TCP重传均将下一次超时间隔设为先前值的两倍q超时间隔由EstimatedRTT和DevRTT决定n收到上层应用的数据n收到对未确认数据的ACK第三章 运输层3.5 面向连接的传输:TCPn快速重传快速重传q超时周期往往太长n增加重发丢失分组的延时q通
37、过重复的ACK检测丢失报文段n发送方常要连续发送大量报文段n如果一个报文段丢失,会引起很多连续的重复ACK.q如果发送收到一个数据的3个ACK,它会认为确认数据之后的报文段丢失n快速重传:在超时到来之前重传报文段2022/11/1886第三章 运输层2022年11月18日873.5 面向连接的传输:TCPn产生产生TCP ACK的建议(的建议(RFC1122、2581)接收方事件接收方事件所期望序号的报文段按序到达。所所期望序号的报文段按序到达。所有在期望序号及其以前的数据都已有在期望序号及其以前的数据都已经被确认经被确认有期望序号的报文段按序到达。有期望序号的报文段按序到达。另一个按序报文段
38、等待发送另一个按序报文段等待发送ACK比期望序号大的失序报文段到达,比期望序号大的失序报文段到达,检测出数据流中的间隔检测出数据流中的间隔能部分或完全填充接收能部分或完全填充接收数据间隔的报文段到达数据间隔的报文段到达 TCP接收方接收方 动作动作延迟的延迟的ACK。对另一个按序报文段的到。对另一个按序报文段的到达最多等待达最多等待500ms。如果下一个按序报。如果下一个按序报文段在这个时间间隔内没有到达,则发文段在这个时间间隔内没有到达,则发送一个送一个ACK立即发送单个累积立即发送单个累积ACK,以确认两个按,以确认两个按序报文段序报文段 立即发送冗余立即发送冗余ACK,指明下一个期待字,
39、指明下一个期待字节的序号节的序号(也就是间隔的低端字节序号也就是间隔的低端字节序号)倘若该报文段起始于间隔的低端,倘若该报文段起始于间隔的低端,则立即发送则立即发送ACK第三章 运输层3.5 面向连接的传输:TCPn快速重传的算法快速重传的算法 event:ACK received,with ACK field value of y if(y SendBase)SendBase=y if(there are currently not-yet-acknowledged segments)start timer else increment count of dup ACKs received
40、for y if(count of dup ACKs received for y=3)resend segment with sequence number y 重复的重复的ACK报文报文快速重传快速重传2022/11/1888第三章 运输层3.5 面向连接的传输:TCPnTCP流量控制流量控制q背景nTCP接收方有一个缓存,所有上交的数据全部缓存在里面n应用进程从缓冲区中读取数据可能很慢q目标n发送方不会由于传得太多太快而使得接收方缓存溢出q手段n接收方在反馈时,将缓冲区剩余空间的大小填充在报文段首部的窗口字段中,通知发送方2022/11/1889第三章 运输层3.5 面向连接的传输:TC
41、Pq窗口值的计算空闲空间空闲空间缓存中的缓存中的TCP数据数据RcvWindow来自来自IP的数据的数据应用进程应用进程RcvBufferLastByteRcvd LastByteRead RcvBuffer接收方:接收方:RcvWindows=RcvBuffer LastByteRcvd-LastByteRead发送方:发送方:LastByteSent LastByteAcked RcvWindow2022/11/1890第三章 运输层3.5 面向连接的传输:TCPq一种特殊的情况n接收方通知发送方RcvWindow为0,且接收方无任何数据传送给发送方n发送方持续向接受方发送只有一个字节数据
42、的报文段,目的是试探2022/11/1891第三章 运输层3.5 面向连接的传输:TCPnTCP连接的建立SYN,SEQ=x主机 BSYN,ACK,SEQ=y,ACK=x 1ACK,SEQ=x+1,ACK=y 1被动打开主动打开确认确认主机 A连接请求2022/11/1892第三章 运输层2022年11月18日93TCP 连接释放的过程 FIN,SEQ=xACK,SEQ=y,ACK=x 1ACK,SEQ=x+1,ACK=y 1应用进程释放连接A 不再发送报文FIN,ACK,SEQ=y,ACK=x+1主机 B主机 A通知主机应用进程应用进程释放连接B 不再发送报文确认确认从 A 到 B 的连接就
43、释放了,连接处于半关闭状态。相当于 A 向 B 说:“我已经没有数据要发送了。但你如果还发送数据,我仍接收。”至此,整个连接已经全部释放。第三章 运输层3.5 面向连接的传输:TCPnTCP连接管理的状态序列连接管理的状态序列客户机TCP状态序列服务器TCP状态序列2022/11/1894第三章 运输层3.6 拥塞控制原理n拥塞的基本知识拥塞的基本知识q非正式定义:“过多的源端发送了过多的数据,超出了网络的处理能力”q不同于流量控制q现象:n丢包(路由器缓冲区溢出)n延时长(在路由器缓冲区排队)2022/11/1895第三章 运输层3.6 拥塞控制原理n情境情境1q两个发送方,两个接受方q一个
44、具有无限大缓存的路由器q没有重传无限制的共享式输出链路缓存主机 Alin:原始数据主机 Blout主机D主机C2022/11/1896第三章 运输层3.6 拥塞控制原理n情境情境1q最大可获得的吞吐量q出现拥塞时延时变大拥塞代价:当分组到达速率接近链路容量时,分组当分组到达速率接近链路容量时,分组 经历的巨大排队时延经历的巨大排队时延2022/11/1897第三章 运输层3.6 拥塞控制原理n情境情境2q一个具有有限 缓存的路由器q发送方对丢失的分组进行重传有限的共享式有限的共享式输出链路缓存输出链路缓存主机主机 Al lin:原始数据原始数据主机主机 Bl loutl lin:原始数据原始数
45、据+重传数据重传数据主机主机 D主机主机 C2022/11/1898第三章 运输层3.6 拥塞控制原理n设计期望:(goodput)n“理想”的重传是仅仅在丢包时才发生重传:n对延迟到达(而非丢失)的分组的重传使得 比理想情况下更大于linlout=linloutlinlout拥塞的“开销”:n发送方必须重传以补偿因为缓存溢出而丢失的分组n发送方在遇到大的时延时所进行的不必要重传会引起路由器转发不必要的分组拷贝而占用其链路带宽R/2R/2linlouta.R/2R/2linc.R/4R/2R/2linloutb.loutR/32022/11/1899第三章 运输层3.6 拥塞控制原理n情境情境
46、3q四个发送方q多跳路径q超时/重传有限的共享式有限的共享式输出链路缓存输出链路缓存主机主机 Al lin:原始数据原始数据主机主机Bl loutl lin:原始数据加重传数据原始数据加重传数据主机主机C主机主机D2022/11/18100第三章 运输层3.6 拥塞控制原理n情境情境3拥塞的另一个”开销”:n当分组被丢弃时,该分组曾用到的所有“上游”传输容量被浪费了!2022/11/18101第三章 运输层3.6 拥塞控制原理n拥塞控制的方法拥塞控制的方法q网络辅助的拥塞控制n直接网络反馈:路由器以阻塞分组的形式通知发送方“网络拥塞了”n经由接收方的网络反馈:路由器标识从发送方流向接收方分组中
47、的某个字段以指示拥塞的产生,由接收方通知发送方“网络拥塞了”q端到端拥塞控制n网络层不为拥塞控制提供任何帮助和支持n端系统通过对网络行为(丢包或时延增加)的观测判断网络是否发生拥塞n目前TCP采用该种方法2022/11/18102第三章 运输层3.6 拥塞控制原理n网络辅助拥塞控制的例子:网络辅助拥塞控制的例子:ATM ABR拥塞控制拥塞控制q特点n“弹性服务”n当发送方网络“轻载”时:q发送方应充分利用空闲的可用带宽n当发送方网络”拥塞”时:q发送方应将传输速率抑制为最小承诺传输速率2022/11/18103第三章 运输层3.6 拥塞控制原理q工作机制n发送方散布在数据信元中会发出若干个RM
48、(资源管理)信元n交换机可以设置RM信元中的比特(“网络辅助”)qNI比特:不得增大发送速率(轻度拥塞)qCI比特:拥塞指示(严重拥塞)n接收方会将RM信元完整地回送给发送方源源 端端RM信元信元数据信元数据信元交换机交换机交换机交换机目的端目的端2022/11/18104第三章 运输层3.6 拥塞控制原理nRM信元中包含一个两字节的显式速率ER(explicit rate)字段q出现拥塞的交换机会减小经过自己的信元中ER字段的值q发送方的发送速率也因之减小为路径支持的最小速率,可以得到最低程度的支持n数据信元中的EFCI 比特:拥塞交换机将之置1来通知目的主机网络已经出现拥塞q如果一个RM信
49、元到达时之前,多数数据信元的EFCI比特置1,目的方会将返回给发送方的RM信元中CI比特置12022/11/18105第三章 运输层3.7 TCP拥塞控制nTCP拥塞控制为端到端拥塞控制拥塞控制为端到端拥塞控制nTCP进行拥塞控制的方法进行拥塞控制的方法q每个发送方自动感知网络拥塞的程度q发送方根据感知的结果限制外发的流量n如果前方路径上出现了拥塞,则降低发送速率n如果前方路径上没有出现拥塞,则增加发送速率2022/11/18106第三章 运输层3.7 TCP拥塞控制nTCP拥塞控制需要解决的三个问题拥塞控制需要解决的三个问题qTCP发送方如何限制外发流量的速率n拥塞窗口 LastByteSe
50、nt-LastByteAcked minCongWin,RcvWindowq发送方如何感知拥塞n超时n三个冗余ACKq在感知到拥塞后,发送方如何调节发送速率rate=CongWin RTT Bytes/sec2022/11/18107第三章 运输层3.7 TCP拥塞控制nTCP拥塞控制算法(拥塞控制算法(Reno算法)算法)q加性增,乘性减(AIMD)n出现丢包事件后将当前 CongWin 大小减半,可以大大减少注入到网络中的分组数n当没有丢包事件发生,每个RTT之后将CongWin增大1个MSS使拥塞窗口缓慢增大,以防止网络过早出现拥塞拥塞窗口拥塞窗口时间时间2022/11/18108第三章