
传输层 协议 :
① UDP 协议 : 无连接 用户数据报协议 ;
② TCP 协议 : 面向连接 传输控制协议 ;
复用与分用 :
① 复用 : 应用层 多个 应用进程 通过传输层 传输到 网络层 中 ;
② 分用 : 传输层 从 网络层 接收数据 , 分发给不同的 应用进程 ;
参考 : 【计算机网络】传输层 : 传输层概述 ( 设备层级 | 传输层功能 | TCP 协议 | UDP 协议 | 复用与分用 | 端口号 | 套接字 )
端口号 : 软件端口 , 逻辑端口 , 用于标识 主机中的 应用程序 ;
① 端口号 只在主机 本地有实际意义 ;
② 取值范围 : 端口号长度
位 , 取值范围
~
;
端口号分类 :
① 服务端使用的端口号 :
~
, 给 TCP/IP 的重要程序使用 ;
~
, 给普通应用程序使用 ;
② 客户端使用的端口号 :
~
, 客户端程序动态分配 ;
应用程序的 熟知端口号 对应 :
参考 : 【计算机网络】传输层 : 传输层概述 ( 设备层级 | 传输层功能 | TCP 协议 | UDP 协议 | 复用与分用 | 端口号 | 套接字 )
TCP 协议 特点 :
① 面向连接 : TCP 协议的连接是 “虚连接” ;
② 点对点 : TCP 协议 是 点对点 的 , 是两个端点之间的连接 ;
③ 可靠传输 : TCP 协议提供 可靠服务 , 按序到达 , 没有丢失 , 没有重复 ;
④ 全双工 : TCP 协议通信是全双工通信 ;
⑤ 面向字节流 : TCP 协议将 数据 看做 无结构的字节流 ;
TCP 报文段首部格式 :

① TCP 报文段组成 : 由 TCP 首部 和 TCP 数据部分 组成 ;
② TCP 首部格式 : 由
字节固定首部 + 可变的选项 + 填充部分 组成 ; 其中 可变选项 + 填充部分 是
字节整数倍 , 填充部分的意义就是为了让整个 TCP 首部大小是
字节整数倍 ;
③ 源端口 / 目的端口 : 进程端口号 , 每个
字节 , 取值范围
~
;
④ 序号 : TCP 连接中 , 字节流中的 字节按照顺序编号 , 每个字节都有一个序号 , 本首部中的序号是本 TCP 报文 数据部分第一个字节的序号 ;
⑤ 确认号 : 期望收到 对方 下一个报文段 第一个数据字节的序号 ; 序号为
, 说明
及之前的数据都已经收到 ;
⑥ 数据偏移 : TCP 报文段 数据部分起始位置 , 距离 TCP 报文段的起始位置 , 有多远 , 单位
字节 ; 即 整个 TCP 报文段 中 TCP 首部的长度 ;
⑦ 窗口 : 发送本报文段一方的 接收窗口 ( 发送方 ) , 即允许对方发送的数据量 ( 接收方 ) ;
⑧ 检验和 : 检验首部 + 数据 ; 检验时 加上
字节伪首部 , 第
字段都是
;
⑨ 紧急指针 : 当 URG 紧急标志位 为
时 有效 , 表明本报文段的紧急数据字节数 ; 如 : 紧急指针值为
, 说明 报文段的 数据部分 前 88 字节时 紧急数据 ;
⑩ 选项 : 最大报文段长度 MSS , 窗口扩大字段 , 时间戳 , 选择确认信息 等 ; 如果选项 不足
字节整数倍 , 使用填充
使 TCP 首部是
字节整数倍 ;
控制位
TCP 报文段首部
控制位 :
① URG ( 紧急位 ) : URG
时 , 表明 该报文段中有紧急数据 , 优先级很高 , 尽快传送 , 不在缓存中排队 , 结合紧急指针字段使用 ;
② ACK ( 确认位 ) : ACK
时 , 确认号有效 , 连接建立后 , 所有的报文段的 ACK 都必须设置为
;
③ PSH ( 推送位 ) : PSH
时 , 接收方 要 尽快交付接收应用进程 , 不用等到接收缓存满后再交付 ;
④ RST ( 复位 ) : RST
时 , TCP 连接中出现错误 , 必须释放当前连接 , 重新建立连接 ;
⑤ SYN ( 同步位 ) : SYN
时 , 表明该报文是一个 连接请求 / 连接接收 报文 ;
⑥ FIN ( 终止位 ) : FIN
时 , 表明该报文发送完毕 , 释放连接 ;
TCP 连接建立过程 : 客户端 与 服务器 的 TCP 连接建立过程 ;

① 客户端 发送 连接请求报文段 , 该报文段 没有应用层数据 ;
, 说明该位是连接请求 / 连接接收 报文 ; 本次的情况是 连接请求 ;
, 之后连接建立成功后置位
;
② 服务器端 收到 连接请求报文段 , 为 TCP 连接 分配 缓存和变量 , 向客户端返回 确认报文段 , 允许客户端连接 , 此时该报文段 也没有应用层数据 ;
, 说明该位是连接请求 / 连接接收 报文 ; 本次的情况是 连接接收 ;
;
③ 客户端 收到 服务器端 返回的 确认报文段 , 客户端为 TCP 连接分配缓存和变量 , 同时向 服务器端 返回 确认报文段 的 确认 , 并可以 携带实际传输的数据 ;
;
总结 :
, 这是建立连接的前两次握手 ; 等到真实传输数据时 , 该位 为
;
, 此时还没有建立连接 , 之后服务器端接收后 , 知道连接建立成功了 , ACK 设置为
;
上述涉及到的 TCP 报文的 四个字段 :
, 说明
及之前的数据都已经收到 ;
时 , 表明该报文是一个 连接请求 / 连接接收 报文 ;
时 , 确认号有效 , 连接建立后 , 所有的报文段的 ACK 都必须设置为
;

上述 涉及到 TCP 报文内容 , 参考博客 【计算机网络】传输层 : TCP 协议 ( TCP 协议特点 | TCP 报文段首部格式 | TCP 报文段控制位 )
TCP 连接释放 : 四次挥手 ;

① 客户端 : 客户端 发送 连 接释放报文段 , 停止发送数据 , 发起 TCP 连接关闭流程 ; 连接释放报文段 关键字段如下 :
② 服务器端 : 返回 确认报文段 , 客户端收到该报文段后 ; 确认报文段 关键字段 如下 :
③ 服务器端 : 发送完毕 上面的 确认报文段后 , 发送 连接释放报文段 , 关闭 TCP 连接 ( 该链接时 客户端 -> 服务器端 方向的连接 ) ; 连接释放报文段 关键字段如下 :
④ 客户端 : 收到 服务器端 连接释放报文段 , 回复 确认报文段 , 等待 2MSL ( 最长报文寿命 ) 后 , 关闭 TCP 连接 ( 服务器 -> 客户端 方向连接 ) ; 确认报文段 格式 :
TCP 实现可靠传输机制 :
① 校验 : 使用 伪首部 进行校验 ;
② 序号 : 每个字节编一个序号 ; 序号 字段 的值是 报文段 第一个字节的序号 ;
③ 确认 : 累计确认 ;
④ 重传 : 重传 与 确认机制 结合使用 , 发送方 如果 在 规定时间内 , 没有收到 接收端的确认 , 就要重发报文段 ;
TCP 快速重传 机制 : 使用 冗余确认 机制 , 实现快速重传 ;
① 冗余 ACK 确认信息 : 接收方 接收到 接收到 比 期望序号大的 失序报文段 , 就向 发送方 发送 冗余 ACK , 表明下一个期待的序号 ;
② 快速重传示例 :
号报文丢失 , 一直发 1 号确认信息 ;
参考 : 【计算机网络】传输层 : TCP 流量控制 ( 流量控制过程 | 持续计时器机制 )
TCP 流量控制 :
① 流量控制 : 控制 发送方 降低发送速率 , 避免 接收方 来不及接收 , 丢弃数据 , 导致重传 ;
② 滑动窗口机制 : TCP 通过 该 滑动窗口机制 实现 流量控制 ;
③ 滑动窗口 调整 : 接收方 根据 接收缓存大小 , 动态调整 发送方 发送窗口 大小 ;
④ 接收方窗口 rwnd : 接收方 设置 确认报文段 中含有 窗口字段 , 将 rwnd 通知给发送方 ;
⑤ 发送窗口 : 发送方 发送窗口 取 接收窗口 rwnd , 与 拥塞窗口 cwnd , 中较小的值 ;
TCP 流量控制 过程 : 发送端 向 接收端 发送数据 ;
① 连接建立 : 接收端 向 发送端 发送 接收窗口 rwnd = 400 ;
② 发送端 发送数据 :
③ 接收端 返回数据 : 返回 ACK = 1 , ack = 201 , rwnd = 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 拥塞控制相关术语 :
① 单向传输 : 拥塞控制假定单向传输数据 , 发送方 向 接收方 发送 数据 , 接收方 向 发送方 回送 确认信息 ;
② 发送窗口 : 接收方 缓存空间 足够大 , 发送窗口大小 取决于 网络拥塞程度 ; 发送窗口大小 是 接收窗口 rwnd 和 拥塞窗口 cwnd 中的 较小的值 ;
③ 接收窗口 : 接收方 根据 接收缓存 设置 接收窗口 大小值 , 同时将该大小 告知发送方 , 可以反映接 收方容量 ;
④ 拥塞窗口 : 发送方 估算 网络拥塞程度 , 设置 合适的 拥塞窗口 值 , 反映当前 网络容量 ;
( 知道每个算法的原理 , 细节仅做了解 )

坐标系说明 :
① 纵坐标 : 纵坐标 是 拥塞窗口 cnwd 大小 , 单位是 一个报文段 , 长度是一个最大报文段长度 MSS ;
② 横坐标 : 横坐标 是 传输轮次 ;
慢开始 和 拥塞避免 算法 :
① 慢开始 : 拥塞窗口 开始设置成 1 , 每隔一个 传输轮次 , 收到上一个报文段的确认报文后 , 拥塞窗口翻倍 , 即变为之前的 两倍 ;
② 慢开始门限值 ( ssthresh ) : 当 拥塞窗口 到达 慢开始门限值 ( ssthresh ) 初始值时 , 停止指数级增长 , 开始线性增长 ;
③ 拥塞避免 : 进入到 慢开始门限值 后 , 开始进行 拥塞避免算法 , 每个传输轮次 , 拥塞窗口 增加 1 ;
④ 网络拥塞 : 当 拥塞窗口 增加到一定值 , 检测到了 网络拥塞 , 此时瞬间将 拥塞窗口降为 1 ; 继续执行慢开始算法 , 新的 慢开始门限值 变为 网络拥塞时 的 拥塞窗口的 1/2 大小 ;
拥塞窗口改变时机 :

快重传算法 : 收到 3 个冗余的 确认后 , 执行快重传算法 ;
示例 : 发送方 给 接收方 发送 1 2 3 4 5 , 五个报文 , 2 号报文丢失 , 如果收到 3 4 5 号报文 , 其中会携带期待 发送方 发送 2 号报文 , 此时触发 快重传 算法机制 , 在超时计时器到时之前 , 快速发送 丢失的 2 号 报文 ;
快回复算法 : 与 上面的 拥塞避免算法的 区别是 , 出现 网络拥塞 之后 , 拥塞窗口 不降为 1 , 而是降低到 慢开始门限值 , 即当前的 拥塞窗口大小的 1/2 , 然后线性增加 拥塞窗口 ;