计算机网络·传输层
传输层
- 功能概述
- 提供应用进程间的逻辑通信
- 复用和分用
- 复用
- 发送方不同的应用进程使用同一个传输层协议
- 分用
- 接收方的传输层在剥去报文首部后能把这些数据正确交付至目的应用进程
- 复用
- 差错检测(首部和数据部分)
- TCP和UDP
- 寻址与端口
- 端口作用
- 让应用层各应用程序将其数据通过端口向下交付给传输层
- 让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程
- 端口号
- 长度16bit \(2^{16}=65536\)个不同的端口号
- 端口划分
-
服务器端使用
- 熟知端口
- 0 ~ 1023
- FTP
- 21
- TELNET
- 23
- SMTP
- 25
- DNS
- 53
- TFTP
- 69
- HTTP
- 80
- SNMP
- 161
- 登记端口
- 1024 ~ 49151
- 熟知端口
-
客户端使用
- 客户进程运行时动态选择
- 又称临时端口
-
套接字
- 端口和IP拼接
- Socket = (IP地址:端口号)
-
- 端口作用
- UDP
- 概述
- 在IP数据报基础上增加
- 复用
- 分用
- 差错检测
- 无需建立连接
- 无连接状态
- 分组首部开销小
- 不保证可靠交付
- 面向报文
- IP协议字段17
- 报文长度由发送程序决定
- 在IP数据报基础上增加
- 首部格式
- 8B 4字段构成
- 源端口
- 需要对方回信时选用
- 不需要可用全0
- 目的端口
- 终点交付报文时必须使用
- 长度
- 最小值8(仅首部)
- 校验和
- 检测UDP数据报传输过程是否有错
- 有错丢弃
- 源主机不想计算校验和填写全0
- 源端口
- 8B 4字段构成
- 校验
- 计算校验和在UDP数据报前增加12B伪首部
- 伪首部不是UDP真正首部只用于计算校验和
- 概述
- TCP
- 概述
- 面向连接
- 可靠交付
- 全双工通信
- 允许双方任何时候都能发送数据
- 两端设有缓存暂存数据
- 发送缓存
- 发送程序传给发送方TCP准备的数据
- TCP已发送尚未收到确认的数据
- 接收缓存
- 按序到达但尚未被接收程序读取的数据
- 不按序到达的数据
- 发送缓存
- 面向字节流
- 仅视为一连串无结构的字节流
- 报文长度由接受方给出的窗口值和当前网络拥塞程度决定
- 报文段
- 源端口和目的端口
- 2B + 2B
- 序号
- 4B
- 0 ~ \(2^{32}-1\)
- 面向字节流
- TCP连接传送的字节流的每个字节都按顺序编号
- 本报文段发送的数据的第一个字节的序号
- 确认号
- 4B
- 期望收到对方下一报文段的第一个数据字节的序号
- 确认号为N表明到序号N-1为止的所有数据都已正确收到
- 数据偏移
- 表示首部长度
- 指出TCP报文段的数据起始处距离TCP报文段的起始处有多远
- 保留
- 占6位
- 今后使用
- 目前置0
- 紧急位URG
- URG=1
- 表明紧急指针字段有效
- 应尽快传送
- URG=1
- 确认位ACK
- ACK=1
- 确认号字段才有效
- ACK=0
- 确认号无效
- ACK=1
- 推送位PSH
- 接收方TCP收到PSH=1的报文段
- 尽快交付给接收应用进程
- 不等到缓存满在交付
- 复位位RST
- RST=1
- 表明TCP连接中出现严重错误
- 必须释放链接
- 重新建立连接
- RST=1
- 同步位SYN
- SYN=1表明这是一个连接请求或连接接受报文
- SYN=1 ACK=0表明这是一个连接请求报文
对方同意建立连接
则响应报文中使用SYN=1 ACK=1
- 终止位FIN
- 用来释放一个连接
- FIN=1 表明此报文段的发送方的数据已经发送完毕
- 并要求释放运输链接
- 窗口
- 2B
- \(2^{16}-1\)
- 现在允许对方发送的数据量
- 设确认号为701 窗口字段1000
- 从701起发送此报文段的一方
还有接受1000字节数据的接受缓存空间
701~1700
- 从701起发送此报文段的一方
- 校验和
- 2B
- 校验和字段检验的范围包括首部和数据两部分
- 计算校验和
- 报文段前加入12B伪首部
- 协议字段6
- 紧急指针
- 2B
- URG=1有意义
- 指出在本报文段中紧急数据共多少字节
- 选项
- 长度可变
- 最大报文段长度MSS
- TCP报文段的数据字段最大长度
- 填充
- 为了使整个首部长度为4B的整数倍
- 源端口和目的端口
- 连接管理
- 三阶段
- 连接建立
- 数据传输
- 连接释放
- 客户/服务器模式
- 连接建立
- 三次握手
- 建立前 服务器进程进入LISTEN 等待客户连接请求
- 客户机TCP首先向服务器TCP发送请求报文段
- SYN=1 seq=x
- SYN报文段不能携带数据
- 消耗一个序号
- 客户机进入SYN-SENT
- 服务器TCP收到连接请求报文段同意连接
- 发回确认报文段并配置该TCP缓存和变量
- SYN=1 ACK=1 seq=y ack=x+1
- 确认报文段不能携带数据
- 消耗一个序号
- 服务器进入SYN-RCVD同步收到状态
- 客户机收到确认报文段还要向服务器给出确认
- 并为该TCP连接配置缓存和变量
- ACK=1 seq=x+1 ack=y+1
- 该报文段可携带数据
- 不携带数据不消耗序号
- 客户机进入ESTABLISHED
- 三次握手易受到SYN洪泛攻击
- 连接释放
- 四次握手
- 客户机打算关闭连接 发送TCP连接释放报文段
- 主动关闭TCP连接
- FIN=1 seq=u
- seq为先前传输的最后一个序号+1
- 客户进程进入FIN-WAIT-1终止等待1
- 服务器收到连接释放报文段
- ack=u+1 seq=v
- 序号等于前面传过的数据最后一个字节的序号+1
- 服务器CLOSE-WAIT关闭等待
- 客户机到服务器方向连接关闭
- 服务器到客户机方向连接未关闭
- 半关闭状态
- 服务器若发送数据
- 客户机仍要接收
- 服务器无数据发送至客户机 发送通知TCP释放连接报文段
- FIN=1 ACK=1 seq=w ack=u+1
- 设报文段的序号为w 在半关闭状态又传输部分数据
- 需重复上次发送的确认号ack=u+1
- 服务器进入LAST-ACK最后确认状态
- 客户机收到连接释放报文段后 必须发出确认
- ACK=1 ack=w+1 seq=u+1
- 此时TCP连接还未释放
- 必须经过时间等待计时器设置的时间2MSL最长报文段寿命
- 客户机进入CLOSED连接关闭状态
- 三阶段
- 可靠传输
- 序号
- 序号保证数据能有序提交至应用层
- TCP视数据为无结构但有序的字节流
- 序号建立在传输的字节流
- 序号字段值是指本报文段所发送的数据的第一个字节的序号
- 确认
- 期望收到对方的下一个报文段的数据的第一个字节的序号
- 默认使用累积确认
- 只确认数据流中至第一个丢失字节为止的字节
- 重传
- 只针对两种情况进行重传
- 超时
- 冗余ACK
- 超时
- TCP发送一个报文段就对这个报文段设置一次计时器
- 超时未收到确认就要重传这一报文段
- 采用自适应算法记录一个报文段发出的时间和收到确认的时间
- \({RTT}_S\)加权平均往返时间
- 冗余ACK
- 超时触发重传存在的一个问题是周期往往太长
- 是再次确认某个报文段的ACK 而发送方先前已经收到过该报文段的确认
- 发送方收到对同一个报文段的3个冗余ACK 就可以认为跟在这个被确认报文段之后的报文段已经丢失
- 只针对两种情况进行重传
- 序号
- 流量传输
- 使用流量控制消除发送方速率过快使接收方缓存区溢出的可能性
- 基于滑动窗口协议的流量控制机制
- rwnd
- 接收方根据自己的接收缓存 动态调整发送方的发送窗口大小
- cwnd
- 发送方根据其对当前网络拥塞程度的估计而确定的窗口值
- 发送窗口=min
- 拥塞控制
- 防止过多数据注入网络 保证网络中的路由器或链路不致过载
- 慢开始
- TCP连接好并开始发送报文段 cwnd=1 即一个最大报文段长度MSS
- 每收到一个对新报文段的确认后 cwnd+1
- 使用慢开始算法后 每经过一个传输轮次RTT cwnd加倍 指数增长
- 一直增长到一个规定的慢开始门限值ssthresh
- 拥塞避免
- 让拥塞窗口cwnd缓慢增大
- 每经过一个往返时延RTT就把发送方的拥塞窗口cwnd+1 加法增大
- 根据cwnd大小选择算法
- cwnd < ssthresh
- 慢开始
- cwnd > ssthresh
- 拥塞避免算法
- cwnd = ssthresh
- 均可
- cwnd < ssthresh
- 拥塞处理
- 初始
- 拥塞窗口置1 cwnd=1 慢开始门限ssthresh=16
- 慢开始
- cwnd=1 发送方每收到一个确认ACK cwnd+1
- 经过每个RTT cwnd指数增长
- 达到门限值ssthresh 使用拥塞避免算法
- 拥塞避免
- 假定cwnd=24出现超时 更新ssthresh=12 cwnd=1 执行慢开始
- 初始
- 快重传
- 当发送方连续收到三个重复的ACK报文
- 直接重传对方未收到的报文段
- 不必等待那个报文段设置的重传计算器超时
- 快恢复
- 发生黄连续收到三个冗余ACK
- 乘法减小
- 将慢开始门限ssthresh设置为此时发送方cwnd的一半
- 概述