【计算机网络】传输层 : 总结 ( TCP / UDP 协议 | 寻址与端口 | UDP 协议 | TCP 协议特点 | TCP 连接释放 | TCP 流量控制 | TCP 拥塞控制 ) ★★★
文章目录
一、传输层 TCP / UDP 协议 ★
传输层 协议 :
① UDP 协议 : 无连接 用户数据报协议 ;
- 无连接 无确认 : 数据传输前 , 不建立连接 , 接收端收到 UDP 报文后 , 不需要给出确认 ;
- 特点 : 不可靠 , 无连接 , 延迟小 , 适用于少量数据传输 ;
② TCP 协议 : 面向连接 传输控制协议 ;
- 面向连接 : 传输数据前 , 建立连接 , 数据传输后 , 释放连接 ;
- 无多播 : 不提供 广播 多播 服务 ;
- 额外开销 : TCP 提供可靠的 , 面向连接的 传输服务 , 需要额外开销 , 如 : 收据接收确认 , 流量控制 , 计时器 , 连接管理 ;
- 协议特点 : 可靠 , 面向连接 , 时延大 , 适用于大数据量传输 ;
复用与分用 :
① 复用 : 应用层 多个 应用进程 通过传输层 传输到 网络层 中 ;
② 分用 : 传输层 从 网络层 接收数据 , 分发给不同的 应用进程 ;
参考 : 【计算机网络】传输层 : 传输层概述 ( 设备层级 | 传输层功能 | TCP 协议 | UDP 协议 | 复用与分用 | 端口号 | 套接字 )
二、寻址端口号 ★
端口号 : 软件端口 , 逻辑端口 , 用于标识 主机中的 应用程序 ;
① 端口号 只在主机 本地有实际意义 ;
② 取值范围 : 端口号长度 16 16 16 位 , 取值范围 0 0 0 ~ 65535 65535 65535 ;
端口号分类 :
① 服务端使用的端口号 :
- 熟知端口号 : 0 0 0 ~ 1023 1023 1023 , 给 TCP/IP 的重要程序使用 ;
- 登记端口号 : 1024 1024 1024 ~ 49151 49151 49151 , 给普通应用程序使用 ;
② 客户端使用的端口号 : 49152 49152 49152 ~ 65535 65535 65535 , 客户端程序动态分配 ;
应用程序的 熟知端口号 对应 :
- FTP : 21 21 21
- TELNET : 23 23 23
- SMTP : 25 25 25
- DNS : 53 53 53
- TFTP : 69 69 69
- HTTP : 80 80 80
- SNMP : 161 161 161
参考 : 【计算机网络】传输层 : 传输层概述 ( 设备层级 | 传输层功能 | TCP 协议 | UDP 协议 | 复用与分用 | 端口号 | 套接字 )
三、UDP 协议特点
四、UDP 协议首部格式
五、UDP 校验
六、TCP 协议 特点 ★
TCP 协议 特点 :
① 面向连接 : TCP 协议的连接是 “虚连接” ;
② 点对点 : TCP 协议 是 点对点 的 , 是两个端点之间的连接 ;
③ 可靠传输 : TCP 协议提供 可靠服务 , 按序到达 , 没有丢失 , 没有重复 ;
④ 全双工 : TCP 协议通信是全双工通信 ;
- 发送缓存 : 存储 准备发送的数据 , 已经发送尚未确认送达的数据 ;
- 接收缓存 : 存储 按序到达尚未被读取的数据 , 不按序到达的数据 ;
⑤ 面向字节流 : TCP 协议将 数据 看做 无结构的字节流 ;
七、TCP 报文段首部格式
TCP 报文段首部格式 :
① TCP 报文段组成 : 由 TCP 首部 和 TCP 数据部分 组成 ;
② TCP 首部格式 : 由 20 20 20 字节固定首部 + 可变的选项 + 填充部分 组成 ; 其中 可变选项 + 填充部分 是 4 4 4 字节整数倍 , 填充部分的意义就是为了让整个 TCP 首部大小是 4 4 4 字节整数倍 ;
③ 源端口 / 目的端口 : 进程端口号 , 每个 2 2 2 字节 , 取值范围 0 0 0 ~ 65535 65535 65535 ;
④ 序号 : TCP 连接中 , 字节流中的 字节按照顺序编号 , 每个字节都有一个序号 , 本首部中的序号是本 TCP 报文 数据部分第一个字节的序号 ;
⑤ 确认号 : 期望收到 对方 下一个报文段 第一个数据字节的序号 ; 序号为 100 100 100 , 说明 99 99 99 及之前的数据都已经收到 ;
⑥ 数据偏移 : TCP 报文段 数据部分起始位置 , 距离 TCP 报文段的起始位置 , 有多远 , 单位 4 4 4 字节 ; 即 整个 TCP 报文段 中 TCP 首部的长度 ;
⑦ 窗口 : 发送本报文段一方的 接收窗口 ( 发送方 ) , 即允许对方发送的数据量 ( 接收方 ) ;
⑧ 检验和 : 检验首部 + 数据 ; 检验时 加上 12 12 12 字节伪首部 , 第 4 4 4 字段都是 6 6 6 ;
⑨ 紧急指针 : 当 URG 紧急标志位 为 1 1 1 时 有效 , 表明本报文段的紧急数据字节数 ; 如 : 紧急指针值为 88 88 88 , 说明 报文段的 数据部分 前 88 字节时 紧急数据 ;
⑩ 选项 : 最大报文段长度 MSS , 窗口扩大字段 , 时间戳 , 选择确认信息 等 ; 如果选项 不足 4 4 4 字节整数倍 , 使用填充 0 0 0 使 TCP 首部是 4 4 4 字节整数倍 ;
八、TCP 报文段首部 6 6 6 控制位
TCP 报文段首部 6 6 6 控制位 :
① URG ( 紧急位 ) : URG = 1 = 1 =1 时 , 表明 该报文段中有紧急数据 , 优先级很高 , 尽快传送 , 不在缓存中排队 , 结合紧急指针字段使用 ;
② ACK ( 确认位 ) : ACK = 1 = 1 =1 时 , 确认号有效 , 连接建立后 , 所有的报文段的 ACK 都必须设置为 1 1 1 ;
③ PSH ( 推送位 ) : PSH = 1 =1 =1 时 , 接收方 要 尽快交付接收应用进程 , 不用等到接收缓存满后再交付 ;
④ RST ( 复位 ) : RST = 1 =1 =1 时 , TCP 连接中出现错误 , 必须释放当前连接 , 重新建立连接 ;
⑤ SYN ( 同步位 ) : SYN = 1 =1 =1 时 , 表明该报文是一个 连接请求 / 连接接收 报文 ;
⑥ FIN ( 终止位 ) : FIN = 1 =1 =1 时 , 表明该报文发送完毕 , 释放连接 ;
九、TCP 连接建立 ★★
TCP 连接建立过程 : 客户端 与 服务器 的 TCP 连接建立过程 ;
① 客户端 发送 连接请求报文段 , 该报文段 没有应用层数据 ;
- SYN = 1 , 同步位 , 如果为 1 1 1 , 说明该位是连接请求 / 连接接收 报文 ; 本次的情况是 连接请求 ;
- seq = x ( 随机 ) , 序号位 , 随机产生一个字节 , 确认号此时是无效的 , 客户端没有收到服务器发送的报文段 , 不知道期待获取什么序号的数据 ;
- ACK = 0 , 确认位 , 连接还没有建立成功 , 此时是 0 0 0 , 之后连接建立成功后置位 1 1 1 ;
② 服务器端 收到 连接请求报文段 , 为 TCP 连接 分配 缓存和变量 , 向客户端返回 确认报文段 , 允许客户端连接 , 此时该报文段 也没有应用层数据 ;
- SYN = 1 , 同步位 , 如果为 1 1 1 , 说明该位是连接请求 / 连接接收 报文 ; 本次的情况是 连接接收 ;
- seq = y ( 随机 ) , 序号位 , 随机产生一个字节 , 确认号此时是无效的 , 客户端没有收到服务器发送的报文段 , 不知道期待获取什么序号的数据 ;
- ACK = 1 , 确认位 , 连接建立成功后置位 1 1 1 ;
- ack = x + 1 , 确认号 , 该 ack 与上面的 ACK 是配套使用的 ; 只有 ACK = 1 确认位为 1 时 , 确认号 ack 才生效 ;
③ 客户端 收到 服务器端 返回的 确认报文段 , 客户端为 TCP 连接分配缓存和变量 , 同时向 服务器端 返回 确认报文段 的 确认 , 并可以 携带实际传输的数据 ;
- SYN = 0 , 同步位 , 说明该位 不是 连接请求 / 连接接收 报文 ;
- seq =x+1 , 序号位 , 表明本次发送的数据的第一个字节的序号 ;
- ACK = 1 , 确认位 , 连接建立成功后置位 1 1 1 ;
- ack = y + 1 , 确认号 , 期望收到 服务器端 下一次 发送的序号 ; 该 ack 与上面的 ACK 是配套使用的 ; 只有 ACK = 1 确认位为 1 时 , 确认号 ack 才生效 ;
总结 :
- SYN : 在开始的两个报文段为 1 1 1 , 这是建立连接的前两次握手 ; 等到真实传输数据时 , 该位 为 0 0 0 ;
- ACK : 只在第一次握手时 为 0 0 0 , 此时还没有建立连接 , 之后服务器端接收后 , 知道连接建立成功了 , ACK 设置为 1 1 1 ;
- 序号位 : 随机值 , 客户端生成 发送的 随机序号位 x , 服务器端生成 发送的 随机序号位 y ;
- 确认号 : 对应上述 序号位 的是 确认号 , 客户端 生成的随机序号 x 是 服务器端 期待的接收的序号 确认号 , 服务器端 生成的 随机序号 y 是 客户端 期待接收的 序号 确认号 ;
十、TCP 连接建立 相关报文段 字段
上述涉及到的 TCP 报文的 四个字段 :
- 序号 seq : TCP 连接中 , 字节流中的 字节按照顺序编号 , 每个字节都有一个序号 , 本首部中的序号是本 TCP 报文 数据部分第一个字节的序号 ;
- 确认号 ack : 期望收到 对方 下一个报文段 第一个数据字节的序号 ; 序号为 100 100 100 , 说明 99 99 99 及之前的数据都已经收到 ;
- 同步位 SYN : SYN = 1 =1 =1 时 , 表明该报文是一个 连接请求 / 连接接收 报文 ;
-
确认位 ACK : ACK
=
1
= 1
=1 时 , 确认号有效 , 连接建立后 , 所有的报文段的 ACK 都必须设置为
1
1
1 ;
上述 涉及到 TCP 报文内容 , 参考博客 【计算机网络】传输层 : TCP 协议 ( TCP 协议特点 | TCP 报文段首部格式 | TCP 报文段控制位 )
十一、TCP 连接释放 ★★
TCP 连接释放 : 四次挥手 ;
① 客户端 : 客户端 发送 连 接释放报文段 , 停止发送数据 , 发起 TCP 连接关闭流程 ; 连接释放报文段 关键字段如下 :
- FIN = 1 : 表明该报文发送完毕 , 释放连接 ;
- seq = u : 序号位设置成 u
② 服务器端 : 返回 确认报文段 , 客户端收到该报文段后 ; 确认报文段 关键字段 如下 :
- ACK = 1
- seq = v : 服务器端生成的发送序号 ;
- ack = u + 1 : 期待收到 客户端 发送的 u 之后的报文段 u + 1 ;
③ 服务器端 : 发送完毕 上面的 确认报文段后 , 发送 连接释放报文段 , 关闭 TCP 连接 ( 该链接时 客户端 -> 服务器端 方向的连接 ) ; 连接释放报文段 关键字段如下 :
- FIN = 1
- ACK = 1
- seq = w : 服务器端 生成的序号 ;
- ack = u + 1 : 该步骤 与 步骤 ② 中 , 没有收到客户端的报文 , 因此 ack 仍然保持 u + 1 不变 ;
④ 客户端 : 收到 服务器端 连接释放报文段 , 回复 确认报文段 , 等待 2MSL ( 最长报文寿命 ) 后 , 关闭 TCP 连接 ( 服务器 -> 客户端 方向连接 ) ; 确认报文段 格式 :
- ACK = 1
- seq = u + 1 : 第一次回收时是 u , 第四次挥手 时 , 是 u + 1 ;
- ack = w + 1 : 服务器端发送的数据序号是 w , 本次期待收到下一次 w + 1
十二、TCP 可靠传输机制 ★★
TCP 实现可靠传输机制 :
① 校验 : 使用 伪首部 进行校验 ;
② 序号 : 每个字节编一个序号 ; 序号 字段 的值是 报文段 第一个字节的序号 ;
③ 确认 : 累计确认 ;
④ 重传 : 重传 与 确认机制 结合使用 , 发送方 如果 在 规定时间内 , 没有收到 接收端的确认 , 就要重发报文段 ;
- 重传时间 : TCP 使用 自适应 算法 , 动态改变重传时间 RTTs , 该时间成为 加权平均往返时间 ;
十三、TCP 快速重传 机制
TCP 快速重传 机制 : 使用 冗余确认 机制 , 实现快速重传 ;
① 冗余 ACK 确认信息 : 接收方 接收到 接收到 比 期望序号大的 失序报文段 , 就向 发送方 发送 冗余 ACK , 表明下一个期待的序号 ;
② 快速重传示例 :
- 发送方 发送 1 , 2 , 3 , 4 , 5 报文段 ;
- 接收方 收到 1 号报文 , 向 发送方 返回 1 号 确认 ACK ;
- 2 号报文 丢失 ;
- 接收方 收到 3 号报文 , 向 发送方 返回 1 号 确认 ACK ;
- 接收方 收到 4 号报文 , 向 发送方 返回 1 号 确认 ACK ;
- 接收方 收到 5 号报文 , 向 发送方 返回 1 号 确认 ACK ;
- 如果 发送方 连续收到 3 个相同 确认号 的 冗余 ACK , 此时认为该确认号 报文丢失 , 重传该报文<> ; 如 本次的 2 2 2 号报文丢失 , 一直发 1 号确认信息 ;
十四、TCP 流量控制 ★★
参考 : 【计算机网络】传输层 : TCP 流量控制 ( 流量控制过程 | 持续计时器机制 )
TCP 流量控制 :
① 流量控制 : 控制 发送方 降低发送速率 , 避免 接收方 来不及接收 , 丢弃数据 , 导致重传 ;
② 滑动窗口机制 : TCP 通过 该 滑动窗口机制 实现 流量控制 ;
③ 滑动窗口 调整 : 接收方 根据 接收缓存大小 , 动态调整 发送方 发送窗口 大小 ;
④ 接收方窗口 rwnd : 接收方 设置 确认报文段 中含有 窗口字段 , 将 rwnd 通知给发送方 ;
⑤ 发送窗口 : 发送方 发送窗口 取 接收窗口 rwnd , 与 拥塞窗口 cwnd , 中较小的值 ;
TCP 流量控制 过程 : 发送端 向 接收端 发送数据 ;
① 连接建立 : 接收端 向 发送端 发送 接收窗口 rwnd = 400 ;
② 发送端 发送数据 :
- 发送 1 ~ 100 字节 , 此时还能再发送 300 字节 ; ( seq = 1 )
- 发送 101 ~ 200 字节 , 此时还能再发送 200 字节 ; ( seq = 101 )
- 发送 201 ~ 300 字节 , 该报文段丢失 ; ( seq = 201 )
③ 接收端 返回数据 : 返回 ACK = 1 , ack = 201 , rwnd = 300 ;
- 表示 接收端 接收到了 201 之前的数据 , 期待发送 201 数据 , 接收窗口 rwnd 大小为 300 字节 ;
- 发送方此时 只能发从 201 开始的 300 字节滑动窗口大小的数据 , 即发送 201 ~ 500 之间的数据 , 共 300 字节 ;
④ 发送方 发送数据 :
- 发送 301 ~ 400 字节 , 此时还能再发送 100 字节数据 ;
- 发送 401 ~ 500 字节 , 此时滑动窗口的数据都发送完毕 , 不能再发送了 ;
- 发送方 的 超时重传计时器 , 时间到期 , 重传 201 ~ 300 字节数据 , 此时不能发送 新数据 ;
⑤ 接收方 接收数据 : 接收方接收到了上述 所有发送的数据 , 返回 ACK = 1 , ack = 501 , rwnd = 100 ; 表示 期待 发送方发送 501 之后的数据 , 接收窗口 rwnd 设置为 100 字节 ;
⑥ 发送方 发送数据 : 发送方发送 501 ~ 600 字节数据 , 此时滑动窗口占满 , 不能继续发送数据 ;
⑦ 接收方 接收数据 : 接收方接收到了 501 ~ 600 字节数据 , 此时回送 ACK = 1 , ack = 601 , rwnd = 0 ; 设置期望发送 601 之后的数据 , 接收窗口设置为 0 ; 此时不允许发送方再发送了 ;
十五、TCP 拥塞控制
TCP 拥塞控制 :
① 拥塞出现表现 : 资源需求总和 大于 可用资源 ;
② 拥塞问题发展 : 网络中 资源 供应不足 -> 网络性能降低 -> 网络吞吐量随着负荷增加而降低
③ 拥塞控制 : 防止数据大量注入到网络中 , 降低整体网络中主机的发送速率 , 流量控制 是 降低一台主机的发送速率 ;
④ 流量控制 与 拥塞控制 : 流量控制 是 点到点 的问题 , 拥塞控制 是 全局性 问题 ;
十六、TCP 拥塞控制算法 ★★
TCP 拥塞控制算法 :
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
TCP 拥塞控制相关术语 :
① 单向传输 : 拥塞控制假定单向传输数据 , 发送方 向 接收方 发送 数据 , 接收方 向 发送方 回送 确认信息 ;
② 发送窗口 : 接收方 缓存空间 足够大 , 发送窗口大小 取决于 网络拥塞程度 ; 发送窗口大小 是 接收窗口 rwnd 和 拥塞窗口 cwnd 中的 较小的值 ;
③ 接收窗口 : 接收方 根据 接收缓存 设置 接收窗口 大小值 , 同时将该大小 告知发送方 , 可以反映接 收方容量 ;
④ 拥塞窗口 : 发送方 估算 网络拥塞程度 , 设置 合适的 拥塞窗口 值 , 反映当前 网络容量 ;
( 知道每个算法的原理 , 细节仅做了解 )
十七、慢开始 和 拥塞避免 算法 ★
坐标系说明 :
① 纵坐标 : 纵坐标 是 拥塞窗口 cnwd 大小 , 单位是 一个报文段 , 长度是一个最大报文段长度 MSS ;
- 如 : 纵坐标的 4 指的是 4 个 MSS , 8 指的是 8 个 MSS ;
② 横坐标 : 横坐标 是 传输轮次 ;
- 往返时延 : 一个传输轮次 是 发送一批报文段 , 并接收到它们的 确认信息 所花费的时间 ; 即 RTT ;
- 如 : 发送方 向 接收方 发送 N 个报文段 , 发送方 发送完毕后 , 接收到所有 N 个 报文段的确认信息 , 所花费的时间 , 就是 一个传输轮次 ;
- 报文段发送间隔 : 也可以理解成 发送方 开发发送一批 拥塞窗口 中的报文段 , 到 开始发送 下一批 拥塞窗口 报文段 的时间 ;
慢开始 和 拥塞避免 算法 :
① 慢开始 : 拥塞窗口 开始设置成 1 , 每隔一个 传输轮次 , 收到上一个报文段的确认报文后 , 拥塞窗口翻倍 , 即变为之前的 两倍 ;
② 慢开始门限值 ( ssthresh ) : 当 拥塞窗口 到达 慢开始门限值 ( ssthresh ) 初始值时 , 停止指数级增长 , 开始线性增长 ;
③ 拥塞避免 : 进入到 慢开始门限值 后 , 开始进行 拥塞避免算法 , 每个传输轮次 , 拥塞窗口 增加 1 ;
④ 网络拥塞 : 当 拥塞窗口 增加到一定值 , 检测到了 网络拥塞 , 此时瞬间将 拥塞窗口降为 1 ; 继续执行慢开始算法 , 新的 慢开始门限值 变为 网络拥塞时 的 拥塞窗口的 1/2 大小 ;
拥塞窗口改变时机 :
- 收到上一个报文段的确认报文后 , 拥塞窗口翻倍 ;
- 收到上一个报文段的拥塞信息后 , 拥塞窗口变为 1 ;
十八、快重传 和 快回复 算法★
快重传算法 : 收到 3 个冗余的 确认后 , 执行快重传算法 ;
示例 : 发送方 给 接收方 发送 1 2 3 4 5 , 五个报文 , 2 号报文丢失 , 如果收到 3 4 5 号报文 , 其中会携带期待 发送方 发送 2 号报文 , 此时触发 快重传 算法机制 , 在超时计时器到时之前 , 快速发送 丢失的 2 号 报文 ;
快回复算法 : 与 上面的 拥塞避免算法的 区别是 , 出现 网络拥塞 之后 , 拥塞窗口 不降为 1 , 而是降低到 慢开始门限值 , 即当前的 拥塞窗口大小的 1/2 , 然后线性增加 拥塞窗口 ;