计算机网络第3章_第1页
计算机网络第3章_第2页
计算机网络第3章_第3页
计算机网络第3章_第4页
计算机网络第3章_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1Chapter 3 Transport Layerq电子科技大学计算机科学与工程学院q付波 A Top-Down Approach2目标: 理解运输层服务: 复用/分解复用 可靠数据传输 流量控制 拥塞控制 学习因特网的运输层协议: UDP: 无连接传输 TCP: 面向连接传输 TCP 拥塞控制3 3.1 运输层服务 3.2多路复用和多路分解 3.3 无连接传输: UDP 3.4 可靠数据传输原理 3.5 面向连接传输: TCP 报文段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理 3.7 TCP 拥塞控制4 在两个不同的主机上运行的应用程序之间应用程序之间提供逻辑通信 运输层

2、协议运行在端系统运行在端系统 发送方: 将应用程序报文分解成数据段,加上运输层首部后传递给网络层 接受方: 将数据段重新组装成报文传递到应用层 运输层协议: TCP 和和 UDP应用层应用层运输层运输层网络层网络层链路层链路层物理层物理层应用层应用层运输层运输层网络层网络层链路层链路层物理层物理层networkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysical逻辑的端到端传输逻辑的端到端传输5 运输层位于网络层之上 运输

3、层协议提供的某些服务受到网络层协议的限制。比如,时限和带宽保证。 运输层也提供自己的特殊服务。比如,可靠数据传输服务,安全性服务。 网络层:两个主机之间主机之间的逻辑通信 运输层:两个进程之间进程之间的逻辑通信6 传输控制协议(TCP) 通过流量控制流量控制、序号序号、确认确认和定时器定时器等确保数据可靠按序递交,会涉及到 拥塞控制 流量控制 连接建立 用户数据报协议(UDP) 采用best-effort delivery service IP服务的直接扩展,提供不可靠的无序传递applicationtransportnetworkdata linkphysicalapplicationtra

4、nsportnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicallogical end-end transport7 3.1 运输层服务 3.2 多路复用和多路分解 3.3 无连接传输: UDP 3.4 可靠数据传输原理 3.5 面向连接传输: TCP 报文段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理 3.7 TCP 拥塞控制8 网络层是主机之

5、间的通信,运输层是应用网络层是主机之间的通信,运输层是应用进层之间的通信。进层之间的通信。如何实现将主机之间的如何实现将主机之间的通信转换为进程之间的通信呢?通信转换为进程之间的通信呢? 解决办法:运输层提供解决办法:运输层提供 多路复用(多路复用(multiplexing) 多路分解(多路分解(demultiplexing)9进程进程1进程进程2多路复用器多路复用器网络网络接口接口进程进程1进程进程2多路分解器多路分解器网络网络接口接口怎样实现呢?怎样实现呢?10 通过套接字套接字(socket)来实现多路复用与分解 套接字相当于从网络向进程传递数据和从进层向网络传递数据的门户门户 套接字有

6、唯一的标识符标识符11 多路复用:多路复用:The job of gathering data chunks at the source host from different sockets, encapsulating each data chunk with header information to create segments, and passing the segments to the network layer 多路分解:多路分解:The job of delivering the data in a transport-layer segment to the corre

7、ct socket12applicationtransportnetworklinkphysicalP1applicationtransportnetworklinkphysicalapplicationtransportnetworklinkphysicalP2P3P4P1host 1host 2host 3= = 进程进程= = 套接字套接字将接收到的数据段传递到将接收到的数据段传递到正确的套接字正确的套接字接收主机多路分解接收主机多路分解: :从多个套接字收集数据从多个套接字收集数据, , 用首部封装数据,然后将用首部封装数据,然后将报文段传递到网络层报文段传递到网络层发送主机多路复用发

8、送主机多路复用: :13 主机上每个套接字分配一个端口号端口号 端口号是16比特的数字,大小在 065535之间。 01023的端口号是众所周知的端 口号,是受严格限制的。比如HTTP80 当报文段到达主机(1)运输层检查报文段的目的端口号(2)将目的端口号定向到相应套接字(3)报文段中的数据通过套接字进入所连接的进程 主机用IP地址和端口号指明数据段属于哪个合适的套接字源端口源端口 # #目的端口目的端口 # #32 bits32 bits应用程序数据应用程序数据( (报文报文) )其他首部域其他首部域TCP/UDP TCP/UDP 报文段格式报文段格式14 用端口号创建套接字:自动分派端口

9、号:自动分派端口号:DatagramSocket ServerSocket1 = new DatagramSocket();应用程序指定端口号:应用程序指定端口号: DatagramSocket ServerSocket2 = new DatagramSocket(9922); UDP套接字由目的IP地址和目的端口号来标识 具有不同的源IP地址且/或源端口号,但具有相同的目的IP地址和目的端口号的IP数据报指向同样的套接字(m:1)15P2ClientIP:Bclient IP: AP1P1P3serverIP: CSP: 6428DP: 9157SP: 9157DP: 6428SP: 642

10、8DP: 5775SP: 5775DP: 6428请求报文段中提供返回地址(包括请求报文段中提供返回地址(包括IPIP地址和端口号)地址和端口号)端口号9157端口号5775端口号642816 TCP 套接字由4部分指定: (源源IP地址地址,源端口号源端口号,目的目的IP地址地址,目的端口号目的端口号) 接收主机使用所有四个值将数据段定位到合适的套接字(1:1) 服务器主机支持很多同时的 TCP 套接字: 每个套接字用4部分来表示例例:Web服务器对每个连接的客户都有不同的套接字,而非持久 HTTP 将对每个请求有一个不同的套接字17(1)TCP服务器进程在端口(比如服务器进程在端口(比如8

11、0)上等待)上等待TCP客客户机的连接建立请求。户机的连接建立请求。(2)TCP客户机产生一条连接建立请求并创建客户机客户机产生一条连接建立请求并创建客户机套接字套接字Socket clientsocket = new socket(“服务器主机名服务器主机名”,80)(3)服务器接收到服务器接收到80端口请求报文后,定位服务器进端口请求报文后,定位服务器进程,创建一个连接套接字程,创建一个连接套接字Socket consocket=welcomesocket.accept()(4)新创建的套接字通过(新创建的套接字通过(源源IP地址地址,源端口号源端口号,目的目的IP地地址址,目的端口号目的

12、端口号) 值来标识。若后续报文与这四个值来标识。若后续报文与这四个值相同,则多路分解到这个套接字。值相同,则多路分解到这个套接字。18ClientIP:BP1client IP: AP1P2P4serverIP: CSP: 9157DP: 80SP: 9157DP: 80P5P6P3D-IP:CS-IP: AS-IP: BSP: 5775DP: 80D-IP:CS-IP: BD-IP: C19 3.1 运输层服务 3.2多路复用和多路复用 3.3 无连接传输: UDP 3.4 可靠数据传输原理 3.5 面向连接传输: TCP 报文段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理

13、3.7 TCP 拥塞控制20 UDP仅提供:仅提供:多路复用/分解功能轻型的差错检测 UDP是无连接的是无连接的:在UDP接收者发送者之间没有握手每个UDP 数据段的处理独立于其他数据段 UDP采用采用“尽最大努力尽最大努力”服务服务, 导致导致UDP 数据段数据段可能可能:丢失会传递失序的报文到应用程序21 应用层能更好地控制要发送的数据和时间,容忍数据丢失 无需连接建立(减少延迟) 无连接状态 很小的数据段首部(8字节) TCP不容数据丢失,有拥塞和确认控制,在拥堵链路会耗费很多时间 TCP需三次握手建立连接 TCP需维护连接状态,包括缓存、拥塞控制参数、序号和确认号参数等 TCP有20个

14、字节首部22 UDP 只在IP数据报服务之上增加了很少一点的功能,即端口的功能端口的功能和差错检测差错检测的功能。 UDP 用户数据报只提供不可靠交付不可靠交付,但 UDP 在某些方面有其特殊的优点。 UDP 是无连接的无连接的,即发送数据之前不需要建立连接。 UDP 使用尽最大努力尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。 UDP 没有拥塞控制没有拥塞控制,很适合多媒体通信的要求。 UDP 支持一对一一对一、一对多一对多、多对一多对一和多对多多对多的交互通信。23 UDP 的首部首部开销小,只有 8 个字节。 UDP 是面向报文面向报文的。24IP IP 分组的数据部分分组的数

15、据部分IP IP 首部首部IP IP 层层UDP UDP 首部首部UDP UDP 用户数据报的数据部分用户数据报的数据部分运输层运输层应用层报文应用层报文应用层应用层25源端口源端口目的端口目的端口长长 度度检验和检验和数数 据据首首 部部IP IP 分组分组2 22 22 22 2字节字节数数 据据首首 部部UDP UDP 用户数据报用户数据报UDP 有两个字段:首部字段首部字段和数据字段数据字段首部字段:有 8 个字节,由 4 个字段组成,每个字段都是两个字节。长度是首部和数据的总长度 26在计算检验和时,临时把在计算检验和时,临时把“伪首部伪首部”和和 UDP UDP 用户数据用户数据报

16、连接在一起。伪首部仅仅是为了计算检验和。报连接在一起。伪首部仅仅是为了计算检验和。伪首部伪首部源端口源端口目的端口目的端口长长 度度检验和检验和数数 据据首首 部部UDPUDP长度长度源源 IP IP 地址地址目的目的 IP IP 地址地址0 01717IP IP 分组分组字节字节4 44 41 11 12 212122 22 22 22 2字节字节数数 据据首首 部部UDP UDP 用户数据报用户数据报27发送方: 将数据段看成16bit的整数序列 校验和: 数据段内容相加 (1的补码和) 发送者将校验和值放入UDP的校验和域接收方: 计算接收到数据段的校验和 检查 计算的校验和是否等于校验

17、和域中的值: NO 检测到错误 YES 没有检测到错误目标目标: : 检测传输的数据段的检测传输的数据段的 “错误错误” 如如bitbit丢失丢失) )28注意:错误检测不是注意:错误检测不是100%100%可靠!可靠! 协议有可能漏掉一些错误,但很少协议有可能漏掉一些错误,但很少 大的校验信息域能提供更好的检错能力大的校验信息域能提供更好的检错能力用户数据用户数据 校验信息校验信息传输信道传输信道用户数据用户数据差错检测差错检测算法算法用户数据用户数据 校验信息校验信息用户数据用户数据差错检测差错检测算法算法是否相等是否相等是是错误处理错误处理否否291 1 1 0 0 1 1 0 0 1

18、1 0 0 1 1 01 1 0 1 0 1 0 1 0 1 0 1 0 1 0 11 0 1 1 1 0 1 1 1 0 1 1 1 0 1 111 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0累加和累加和0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1校验和校验和变反变反求和求和回卷回卷求和时产生的进位必求和时产生的进位必须回卷加到结果上须回卷加到结果上最后的累加和必须按位最后的累加和必须按位变反才是校验和变反才是校验和30 3.1 运输层服务 3.2多路复用和多路分解 3.3 无连接传输: UDP 3.4 可靠数据传输原理 3.5 面向连接传输: TCP 报文

19、段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理 3.7 TCP 拥塞控制31 服务模型和服务实现 不可靠信道的特性将决定可靠数据传输协议(rdt)的复杂性rdt: reliable data transferudt: unreliable data transfer应用层应用层运输层运输层网络层网络层理想状态理想状态协议实现协议实现32发送方发送方接受方接受方rdt_send(): rdt_send(): 上层应用调用该函数上层应用调用该函数,要求可靠传输数据到接收者,要求可靠传输数据到接收者udt_send(): udt_send(): 可靠传输调用该可靠传输调用该函数,在不

20、可靠的信道上传输数函数,在不可靠的信道上传输数据给接收者据给接收者rdt_rcv(): rdt_rcv(): 接收方接收到数据后调接收方接收到数据后调用该函数,完成可靠传输用该函数,完成可靠传输deliver_data(): deliver_data(): 可靠传输调用可靠传输调用该函数,将数据传给上层应用该函数,将数据传给上层应用33 我们将逐步开发发送方和接收方的可靠数据传输协议 (rdt) 仅考虑单向数据传输单向数据传输,即数据传输仅从发送方到接收方,但控制信息将双向流动! 有限状态机有限状态机 (FSM) 来标示发送方和接收方 发送方和接收方有各自的FSM 箭头箭头指示协议从一个状态变

21、迁到另一个状态 状态可变迁到其自身 引起变迁的事件事件显示在表示变迁的横线上方,所采取的动作动作显示在横线下方。 如果对一个事件没有采取动作,或没有事件发生则在横线下方或上方用符号 初始状态用虚线虚线表示34状态状态1 1状态状态2 2导致状态转换的事件导致状态转换的事件状态转换时执行的动作状态转换时执行的动作状态状态: : 在一个状态时,由事在一个状态时,由事件唯一确定状态的转换件唯一确定状态的转换事件事件动作动作初始状态初始状态35 假设:在完美可靠的信道完美可靠的信道上 没有bit错误 没有分组丢失 发送方/接收方分离的 FSMs : 发送方发送数据到下层信道 接收方从下层信道接收数据等

22、待来自等待来自上层的调上层的调用用packet = make_pkt(data)udt_send(packet)rdt_send(data)extract (packet,data)deliver_data(data)等待来自等待来自下层的调下层的调用用rdt_rcv(packet)senderreceiver36 假设:下层信道可能让传输分组中的bit受损 校验和校验和将检测到bit错误问题: 如何从错误中恢复?确认(ACKs): 接收方明确告诉发送方:分组接收正确否认 (NAKs):接收方明确告诉发送方:分组接收出错 发送方收到NAK后重发重发这个分组 在 rdt2.0的新机制 (在 rd

23、t1.0中没有的): 差错检测差错检测 接收方反馈反馈: 控制信息 (ACK,NAK)37extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt) &corrupt(rcvpkt)Wait for call from belowreceiverWait for call from abovesnkpkt = make_pkt(data, checksum)udt_send(sndpkt)rdt_rcv(rcvpkt) &

24、isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt) &isNAK(rcvpkt)Wait for ACK or NAKsenderrdt_send(data)L38Wait for call from abovesnkpkt = make_pkt(data, checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt)rdt_rcv(rcvpkt) & isACK(rcvpkt)udt_send

25、(sndpkt)rdt_rcv(rcvpkt) & isNAK(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt) & corrupt(rcvpkt)Wait for ACK or NAKWait for call from belowrdt_send(data)L39Wait for call from abovesnkpkt = make_pkt(data, checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt) & notcorrupt(rc

26、vpkt)rdt_rcv(rcvpkt) & isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt) & isNAK(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt) & corrupt(rcvpkt)Wait for ACK or NAKWait for call from belowrdt_send(data)L40ACK/NAKACK/NAK发生错误会发生什么呢?发生错误会发生什么呢? 发送方并不知道接收方发生了什么发送方并不知道接收方发生了什么! 不能正确重发不能正确重发: 可能导致重复分组可能导致重复分组解决办法解决办法-序号序

27、号: 发送方给每个分组加一个序号 在 ACK/NAK 错误时发送方重发当前分组 接收方丢弃重复的分组(并不向上传递)Sender sends one packet, then waits for receiver responsestop and wait41等待来自等待来自上层的上层的调用调用0sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)rdt_send(data)等待等待 ACK 或或 NAK 0udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isNAK(rcvpkt) )

28、sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)rdt_send(data)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt) udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isNAK(rcvpkt) )rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt) 等待来自等待来自 上层的上层的调用调用1等待等待 ACK 或或 NAK 1LL42sndpkt = make_pkt(N

29、AK, chksum)udt_send(sndpkt)等待来自等待来自下层的下层的0 rdt_rcv(rcvpkt) & not corrupt(rcvpkt) & has_seq0(rcvpkt)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq1(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt)等待来自等待来自下层的下层的1rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq

30、0(rcvpkt) extract(rcvpkt,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) & not corrupt(rcvpkt) & has_seq1(rcvpkt)rdt_rcv(rcvpkt) & (corrupt(rcvpkt)sndpkt = make_pkt(ACK, chksum)udt_s

31、end(sndpkt)sndpkt = make_pkt(NAK, chksum)udt_send(sndpkt)43发送方: 序号加到分组上 两个序号 (0,1) 就可以满足. 必须检查是否收到错误的 ACK/NAK 必须记住当前的报文是1号还是0号接收方: 必须检查是否接收到重复的报文 状态指示0或者1是否为希望收到的报文序号 注意注意: 接收方并不知道它的上一个ACK/NAK 是否被发送方正确收到44 同 rdt2.1一样的功能, 只用 ACKs 不用 NAK, 如果上个报文接收正确接收方发送 ACK 接收方必须明确包含被确认的报文的序号 发送方收到重复ACK将导致和 NAK一样的处理:

32、 重发当前报文重发当前报文45等待来自等待来自上层的上层的调用调用0sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)rdt_send(data)等待等待 ACK 0udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,1) )sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)rdt_send(data)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt,0)

33、 udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,0) )rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt,1) 等待来自等待来自 上层的上层的调用调用1等待等待 ACK 1LL46等待来自等待来自下层的下层的0 rdt_rcv(rcvpkt) & (corrupt(rcvpkt) | has_seq0(rcvpkt)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq1(rcvpkt) extract(rcvpkt,

34、data)deliver_data(data)sndpkt = make_pkt(ACK, 1, chksum)udt_send(sndpkt)等待来自等待来自下层的下层的1rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq0(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, 0, chksum)udt_send(sndpkt)oncethru=1udt_send(sndpkt) rdt_rcv(rcvpkt) & (corrupt(rcvpkt)| has_seq

35、1(rcvpkt)If (oncethru=1) udt_send(sndpkt)oncethru=0L47新假设: 下层信道可能发生分组丢失丢失 ,比如数据或者 ACKs该怎么办呢?倒计数定时器countdown timer方法方法: 发送者等待“合理的”确认时间,如果在这个时间内没有收到确认就重发重发 发送方需要:发送方需要: 每发送一个分组启动定时器 超时:响应定时器中断 收到ACK:终止定时器48sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)start_timerrdt_send(data)等待等待 ACK0rdt_rcv(rc

36、vpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,1) )等待来自上等待来自上层的调用层的调用1sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)start_timerrdt_send(data)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt,0) rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,0) )rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt

37、,1) stop_timerstop_timerudt_send(sndpkt)start_timertimeoutudt_send(sndpkt)start_timertimeoutrdt_rcv(rcvpkt)等待来自上等待来自上层的调用层的调用0等待等待 ACK1Lrdt_rcv(rcvpkt)LLL495051第第1 1个比特被传输个比特被传输, , t = 0t = 0发送方发送方接收方接收方RTTRTT 最后最后1 1比特被传输比特被传输, , t = L / R t = L / R首个分组的第首个分组的第1 1个比特到达个比特到达首个分组的最后首个分组的最后1 1比特到达比特到达

38、发送发送 ACK ACKACK ACK 到达到达, , 发送下一个分组发送下一个分组, t = RTT + L / R, t = RTT + L / R首个分组首个分组: :52Ttransmit=8kb/pkt109b/sec= 8 microsec每30.008msec发送一个1K字节的报文,由此可见在1Gbps的链路上,其有效吞吐量只有267kbps U sender = .008 30.008 = 0.00027 Ttransmit RTT + Ttransmit = L (packet length in bits)R (transmission rate, bps)= 例如: 1

39、Gbps链路, 15 ms 端到端传输延迟, 1K字节报文,计算网络利用率?53 不使用停等方式,允许发送方发送多个分不使用停等方式,允许发送方发送多个分组而无需等待确认组而无需等待确认流水线技术流水线技术pipelining54首个分组的第首个分组的第1 1个比特被传输个比特被传输, t = 0, t = 0sendersenderreceiverreceiverRTT RTT 首个分组的最后首个分组的最后1 1比特被传输比特被传输, t = L / R, t = L / R首个分组的第首个分组的第1 1比特到达比特到达首个分组的最后首个分组的最后1 1比特到达比特到达, ,发送发送ACKA

40、CKACKACK到达到达, , 发送下一个分组发送下一个分组, t = RTT + L / R, t = RTT + L / R第第2 2分组的最后分组的最后1 1比特到达比特到达, , 发送发送ACKACK第第3 3分组的最后分组的最后1 1比特到达比特到达, ,发送发送ACKACK U sender = .024 30.008 = 0.0008 microseconds 3 * L / R RTT + L / R = 利用率提高了利用率提高了3 3倍倍55流水线流水线: 允许发送多个没有确认的分组 “在路上的” 序号数目序号数目必须增加 在发送方/接收方必须有缓冲区缓冲区 两个方法: go

41、-Back-N, 选择重传选择重传56Go-Back-NGo-Back-N发送方发送方: : 在流水线中允许在流水线中允许N N个个unACKed unACKed 分组分组接收方接收方: : 累积确认累积确认ACKsACKs发送方发送方: : 只有最早只有最早unACKedunACKed分组有一个定时器分组有一个定时器 若超时若超时: : 重传所有重传所有 unACKedunACKed分组分组选择重传选择重传发送方发送方: :在流水线中允许在流水线中允许N N个个unACKed unACKed 分组分组接收方接收方: : 每个分组单独确认每个分组单独确认发送方发送方: : 每个每个unACKe

42、dunACKed分组分组有一个定时器有一个定时器 若超时若超时: : 仅重传仅重传unACKed unACKed 分组分组57发送方: 在分组头中规定一个k位的序号 “窗口”, 允许的连续未确认的报文ACK(n):ACK(n): 确认所有的报文直到(包含)序号确认所有的报文直到(包含)序号n - n - “累积累积ACKACK”定时定时:对第一个发送未被确认的报文定时:对第一个发送未被确认的报文定时超时超时(n):(n): 重发窗口中的报文重发窗口中的报文n n及以上更高序号的报文及以上更高序号的报文( (只有一个定时器记只有一个定时器记录最早的未被确认报文的发送时间录最早的未被确认报文的发送

43、时间) )58ACK-only: 总是为正确接收的最高序号最高序号的分组发送ACK。 可能生成重复的ACKs 只需要记住被期待接收的序号expectedseqnum 接收到失序分组: 丢弃(不缓冲) - 没有接收缓冲区! 重发最高序号分组的ACK59Waitstart_timerudt_send(sndpktbase)udt_send(sndpktbase+1)udt_send(sndpktnextseqnum-1)timeoutrdt_send(data) if (nextseqnum SendBase) SendBase = y if (there are currently not-ye

44、t-acknowledged segments) start timer /* end of loop forever */ 注意注意: SendBase-1: last cumulatively acked byteExample: SendBase-1 = 71; y= 73, so the rcvr wants 73+ ;y SendBase, so that new data is acked84Host ASeq=100, 20 bytes dataACK=100time过早的超时设置过早的超时设置Host BSeq=92, 8 bytes dataACK=120Seq=92, 8

45、bytes dataSeq=92 timeoutACK=120Host ASeq=92, 8 bytes dataACK=100losstimeout丢失丢失ACK的情况的情况Host BXSeq=92, 8 bytes dataACK=100timeSeq=92 timeoutSendBase= 100SendBase= 120SendBase= 120Sendbase= 10085Host ASeq=92, 8 bytes dataACK=100losstimeout累积累积ACK的情况的情况Host BXSeq=100, 20 bytes dataACK=120timeSendBase=

46、 120累积避免了第一个累积避免了第一个报文段的重传报文段的重传86 超时触发重传存在问题:超时周期往往太长超时周期往往太长 导致重传丢失报文之前要等待很长时间,因此增加了网络时延网络时延 解决办法:冗余冗余ACK检测检测 发送方在超时之前通过重复的ACK检测丢失报文段 发送方常常一个接一个地发送很多报文段 如果报文段丢失,则发送方将可能接收到很多重复的 ACKs. 如果发送方收到3个个对同样报文段的确认,则发送方认为该报文段之后的数据已经丢失。 启动快速重传快速重传: 在定时器超时之前重发丢失的报文段87Host AtimeoutHost BtimeXresend seq X2seq # x

47、1seq # x2seq # x3seq # x4seq # x5ACK x1ACK x1ACK x1ACK x1tripleduplicateACKs88 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 for y if (count of dup ACKs received

48、 for y = 3) resend segment with sequence number y a duplicate ACK for already ACKed segmentfast retransmit89接收方的事件接收方的事件期望序号的报文段按序到达期望序号的报文段按序到达. . 所有所有在期望序号以前的报文段都在期望序号以前的报文段都被确认被确认期望序号的报文段按序到达期望序号的报文段按序到达. .另一个按序报文段等待发送另一个按序报文段等待发送ACKACK收到一个失序的报文段,高于收到一个失序的报文段,高于期望的序号,检测到缝隙期望的序号,检测到缝隙到达的报文段部分地或者完到

49、达的报文段部分地或者完全地填充接收数据间隔全地填充接收数据间隔TCP TCP 接收方行为接收方行为延迟延迟ACK. ACK. 等到等到 500ms 500ms看是否有下一个看是否有下一个报文段,如果没有,发送报文段,如果没有,发送ACKACK立即发送单个累积立即发送单个累积ACK, ACK, 确认两个有序的报文段确认两个有序的报文段立即发送重复立即发送重复 ACK, ACK, 指出期望的序号指出期望的序号立即发送立即发送 ACK, ACK, 证实缝隙低端的证实缝隙低端的报文段已经收到报文段已经收到90 3.1 运输层服务 3.2多路复用和多路复用 3.3 无连接传输: UDP 3.4 可靠数据

50、传输原理 3.5 面向连接传输: TCP 数据段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理 3.7 TCP 拥塞控制91 TCP连接的接收边有一个接收缓冲区: 速度匹配服务速度匹配服务: 发送速率和接收应用程序的提取速率匹配应用程序可能从这个缓冲应用程序可能从这个缓冲区读出数据很慢区读出数据很慢发送方不能发送的太多太发送方不能发送的太多太快,让接收缓冲区溢出快,让接收缓冲区溢出流量控制流量控制92(假设 TCP 接收方丢弃失序的报文段) 流量控制使用接收窗口接收窗口:接收缓冲区的剩余空间 接收方在报文段中宣告接收窗口的剩余空剩余空间间 发送方限制没有确认的数据不超过接收窗口

51、保证接收缓冲区不溢出93 3.1 运输层服务 3.2多路复用和多路复用 3.3 无连接传输: UDP 3.4 可靠数据传输原理 3.5 面向连接传输: TCP 数据段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理 3.7 TCP 拥塞控制94回忆回忆: TCP在交换数据报文段之前在发送方和接收方之间建建立连接立连接 初始化初始化TCP 变量变量: 序号 缓冲区流控信息 如,接收窗口 客户客户: 连接发起者 Socket clientSocket = new Socket(hostname,port number); 服务器服务器: 等待客户联系 Socket connection

52、Socket = welcomeSocket.accept();三次握手协议三次握手协议95Step 1: 客户发送TCP SYN报文段到服务器 指定初始的序号 没有数据Step 2: 服务器接收SYN, 回复 SYNACK 报文段 服务器分配缓冲区 指定服务器的初始序号Step 3: 客户接收 SYNACK, 回复 ACK 报文段, 可能包含数据SYN = 1, seq = client_isnSYN = 0, seq = client_isn + 1, ack = server_isn 1连接连接请求请求连接连接允许允许AB客户服务器SYN = 1, seq = server_isn, a

53、ck= client_isn 196客户关闭套接字客户关闭套接字: clientSocket.close()Step 1: 客户发送 TCP FIN 控制报文段到服务器 Step 2: 服务器接收 FIN, 回复 ACK. 半关闭连接半关闭连接, 并发送FIN到客户Step 3: 客户接收 FIN, 回复 ACK. 进入 “timed wait” 等待结束时释放连接资源Step 4: 服务器接收 ACK. 连接关闭连接关闭. clientFINserverACKACKFINclosecloseclosedtimed wait97TCP 客户端状态转换图客户端状态转换图98TCP 服务器端状态转

54、换图服务器端状态转换图99 3.1 运输层服务 3.2多路复用和多路复用 3.3 无连接传输: UDP 3.4 可靠数据传输原理 3.5 面向连接传输: TCP 数据段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理 3.7 TCP 拥塞控制100原因原因: Too many sources sending too much data too fast for network to handle(太多主机发送太多的数据,速度太快以至于网络来不及处理) 表现表现: 丢失分组丢失分组 - 路由器的缓冲区溢出 长时延长时延 - 在路由器的缓冲区排队101假设假设: 两个发送者,两个两个发

55、送者,两个接收者接收者 一个路由器,无限一个路由器,无限缓冲区缓冲区 不执行重发不执行重发 链路带宽为链路带宽为C 每个主机最大可每个主机最大可达吞吐量达吞吐量C/2,C/2,总总的吞吐量为的吞吐量为C C 拥塞时延在拥塞时延在C/2C/2达达到无限大到无限大unlimited shared output link buffersHost Al lin : original dataHost Bl loutl lin : original data102假设:假设: 一个路由器,有限缓冲区一个路由器,有限缓冲区 发送方重发丢失的报文发送方重发丢失的报文有限的共享式有限的共享式输出链路缓存输出链

56、路缓存Host AHost Ain in : : 原始数据原始数据Host BHost Boutoutin in : : 原始数据加重发数据原始数据加重发数据103 情况情况a:总是 情况情况b:仅当数据丢失时才重发: 情况情况c:超时而没有丢失的报文重发,导致同样的 需要比更大的l linl lout=l linl loutl linl loutR/2R/2l linl loutb.R/2R/2l linl louta.R/2R/2l linl loutc.R/4R/3104问问: : 在在 和和 增增加的时候什么会发生加的时候什么会发生 ? ?假设:假设: 四个发送方四个发送方 多跳路径多

57、跳路径 超时超时/重发重发l linl lin有限共享输出链路有限共享输出链路Host AHost Dl loutl lin : 原始数据原始数据l lin : 原始数据加重发数原始数据加重发数据据Host CHost BR1R3R4R2105当分组沿路径被丢失后,当分组沿路径被丢失后, 任何上游路由器的传输容量都任何上游路由器的传输容量都被浪费了被浪费了!Host AHost Bl lout106端到端拥塞控制端到端拥塞控制: 网络层没有为运输层拥塞控制提供显式支持 端系统必须观察网络行为,如分组丢失分组丢失或延迟延迟来推断拥塞 TCP采用的方法网络辅助的拥塞控制网络辅助的拥塞控制: 路由器

58、给端系统提供显式反馈 单单bit指示网络拥塞 (SNA, DECnet) ATM 允许路由器显式通知发送者输出链路支持的传输速率传输速率107ABR: 可用比特率: “弹性服务” 如果发送方通道“低载” : 发送方应该利用有效带宽 如果发送方通道拥塞: 发送方应该调节到保证速率RM (资源管理) 信元: 发送方发送,点缀在数据信元中 RM信元中的bit是交换机设置(网络辅助) NI bit: 速率不要增加 (轻度拥塞) CI bit: 拥塞指示 接收方不改变RM 信元的bit,将其返回给发送者 108 RM信元的两个字节的 ER (明确速率) 域 拥塞的交换机可能降低信元中的 ER 值 发送方

59、的发送速率因此调整到通道支持的最低速率 数据信元中的EFCI 位: 在拥塞的交换机中设置为1 如果数据信元有EFCI,比RM先到,发送方设置CI比特于返回的RM信元中109 3.1 运输层服务 3.2多路复用和多路分解 3.3 无连接传输: UDP 3.4 可靠数据传输原理 3.5 面向连接传输: TCP 报文段结构 可靠数据传输 流量控制 连接管理 3.6 拥塞控制原理 3.7 TCP 拥塞控制110goal: TCP sender should transmit as fast as possible, but without congesting netwo分散管理分散管理: 根据以下反馈设置自己的发送速率:1.1.收到收到ACK:ACK: 报文段被收到,网络无拥塞,因而可增加发送速率2.2.报文段丢失报文段丢失: : 可认为是由于网络拥塞导致丢失,降低发送速率三个机制三个机制:(1)AIMD (2)慢启动慢启动 (3)对超时事件作出反应对超时事件作出反应问题问题: 如何找到合适的发送速率以防止拥塞呢?如何找到合适的发送速率以防止拥塞呢?111 设置拥塞窗口,CongWin大小 CongWin 是动态感知网络拥塞的函数 发送方限制发送:LastByteSent-LastByteA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论