运输层
运输层协议概述
进程之间的通信
概念
运输层属于面向通信部分的最高层,也是用户功能中的最底层
网络层提供了主机间的逻辑通信,运输层为应用进程间提供了逻辑通信(端到端)

作用
基于端口的复用和分用
- 复用 :发送方的不同应用进程使用同一个运输层协议
- 分用 :接收方的运输层把数据正确交付给目的进程


根据应用程序的不同需求,运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP
可靠信道的含义:无差错、按序(接收和发送的顺序)、无丢失、无重复
不可靠的含义:不保证交付。接收时不按序、可能出现丢失和重复
运输层的两个主要协议
- 用户数据报协议 UDP (User Datagram Protocol)
- 传输控制协议 TCP (Transmission Control Protocol)

运输层的端口
为了使不同操作系统的进程能够相互通信,必须用统一的方法对应用进程进行标志
端口就是运输层服务访问点 TSAP,运输层的复用和分用功能依赖端口来完成。
端口号(Protocol port number):16 位二进制数,只具有本地意义
如何找进程?IP 地址 + 端口号
服务器端使用的端口号
-
熟知端口:0-1023,所有用户进程都知道
-
登记端口号:1024-49151,需要在 IANA 登记,以防重复
客户端使用的端口号
- 短暂端口号:49152-65535,,留给客户进程选择暂时使用
常用的熟知端口

用户数据报协议 UDP
概述
定义
UDP 只在 IP 的数据报服务之上增加了很少一点的功能
- 复用和分用的功能
- 差错检测的功能
主要特点
- 无连接,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。
- 尽最大努力交付, 即不保证可靠交付, 因此主机不需要维持复杂的连接状态表。
- 面向报文。 UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
- 没有拥塞控制, 因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用 IP 电话、视频会议是很重要的。
- 支持一对一、一对多、多对一和多对多的交互通信。
- 首部开销小, 只有 8 个字节,比 TCP 的 20 个字节的首部要短
首部格式
UDP 有两个字段 :数据字段和首部字段。首部字段很简单,只有 8 个字节
首部字段 4 个字段组成,每个字段都是 2 个字节:源端口、目的端口、长度、校验和
在计算检验和时,临时把 “伪首部” 和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。

校验和
IP 的校验和只校验了 IP 数据报的首部;
UDP 的校验和,检查了:
- UDP 数据报的源端口、目的端口;
- UDP 数据报的数据部分;
- IP 数据报的源地址和目的地址。
校验方法:与伪首部、数据一起计算二进制反码校验和,循环进位,最后取反。(不要求)
队列工作原理


传输控制协议 TCP
最主要的特点
- 面向连接
- 每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)。
- 提供可靠交付的服务。数据无差错、不丢失、不重复,并且按序到达。
- 全双工通信
- 面向字节流
- TCP 中的 “流 ”(stream)指的是流入或流出进程的字节序列。
- “面向字节流” 的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流
- TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系 。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
首部格式
见 5.5
连接
TCP 把连接作为最基本的抽象。每一条 TCP 连接有两个 点。
TCP 连接的端点不是主机,不是主机的 IP 地址,不是应用进程,也不是运输层的协议端口。
TCP 连接的端点叫做套接字 (socket) 或插口
端口号拼接到 (contatenated with) IP 地址即构成了套接字。
套接字
TCP 连接就是由协议软件所提供的一种抽象。
TCP 连接的端点是个很抽象的套接字,即( IP 地址:端口号)
同一个 IP 地址可以有多个不同的 TCP 连接
同一个端口号也可以出现在多个不同的 TCP 连接中

可靠传输的工作原理
停止等待协议
发送完一个分组就停止发送等待确认,一旦出现传输差错(检测差错被丢弃或丢失),则超时重传
出现差错的情况


确认丢失、确认迟到
确认丢失:B 向 A 发送的确认丢失了
A (在超时计时器到期后)重传,B 丢弃这个重传的分组,并向 A 再次发送确认
确认迟到:B 向 A 发送的确认迟到了
A (在超时计时器到期后)重传后收到迟到的确认,将其丢弃,B 丢弃这个重传的分组,并再次确认

注意
在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发。
分组和确认分组都必须进行编号。
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
自动重传请求 ARQ
(Automatic Repeat reQuest)
重传的 请求是自动进行的,接收方不需要请求发送方重传某个出错的分组
使用这样的确认和重传机制,就可以在不可靠的传输网络上实现可靠通信
信道利用率

信道利用率
流水线运输
发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送
由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。

连续 ARQ 协议
发送方维持一个发送窗口
- 位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了 。
- 连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置



上图没有用到累计确认
累计确认
接收方一般采用累计确认的方式,即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,表示这个分组之前的所有分组都已正确收到了
- 优点:容易实现,即使确认丢失也不必重传(因为后续确认已经发送)
- 缺点:不能向发送方反映所有正确收到的分组(回退),序号位数多,重传代价高
Go back N (回退 N)
如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。
这就是回退 N,表示需要再退回来重传已发送过的 N 个分组
可见当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
不缓存失序的分组
步骤
发送端:
- 在发送完一个分组后,不是停下来等待确认分组,而是可以连续再发送若干个分组。
- 如果这时收到了接收端发来的确认,那么还可以接着发送分组。
- 如果在超时时间到时,仍然没有收到相应分组的确认,则重新从这个分组开始传起 (Go back N) 。
接收端:只按序接收分组
- 当接收到一个有差错的分组时,丢弃该分组和它以后的所有分组,让它们在发送端超时,然后重复发送已发送过的最后一个确认分组。
发送窗口的最大值
当用 n 比特进行分组的编号时,接收窗口 WR = 1;只有在发送窗口 时,连续 ARQ 协议才能正确运行
例:当 n = 3 时,发送窗口的最大值是 7 而不是 8
用反例证明:
若发送窗口大小为 8 ,则分组编号为 0 - 7
- 状态 1: 所有确认分组都到达了发送端,此时发送端又发送 8 个新分组,编号为 0~7 ,接收端认为是新分组
- 状态 2: 所有确认分组丢失,发送端超时后重发 0~7 号分组,接收端同样将其当作新分组接收(实际是重传的旧分组)。
小窗口 ARQ 信道利用率 ,大窗口信道利用率为 1
通常连续 ARQ 的接收窗口大小 Wr 为 1
选择重传 ARQ 协议
连续 ARQ 协议的问题 :当线路的出错率高时,将出错帧之后的所有帧都丢弃掉,重传这些帧会带来效率上的大幅度降低。
加大接收窗口 ,使得 WR > 1 。先收下发送序号不连续但仍处在接收窗口中的那些数据帧。等到所缺序号的数据帧收到后再一并送交主机。这就是选择重传 ARQ 协议 。
接收窗口的尺寸不能超过 2^n-1^ (即序号范围的 1/2 ),否则可能造成帧的重叠。发送窗口的尺寸一般和接收窗口的尺寸相同。
优点 :避免重复传送那些本来已经正确到达接收端的数据帧。
TCP 报文段的首部格式
前 20 位固定字节 + 4n 字节可选项
- 源端口和目的端口字段
- 各占 2 字节。
- 端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
- 序号字段 seq
- 占 4 字节。
- TCP 连接中传送的数据流中的每一个字节都编上一个序号。
- 序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
- 确认号字段 ack
- 占 4 字节
- 是期望收到对方的下一个报文段的数据的第一个字节的序号。
- 若确认号 = N,表明:到序号 N - 1 为止的所有数据都已正确收到
-
以下字段了解即可
- 数据偏移(即首部长度)
- 占 4 位
- 它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。
- “数据偏移”的单位是 32 位字(以 4 字节为计算单位)
- 保留字段
- 占 6 位,保留为今后使用,但目前应置为 0
- 紧急 URG
- 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据, 应尽快传送 相当于高优先级的数据
- 确认 ACK
- 只有当 ACK = 1 时确认号字段才有效。
- 当 ACK = 0 时,确认号无效。
- 推送 PSH (PuSH)
- 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
- 复位 RST ( ReSeT )
- 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
- 同步 SYN
- 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
- 终止 FIN ( FINish )
- 用来释放一个连接。 FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
- 窗口字段
- 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。
- 检验和
- 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
- 紧急指针字段
- 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
- 选项字段
- 长度可变。 TCP 最初只规定了一种选项,即 最大报文段长度 MSS 。 MSS 告诉对方 TCP :“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
- 填充字段
- 这是为了使整个首部长度是 4 字节的整数倍。