一.目录
传输层服务的基本理论与基本机制
- 复用/分用技术
- 可靠数据传输
- 流量控制机制
- 拥塞控制机制
Internet传输层协议
- UDP
- TCP
- TCP拥塞控制
二.概述
传输层为运行在不同主机上的进程提供了逻辑通信机制
发送方:将应用层提交的消息分成一个或多个segment,并向下传给网络层
接收方:将接收到的segment组装成消息,并向上交给应用层
三.UDP(User Datagram Protocol)
特性
- 基于IP协议(复用/分用,有简单的错误校验)
- Best effort服务(可能丢失,非按序到达)
- 无连接(无需握手)
优点
- 无需建立连接(减少延迟)
- 实现简单(无需维护连接状态)
- 头部开销少
- 没有拥塞控制(应用可更好的控制发送时间及速率)
用处
- 常用于流媒体应用(容忍丢失,速率敏感)
- 用于DNS,SNMP
报文结构
报文结构在图中比较清楚
长度(length):UDP段的长度,包括了头部
校验和(checksum):用于差错校验
checksum
目的
检测UDP段在传输中是否发生位错误
算法
伪首部
伪首部是为了计算校验和,临时添加在UDP数据报前面,不向下传送,也不向上递交。共12个byte
- 源IP地址(4byte)
- 目标IP地址(4byte)
- 全0(1byte)
- IP首部中的协议字段值,对于UDP来说是17(1byte)
- UDP数据报长度(2byte)
步骤
发送方
- 首先增加12个字节的伪首部
- 将段内容视为16bit整数
- 计算所有整数的和,进位加在和的后面,将得到的值按位取反
- 将校验和放入校验和字段
接收方
计算所收到段的校验和,比对
不相等:检测出错误
相等:没有检测出错误(仍有可能出错)
四.可靠数据传输(Rdt)
定义
不错,不丢,不乱
- rdt1.0:底层信道完全可靠,不会发生错误,不会丢弃分组,则传输数据可靠
- rdt2.0:产生位错误的信道
- rdt2.1&rdt2.2: 基于ACK的改进
- rdt3.0:产生位错误及丢包的信道
rdt2.0
问题:底层信道可能翻转分组中的bit
校验和检测位错误
确认机制ACK恢复错误
接收方发送ACK,通知发送方分组正确接收
发送方发送NAK,通知发送发分组错误
发送发收到NAK后,重传分组
基于重传机制的rdt协议成为ARQ(automatic repeat request)
rdt2.1& rdt2.2
问题:ACK/NAK消息发送错误
- 为ACK/NAK增加校验和,检错并纠错
- 若ACK/NAK坏掉,重传
使用序列号重传(sequence number)
为每个分组增加序列号,返回的认证消息中增加序列号,表示对某序列号的分组确认。
在停等协议中,只需要0,1两个序列号即可。
rdt2.2去掉了NAK,接收方通过ACK告知最后一个被正确接收的分组,在ACK消息中显示的加入被确认分组的序列号
rdt3.0
问题:信道既可能发生错误,也可能丢失分组。
增加计时器,在发送消息后,开启计时器,在计时器结束后,自动重发。
总结
rdt使用的技术:
- 校验和
- 带序列号的ACK/NAK
- 定时器
rdt使用停等协议,性能很差。
示例:
1Gbps链路,15ms端到端传播延迟,1KB分组。
T = L / R = 8kb/10 ^ 9 = 8 microsec
发送方利用率:
U = (L/R)/(RTT+(L/R)) = 0.00027
五. 滑动窗口协议
解决利用率低的问题
允许发送方在收到ACK之前连续发送分组
需要更大的序列号范围
发送方和接收方需要更大的存储空间缓存分组
窗口尺寸为N,最多有N个等待确认的消息,窗口在序列号空间内向前滑动
GBN(GO-BACK-N)
发送方
ACK(n):确认到序列号n的分组已被正确接收
为空的分组设置计时器
Timeout(n):大于等于n,还未收到ACK的所有分组,全部重传。
接收方
发送拥有最高序列号的,已被正确接收的分组的ACK
乱序到达的分组:直接丢弃(接收方没有缓存),重传确认序列号最大的,按序到达的分组
SR(Selective Repeat)
接收方对每个分组单独进行确认,设置缓存机制,缓存乱序到达的分组
发送方只重传没有收到ACK的分组,为每个分组设置定时器(GBN只有一个定时器)
问题:若窗口尺寸与序列号接近,很可能会出现确认混乱情况。
要求2^k 远远>= 窗口尺寸
六.TCP
1.概述
- 点对点
- 可靠的,按序的字节流
- 流水线机制
- 发送方/接收方缓存
- 全双工
- 面向连接
- 流量控制机制
2.报文结构
序列号:segment中第一个字节的编号,建立TCP连接时,双方随机选择序列号
确认号:希望接收到的下一个字节的序列号,采用累计确认,该序号前的所有字节均被正确接收
URG(urgent data):generally not used
ACK:ACK
PSH(push data now):generally not used
RST,SYN,FIN(connection establish)
Receive window:希望接收的字节数
3.流量控制
发送方不会传输太多,太快导致淹没接收方。
接收方会为TCP连接分配buffer
接收方计算目前可用空间:RcvBUffer - (lastByteRcvd - LastByteRead)
通过头部字段 Receive window告诉sender。
sender限制自己已经发送的,但还未收到ACK的数据不能超过接收方receive window尺寸
4.连接管理
建立连接
关闭连接
client向server发送TCP FIN
server收到FIN,回复ACK,关闭连接,发送FIN
client收到FIN,回复ACK
server收到ACK 连接关闭
5.TCP拥塞控制
基本原理
sender限制发送速率
rate = congWin/RTT
动态调整以改变发送速率
如何感知网络拥塞
Loss事件 = timeout或3个重复的ACK
发生loss事件后,发送方降低速率
AIMD 加性增-乘性减
每个RTT将CongWin增大一个MSS
发送loss事件后,将CongWin减半
SS 慢启动
每个segment被确认后,CongWin增大一个MSS(每个RTT。CongWin翻倍)
实现算法
- 设置默认阈值
- 达到阈值前,使用SS
- 达到阈值后使用加性增
- 发送loss事件后,阈值变为当前CongWin的一半
- loss事件为3个重复ACK时,CongWin变为一半,采用线性增长(表示网络还能传输segment)
- loss事件为timeout事件,CongWin直接设为1个,采用指数增长。(拥塞更严重)
来源:CSDN
作者:谢宇寒
链接:https://blog.csdn.net/u012933335/article/details/104248832