适用计算机网络(第七版)
自己的学习笔记,PPT及图片来源网络,侵删。
计算机网第五章
第五章 运输层
5.1 运输层协议概述
5.1.1 进程之间的通信
- 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
- 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
运输层的作用 :运输层提供应用进程间的逻辑通信,从运输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。
网络层是为主机之间提供逻辑通信;运输层为应用进程之间提供端到端的逻辑通信。
运输层的重要功能 :
- 复用,在发送方不同的应用进程都可以使用同一个运输层协议传送数据。
- 分用,接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程。
运输层两种不同的运输协议 :面向连接的 TCP 协议与无连接的 UDP 协议时。
5.1.2 运输层的两个主要协议
当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道。
用户数据报协议 UDP 与传输控制协议 TCP
- 两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU 。
- TCP 传送的数据单位协议是 TCP 报文段。
- UDP 传送的数据单位协议是 UDP 报文或用户数据报。
- 运输层的 UDP 用户数据报与网际层的IP数据报有很大区别。
- IP 数据报要经过互连网中许多路由器的存储转发。
- UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。
- TCP 报文段是在运输层抽象的端到端逻辑信道中传送,这种信道是可靠的全双工信道。但这样的信道却不知道究竟经过了哪些路由器,而这些路由器也根本不知道上面的运输层是否建立了 TCP 连接。
5.1.3 运输层的端口
- 运行在计算机中的进程是用进程标识符来标志的。
- 为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志,即端口。
端口号 :
- 端口用一个 16 位端口号进行标志。
- 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在互联网中,不同计算机的相同端口号是没有联系的。
- 由此可见,两个计算机中的进程要互相通信,不仅必须知道对方的端口号(为了找到对方计算机中的应用进程) ,而且还要知道对方的 IP 地址(为了找到对方的计算机)。
端口号的划分 :
- 服务器端使用的端口号(不允许自由分配)
- 熟知端口,数值一般为 0 ~ 1023,一些协议的固定端口号。
- 登记端口号,数值为 1024 ~ 49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复,一般大型的APP希望可以使用固定的端口号。
- 客户端使用的端口号
又称为短暂端口号,数值为 49152 ~ 65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。
5.2 用户数据报协议 UDP
5.2.1 UDP概述
UDP 只在 IP 的数据报服务之上增加了很少一点的功能:
- 复用和分用的功能
- 差错检测的功能
UDP 的主要特点 :
- UDP 是无连接的,发送数据之前不需要建立连接。
- UDP 使用尽最大努力交付,即不保证可靠交付。
- UDP 是面向报文的。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文。
- UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小,只有 8 个字节
面向报文的 UDP :
- 接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。
- 应用程序必须选择合适大小的报文。
- 若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片,这会降低 IP 层的效率。
- 若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报的首部的相对长度太大,这也降低了 IP 层的效率。
5.2.2 UDP的首部格式
- 源端口:源端口号。在需要对方回信时选用,不需要时可用全0。
- 目的端口:目的端口号。这在终点交付报文时必须使用。
- 长度:UDP用户数据报的长度,其最小值是8(仅有首部)。
- 检验和: 检测UDP用户数据报在传输中是否有错,有错就丢弃,计算时为了确保数据没有被修改需要加上一个伪首部,仅仅只是用作计算校验和。
5.3 传输控制协议 TCP 概述
5.3.1 TCP最主要的特点
- TCP 是面向连接的运输层协议,在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此,在 IP 的数据报服务基础之上,增加了保证可靠性的一系列措施。
- 每一条 TCP 连接只能有两个端点 ,每一条 TCP 连接只能是点对点的(一对一)。
- TCP 提供可靠交付的服务,不丢失,不重复,不乱序,无差错。
- TCP 提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据。
- 面向字节流
面向字节流的TCP
- TCP 中的“流”:指的是流入或流出进程的字节序列。
- “面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
- TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
- TCP与UDP不同,它会根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节。
5.3.2 TCP的连接
- TCP 把连接作为最基本的抽象(TCP是建立在连接的基础上的)。
- 每一条 TCP 连接有两个端点。
- TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口,TCP 连接的端点叫做套接字 。
套接字 socket = (IP 地址:端口号)
TCP连接 ::=
{socket1,scoket2} = {(IP1: port1),(IP2:port2)}
5.4 可靠传输的工作原理
理想的传输条件有以下两个特点:
- 传输信道不产生差错。
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
5.4.1 停止等待协议(自动重传ARQ)
“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组,全双工通信的双方既是发送方也是接收方。
为了方便,仅考虑 A 发送数据,而 B 接收数据并发送确认。因此 A 叫做发送方,而 B 叫做接收方。
停等协议的四种情况 :
- B收到A发送的协议且无差错 :A发送分组M1,发完就暂停发送,等待B的确认。B收到了M1就向A发送确认。A在收到了对M1的确认后,就再发送下一个分组M2。同样,在收到B对M2的确认后,再发送M3。
- B收到A发送的协议但有差错或者A发送的协议丢失 :B接收M1时检测出了差错,就丢弃M1,其他什么也不做(不通知A收到有差错的分组)。也可能是M1在传输过程中丢失了,在这两种情况下,B都不会发送任何信息。A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这就叫做超时重传。要实现超时重传,就要在每发送完一个分组时设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。
- B发送给A的确认丢失 :若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内不能收到确认,因此 A 在超时计时器到期后就要重传 M1。假定 B 又收到了重传的分组 M1。这时 B 应采取两个行动:
- 第一,丢弃这个重复的分组 M1,不向上层交付。
- 第二,向 A 发送确认。
- B发送给A的确认迟到 :传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了。A 会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃。B 仍然会收到重复的 M1,并且同样要丢弃重复的 M1,并重传确认分组。
像上述的这种可靠传输协议常称为自动重传请求 ARQ 。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。
信道利用率 :
A发送分组需要的时间是TD。显然,TD等于分组长度除以数据率。再假定分组正确到达B后,B处理分组的时间可以忽略不计,同时立即发回确认。假定B发送确认分组需要时间TA。如果A处理确认分组的时间也可以忽略不计,那么A在经过时间(TD+RTT+TA)后就可以再发送下一个分组,这里的RTT是往返时间。因为仅仅是在时间TD内才用来传送有用的数据(包括分组的首部),因此信道的利用率U可用下式计算:
流水线传输:
5.4.2 连续ARQ协议
依旧存在超时计时器。
滑动窗口机制:
窗口 :缓存中的一块区域 ,发送窗口存放即将发送的数据,接受窗口存放即将要接收的数据。
接收窗口 :为了提供可靠有序的数据,防止丢包
发送数据之前对数据编号,每次发送窗口可以发送的数据大小受到不同条件的制约,即将发送的数据按照编号顺序送入发送窗口,剩余数据依旧存放在缓存中等待进入发送窗口。
累计确认 :即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
优点:容易实现,即使确认丢失也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
Go-back-N(回退 N):发送分组,第三个分组收到确认,四直到八都发送了,但没有收到第八个分组的确认,只收到第四个分组的确认,这事可能是五、六、七中的一个分组丢失或者确认丢失,但需要从第四个分组开始全部重新发送,及再次发送五六七八。
5.5 TCP 报文段的首部格式
-
源端口 :2个字节,写入源端口号
-
目的端口 :2个字节,写入目的端口号
-
序号 :4个字节,为要求传输的所有字节编号,从哪一个字节开始发送,序号就是几。(发送1-100,序号1)
-
确认号ack :4个字节,希望对方下一次从哪一个开始发送的序号。(与本报文的序号无关,上一次收到300-400,希望下一次从401开始发送,确认号401)
-
数据偏移 :4位,指出数据部分从哪开始。
-
保留 :6位,保留为今后使用,但目前应置为0 。
-
6个控制位,各1位,用来说明本报文段的性质。
- 紧急URG(URGent):1;表示紧急指针有效,0;表示紧急指针无效。
- 确认ACK(ACKnowledgment):1;表示确认号有效,0;表示确认号无效。
- 推送 PSH(PuSH):1;向上层交付,0;存放咋缓存中,不向上层交付。
- 复位RST(ReSeT) : 1;表示要求重新建立连接,0;不需要重新建立连接。
- 同步SYN(SYNchronization):1;表示正在建立连接
- 终止FIN(FINis) :1;数据发送结束,释放连接
-
窗口 :2个字节,此刻的接受窗口大小。
-
检验和 :2个字节,检测数据报在传输中是否有错,有错就丢弃,计算时为了确保数据没有被修改需要加上一个伪首部,仅仅只是用作计算校验和。
-
紧急指针 :2个字节,指向紧急数据
-
选项 :长度可变,最长可达40字节。
-
填充 :用来保证首部长度是4个字节的整数倍。
5.6 TCP 可靠传输的实现
5.6.1 以字节为单位的滑动窗口
发送窗口是根据确认报文首部构建 :
A收到来自B的确认报文,窗口为20,确认号为31,这表明A的接受窗口大小为20,本次发送给A的序号是31,发送数据为31-50,30号之前的数据已经成功。
在收到确认之前不会把已经发送的数据移出发送窗口,在超时之前还没有收到累计确认,则会引起重传,只有成功发送之后(收到确认),发送窗口才会移动。
发送窗口增大,就移入相应的新数据,在发送窗口缩小之后,不会移出靠右的数据,而是不再移入新的数据,直到发送窗口符合大小为止。
强调 :
- A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
- TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
- TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。
5.6.2 超时重传时间的选择
RTT:报文段往返时间。
RTTS :加权平均往返时间。
RTO :超时重传时间 。
RTTD : RTT 的偏差的加权平均值
加权平均往返时间RTTS:
推荐的α值为 1/8,是0-1之间的一个值。若α很接近于零,表示 RTT 值更新较慢。若选择α接近于 1,则表示 RTT 值更新较快。
超时重传时间 RTO :
RTTD 是 RTT 的偏差的加权平均值 :
第一次测量时, RTTD 值取为测量到的 RTT 样本值的一半,β是个小于 1 的系数,其推荐值是 1/4。
5.6.3 选择确认 SACK
TCP的扩展头部,即哪一段收到了就确认哪一段,没有收到就不确认,避免了重传。
- 如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。
- 由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息(4个字节块,8个边界需要使用32字节描述,另外还需1个字节指明SACK选项,1个字节描述该选项占用多少字节)。
5.7 TCP 的流量控制
流量控制:就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。
5.7.1 利用滑动窗口实现流量控制
A 向 B 发送数据。在连接建立时,B 告诉 A:
“我的接收窗口 rwnd = 400(字节)”。
可能发生死锁 :
- B 向 A 发送了零窗口的报文段后不久,B 的接收缓存又有了一些存储空间。于是 B 向 A 发送了 rwnd = 400 的报文段。
- 但这个报文段在传送过程中丢失了。A 一直等待收到 B 发送的非零窗口的通知,而 B 也一直等待 A 发送的数据。
解决 :
- TCP 为每一个连接设有一个持续计时器。只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。
- 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
- 若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器,若窗口不是零,则死锁的僵局就可以打破了。
5.7.2 TCP 的传输效率
可以用不同的机制来控制 TCP 报文段的发送时机:
- 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
- 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送 (push) 操作。
- 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。
糊涂窗口综合症:每次仅发送一个字节或很少几个字节的数据时,有效数据传输效率变得很低的现象。
发送方:
发送方 TCP 每次接收到一字节的数据后就发送,使用 Nagle 算法解决。
- 若应用进程数据逐个字节地送到 TCP 的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。
- 当收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。
- 只有在收到对前一个报文段的确认后才继续发送下一个报文段。
- 当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。
接收方:
当接收方的 TCP 缓冲区已满,接收方会向发送方发送窗口大小为 0 的报文,若此时接收方的应用进程以交互方式每次只读取一个字节,于是接收方又发送窗口大小为一个字节的更新报文,发送方应邀发送一个字节的数据(发送的 IP 数据报是 41 字节长),于是接收窗口又满了,如此循环往复。
解决 :让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。
5.8 TCP 的拥塞控制
5.8.1 拥塞控制的一般原理
拥塞 :在某段时间,若对网络中某资源的需求量的总和超过了该资源所能提供的可用部分,网络的性能就要变坏。
拥塞控制与流量控制
拥塞控制的作用
拥塞控制是很难设计的,因为它是一个动态问题,分组的丢失是网络发生拥塞的征兆而不是原因,分组的丢失不一定就是网络网络发生了拥塞。
TCP认为一旦发生了分组的丢失就是可能即将要发生网络拥塞的征兆。
5.8.2 TCP 的拥塞控制方法
TCP 采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法。
TCP发送方维持一个拥塞窗口 cwnd发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量(即根据网络的状态调整拥塞窗口的大小)。
发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:
真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)
拥塞的判断
- 重传定时器超时,网络已经发生了拥塞。
- 收到三个重复的 ACK,预示网络可能会出现拥塞(实际可能还未发生拥塞)。
TCP拥塞控制算法 :
- 四种拥塞控制算法:
- 慢开始 :两种都有
- 拥塞避免 :两种都有
- 快重传 :三个ACK
- 快恢复 :三个ACK
快重传 :接收方在接收报文丢失了其中的某一个报文,在丢失报文之后的三个报文也立即给予回复,回复三个重复的确认希望发送方可以重传丢失报文。
拥塞控制算法 :(举例说明)
- 设定慢开始门限ssthresh为16,即下一个轮次依旧执行慢开始就一定会拥塞。
- 慢开始从1开始指数增长,直到达到慢开始门限时进行拥塞避免。
- 拥塞避免即每一个增长轮次拥塞窗口数加1
- 当拥塞窗口增加到一定的大小时会产生分组的丢失(超时),此时进行强制干预,拥塞窗口数直接将为1。
- 重新开始慢开始,此时的慢开始门限值设置为原来发生超时时的轮次的拥塞窗口的一半。
- 慢开始从1开始指数增长,直到达到慢开始门限时进行拥塞避免,每一个增长轮次拥塞窗口数加1(加法增大)。
- 当达到一定的拥塞窗口时引发了快重传,即收到了3个重复的确认。
- 此时进行快恢复(乘法减小),不再重新进行慢开始,而是直接从引发快重传时的拥塞窗口数的一般直接进行拥塞避免
- 不断重复拥塞避免、快重传、快恢复
必须指出 :
- “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
- “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
5.8.3 主动队列管理 AQM
随机早期检测RED :如果分组到达的速度大于了理想的数据处理速度,则随机丢弃一些分组用来减少分组队列的长度,以此来主动触发3个ACK。
5.9 TCP 的运输连接管理
TCP 是面向连接的协议。
TCP 连接有三个阶段:
- 连接建立
- 数据传送
- 连接释放
TCP 连接的管理就是使 TCP 连接的建立和释放都能正常地进行。
5.9.1 TCP 的连接建立
解决的问题 :
- 要使双方能够确知对方的存在。
- 要允许双方协商一些参数。
- 能够对运输实体资源进行分配。
客户——服务器模式
- TCP 连接的建立采用客户服务器方式。
- 主动发起连接建立的应用进程叫做客户。
- 被动等待连接建立的应用进程叫做服务器
TCP连接的建立:
- TCP 建立连接的过程叫做握手。
- 握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手。
- 采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。
第一次握手 :SYN=1(正在建立连接)、ACK=0(没有确认号)、seq=x(序号x,不携带实际的数据)
第二次握手 :SYN=1(正在建立连接)、ACK=1(有确认号)、seq=y(A可不可以收到B的回复)、ack=x+1(B可以收到A的连接请求且同意(希望下次分组从x+1开始))
第三次握手 (仅仅只是回复报文,SYN=0):ACK=1(有确认号)、seq=x+1(A收到了B的确认且满足了B的要求)、ack=y+1(A对B的要求)
5.9.2 TCP 的连接释放
TCP连接的释放 :
- TCP 连接释放过程是四报文握手
- TCP是全双工的,一方发送完全部的数据不代表着另一方也发送完成了全部的数据。
第一次握手 :FIN=1(A发起释放连接的请求)、seq=u(最后一次数据的序号)A通知B可以释放接收缓存。
第二次握手 :ACK=1(有确认)、seq=v(B还要发送数据序号为v)、ack=u+1(B收到了A最后一次的数据)B同意A释放连接的请求,并通知A可以释放发送缓存,此时TCP半关闭,B还可以发送数据给A。
第三次握手:FIN=1(B发起释放连接的请求)、seq=w(最后一次数据的序号)、ACK=1(有确认)、ack=u+1(最后一次的确认不变),B通知A可以释放接收缓存。
第四次握手 :ACK=1(有确认)、seq=u+1(最后一次发送不变)、ack=w+1(A收到了B的最后一次数据),A通知B可以释放发送缓存,A与B之间连接完全断开。
等待计时器 :发送第四次握手报文在等待计时器结束之前((2MSL)2个传输报文时间)没有收到第三次握手报文的重复报文,则认为第四握手成功。
5.9.3 TCP 的有限状态机
状态的个数是有贡献个,构成了一个逻辑关系。