传输层
传输层的基本服务
核心任务:
应用进程 之间提供 端到端 的 逻辑通信 服务
只有 主机 才有传输层
网络核心中的 中间系统 只用到 下三层 的功能
传输层功能
- 对应用层报文进行分段和重组
- 面向应用层实现复用与分解
- 实现端到端的流量控制
- 拥塞控制
- 传输层寻址
- 对报文进行差错检测
- 实现进程间的端到端可靠数据传输控制
小口诀:
分复流拥寻差错-可靠
传输层寻址与端口
一台计算机中,不同应用进程用 进程标识符(进程ID) 来区分
在 全网 范围内利用 IP地址+端口号 唯一标识一个通信端点(套接字)
在传输层使用协议端口号,通常称为 端口(port)
传输层端口号为 16 位整数,可以编号65536个(2的16次方)
服务器端使用的端口号:
熟知端口号和登记端口号
客户端使用的端口号:
临时性,在客户进行运行时由操作系统随机选择取唯一的未被使用的端口号
常用端口:
端口号小于256的端口
端口号类型 | 名称 | 端口号范围 |
---|---|---|
服务器端口号 | 熟知端口号 | 0 - 1023 |
服务器端口号 | 登记端口号 | 1024 - 49151 |
客户端端口号 | 短暂端口号 | 49152 - 65535 |
无连接服务与面向连接服务
无连接服务:
数据传输之前:无需 与接收端进行任何信息交换,直接构造传输层报文段并向接收端发送
类似于 信件通信
面向连接服务:
数据传输之前:需要 双方交换一些控制信息,建立逻辑连接,然后再传输数据,传输结束后还需要拆除连接
类似于 电话通信
传输层的复用与分解
复用与分解
多路复用与多路分解(复用与分解/复用与分用):
支持众多 应用进程共用 同一个传输层协议,并能够将接收到的数据准确交付给 不同的应用进程
无连接的多路复用与多路分解
用户数据报协议(User Datagram Protocol, UDP):Internet提供 无连接服务 的传输层协议
UDP套接字二元组:<目的IP地址, 目的端口号>
面向连接的多路复用与多路分解
传输控制协议(Transmission Control Protocol, TCP): Internet提供 面向连接服务 的传输层协议
TCP套接字四元组:<源IP地址, 源端口号, 目的IP地址, 目的端口号>
停-等协议与滑动窗口协议
可靠数据传输基本原理
不可靠传输信道在数据传输中可能发生
- 比特差错:1001 - 1000
- 乱序:数据块1、2、5、6、3、4
- 数据丢失:数据块1、2、5
很多网络应用希望传输层提供 可靠的数据传输服务
基于不可靠传输信道在数据传输采取的措施
- 差错检测:利用编码实现数据包传输过程中的比特差错检测
- 确认:接收方向发送方反馈接收状态。ACK(肯定确认)、NAK(否定确认)
- 重传:发送方重新发送接收方没有正确接收的数据
- 序号:确保数据按序提交
- 计时器:解决数据丢包问题
停-等协议
自动重传请求协议(Automatic Repeat reQuest, ARQ)的典型
工作流程
- 发送数据,等待确认:发送方发送经过差错编码和编号的报文段,等待接收方确认
- 确认结果(ACK、NAK):接收方如果差错检测无误且序号正确,则接收报文段,并向发送方发送 ACK,否则丢弃报文段,并向发送方发送 NAK
- 处理结果(发送后续数据、重传数据):发送方如果收到 ACK,则继续发送后续报文段,否则重发刚刚发送的报文段
滑动窗口协议
流水线协议(管道协议):允许发送方在没有收到确认前连续发送多个分组
最典型的流水线协议:滑动窗口协议
发送窗口(Ws):
发送方可以发送未被确认分组的最大数量
接收窗口(Wr):
接收方可以缓存的正确到达的分组的最大数量
GBN协议
发送窗口 Ws 1,接收窗口 Wr = 1
特点:
发送端缓存能力高,可以在没有得到确认前发送多个分组。
接收端缓存能力很低,只能接收一个按序到达的分组,不能缓存未按序到达的分组
GBN发送方响应的3类事件:
- 上层(应用层)调用
- 收到1个ACKn,GBN采用 累计确认 方式,即发送方收到ACKn时,表明接收方正确接收序号n以及序号小于n的所有分组
- 计时器超时,发送方(发生多个分组)只使用 一个 计时器
SR协议
发送窗口 Ws > 1,接收窗口 Wr > 1
特点:
发送端缓存能力高
接收端缓存能力高
SR发送方响应事件:
- 上层调用
- 计时器超时,发送方对 每个 分组进行计时
- 收到ACKn,SR协议采取 逐个 方式
用户数据报协议(UDP)
英文全称:User Datagram Protocol
Internet 传输层 协议,提供 无连接、不可靠、数据报 传输服务
特点
- 应用进程 容易控制,发送什么数据以及何时发送,但是会出现分组的丢失和重复
- 不用建立连接
- 无连接状态
- 首部开销小,只有8个字节(Byte)
结构
UDP数据报首部
4 个字段,每个字段长度都是 2 个字节,共 8 个字节,分别为:
名称 | 所占位数 | 含义 |
---|---|---|
源端口号 | 16 | UDP实现复用和分解 |
目的端口号 | 16 | UDP实现复用和分解 |
长度 | 16 | 指示UDP报文段中的字节数(首部和数据的总和) |
校验和 | 16 | 接收方使用来检测数据包是否出现差错 |
UDP数据报数据
应用层数据
UDP校验和
提供差错检测功能,用于检测UDP报文段从源到目的地传送过程中,其中的数据是否发生了改变
二进制:相加逢二进一
UDP校验和计算的规则
- 所有参与运算的内容按 16位二进制对齐求和
- 求和过程中遇到 溢出(即进位)都被 回卷(即进位与和的最低位再相加)
- 最后得到的和 取反码,就是UDP的校验和,填入UDP数据报头部的 校验和 字段
UDP校验和计算的内容
- UDP伪首部(仅用于计算):源IP地址、目的地IP地址、协议号、UDP长度
- UDP首部
- 应用数据
传输控制协议(TCP)
英文全称:Transmission Control Protocol
Internet 传输层 协议,提供 面向连接、可靠、有序、字节流 传输服务
特点
- 应用进程 先建立连接
- 每一条TCP连接只有 两个 端点
- 可靠交付:无差错、不丢失、不重复、按序到达
- 全双工 通信
- 面向 字节流
流:序列。应用程序和TCP的交互是一个个数据块,TCP把他们看作是无结构字节流
TCP报文段结构
名称 | 所占位数 | 含义 |
---|---|---|
源端口号 | 16 | 复用和分解上层应用的数据 |
目的端口号 | 16 | 复用和分解上层应用的数据 |
序号 | 32 | TCP的序号是对每个应用层数据的 每个字节 进行编码 |
确认序号 | 32 | 期望 从对方接收数据的字节序号,即该字号对应的字节尚未收到,用 ack_seq 标识 |
首部长度 | 4 | 指出TCP段的首部长度,以 4字节 为计算单位 |
保留长度 | 6 | 保留为今后使用,目前值为0 |
URG | 1 | 标志位字段,取值为 0 或 1;紧急 URG = 1,紧急指针 字段有效,优先传送 |
ACK | 1 | 标志位字段,取值为 0 或 1;确认 ACK = 1,确认序号 字段是否有效 |
PSH | 1 | 标志位字段,取值为 0 或 1;推送 PSH = 1,尽快将报文段中的数据交付接收应用进程,不要等待缓存满了再交付 |
RST | 1 | 标志位字段,取值为 0 或 1;复位 RST = 1,TCP连接出现严重错误,释放连接,再重新建立TCP连接 |
SYN | 1 | 标志位字段,取值为 0 或 1;同步 SYN = 1,该TCP报文段是一个建立新连接请求控制段或者同意建立新连接的确认段 |
FIN | 1 | 标志位字段,取值为 0 或 1;终止 FIN = 1,TCP报文段的发送端数据已经发送完毕,请求释放连接 |
接收窗口 | 16 | 向对方通告我方接收窗口的大小,实现TCP的流量控制 |
校验和 | 16 | 计算方法同 UDP 的校验和 |
紧急指针 | 16 | 在 URG = 1 是有效,指出在本TCP报文段中紧急数据共有多少个字节 |
选项 | 长度可变 | 最短为0字节,最长为40字节 |
填充 | 长度可变 | 补充 选项 字段的长度为 4 的整数倍数 |
固定首部:
展位20字节,排除 选项、长度 字段的其他首部字段
TCP首部长度的最长最短:
最短20字节,最长为60字节(选项字段长度可变)
TCP连接管理
三次握手
第一次握手:
客户端向服务器发送连接请求段:SYN = 1, seq = x
SYN = 1:建立连接请求的控制段
seq = x:标识传输的报文段第一个数据字节的序列号是x,此序号列代表整个报文段的序号
客户端进入 SYN_SEND (同步发送)
第二次握手:
服务器发回确认报文段:SYN = 1, ACK = 1, seq = y, ack_seq = x + 1
SYN = 1:同意建立新连接的确认段
ACK = 1:确认序号字段有效
seq = y:服务器告诉客户端确认报文段的序列号是y
ack_seq = x + 1:表示已经收到序列号为x的报文段,准备接收序列号为x + 1 的报文段
服务器由 LISTEN 进入 SYNC_RECV(同步收到)
第三次握手:
客户端对服务器的 同意连接报文段 进行确认:ACK = 1, seq = x + 1, ack_seq = y + 1
ACK = 1:确认序号字段有效
seq = x + 1:客户端此次的报文段的序列号是 x + 1
ack_seq = y + 1:客户端希望接收服务器序列号为 y + 1 的报文段
当客户端发送ACK时,客户端进入 ESTABLISHED 状态
当服务器接收ACK后,服务器进入 ESTABLISHED 状态
第三次握手,可携带数据
四次挥手
第一次挥手:
客户端向服务器发送释放连接报文段:FIN = 1, seq = u
FIN = 1:客户端数据发送完毕,请求释放连接
seq = u:传输的第一个数据字节的序号是u
客户端状态由 ESTABLISTHED 进入 FIN_WAIT_1(终止等待1状态)
第二次挥手:
服务器向客户发送确认段:ACK = 1, seq = v, ack_seq = u + 1
ACK = 1:确认序号字段有效
seq = v:服务器传输的数据序号是v
ack_seq = u + 1:服务器期望接收客户数据序号为u + 1
服务器状态由 ESTABLISTHED 进入 CLOSE_WAIT(关闭等待)
客户端收到ACK段后,由 FIN_WAIT_1 进入 FIN_WAIT_2
第三次挥手:
服务器向客户端发送释放连接报文段:FIN = 1, ACK = 1, seq = v + 1, ack_seq = u + 1
FIN = 1:请求释放连接
ACK = 1:确认序号字段有效
seq = v + 1:表示自己传输的第一个数据字节的序号为v + 1
ack_seq = u + 1:服务器期望接收客户数据序号为u + 1
服务器状态由 CLOSE_WAIT 进入 LAST_ACK(最后确认状态)
第四次挥手:
客户端向服务器发送确认段:ACK = 1, seq = u + 1, ack_seq = v + 1 + 1
ACK = 1:确认序号字段有效
seq = u + 1:表示客户端传输的数据的序号是u
ack_seq = v + 1 + 1:表示客户端期望接收服务器数据序号为v + 1 + 1
客户端状态由 FIN_WAIT_2 进入 TIME_WAIT,等待2MSL时间,进入 CLOSED 状态
服务器在收到最后一个ACK后,由 LAST_ACK 进入 CLOSED
TCP可靠数据传输
可靠:
保证接收方应用进程从缓冲区读出的字节流与发送方发出的字节流是完全一样的,即:无差错、不丢失、不重复、按序到达
最大报文段长度:
英文全称:Maximum Segment Size, MSS,报文段中封装的 应用层数据 的最大长度
TCP实现可靠数据传输服务的工作机制
分段:
应用层数据被 分割 成TCP认为最适合发送的数据块
序号:
发送方对发送的数据包进行 编号,确保数据按序提交给接收方
一个字节占一个序号
TCP报文段的序号 就是报文段中第一个字节的序号
确认:
接收方向发送方 反馈 接收状态,确认是否正确接收数据
TCP通常采用 累计确认
差错检测:
利用差错编码实现数据包传输过程中的 比特差错检测 (甚至纠正)
重传:
发送方 重新发送 接收方没有正确接收的数据,主要针对:三次重复确认 和 计时器超时
三次重复确认:
TCP发送方接收到对相同序号的3次重复ACK(四次确认 = 1次正常确认 + 3次重复确认),则说明被重复确认的报文段已丢失,这时候即便计时器没有超时,也会重发该报文段(快速重传)
计时器:
在发送方引入单一计时器,解决 数据丢失 问题
计时器超时时间设置:
TimeoutInerval = EstimatedRTT(抽样RTT的加权移动平均值) + 4 * DevRTT(偏差RTT)
TCP生成ACK的策略
第一种:
具有所期望序号的报文段按序到达,所有在期望序号及以前的报文段都已被确认。TCP延迟 500ms 发送ACK
例如:接收方收到123,且返回对123的确认。此时,4来了。则接收方等待500ms,再返回ACK5
第二种:
具有所期望序号的报文段按序到达,且另一个按序报文段在等待ACK传输。TCP接收方立即发送累计ACK,确认以上两个按序到达报文段
例如:接收方刚刚收到4,正准备返回ACK5时,此时5来了,则接收方返回ACK6
第三种:
拥有序号大于期望序号的失序报文段到达。TCP接收方立即发送重复ACK,提示下一个期望接收字节的序号。
例如:接收方返回ACK5时,但是6到了。则接收方在空间足够的情况下会先缓存6,否则丢弃6,同时接收方返回三次重复的ACK5
第四种:
收到一个报文段,部分或完全填充数据间隔
例如:接收方收到123,且返回对123的确认。后来又收到了56,这时4来了。则接收方返回ACK7
TCP流量控制
流量控制:
协调发送方与接收方的数据发送与接收速度
在通信过程中,接收方设置报文段的 接收窗口 字段来将窗口大小通知给发送方
TCP拥塞控制
拥塞:
太多的主机以太快的速度向网络中发送太多的数据,超出了网络处理能力,导致大量数据分组拥挤在中间设备队列中等待转发,网络性能 显著下降的现象
拥塞控制:
通过合理调度、规范、调整向网络中发送数据的 主机数量、发送速率、数据量,以 避免 拥塞或 消除 已发生的拥塞
拥塞窗口:
CongWin,发送方一次性可以发送几个分组
连接开始,CongWin = 1MSS
MSS:Maximum Segment Size,1个最大报文段长度
阈值:
临界值
怎么算是报文段丢失
- 收到三次重复确认
- 计时器超时
计时器超时后的变化
新的阈值:为当前 拥塞窗口 的一半
新的拥塞窗口:直接调整 1MSS
调整好新的阈值和新的拥塞窗口后,使用 慢启动、拥塞避免 算法增加拥塞窗口的大小
例子:
发送计时器超时,拥塞窗口为24MSS,阈值为16MSS
新的阈值:24MSS / 2 = 12MSS
新的拥塞窗口:1MSS
拥塞窗口变化:
慢启动阶段:1 - 2 - 4 - 8 - 12
拥塞避免结点:12 - 13 - 14 - x
拥塞预防策略
流量整形技术:
规范主机向网络发送数据的流量
TCP拥塞控制的算法
慢启动:
在TCP连接建立时,每经过1个RTT时间,拥塞窗口 增大一倍,慢启动阶段的阈值为 16MSS
拥塞避免:
当拥塞窗口 大于等于 阈值时,每经过1个RTT,拥塞窗口的值 加1
快速重传:
接收端收到3次重复确认,则推断被重复确认的报文段已经丢失,于是 立即发送被重复确认 的报文段
快速恢复:
当发生3次重复确认时,网络拥塞程度不是很严重
阈值和拥塞窗口的调整方法:
拥塞窗口不再重新从慢启动阶段开始,而是直接从 新的阈值(当前拥塞窗口的一半) 开始,直接进入拥塞避免阶段
窗口调整的基本策略
英文名称:Additive Increase, Multiplicative Decrease, AIMD
网络未发生拥塞时,逐渐“加性”增大窗口
网络拥塞时,“乘性”减小窗口