Copyright©stonee
约定:本文是针对于《计算机网络》第七版(谢希仁)中第5章的知识点总结,不适合单独看,结合课本或者PPT中的图片复习更佳
一、 运输层概述
运输层为应用进程之间提供端到端的逻辑通信
- 运输层具有复用和分用特点(P204)
- 需要对报文进行差错检测
- 运输层下面的网络是不可靠的,但TCP的面向连接会使其相当于全双工的可靠信道
- 两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)
- 端口是为了解决OS种类过多,无法锁定进程而诞生的
二、 UDP(User Datagram Protocol)
1. UDP概述
-
非常简单,首部开销小只有复用/分用和差错检错功能
-
高效但不可靠交付(如视频传输)
-
单播,广播,多播
-
面向报文而非面向连接
2. UDP首部格式
- 源端口(2) + 目的端口(2) + 长度(2) + 检验和(2)
- 长度最小值是8 = 2+2+2+2 (只有首部)
- 计算检验和时,需要增加伪首部(是一个临时添加的UDP数据包,用完即毁)
- 伪首部格式:源IP(4) + 目的IP(4) + 0(1) + 17(1) + UDP长度(2)
三、 TCP(Transmission Control Protocol)
1. TCP概述
- 面向连接,把连接作为最基本的抽象
- 面向字节流而非报文流
- 一对一全双工的可靠交付
- TCP连接的端点叫套接字(Socket)
- TCP连接 = {Socket1,Socket2} = {(IP1:port1),(IP2:port2)}
2. TCP 首部格式
TCP 虽然时面向字节流的,但是传送的数据单元时报文段
- 源端口(2B) + 目的端口(2B) + 序号seq(4B) + 确认号(4B) + 数据偏移(1B) + 0(6b) + URG(1b) + ACK(1b) + PSH(1b) + RST(1b) + SYN(1b) + FIN(1b) + 窗口(2B) + 检验和(2B) + 紧急指针(2B) + 选项(0-40B) + 填充(为了适应选项)
- 选项中有 MSS 值,默认536B;窗口扩大选项(3B);时间戳 (10)
- 应用程序把数据传到TCP发送缓存后,默认只要数据达到MSS字节就会封装成TCP报文发送出去
- 序号是报文段发送数据的第一个字节的序号
- 确认号是期望收到下个报文段的第一个数据字节的序号
- 窗口是从确认号开始算起,接收方允许接收的数据量(cwind)
3. 可靠传输的工作原理
发现差错及时重传(可靠传输),同时来不及接收时会通知发送发降低速度(流量和拥塞控制)
-
停止等待协议
每发送完一个分组就停止发送,收到确认后再发送下一个
①. ARQ(Automatic Repeat Quest)
- 发送设置一个超时计时器,用来超时重传
- 发送方发送完分组后需要保留副本并进行编号
- 接收方对重复发过来的分组要进行重复确认但要丢掉一个,同时接受方也要丢掉一个重复的确认
②. 信道利用率
- U = Td/(Td + PTT + Ta)
- 流水线式传输
-
连续ARQ协议
- 收到几个分组后对按需到达的最后的一个分组发送确认
-
当通信线路不好时,连续ARQ会带来不好的影响
4. TCP可靠传输的实现
-
以字节为单位的滑动窗口
- 3个指针把窗口分为:已发送并收到确认,已发送但未收到确认,允许发送但尚未发送,不允许发送
-
窗口和缓存的关系
对于发送发
- 发送应用程序传送给发送方TCP准备发送的数据
- TCP已经发送但是未收到确认的数据
对于接受方
- 按序到达的,但尚未被接收的数据
- 未按序到达的数据
-
超时重传时间的选择
公式
- RTTs = ( 1 - α ) * RTTs + α * RTT
- α = 1 / 8
- RTTd = ( 1 - β ) * RTTd + β * | RTTs - RTT|
- β = 1 / 4
- RTO = RTTs + 4 * RTTd
- 未重传时用上述公式,重传后需要用Karn算法
选择确认SACK
5. TCP的流量控制
流量控制通过速度解决缓存问题
-
接收方通过rwnd数值说明可接受的字节数
-
TCP的窗口单位是字节不是报文段
-
死锁情况
- 接收方把rwnd置为0一段时间后恢复rwnd但是发送方没有收到
- 解决办法:每个连接有个持续计时器,发送方会向接收方隔段时间发送一个零窗口的探测报文段
-
Nagle算法
- 和前面说到的MSS不是一种方法
- 刚开始只发送一个字节,收到确认后再根据MSS或者MSS/2发送报文段
- 让接收方等待一段时间释放缓存是为了解决糊涂窗口综合征
6. TCP的拥塞控制
拥塞是指网络资源小于需求。网络的吞吐量会随着负荷的增大而下降
拥塞控制解决网络资源问题
-
开环控制:设计网络时考虑周到,系统运行起来后不能改正
-
闭环控制:基于反馈环路概念,动态解决
-
判断拥塞的依据是出现了超时
-
拥塞控制方法
慢开始和拥塞避免
- 最初发送窗口cwnd = (2 ~ 4 )SMSS
- 增加量 = min(N, SMSS)
- 当cwnd达到慢开始门限ssthresh时,停止慢开始算法
- 采用拥塞避免算法,此时增加量 = 1
- 当网络发生拥塞时,ssthresh = cwnd / 2, cwnd = 1
快重传和快恢复
-
如果超时不是发生了拥塞而是因为报文段丢失(3次ACK),就需要用快重传对丢失报文段迅速重传
-
同时执行快恢复算法,ssthresh = cwnd / 2, cwnd = ssthresh
-
之后执行拥塞避免算法
-
发送方窗口上限值 = Min[rwnd, cwnd]
-
主动队列管理AQM
将拥塞控制和网络层联系起来
- 尾部丢弃策略:报文丢失的原因可可能是网络层路由器的队列有限,把尾部的TCP报文丢弃
- AQM是代替尾部丢弃策略的
- 大概可以理解为随机丢弃(肯定不对,但是考试不考)
7. TCP的运输连接管理
- 三次握手
- 客户 SYN = 1, seq = x 服务器
- 服务器 SYN = 1, ACK = 1, seq = y, ack = x + 1 客户
- 客户 ACK = 1, seq = x + 1, ack = y + 1 服务器
- SYN是发起连接,ACK是确认连接,seq是序列号,ack是期待序列号
- 四次挥手
- 客户 FIN = 1, seq = u服务器
- 服务器 ACK = 1, seq = v, ack = u + 1 客户
- 服务器 FIN = 1, ACK = 1, seq = w + 1, ack = u + 1 客户
- 客户 ACK = 1, seq = u + 1, ack = w + 2 服务器
- 客户等待2MSL后关闭
- FIN是发起关闭请求
- 有限状态机
- 图片请查阅课本
四、 说明
- 可靠并不是指收到的数据都是正确的,而是在正确的基础上保证数据传输的完整性
- UDP在传输是也需要指定IP和PORT,只不过不称之为套接字而已
- 不管是UDP还是TCP,它们最基本的封装单位都是报文,但是在传输过程中,对于UDP来说单位是报文,对于TCP来说单位是字节
- cwind存在于接收窗口中,rwind存在于发送窗口;前者用于流量控制,声明接收方可以接收多少字段,后者用于拥塞控制,表示发送方可以一次性发送多少字段
- 3次ACK中是为了确认报文丢失而不是拥塞
- 我的理解是:3次握手中,第一次是检验客户的发送功能,第二次是检验服务器的发送和接收功能,第三次是检验客户的接收功能,但是课本上说第三次是为了防止客户发送两次,一次延时,服务器浪费资源
- 建立连接后ACK都需要置位1
本文深入解析《计算机网络》第七版中运输层的核心概念,包括UDP与TCP的特性、首部格式、可靠传输原理及拥塞控制策略,适合与课本结合学习。
1346





