740 likes | 881 Views
Data Communications and Computer Networks. CHAPTER 7 TRANSPORT LAYER. 中国科学技术大学网络学院 李艺 leey i@ustc.edu.cn. 7.1 概述. 传输层是 OSI 模型的第四层,是整个网络体系的核心,它的主要职能是在源计算机到目的计算机之间提供可靠的、经济的数据传输服务,而且独立于所使用的物理网络。 传输层服务和协议 在两个不同的主机上运行的应用程序之间提供 逻辑通信 传输层协议运行在端系统 发送方 : 将应用程序报文分成数据段传递给网络层 ,
E N D
Data Communications and Computer Networks CHAPTER 7 TRANSPORT LAYER 中国科学技术大学网络学院 李艺 leeyi@ustc.edu.cn NETWORK PRINCIPLE 7- 1
7.1 概述 传输层是OSI模型的第四层,是整个网络体系的核心,它的主要职能是在源计算机到目的计算机之间提供可靠的、经济的数据传输服务,而且独立于所使用的物理网络。 • 传输层服务和协议 • 在两个不同的主机上运行的应用程序之间提供 逻辑通信 • 传输层协议运行在端系统 • 发送方: 将应用程序报文分成数据段传递给网络层, • 接受方: 将数据段重新组装成报文传递到应用层 • 不只一个传输层协议可以用于应用程序 • 因特网: TCP 和 UDP • 传输层和网络层区别 • 网络层:两个主机之间的逻辑通信,不可靠服务。 • 传输层:两个进程之间的逻辑通信,可靠服务。 NETWORK PRINCIPLE 7- 2
面向信息处理 应用层 用户功能 传输层 网络层 面向通信 网络功能 数据链路层 物理层 7.1 概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 NETWORK PRINCIPLE 7- 3
7.1 概述 • 应用进程之间的通信 • 两个主机进行通信实际上就是两个主机中的应用进程互相通信。 • 应用进程之间的通信又称为端到端的通信。 • 传输层的一个很重要的功能就是复用和分用。应用层不同进程的报文通过不同的端口向下交到传输层,再往下就共用网络层提供的服务。 • “传输层提供应用进程间的逻辑通信”。“逻辑通信”的意思是:传输层之间的通信好像是沿水平方向传送数据。但事实上这两个传输层之间并没有一条水平方向的物理连接。 NETWORK PRINCIPLE 7- 4
?错误 发 送 进 程 接 收 进 程 发 送 进 程 接 收 进 程 应 用 层 数据 数据 数据 数据 运 输 层 全双工可靠信道 不可靠信道 使用 TCP 协议 使用 UDP 协议 7.1 概述 • 传输层向上提供可靠的和不可靠的逻辑通信信道 NETWORK PRINCIPLE 7- 5
7.1 概述 • 传输层的主要功能 • 寻址 • 建立连接 • 释放连接 • 流量控制 • 复用 • 崩溃恢复 NETWORK PRINCIPLE 7- 6
主机 A 主机 B 传输服务用户 (应用层实体) 传输服务用户 (应用层实体) 应用层 传输层服务访问点 TSAP 层接口 传输协议 TPDU 传输层 传输实体 传输实体 网络层 层接口 网络层服务访问点 NSAP 网络 7.2 寻址 • 寻址方法 定义传输服务访问点TSAP(Transport Service Access Point),将应用进程与这些TSAP相连。在Internet中,TSAP为(IP address, local port) NETWORK PRINCIPLE 7- 7
7.2 寻址 • 远方客户程序如何获得服务程序的TSAP? • 方法1:预先约定、广为人知的,象telnet是(IP地址,端口23); • 方法2:从名字服务器(name server)或目录服务器(directory server)获得TSAP • 一个特殊的进程称为名字服务器或目录服务器(TSAP众所周知); • 用户与名字服务器建立连接,发送服务名称,获得服务进程的TSAP,释放与名称服务器的连接; • 与服务进程建立连接。 NETWORK PRINCIPLE 7- 8
接收方 发送方 应用进程 应用进程 应 用 层 端口 端口 TCP 复用 运 输 层 UDP 复用 UDP 分用 TCP 分用 UDP 用户数据报 UDP 用户数据报 TCP 报文段 TCP 报文段 IP 复用 网 络 层 IP 分用 IP 数据报 IP 数据报 7.2 寻址 • 端口的概念 • 端口就是运输层服务访问点 TSAP。 • 端口的作用就是让应用层的各种应用进程都能将其数据通过端口向下交付给运输层,以及让运输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。 • 从这个意义上讲,端口是用来标志应用层的进程。 NETWORK PRINCIPLE 7- 9
7.2 寻址 • 端口用一个 16 bit 端口号进行标志。 • 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。 • 两类端口 • 一类是周知端口,其数值一般为 0~1023。当一种新的应用程序出现时,必须为它指派一个熟知端口。 • 另一类则是一般端口,用来随时分配给请求通信的客户进程。 NETWORK PRINCIPLE 7- 10
常用周知端口号列表 NETWORK PRINCIPLE 7- 11
常用周知端口号列表(续) NETWORK PRINCIPLE 7- 12
7.2 寻址 • 传输层寻址(Addressing) • 当服务程序很多时,使用初始连接协议(initial connection protocol) • 一个称为进程服务器(process server)的进程(inetd)同时在多个端口上监听; • 远方客户程序向它实际想访问的服务程序的TSAP发出连接建立请求; • 如果没有服务程序在此TSAP上监听,则远方客户和进程服务器建立连接; • 进程服务器产生所请求的服务进程,并使该进程继承和远程客户的连接; • 进程服务器返回继续监听; • 远方客户程序与所希望的服务程序进行数据传输。 NETWORK PRINCIPLE 7- 13
端口号 IP 地址 1500 131.6.23.13 131.6.23.13, 1500 插口(socket) 7.2 寻址 • 插口(socket) • TCP 使用“连接”(而不仅仅是“端口”)作为最基本的抽象,同时将 TCP 连接的端点称为插口(socket),或套接字、套接口。 • 插口和端口、IP 地址的关系是: NETWORK PRINCIPLE 7- 14
7.2 寻址 • 同一个名词 socket 有多种不同的意思 • 应用编程接口API称为 socket API, 简称为 socket。 • socket API 中使用的一个函数名也叫作socket。 • 调用 socket 函数的端点称为 socket。 • 调用 socke t函数时其返回值称为 socket描述符,可简称为 socket。 • 在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。 NETWORK PRINCIPLE 7- 15
7.3 连接的建立与释放 • 建立连接 网络可能丢失、重复包,特别是延迟重复包(delayed duplicates)的存在,导致传输层建立连接的复杂性; • 解决延迟重复包的关键是丢弃过时的包; • 两次握手方案 • A发出连接请求CR TPDU,B发回连接确认CC TPDU; • 失败的原因:网络层会丢失、存储和重复包。 • 建立连接的三次握手(three-way handshake) 三次握手方案解决了由于网络层会丢失、存储和重复包带来的问题。 NETWORK PRINCIPLE 7- 16
主机 1 主机 2 主机 1 主机 2 CR (SEQ=X) CR (SEQ=X) (重复) ACK (SEQ=Y,ACK=X) ACK (SEQ=Y,ACK=X) DATA (SEQ=X,ACK=Y) REJ (ACK=Y) 7.3 连接的建立与释放 NETWORK PRINCIPLE 7- 17
主机 1 主机 2 CR (SEQ=X) ACK (SEQ=Z,ACK=X) CR (SEQ=X) (重复) ACK (SEQ=Y,ACK=X) DATA (SEQ=X,ACK=Z) DATA (SEQ=X,ACK=Z) (重复) REJ (ACK=Y) 7.3 连接的建立与释放 NETWORK PRINCIPLE 7- 18
7.3 连接的建立与释放 • 释放连接:两种连接释放方法 • 非对称式:一方释放连接,整个连接断开,存在丢失数据的危险; NETWORK PRINCIPLE 7- 19
7.3 连接的建立与释放 • 对称式:由于两军问题(two-army problem)的存在,可以证明不存在安全的通过N次握手实现对称式连接释放的方法; NETWORK PRINCIPLE 7- 20
7.3 连接的建立与释放 • 但是在实际的通信过程中,使用三次握手 + 定时器的方法释放连接在绝大多数情况下是成功的。图中,DR:disconnect request NETWORK PRINCIPLE 7- 21
7.4 流量控制和缓存 • 缓存(Buffering ) 由于网络层服务是不可靠的,传输层实体必须缓存所有连接发出的TPDU,而且为每个连接单独做缓存,以便用于错误情况下的重传。接收方的传输层实体既可以做也可以不做缓存。缓存区的设计有三种。 NETWORK PRINCIPLE 7- 22
7.4 流量控制和缓存 • 流量控制 传输层利用可变滑动窗口协议来实现流控。所谓可变滑动窗口协议,是指发送方的发送窗口大小是由接收方根据自己的实际缓存情况给出的。为了避免控制TPDU丢失导致死锁,主机应该周期性的发送TPDU。 NETWORK PRINCIPLE 7- 23
7.4 流量控制和缓存 • 慢开始和拥塞避免 • 发送端的主机在确定发送报文段的速率时,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞。 • 因此,每一个 TCP 连接需要有以下两个状态变量: • 接收端窗口 rwnd (receiver window) 又称为通知窗口(advertised window)。 • 拥塞窗口 cwnd (congestion window)。 • 接收端窗口 rwnd 和拥塞窗口 cwnd • 接收端窗口 rwnd 这是接收端根据其目前的接收缓存大小所许诺的最新的窗口值,是来自接收端的流量控制。接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。 • 拥塞窗口 cwnd (congestion window) 是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。 NETWORK PRINCIPLE 7- 24
7.4 流量控制和缓存 • 发送窗口的上限值 • 发送端的发送窗口的上限值应当取为接收端窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定: 发送窗口的上限值 Min [rwnd, cwnd] (7-1) • 当 rwnd < cwnd 时,是接收端的接收能力限制发送窗口的最大值。 • 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。 NETWORK PRINCIPLE 7- 25
7.4 流量控制和缓存 • 慢开始算法的原理 • 在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS 的数值。 • 在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS 的数值。 • 用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。 NETWORK PRINCIPLE 7- 26
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 当 TCP 连接进行初始化时,将拥塞窗口置为 1。图中的窗口单位不使用字节而使用报文段。 慢开始门限的初始值设置为 16 个报文段, 即 ssthresh = 16。 NETWORK PRINCIPLE 7- 27
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。 NETWORK PRINCIPLE 7- 28
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段 M0。 NETWORK PRINCIPLE 7- 29
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 发送端收到 ACK1 (确认 M0,期望收到 M1)后,将 cwnd 从 1 增大到 2,于是发送端可以接着发送 M1 和 M2 两个报文段。 NETWORK PRINCIPLE 7- 30
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 接收端发回 ACK2 和 ACK3。发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞窗口加 1。现在发送端的 cwnd 从 2 增大到 4,并可发送 M4 ~ M6共 4个报文段。 NETWORK PRINCIPLE 7- 31
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞窗口加 1,因此拥塞窗口 cwnd 随着传输次数按指数规律增长。 NETWORK PRINCIPLE 7- 32
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 拥塞避免 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 慢开始 拥塞避免 当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(即当 cwnd = 16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。 NETWORK PRINCIPLE 7- 33
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 假定拥塞窗口的数值增长到 24 时,网络出现超时(表明网络拥塞了)。 NETWORK PRINCIPLE 7- 34
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 更新后的 ssthresh 值变为 12(即发送窗口数值 24 的一半),拥塞窗口再重新设置为 1,并执行慢开始算法。 NETWORK PRINCIPLE 7- 35
发生超时 线性规律增长 进入拥塞避免 进入拥塞避免 指数规律增长 慢开始和拥塞避免算法的实现举例 拥塞窗口 cwnd 24 20 ssthresh = 16 16 更新后的 ssthresh = 12 12 8 4 传输次数 0 0 2 4 6 8 10 12 14 16 18 20 22 慢开始 拥塞避免 慢开始 拥塞避免 当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口按按线性规律增长,每经过一个往返时延就增加一个 MSS 的大小。 NETWORK PRINCIPLE 7- 36
7.4 流量控制和缓存 • 乘法减小(multiplicative decrease) • “乘法减小“是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。 • 当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数。 • 加法增大(additive increase) • “加法增大”是指执行拥塞避免算法后,当收到对所有报文段的确认就将拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。 • 强调 • “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。 • “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。 NETWORK PRINCIPLE 7- 37
7.4 流量控制和缓存 • 快重传和快恢复 • 快重传算法规定,发送端只要一连收到三个重复的 ACK 即可断定有分组丢失了,就应立即重传丢失的报文段而不必继续等待为该报文段设置的重传计时器的超时。 • 不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。 NETWORK PRINCIPLE 7- 38
M1, M2 ACK2, ACK3 M3 丢失! M4 ACK3 M5 ACK3 M6 ACK3 M3 快重传举例 主机 A 主机 B A 发送 M1 和 M2 B 确认 M1和M2 A 发送 M3 但丢失了 A 发送 M4 B 只能再次确认M2(因为 M3没有收到) A 发送 M5 B 发送第二个重复确认ACK3 A 发送 M6 B 发送第三个重复确认ACK3 A 收到了三个重复的确认 ACK3,就立即重传 M3,而不必等待超时重传。 NETWORK PRINCIPLE 7- 39
7.4 流量控制和缓存 • 快恢复算法 (1) 当发送端收到连续三个重复的 ACK 时,就重新设置慢开始门限 ssthresh。 (2) 与慢开始不同之处是拥塞窗口 cwnd 不是设置为 1,而是设置为 ssthresh + 3 MSS。 (3) 若收到的重复的 ACK 为 n 个(n > 3),则将 cwnd 设置为 ssthresh + n MSS。 (4) 若发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报文段。 (5) 若收到了确认新的报文段的 ACK,就将 cwnd 缩小到 ssthresh。 NETWORK PRINCIPLE 7- 40
7.4 流量控制和缓存 • TCP 的重传机制 • 重传机制是 TCP 中最重要和最复杂的问题之一。 • TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。 NETWORK PRINCIPLE 7- 41
往返时延的 概率分布 数据链路层 时间 运输层 T1 T2 T3 7.4 流量控制和缓存 • 往返时延的方差很大 由于 TCP 的下层是一个互连网环境,IP 数据报所选择的路由变化很大。因而运输层的往返时延的方差也很大。 NETWORK PRINCIPLE 7- 42
7.4 流量控制和缓存 • 往返时延的自适应算法 • 记录每一个报文段发出的时间,以及收到相应的确认报文段的时间。这两个时间之差就是报文段的往返时延。 • 将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延RTT。 • 每测量到一个新的往返时延样本,就按下式重新计算一次平均往返时延 RTT: 平均往返时延RTT (旧的RTT) (1 ) (新的往返时延样本) (7-2) • 在上式中,0 1。 NETWORK PRINCIPLE 7- 43
7.4 流量控制和缓存 • 参数 的选择 • 若 很接近于 1,表示新算出的平均往返时延 RTT 和原来的值相比变化不大,而新的往返时延样本的影响不大(RTT 值更新较慢)。 • 若选择 接近于零,则表示加权计算的平均往返时延 RTT 受新的往返时延样本的影响较大(RTT 值更新较快)。 • 典型的 值为 7/8。 NETWORK PRINCIPLE 7- 44
7.4 流量控制和缓存 • 超时重传时间 RTO (RetransmissionTime-Out) • 计时器的 RTO 应略大于上面得出的 RTT,即: RTO RTT (7-3) • 这里 是个大于 1 的系数。 • 若取 很接近于1 ,发送端可及时地重传丢失的报文段,因此效率得到提高。 • 但若报文段并未丢失而仅仅是增加了一点时延,那么过早地重传反而会加重网络的负担。 • 因此 TCP 原先的标准推荐将 值取为 2。 NETWORK PRINCIPLE 7- 45
是对哪一个报文段 的确认? 发送一个 TCP 报文段 超时重传 TCP 报文段 收到 ACK 1 2 时间 往返时延 RTT? 往返时延 RTT? 7.4 流量控制和缓存 • 往返时间的测量相当复杂 • TCP 报文段 1 没有收到确认。重传(即报文段 2)后,收到了确认报文段 ACK。 • 如何判定此确认报文段是对原来的报文段 1 的确认,还是对重传的报文段 2 的确认? NETWORK PRINCIPLE 7- 46
7.4 流量控制和缓存 • Karn 算法 • 在计算平均往返时延 RTT 时,只要报文段重传了,就不采用其往返时延样本。 • 这样得出的平均往返时延 RTT 和重传时间就较准确。 • 修正的 Karn 算法 • 报文段每重传一次,就将重传时间增大一些: 新的重传时间 (旧的重传时间) (7-4) • 系数 的典型值是2 。 • 当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延 RTT 和重传时间的数值。 • 实践证明,这种策略较为合理。 NETWORK PRINCIPLE 7- 47
发送端 接收端 应用进程 应用进程 向发送缓存 写入数据块 从接收缓存 读取数据块 … … 端口 端口 TCP TCP 发送缓存 接收缓存 … 报文段 报文段 报文段 发送 TCP 报文段 7.5 TCP协议 • TCP 概述 NETWORK PRINCIPLE 7- 48
32 bit 比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节的 固定首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 TCP 首部 TCP 数据部分 TCP 报文段 发送在前 IP 首部 IP 数据部分 NETWORK PRINCIPLE 7- 49
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 NETWORK PRINCIPLE 7- 50