提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
提示:以下是本篇文章正文内容
一、运输层概论
1.进程之间的通信
(1)传输层
传输层为应用进程之间提供端到端的逻辑通信(但网络层是为主机之间提供逻辑通信)。传输层还要对收到的报文进行差错检测。
传输层需要有两种不同的运输协议: 面向连接的 TCP和无连接的 UDP。
从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
(2)运输层的作用
(3)网络层和运输层区别
网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
(4)运输层作用
- 复用和分用
在一台主机中经常有多个应用进程同时分别和另一台主机中的多个应用进程通信。
这表明运输层有一个很重要的功能——复用 (multiplexing)和分用 (demultiplexing)。
根据应用程序的不同需求,运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP 。 - 屏蔽作用
运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
(5)可靠信道与不可靠信道
2.运输层的两个主要协议
(1)TCP与UDP
TCP/IP 的运输层有两个主要协议:用户数据报协议 UDP (User Datagram Protocol)、传输控制协议 TCP (Transmission Control Protocol)。
可靠性是指能否保证将传送的数据送达对方。
TCP中采用超时重发与确认响应的措施来提供可靠的传输,而UDP则不提供可靠性保证。
如果采用UDP又要保证可靠性,就要通过应用程序去确认数据的到达与否。这样一来,势必增加应用软件开发人员的负担。
(2)运输协议数据单元
两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。
TCP 传送的数据单位协议是 TCP 报文段(segment)。
UDP 传送的数据单位协议是 UDP 报文或用户数据报。
(3)UDP 与 TCP 的区别
UDP:传送数据之前不需要先建立连接。收到 UDP 报后,不需要给出任何确认。不提供可靠交付,但是一种最有效的工作方式。
TCP:提供可靠的、面向连接的运输服务。不提供广播或多播服务。开销较多。
(4)使用UDP和TCP的典型应用和应用层协议
(5)思考
思考1:网络游戏采用的是UDP 还是 TCP ?
多数实时战斗类游戏要用UDP,因为TCP的特性,一旦丢包就会重发,会阻塞后续的数据包,因而可能会产生一个较大的瞬时延迟。协议选用主要取决于是否能容忍延迟。
思考2:QQ 采用的是哪种运输层协议?
QQ既有UDP也有TCP。不管UDP还是TCP,最终登陆成功之后,QQ都会有一个TCP连接来保持在线状态。QQ采用的通信协议以UDP为主,辅以TCP协议。由于QQ的服务器设计容量是海量级的应用,一台服务器要同时容纳十几万的并发连接,因此服务器端只有采用UDP协议与客户端进行通讯才能保证这种超大规模的服务。QQ客户端之间的消息传送也采用了UDP模式。
3. 运输层的端口
(1)复用和分用
复用:应用进程都可以通过运输层再传送到 IP 层(网络层)。
分用:运输层从 IP 层收到发送给应用进程的数据后,必须分别交付给指明的各应用进程。
(2)需要考虑的问题
进程的创建和撤销都是动态的,因此发送方几乎无法识别其他机器上的进程。
我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个。
有时我们会改换接收报文的进程,但并不需要通知所有的发送方。
(3)端口号
- 端口号
解决方法:在运输层使用协议端口号 (protocol port number),或通常简称为端口 (port)。把端口设为通信的抽象终点。
所谓的端⼝,就好像是⻔牌号⼀样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端⼝的,每个应⽤程序对应⼀个端⼝号,通过类似⻔牌号的端⼝号,客户端才能真正的访问到该服务器。为了对端⼝进⾏区分,将每个端⼝进⾏了编号,这就是端⼝号。
-
运输层端口号
端口用一个 16 位端口号进行标志。
端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。
在互联网中,不同计算机的相同端口号是没有联系的。
由此可见,两个计算机中的进程要互相通信,不仅必须知道对方的 IP 地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。 -
两大类、三种类型的端口号
- 常用熟知端口号
【UDP】
域名系统DNS*:53
简单文件传输协议TFTP:69
简单网络管理协议SNMP:161
【TCP】
文件传输协议FTP*:21连接 (20传输数据)
远程登陆TELNET*:23
电子邮件传输协议SMTP*:25(发邮件)
邮局协议版本3POP3:110(收邮件)
超文本传输协议HTTP*:80
超文本传输安全协议HTTPS*:443
- MAC地址、IP地址和端口号
MAC地址、IP地址和端口号是网络通信中用于标识网络设备和进程的三种不同的标识符。
假设Alice想要通过互联网访问Bob的Web服务器:
MAC地址:Bob的Web服务器有一个网卡,其MAC地址可能是00:1A:2B:3C:4D:5E。当Alice的数据包到达Bob所在局域网的交换机时,交换机会使用这个MAC地址将数据帧直接转发到Bob的服务器。
IP地址:Bob的Web服务器有一个IP地址,假设是192.168.1.100。Alice的计算机通过DNS解析Bob的服务器域名,获得这个IP地址,并通过IP地址在互联网上路由数据包到Bob的服务器。
端口号:Bob的Web服务器监听在端口80上,这是HTTP服务的标准端口。Alice的计算机在数据包中指定目标端口为80,这样当数据包到达Bob的服务器后,操作系统就会将数据传递给监听在端口80上的Web服务器进程。
二、用户数据报协议UDP [更高效]
1.UDP协议概述
(1) UDP协议
UDP 只在 IP 的数据报服务之上增加了很少一点的功能:复用和分用的功能、差错检测的功能。
虽然 UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点。
UDP是一种无连接,不可靠的协议。
并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
此外,传输途中出现丢包,UDP 也不负责重发。甚至当包的到达顺序出现乱序时也没有纠正的功能。
UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)
(2)UDP主要特点:简单方便,但不可靠
(1) UDP 是无连接的,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。
(2) UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
(3) UDP 是面向报文的。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文。
(4) UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很适合多媒体通信的要求。
(5) UDP 支持一对一、一对多、多对一和多对多的交互通信。
(6) UDP 的首部开销小,传输效率较高。只有 8 个字节,比 TCP 的 20 个字节的首部要短。
(3)面向报文的UDP
发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。
应用程序必须选择合适大小的报文。若报文太长,IP 层在传送时可能要进行分片,这会降低 IP 层的效率。若报文太短,会使 IP 数据报的首部的相对长度太大,这也降低了 IP 层的效率。
(4)UDP通信和端口号的关系
复用:将 UDP 用户数据报组装成不同的 IP 数据报,发送到互联网。
分用:根据 UDP 用户数据报首部中的目的端口号,将数据报分别传送到相应的端口,以便应用进程到端口读取数据。
2.UDP首部格式
(1)首部格式
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段很简单,只有 8 个字节,由 4 个字段组成,每个字段都是 2 个字节。
在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
(2)UDP基于端口的分用
当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交最后的终点——应用进程。
注意,虽然在 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字。
三、传输控制协议TCP [更可靠]
1.TCP协议概述
(1)TCP概述
TCP是TCP/IP体系中较为复杂的协议,是传输层中最重要的协议。
(2)TCP特点
TCP 是面向连接的运输层协议。
每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)。
TCP 提供可靠交付的服务。
TCP 提供全双工通信。
TCP是面向字节流。TCP 中的“流”(stream)指的是流入或流出进程的字节序列。“面向字节流”的含义是虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
(3)TCP面向流的概念
TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。
但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
TCP创建一个套接字,同时在内核创建一个接收缓冲区与发送缓冲区。由于缓冲区的存在,TCP的读写不需要一一匹配。如在写100个字节的数据时,可以一次性写100个字节,也可以每次写一个字节写100次,只要最终将数据写完就可以。
因为TCP面向字节流,读写数据较灵活,一次可读一个也可以读多个,有可能导致无法读取完整的应用成数据包,这种现象为粘包问题。
粘包问题的解决办法:明确边界(使用分隔符、指定数据包长度等)。
注意:TCP 连接是一条虚连接而不是一条真正的物理连接。
TCP 对应用进程一次把多长的报文发送到TCP 的缓存中是不关心的。
TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。
TCP 可把太长的数据块划分短一些再传送。
TCP 也可等待积累有足够多的字节后再构成报文段发送出去。
2.TCP的连接
(1) TCP的连接
TCP 把连接作为最基本的抽象。
每一条 TCP 连接有两个端点。
TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP 连接的端点叫做套接字 (socket) 或插口。
端口号拼接到 (contatenated with) IP 地址即构成了套接字。套接字 socket = (IP地址 : 端口号) 。 每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:TCP 连接 ::= {socket1, socket2} = {(IP1: port1),(IP2: port2)} 。
(2) TCP连接、IP地址、套接字
TCP 连接就是由协议软件所提供的一种抽象。
TCP 连接的端点是个很抽象的套接字,即(IP 地址:端口号)。
同一个 IP 地址可以有多个不同的 TCP 连接。
同一个端口号也可以出现在多个不同的 TCP 连接中。
四、可靠传输的工作原理
理想的传输条件有以下两个特点:(1) 传输信道不产生差错。(2) 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
在这样的理想传输条件下,不需要采取任何措施就能够实现可靠传输。
然而实际的网络都不具备以上两个理想条件。必须使用一些可靠传输协议,在不可靠的传输信道实现可靠传输。
1.停止等待协议
“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
全双工通信的双方既是发送方也是接收方。
为了讨论问题的方便,我们仅考虑 A 发送数据而 B 接收数据并发送确认。因此 A 叫做发送方,而 B 叫做接收方。
(1)无差错情况
A 发送分组 M1,发完就暂停发送,等待 B 的确认 (ACK)。B 收到了 M1 向 A 发送 ACK。A 在收到了对 M1 的确认后,就再发送下一个分组 M2。
(2)出现差错
在接收方 B 会出现两种情况:B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。
在这两种情况下,B 都不会发送任何信息。如何保证 B 正确收到了 M1 呢?
解决方法:超时重传A 为每一个已发送的分组都设置了一个超时计时器。A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 。若 A 在超时计时器规定时间内没有收到 B 的确认,就认为分组错误或丢失,就重发该分组。
(3)确认丢失
若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内不能收到确认,但 A 并无法知道:是自己发送的分组出错、丢失了,或者 是 B 发送的确认丢失了。因此 A 在超时计时器到期后就要重传 M1。
假定 B 又收到了重传的分组 M1。这时 B 应采取两个行动:第一,丢弃这个重复的分组 M1,不向上层交付。第二,向 A 发送确认。不能认为已经发送过确认就不再发送,因为 A 之所以重传 M1 就表示 A 没有收到对 M1 的确认。
(4)确认迟到
传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了, 因此 A 在超时计时器到期后重传 M1。
A 会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃。
B 仍然会收到重复的 M1,并且同样要丢弃重复的 M1,并重传确认分组。
注意:
在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发。
分组和确认分组都必须进行编号。
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
(5)信道利用率
停止等待协议的优点是简单,缺点是信道利用率太低。
(6)停止等待协议要点
停止等待。发送方每次只发送一个分组。在收到确认后再发送下一个分组。
暂存。在发送完一个分组后,发送方必须暂存已发送的分组的副本,以备重发。
编号。对发送的每个分组和确认都进行编号。
超时重传。发送方为发送的每个分组设置一个超时计时器。若超时计时器超时位收到确认,发送方会自动超时重传分组。
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些,防止不必要的重传。
简单,但信道利用率太低。
(7)流水线传输
为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。
流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送。
由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
2.连续ARQ协议
(1)连续ARQ协议
滑动窗口协议比较复杂,是 TCP 协议的精髓所在。
发送窗口滑动:连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
发送方维持的发送窗口,它的意义是:位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了。
累积确认:接收方对按序到达的最后一个分组发送确认,表示到这个分组为止的所有分组都已正确收到了。优点是容易实现,即使确认丢失也不必重传。缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息。
连续 ARQ 协议采用 Go-back-N(回退N)(即表示需要再退回来重传已发送过的 N 个分组)。
当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
传统的自动重传请求分为三种:停止-等待协议ARQ、后退N帧(Go-Back-N)ARQ 和选择性重传ARQ 。后两种协议是滑动窗口技术与请求重发技术的结合。由于窗口尺寸开到足够大时,帧再线路上可以连续的流动,因此又称为连续ARQ协议。
(2)工作原理
(3)练习题
采用后退N帧(GBN),发送方已经发送了编号为0-7的数据帧,计时器超时时,若发送方只收到0,2,3号帧的确认,则发送方需要重发的帧数是()
A. 2 B.3 C.4 D.5
答案:C
在连续ARQ协议中,接收方一般采用累计确认的方式,即接收方对按序到达的最后一个分组发送确认,因此本题中收到3的确认帧就表示编号为0,1,2,3的帧已接受,而此时发送方未收到1号帧的确认只能代表确认帧在返回的过程中丢失,而不代表1号帧未到达接收方,因此需要重传的帧的编号是4,5,6,7.
五、TCP 报文段的首部格式
TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。
一个 TCP 报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。
TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。因此 TCP 首部的最小长度是 20 字节。
源端口和目的端口:各占 2 字节。端口是运输层与应用层的服务接口。
运输层的复用和分用功能通过端口实现。
序号:占 4 字节。TCP 连接中传送的数据流中的每一个字节都有一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。 例如:现有 5000 个字节的数据。假设报文段的最大数据长度为 1000 个字节,初始序号为 1001。报文段 1 序号 = 1001 (数据字节序号:1001 ~ 2000),…,报文段 5 序号 = 5001 (数据字节序号:5001 ~ 6000)。
确认号:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 若确认号 = N,则表明:到序号 N – 1 为止的所有数据都已正确收到。
数据偏移(即首部长度):占 4 位,指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。单位是 32 位字(以 4 字节为计算单位)。
保留:占 6 位,保留为今后使用,但目前应置为 0。
紧急URG:控制位。当 URG = 1 时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送 (相当于高优先级的数据)。
确认ASK:控制位。只有当 ACK =1 时,确认号字段才有效。当 ACK =0 时,确认号无效。
推送PSH(PuSH):控制位。接收 TCP 收到 PSH = 1 的报文段后,就尽快(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满后再交付。
复位RST(ReSeT):控制位。当 RST=1 时,表明 TCP 连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
同步SYN(SYNchronization):控制位。同步 SYN = 1 表示这是一个连接请求或连接接受报文。 SYN = 1,ACK = 0 时,表明这是一个连接请求报文段。SYN = 1,ACK = 1 时,表明这是一个连接接受报文段。
终止FIN(FINish):控制位。用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
窗口:占 2 字节。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。
检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。计算检验和时,临时把 12 字节的“伪首部”和 TCP 报文段连接在一起。伪首部仅仅是为了计算检验和。
紧急指针:占 2 字节。在 URG = 1时,指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),指出了紧急数据的末尾在报文段中的位置。
选项:长度可变,最长可达 40 字节。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。” MSS (Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段。所以,MSS是“TCP 报文段长度减去 TCP 首部长度”。
填充:使整个 TCP 首部长度是 4 字节的整数倍。
六、TCP可靠传输的实现
将 TCP 的发送者(用户 S)比喻成一个进水的水龙头,将 TCP 的接收者(用户 R)比喻成一个出水的水龙头。在发送侧,TCP 有一个蓄水池(TCP 发送方缓存),同样在接收侧,TCP 也有一个蓄水池(TCP 接收方缓存)。连接两个蓄水池的网络,就相当于水管。
TCP 的控制,就是面向发送者(进水速度)、接收者(出水速度)、发送方缓存(发送侧蓄水池)、接收方缓存(接收侧蓄水池)、网络(带宽、QoS(时延、丢包、抖动))的一个控制协议,它既要保证传输的可靠,也要面对各方面的复杂情况。
- 固定窗口 [单个]
如果窗⼝过⼩,当传输⽐较⼤的数据的时候需要不停的对数据进⾏确认,这个时候就会造成很⼤的延迟。 - 滑动窗口 [批量]
滑动窗⼝通俗来讲就是⼀种流量控制技术。它本质上是描述接收⽅的TCP数据报缓冲区⼤⼩的数据,发送⽅根据这个数据来计算⾃⼰最多能发送多⻓的数据,如果发送⽅收到接收⽅的窗⼝⼤⼩为0的TCP数据报,那么发送⽅将停⽌发送数据,等到接收⽅发送窗⼝⼤⼩不为0的数据报的到来。
1.以字节为单位的滑动窗口
(1)以字节为单位滑动窗口
TCP 使用流水线传输和滑动窗口协议实现高效、可靠的传输。TCP 的滑动窗口是以字节为单位的。
发送方 A 和接收方 B 分别维持一个发送窗口和一个接收窗口。
发送窗口:在没有收到确认的情况下,发送方可以连续把窗口内的数据全部发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。
接收窗口:只允许接收落入窗口内的数据。
(2)发送窗口
(3)接收窗口
(4)窗口的滑动
(4)发送缓存与发送窗口
(5)接收缓存
(6)强调
第一,发送窗口是根据接收窗口设置的,但在同一时刻,发送窗口并不总是和接收窗口一样大(因为有一定的时间滞后)。
第二,TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
第三,TCP 要求接收方必须有累积确认的功能,以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。但接收方不应过分推迟发送确认,否则会导致发送方不必要的重传,捎带确认实际上并不经常发生。
2.超时重传时间的选择
TCP 发送方在规定的时间内没有收到确认就要重传已发送的报文段。
但重传时间的选择是 TCP 最复杂的问题之一。
互联网环境复杂,IP 数据报所选择的路由变化很大,导致运输层的往返时间 (RTT) 的变化也很大。
(1)TCP 超时重传时间设置
不能太短,否则会引起很多报文段的不必要的重传,使网络负荷增大。
不能过长,会使网络的空闲时间增大,降低了传输效率。
TCP 采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间。
这两个时间之差就是报文段的往返时间 RTT。
(2)加权平均往返时间 RTTS
加权平均往返时间 RTTS 又称为平滑的往返时间。
(3)超时重传时间 RTO
RTO (Retransmission Time-Out) 应略大于加权平均往返时间 RTTS 。
(4)往返时间RTT测量与Karn算法
超时重传报文段后,如何判定此确认报文段是对原来的报文段的确认,还是对重传报文段的确认?
在计算平均往返时间 RTT 时,只要报文段重传了,就不采用其往返时间样本。
新问题:当报文段的时延突然增大很多时,在原来得出的重传时间内,不会收到确认报文段,于是就重传报文段。但根据 Karn 算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新,造成很多不必要的重传。
3.选择确认SACK
问题:若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据?
解决:选择确认 SACK (Selective ACK)
七、TCP的流量控制
1.利用滑动窗口实现流量控制
(1)可变窗口进行流量控制
一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
流量控制 (flow control) 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。
利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。
(2)可能发生死锁
B 向 A 发送了零窗口的报文段后不久,B 的接收缓存又有了一些存储空间。于是 B 向 A 发送了 rwnd = 400 的报文段。
但这个报文段在传送过程中丢失了。A 一直等待收到 B 发送的非零窗口的通知,而 B 也一直等待 A 发送的数据。
如果没有其他措施,这种互相等待的死锁局面将一直延续下去。
为了解决这个问题,TCP 为每一个连接设有一个持续计时器 (persistence timer)。
(3)持续计时器
TCP 为每一个连接设有一个持续计时器 (persistence timer) 。
只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。
若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。
若窗口不是零,则死锁的僵局就可以打破了。
八、TCP的拥塞控制
1.为何要进行拥塞控制?
为了方便,我们假设主机A给主机B传输数据。
两台主机在传输数据包的时候,如果发送方迟迟没有收到接收方反馈的ACK,那么发送方就会认为它发送的数据包丢失了,进而会重新传输这个丢失的数据包。
然而实际情况有可能此时有太多主机正在使用信道资源,导致网络拥塞了,而A发送的数据包被堵在了半路,迟迟没有到达B。这个时候A误认为是发生了丢包情况,会重新传输这个数据包。
结果就是不仅浪费了信道资源,还会使网络更加拥塞。因此,我们需要进行拥塞控制。
所谓的拥塞控制,是指防止过多的数据注入网络,以使网络中的路由器或链路不至于过载。出现拥塞时,端点并不了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。当然,拥塞控制和流量控制也有相似的地方,即他们都通过控制发动方发送数据的速率来达到控制效果。
2.拥塞控制的一般原理
(1)原理
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)。
若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。
出现拥塞的原因:∑对资源需求 > 可用资源。由许多因素引起。例如:节点缓存容量太小;链路容量不足;处理机处理速率太慢;拥塞本身会进一步加剧拥塞。
实践证明,拥塞控制是很难设计的,因为它是一个动态的(而不是静态的)问题。
当前网络正朝着高速化的方向发展,这很容易出现缓存不够大而造成分组的丢失。但分组的丢失是网络发生拥塞的征兆而不是原因。
在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化甚至发生死锁的原因。这点应特别引起重视。
(2)增加资源能解决拥塞吗?
不能。这是因为网络拥塞是一个非常复杂的问题。简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏。
网络拥塞往往是由许多因素引起的。例如:
增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,解决不了网络拥塞;
提高处理机处理的速率会会将瓶颈转移到其他地方;
拥塞引起的重传并不会缓解网络的拥塞,反而会加剧网络的拥塞。
(3) 拥塞控制与流量控制的区别
拥塞控制和流量控制虽然采取的动作很相似,但拥塞控制与网络的拥堵情况相关联,而流量控制与接收方的缓存状态相关联。拥塞控制与流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、路由器,以及与降低网络性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它要做的是抑制发送端的发送速率,以便使接收端来得及接受。
拥塞控制:防止过多的数据注入到网络中,避免网络中的路由器或链路过载。
是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。
流量控制:抑制发送端发送数据的速率,以使接收端来得及接收。
点对点通信量的控制,是个端到端的问题。
(4)拥塞控制所起的作用
(5)开环控制和闭环控制
- 开环控制
开环控制:在设计网络时,事先考虑周全,力求工作时不发生拥塞。思路——力争避免发生拥塞。
但一旦整个系统运行起来,就不再中途进行改正了。 - 闭环控制
闭环控制:基于反馈环路的概念。根据网络当前运行状态采取相应控制措施。思路——在发生拥塞后,采取措施进行控制,消除拥塞。
闭环控制措施:
-监测:监测网络系统,检测拥塞在何时、何处发生。主要指标有由于缺少缓存空间而被丢弃的分组的百分数;平均队列长度;超时重传的分组数;平均分组时延;分组时延的标准差,等等。这些指标的上升都标志着拥塞的增长。
-传送:将拥塞发生的信息传送到可采取行动的地方。将拥塞发生的信息传送到产生分组的源站。在路由器转发的分组中保留一个比特或字段,用该比特或字段的值表示网络没有拥塞或产生了拥塞。周期性地发出探测分组等。
-调整:调整网络系统的运行以解决出现的问题。过于频繁,会使系统产生不稳定的振荡。过于迟缓,不具有任何实用价值。选择正确的时间常数是相当困难的。
2.TCP的拥塞控制方法
(1)方法
如何知道网络的拥塞情况?A与B建立连接之后,就可以向B发送数据了,然而这个时候A并不知道此时的网络拥塞情况如何,也就是说,A不知道一次性连续发送多少个数据包好,我们也把A一次性连续发送多少个数据包称之为拥塞窗口,用N代表此时拥塞窗口的大小吧。
发送方在确定发送报文段的速率时,既要根据接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此,TCP协议要求发送方维护以下两个窗口:
1)接收窗口:接收方根据目前接收缓存的大小所许诺的最新窗口值,反映接收方的容量。由接收方根据其放在TCP报文的首部的窗口字段通知发送方。
2)拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络的当前容量。只要网络未出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络的分组数。
TCP 采用基于滑动窗口的方法进行拥塞控制。该方法属于闭环控制方法。
TCP发送方维持一个拥塞窗口 CWND (Congestion Window)
拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
所以,发送窗口大小不仅取决于接收方公告的接收窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:真正的发送窗口值 = Min(公告窗口值,拥塞窗口值)。
(2)原则
只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。
(3)发送方判断拥塞的方法:隐式反馈
重传定时器超时:现在通信线路的传输质量一般都很好,因传输出差错而丢弃分组的概率是很小的(远小于 1 %)。只要出现了超时,就可以猜想网络可能出现了拥塞。
收到三个相同(重复)的 ACK:个别报文段会在网络中丢失,预示可能会出现拥塞(实际未发生拥塞),因此可以尽快采取控制措施,避免拥塞。
3.TCP拥塞控制算法
四种( RFC 5681) :
慢开始 (slow-start)
拥塞避免 (congestion avoidance)
快重传 (fast retransmit)
快恢复 (fast recovery)
4.流量控制和拥塞控制区别
流量控制是在一条 TCP 连接中的接收端才用的措施,用来限制对方(发送端)发送报文的速率,以免在接收端来不及接收。流量控制只控制一个发送端。
拥塞控制是用来控制 TCP 连接中发送端发送报文段的速率,以免使互联网中的某处产生过载。拥塞控制可能会同时控制许多个发送端,限制它们的发送速率。不过每一个发送端只知道自己应当怎样调整发送速率,而不知道在互联网中还有哪些主机被限制了发送速率。
发送窗口的上限值是 Min [rwnd, cwnd],即发送窗口的数值不能超过接收窗口和拥塞窗口中较小的一个。接收窗口的大小体现了接收端对发送端施加的流量控制,而拥塞窗口的大小则是整个互联网的负载情况对发送端施加的拥塞控制。因此,当接收窗口小于拥塞窗口时,发送窗口的大小取决于流量控制,即取决于接收端的接收能力。但当拥塞窗口小于接收窗口时,则发送窗口的大小取决于拥塞控制,即取决于整个网络的拥塞状况。
4.习题
主机甲和乙之间建立一个TCP链接,最大段长为1000B,若主机甲的当前拥塞窗口为4000B,再主机甲向主机乙连续发送两个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的接收窗口大小为2000B,则此时主机甲还可以向主机乙发送的最大字节数为( )
A.1000 B.2000 C.3000 D.4000
答案:A
发送方的发送窗口的上限值取接收窗口和拥塞窗口这两个值中的较小的一个,于是此时发送方的发送窗口为min{4000,2000}=2000B,由于发送方还未收到第二个最大段的确认,所以此时主机甲还可以向主机乙发送的最大字节数为?
答案:2000-1000=1000B
主机甲和主机乙新建一个TCP连接,甲的拥塞控制初始阈值为32KB,甲向乙始终以MSS=1KB大小的段发送数据,并一直有数据发送。乙为该链接分配16KB接收缓存,并对每个数据段进行确认,忽略段传输延迟。若乙收到的数据全部存入缓存,不被取走,则甲从连接建立成功时刻起,未出现发送超时的情况下,经过4个RTT后,甲的发送窗口是( )。
A. 1KB B.8KB C.16KB D.32KB
答案:A
发送窗口的上限值=min{接收窗口,拥塞窗口}。4个RTT后,乙收到的数据全部存入缓存,不被取走,接收窗口只剩下?
答案:1KB。(16-1-2-4-8=1)缓存,使得甲的发送窗口为1KB。
九、TCP运输连接管理
TCP 是面向连接的协议。运输连接有三个阶段:连接建立、数据传送、连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。
在连接建立过程中(采用Client/Server方式工作)要解决三个问题:要使每一方能够确知对方的存在。要允许双方协商一些参数,如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等。能对运输实体的资源进行分配,如缓存大小、连接表中的项目等。
TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户(client),被动等待连接建立的应用进程叫做服务器(server)。
1.TCP连接建立
(1)三报文握手过程
TCP 建立连接的过程叫做握手。
握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手。
采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。
客户机的TCP首先向服务器的TCP发送一个链接请求报文段,这个特殊的报文段不含应用层数据,其首部的SYN标志位被置为1。另外,客户机会随机选择一个起始序号,确认号是0:
服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1:
客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。
注意 :因为一个SYN将占用一个序号,所以要加1。
你很漂亮,做我女朋友吧;
我也很欣赏你,好呀;
太棒了,咱俩吃个烛光晚餐去吧
之后开始亲密交往(数据传输)
初始序列号(ISN)随时间而变化的,而且不同的操作系统也会有不同的实现方式,所以每个连接的初始序列号是不同的。TCP连接两端会在建立连接时,交互一些信息,如窗口大小、MSS等,以便为接着的数据传输做准备。 RFC793指出ISN可以看作是一个32bit的计数器,每4ms加1,这样选择序号的目的在于防止在网络中被延迟的分组在以后被重复传输,而导致某个连接的一端对它作错误的判断。
(2)为什么不采用两次握手
主要是为了防止两次握手情况下已失效的连接请求报文段突然又传送到服务端而产生错误。考虑下面这种情况。
客户A向服务器B发出TCP连接请求,第一个连接请求报文在网络的某个节点长时间滞留,A超时后认为报文丢失,于是再重传一次连接请求,B收到后建立连接。数据传输完毕后双方断开连接。而此时,前一个滞留在网络中的连接请求到达B,而B认为A又发来连接请求,此时若使用三次握手,则B向A返回确认报文段,由于是一个失效的请求,因此A不予理睬,建立连接失败。若采用的是“两次握手”,则这种情况下B认为传输连接已经建立,并一直等待A传输数据,而A此时并无连接请求,因此不予理睬,这样就造成了B的资源白白浪费。
2.TCP连接释放
(1)四报文握手过程
TCP 连接释放过程比较复杂。数据传输结束后,通信的双方都可释放连接。TCP 连接释放过程是四报文握手。
你太懒了,每天就知道化妆买衣服,我要和你分手;
好的,你这个钢铁直男,等我把我的东西收拾完;
直男,我的东西收拾完了,咱们分手吧;
好的,拜拜
(2)必须等待2MSL时间
第一,保证发送的最后一个 ACK 报文段能够到达 B。
第二,防止“已失效的连接请求报文段”出现在本连接中。
(3)保活计时器
用来防止在 TCP 连接出现长时期空闲。
通常设置为 2 小时 。
若服务器过了 2 小时还没有收到客户的信息,它就发送探测报文段。
若发送了 10 个探测报文段(每一个相隔 75 秒)还没有响应,就假定客户出了故障,因而就终止该连接。
3.TCP的三次握手和四次挥手
1)连接建立
SYN=1,seq=x;
SYN=1,ACK=1,seq=y,ack=x+1;
ACK=1,seq= x+1,ack=y+1.
2)释放连接:
FIN=1,seq=u;
ACK=1,seq=v,ack=u+1;
FIN=1,ACK=1,seq=w,ack=u+1;
ACK=1,seq=u+1,ack=w+1.
4.习题
A和B之间建立了TCP连接,A向B发送了一个报文段,其中序号字段seq=200,确认号字段ack=201,数据部分有2个字节,那么在B对该报文的确认报文段中()
A.seq=202,ack=200 B.seq=201,ack=201
C.seq=201,ack=202 D.seq=202,ack=201
答案:C