第 5 章 传输层
5.1 传输层提供的服务
5.1.1 传输层的功能
- 基本概念
- 位于网络层之上、应用层之下
- 为运行在不同主机上的进程之间提供逻辑通信
- 面向通信部分的最高层,用户功能中的最低层
- 即使网络层协议不可靠,也能为应用程序提供可靠服务
- 通信特点
- 只有主机协议栈才有传输层
- 路由器转发分组只用到下三层功能
- 传输层只存在于通信子网以外的主机中
- 主要功能
- 应用进程之间的逻辑通信
- 通信的真正端点是主机中的进程
- 端到端的逻辑通信
- 复用和分用
- 复用:不同应用进程使用同一传输协议
- 分用:正确交付数据到目的应用进程
- 差错检测
- 检测报文首部和数据部分
- TCP:出错则要求重发
- UDP:出错则直接丢弃
- 网络层只检验IP首部
- 提供两种传输协议
- 面向连接的TCP
- 提供可靠的全双工信道
- 无连接的UDP
- 提供不可靠信道
- 面向连接的TCP
- 应用进程之间的逻辑通信
5.1.2 传输层的寻址与端口
- ①. 端口的作用
端口能让应用层的各种进程将其数据通过端口向下交付给传输层
让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程
端口在传输层的作用类似于IP地址在网络层的作用
- IP地址标识的是主机
- 端口标识的是主机中的应用进程
各层服务访问点:
- 数据链路层:帧的”类型”字段
- 网络层:IP数据报的”协议”字段
- 传输层:”端口号”字段
- 应用层:”用户界面”
协议端口与硬件端口的区别
- 协议端口是软件端口
- 硬件端口是不同硬件设备交互的接口
- 软件端口是应用层协议进程与传输实体交互的地址
- 传输层使用软件端口
②. 端口号
- 应用进程通过端口号进行标识
- 端口号长度为16比特,可表示65536(2¹⁶)个不同端口号
- 端口号只具有本地意义
- 只标识本计算机应用层中的各进程
- 不同计算机的相同端口号没有联系
- 端口号分类:
- 服务器端使用的端口号
- 熟知端口号(0~1023)
- IANA指派给TCP/IP重要应用程序
- 常用熟知端口号:
- FTP: 21
- TELNET: 23
- SMTP: 25
- DNS: 53
- TFTP: 69
- HTTP: 80
- SNMP: 161
- 登记端口号(1024~49151)
- 供没有熟知端口号的应用程序使用
- 必须在IANA登记以防止重复
- 熟知端口号(0~1023)
- 客户端使用的端口号(49152~65535)
- 也称短暂端口号
- 仅在客户进程运行时动态选择
- 通信结束后端口号可复用
- 服务器端使用的端口号
③. 套接字
- 网络中通过IP地址标识不同主机
- 通过端口号标识主机中的不同应用进程
- 套接字(Socket) = IP地址:端口号
- 唯一标识网络中的一台主机上的一个应用进程
- 是一个通信端点
- 通信过程:
- 主机A发给主机B的报文包含目的端口号和源端口号
- 源端口号是”返回地址”的一部分
- B发回A的报文中的目的端口号是A到B报文的源端口号
- 完整返回地址是A的IP地址和源端口号
5.1.3 无连接服务与面向连接服务
- TCP/IP传输协议
- 面向连接的传输控制协议 (TCP)
- 特点
- 全双工的可靠逻辑信道
- 通信前需建立连接
- 数据传输结束后释放连接
- 不提供广播/多播服务
- 可靠性措施
- 确认机制
- 流量控制
- 计时器
- 连接管理
- 适用场景
- 文件传输协议(FTP)
- 超文本传输协议(HTTP)
- 远程登录(TELNET)
- 特点
- 无连接的用户数据报协议 (UDP)
- 特点
- 不可靠的逻辑信道
- 通信前无需建立连接
- 无确认机制
- 附加服务
- 多路复用
- 数据错误检查
- 优势
- 协议简单
- 执行速度快
- 实时性好
- 适用场景
- 小文件传送协议(TFTP)
- DNS
- SNMP
- 实时传输协议(RTP)
- 特点
- 面向连接的传输控制协议 (TCP)
5.2 UDP 协议
5.2.1 UDP 数据报
- UDP概述
- UDP特点
- 仅在IP数据报服务上增加复用、分用和差错检测功能
- 优点
- 无须建立连接
- 无连接状态
- 首部开销小(8B)
- 没有拥塞控制
- 支持多种交互通信方式
- 应用场景
- DNS、SNMP等一次性传输较少数据的应用
- 多媒体应用(IP电话、视频会议、流媒体等)
- UDP可靠性
- 不保证可靠交付
- 可靠性可由应用层实现
- UDP报文处理
- 面向报文
- 保留报文边界
- 报文不可分割
- UDP特点
- UDP首部格式
- 组成
- 源端口(2B)
- 目的端口(2B)
- 长度(2B)
- 检验和(2B)
- 字段说明
- 源端口:源端口号,可选
- 目的端口:目的端口号,必须
- 长度:UDP数据报总长度(最小8)
- 检验和:可选,全0表示不计算
- 处理流程
- 根据目的端口交付应用进程
- 端口错误处理:丢弃报文并发送ICMP差错报文
- 组成
5.2.2 UDP 检验
- UDP检验和计算
- 伪首部
- 12字节临时添加
- 不向下传送也不向上递交
- 用于计算检验和
- 计算方法
- 发送方
- 检验和字段置全0
- 伪首部+UDP数据报视为16位字串接
- 数据部分非偶数字节时补全0字节(不发送)
- 二进制反码计算16位字和
- 和的二进制反码写入检验和字段
- 接收方
- 接收数据报+伪首部(非偶数字节补全0)
- 二进制反码求16位字和
- 无差错时结果为全1
- 有差错则丢弃数据报
- 发送方
- 二进制反码求和规则
- 运算规则
- 低位到高位逐列计算
- 0+0=0
- 0+1=1
- 1+1=0(进位1)
- 最高位进位处理
- 结果最低位加1(回卷)
- 运算规则
- 特点
- 校错能力不强
- 优点:简单、处理速度快
- 伪首部
5.3 TCP 协议
5.3.1 TCP 协议的特点
- TCP概述
- 在不可靠的IP层之上实现的可靠数据传输协议
- 解决传输的可靠、有序、无丢失和不重复问题
- TCP/IP体系中非常复杂的协议
- 主要特点
- ①. 面向连接
- 传输层协议
- TCP连接是逻辑连接
- ②. 一对一连接
- 每一条TCP连接只能有两个端点
- 只能是一对一的
- ③. 可靠交付
- 保证数据无差错
- 保证数据不丢失
- 保证数据不重复
- 保证数据有序
- ④. 全双工通信
- 通信双方可随时发送数据
- 设有发送缓存和接收缓存
- 发送缓存用途
- ① 发送应用程序传送给发送方TCP准备发送的数据
- ② TCP已发送但尚未收到确认的数据
- 接收缓存用途
- ① 按序到达但尚未被接收应用程序读取的数据
- ② 不按序到达的数据
- 发送缓存用途
- ⑤. 面向字节流
- 应用程序和TCP交互是一次一个数据块
- TCP视为一连串无结构的字节流
- ①. 面向连接
- TCP与UDP发送方式对比
- UDP报文长度
- 由发送应用进程决定
- TCP报文长度
- 根据接收方窗口值决定
- 根据当前网络拥塞程度决定
- 处理方式
- 数据块太长:划分后传送
- 数据块太短:积累足够字节后再发送
- UDP报文长度
5.3.2 TCP 报文段
- TCP首部
- 固定部分(20B)
- 源端口(2B)
- 目的端口(2B)
- 序号(4B)
- 确认号(4B)
- 数据偏移(4位)
- 保留(6位)
- 控制位
- 紧急位URG
- 确认位ACK
- 推送位PSH
- 复位位RST
- 同步位SYN
- 终止位FIN
- 窗口(2B)
- 检验和(2B)
- 紧急指针(2B)
- 选项部分(4N B)
- 最大报文段长度(MSS)
- 窗口扩大
- 时间戳
- 其他选项
- 填充
- 固定部分(20B)
- TCP数据部分
- 封装关系
- TCP报文段封装在IP数据报中
5.3.3 TCP 连接管理
- TCP连接阶段
- 连接建立
- 数据传送
- 连接释放
- 连接建立解决的问题
- 确知对方存在
- 协商参数
- 分配运输实体资源
- TCP连接端点
- 套接字(Socket)
- 唯一由两个套接字确定
- 同一IP地址可有多个TCP连接
- 同一端口号可出现在多个TCP连接
- 客户/服务器模式
- 客户(Client):主动发起连接
- 服务器(Server):被动等待连接
- 1.TCP连接的建立(三次握手)
- 步骤1:客户机发送连接请求
- SYN=1,seq=x
- 进入SYN-SENT状态
- 步骤2:服务器确认
- SYN=1,ACK=1,seq=y,ack=x+1
- 进入SYN-RCVD状态
- 步骤3:客户机确认
- ACK=1,seq=x+1,ack=y+1
- 进入ESTABLISHED状态
- 服务器收到确认后进入ESTABLISHED状态
- 步骤1:客户机发送连接请求
- 2.TCP连接的释放(四次挥手)
- 步骤1:客户机发送释放请求
- FIN=1,seq=u
- 进入FIN-WAIT-1状态
- 步骤2:服务器确认
- ACK=1,seq=v,ack=u+1
- 进入CLOSE-WAIT状态
- 客户机进入FIN-WAIT-2状态
- 步骤3:服务器发送释放请求
- FIN=1,ACK=1,seq=w,ack=u+1
- 进入LAST-ACK状态
- 步骤4:客户机确认
- ACK=1,seq=u+1,ack=w+1
- 进入TIME-WAIT状态
- 服务器进入CLOSED状态
- 客户机等待2MSL后进入CLOSED状态
- 步骤1:客户机发送释放请求
- 计时器
- 时间等待计时器(2MSL)
- 保活计时器
- 服务器每收到数据重置
- 超时后发送探测报文段
- 连续10次无响应则关闭连接
- 总结
- 建立连接三步
- ①SYN=1,seq=x
- ②SYN=1,ACK=1,seq=y,ack=x+1
- ③ACK=1,seq=x+1,ack=y+1
- 释放连接四步
- ①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
- 建立连接三步
5.3.4 TCP 可靠传输
- 可靠传输机制
- 检验
- 序号
- 确认
- 重传
- 序号
- 定义
- 保证数据有序提交给应用层
- 基于字节流而非报文段
- 定义
- 确认
- 定义
- 确认号=期望收到的下一个字节序号
- 特点
- 累积确认
- 捎带确认
- 定义
- 重传
- 触发条件
- 超时
- 自适应算法计算RTO
- 维护加权平均RTTs
- 冗余ACK
- 定义:重复确认同一报文段
- 快速重传机制
- 收到3个冗余ACK立即重传
- 超时
- 触发条件
5.3.5 TCP 流量控制
- 功能
- 速度匹配服务
- 匹配发送速率与接收速率
- 实现机制
- 滑动窗口
- 接收窗口(rwnd)
- 动态调整
- 反映接收方容量
- 发送窗口限制
- 不超过接收窗口值
- 接收窗口(rwnd)
- 滑动窗口
- 持续计时器
- 零窗口处理
- 发送探测报文
- 重新设置计时器
- 零窗口处理
- 与数据链路层区别
- 范围
- 端到端 vs 相邻节点
- 窗口大小
- 动态变化 vs 固定
- 范围
5.3.6 TCP 拥塞控制
- 拥塞控制概述
- 定义
- 防止过多数据注入网络
- 避免路由器或链路过载
- 表现
- 通信时延增加
- 定义
- 拥塞控制 vs 流量控制
- 拥塞控制
- 全局性过程
- 涉及所有主机和路由器
- 目标
- 让网络承受现有负荷
- 流量控制
- 点对点通信控制
- 接收端控制发送端
- 目标
- 使接收端来得及接收
- 相似点
- 都通过控制发送速率实现
- 拥塞控制
- TCP拥塞控制算法
- 慢开始
- 原理
- 初始cwnd=1
- 指数增长
- 传输轮次(RTT)后
- cwnd加倍
- 设置
- 慢开始门限ssthresh
- 原理
- 拥塞避免
- 原理
- cwnd线性增长
- 每RTT
- cwnd加1
- 算法切换条件
- cwnd<ssthresh
- 慢开始
- cwnd>ssthresh
- 拥塞避免
- cwnd=ssthresh
- 两者皆可
- cwnd<ssthresh
- 原理
- 网络拥塞处理
- 设置
- ssthresh=cwnd/2
- 重置
- cwnd=1
- 执行
- 慢开始
- 设置
- 快重传
- 原理
- 收到3个冗余ACK立即重传
- 优点
- 避免等待超时
- 原理
- 快恢复
- 原理
- 收到3个冗余ACK时
- ssthresh=cwnd/2
- cwnd=ssthresh
- 执行拥塞避免
- 收到3个冗余ACK时
- 原理
- 慢开始
- 窗口管理
- 发送窗口上限
- min[rwnd,cwnd]
- 拥塞窗口(cwnd)动态调整原则
- 网络未拥塞
- 增大cwnd
- 网络拥塞
- 减小cwnd
- 网络未拥塞
- 发送窗口上限
- 算法应用场景
- TCP连接建立/网络超时
- 慢开始+拥塞避免
- 收到3个冗余ACK
- 快重传+快恢复
- TCP连接建立/网络超时