传输层
传输层
3.1 传输层服务和协议
- 传输层协议:提供应用进程之间的逻辑通信机制(不同host)
- 位于网络层之上
- 依赖于网络服务
- 对网络层服务进行增强(可能)
- 网络层协议:提供主机之间的逻辑通信机制
Internet传输层协议
- TCP(传输控制协议)
- 可靠数据传输
- 拥塞控制
- 流量控制
- UDP(用户数据包协议)
- 不可靠服务(“尽力而为”)
- 进程到进程的数据交付和差错检查(最低限度)
- 两个服务均不保证延迟和带宽
3.2 多路复用与多路分解
多路复用
- 从多个Socket接收数据,为每个数据封装上头部信息,生成Segment,交给网络层
多路分解
- 传输层依据头部信息将收到的Segment交给正确的Socket
工作流程
- 报文段格式
- 源端口号、目的端口号、其他头部信息、应用数据(报文)
- 端口号:16比特的数,大小在0~65535之间(0~1023为周知端口号)
- 源端口号、目的端口号、其他头部信息、应用数据(报文)
- 无连接
- 一个UDP套接字由二元组标识:(目的IP地址,目的端口号)
- 主机根据这两个值将报文段导向相应的Socket
- 来自不同源IP地址和/或源端口号的IP数据包,但具有相同的目的IP地址和目的端口号,将被导向同一个Socket
- 面向连接
- 一个TCP套接字由四元组标识:(源IP地址,源端口号,目的IP地址,目的端口号)
- 主机根据这四个值将报文段导向相应的Socket
- Web服务器与TCP(多线程)
- 通常只使用一个进程,为每个客户连接创建一个具有新连接套接字的新线程(线程可看作一个轻量级的进程)
3.3 UDP
User Datagram Protocol
特点与应用
- 无需建立连接
- 无需维护连接状态
- 分组首部开销小
- 没有拥塞控制:应用可更好地控制发送时间和速率
- 问题:UDP中缺乏拥塞控制,能够导致UDP发送方和接收方的高丢包率(路由器有大量分组溢出),并挤跨TCP会话 - 常用于流媒体应用,还有DNS和SNMP - 使用UDP的应用是可能实现可靠数据传输的
UDP报文段格式
- 首部 (8B)
- 源端口号、目的端口号
- 长度:UDP报文段的字节数(首部+数据)
- 检验和:差错检测
- 应用数据(报文)
UDP检验和
- 端到端原则
- 发送方
- 将报文段的所有16bits进行和运算,然后对和进行反码运算(求和式遇到溢出都要被回卷)
- 进行运算的数据:伪首部+首部+报文(checksum字段不参与计算)
- 接收方
- 计算所收到的报文段的所有16bits的和
- 然后与检验和相加,观察是否全位1
- 若不是:出现错误
- 若是:未检测出错误(但可能仍有错误)
3.4 可靠数据传输原理
- 不错、不丢、不乱
- 发送端和接收端双向的信息流动
- rdt:可靠数据传输协议
- FSM:有限状态机
1)经完全可靠信道:rdt1.0
2)经具有比特差错信道:rdt2.0
- 不可靠信道:比特差错
- ARQ协议(Automatic Repeat reQuest)
- 差错检测:与UDP的检验和字段类似
- 确认机制:ACK(肯定确认)和NAK(否定确认)
- 重传:接收到NAK后,重传分组
- 停等协议:发送方处于等待ACK或NAK的状态时,它不能从上层获得更多的数据
3)ACK/NAK消息发生错误:rdt2.1和rdt2.2
4)经具有比特差错的丢包信道:rdt3.0
流水线可靠数据传输协议
- 原因:停等协议的利用率过低,限制了网络底层协议所能提供的能力
- 流水线协议:允许发送方在收到ACK之前连续发送多个分组
- 需要更大的序列号范围
- 发送方和接受方需要更大的存储空间来缓存分组
GBN协议(回退N步)
别称:滑动窗口协议
|名词|解释| |:–:|:–:| |基序号(base)|最早未确认分组的序号| |下一个序号(nextseqnum)|最小的未使用序号| |窗口长度(N)|最多允许有N个等待确认的消息| |扩展FSM|增加了变量的FSM|
- 发送方
- 分组头部包含k-bits序列号(模$2^k$运算)
- 对窗口是否已满进行判断
- 接受ACK(n):采用累积确认,即序列号n及以前的分组均已被正确接收
- 超时事件:发送方重传所有已发送但还未确认过的分组
- 分组头部包含k-bits序列号(模$2^k$运算)
- 接收方
- ACK机制:发送拥有最高序列号、已被正确接收的分组的ACK(即该分组按序)
- 可能产生重复ACK
- 接收方只需维护的信息:下一个按序接收的分组的序号(expectedseqnum)
- 对于乱序到达的分组,直接丢弃
- ACK机制:发送拥有最高序列号、已被正确接收的分组的ACK(即该分组按序)
- 举例
SR协议(选择重传)
- 发送方只重传那些没有收到ACK的分组
- 为每个分组设置定时器
- 接收方对每个分组单独进行处理
- 发送方
- 超时
- 收到ACK:若分组在窗口内,则标记为已接收;若分组序号为send_base。则窗口向前移动到最小序号的未确认分组处
- 接收方
- 序号在[rcv_base, rcv_base+N-1]内的分组被正确接收,则发送ACK给发送方(若是之前未收到过,则缓存)。同样,若分组为基序号,则移动窗口
- 序号在[rcv_base-N, rcv_base-1]内的分组被正确收到,必须产生一个ACK,即使是之前已确认过的
- 其他情况,忽略该分组
- 滑动窗口协议的窗口大小
- $W_s+W_r\leq 2^k$
- 对于GBN协议$W_r = 1$,则$W_s\leq 2^k-1$
- 对于典型的SR协议$W_r = W_r = W$,则$W_s\leq 2^{k-1}$
- 对于停等协议$W_s=W_r=1$
- 信道利用率
- \[U=\frac{W_s\times t_{Seg}}{t_{Seg}+RTT+t_{ACK}}\]
- \(U=\frac{W_s\times L}{L+2dpR+L^{'}}\)($dpR$为时延带宽积,$L$为报文段长度,$L^{‘}$为$ACK$长度)
3.5 TCP
Transmission Control Protocol
概述
TCP报文段结构
- 首部
- 源端口号、目的端口号(共4B)
- 序号(4B)
- 该报文段首字节的字节流编号
- 建立TCP连接时,双方随机选择序列号
- 确认号(4B)
- 希望收到的下一个字节的序列号
- 累积确认
- 首部长度
- 标志字段:ACK、SYN、FIN……
- 接收窗口
- 因特网检验和
- 紧急数据指针
- 选项:协商MSS或其他
- 数据
- 最大报文长度MSS:报文段里应用层数据的最大长度
RTT和超时
- 采用超时/重传机制
- 使用单一的重传定时器
- SampleRTT:测量从段发出去到收到ACK的时间
- 均值:$EstimatedRTT = (1-\alpha)·EstimatedRTT + \alpha·SampleRTT$
差值:$DevRTT = (1-\beta)·DevRTT + \beta· SampleRTT-EstimatedRTT $ - 超时时间:$TimeoutInterval = EstimatedRTT+4·DevRTT$
双方发送流程
- TCP发送方事件
- 从应用层收到数据
- 创建Segment
- 序列号时Segment第一个字节的编号
- 开启计时器
- 设置超时时间:TimeoutInterval
- 超时
- 重传引起超时的Segment(最小序号还未被确认的报文段)
- 重启定时器
- 收到ACK
- 如果ACK的字段值>SendBase
- 更新SendBase
- 如果窗口中还有未被确认的分组,重新启动定时器
- 如果ACK的字段值>SendBase
- 从应用层收到数据
- TCP接收方事件
- 所期望序号的Segment到达:延迟ACK,等待下一个按序Segment的到达;等不到则发送ACK(一般最多等待500ms)
- 所期望序号的Segment到达且另一个按序报文段等待ACK传输:立即发送单个累积ACK,以确认两个序号报文段
- 比期望序号大的Segment到达:立即发送冗余ACK
- ……
- 超时间间隔
- 每次TCP重传时都会将下一次的超时间间隔设为先前值的两倍
- 定时器在另外两个事件中的任一个启动时,TimeoutInterval再由最近的Estimated和DevRTT推算得到
- 快速重传
- 当发送方收到对同一数据的3个冗余ACK,立即快速重传(TCP不使用否定确认)
流量控制(Flow Control)
- 实质是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配
- 发送方维护接收窗口的变量
- LastByteRcvd - LastByteRead $\leq$ RcvBuffer
- 接收窗口:rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]
- LastByteSent - LastByteAcked $\leq$ rwnd(确保接收方的接收缓存不会溢出)
- 当主机B的接收窗口为0时:主机A继续发送只有一个字节数据的报文段(防止主机A被堵塞而不能再发送数据)
TCP连接管理
- 建立连接:三次握手
次序 事件 说明 第1次 客户端发送SYN报文段 SYN字段置1,随机选择一个初始序号client_isn 第2次 服务器发送SYNACK报文段 SYN字段置1,确认号字段置client_isn+1,选择自己的初始序号server_isn;并且为该TCP连接分配缓存和变量 第3次 客户端发送报文段进行确认 SYN字段置0,确认号字段置server_isn+1,序号为client_isn+1;负载可携带数据;并且为该连接分配缓存和变量
- 关闭连接
次序 事件 说明 第1次 客户端发送报文段 FIN置1 第2次 服务器返回ACK 第3次 服务器发送报文段 FIN置1 第4次 客户端返回ACK 客户端等待一段时间,然后关闭连接,释放资源 - Time_wait
- 保持连接正常终止
- 让重复字节包在网络中消失
- TCP状态序列
- SYN洪泛攻击
- cookie
3.6 拥塞控制原理
- 表现
- 分组丢失(路由器缓存溢出)
- 分组延迟过大(在路由器缓存中排队)
成因和代价
- 两个发送方和一台具有无限大缓存的路由器
- 两个发送方和一台具有有限缓存的路由器
- 4个发送方和具有有限缓存的多台路由器及多跳路径
拥塞控制方法
端到端拥塞控制
- 网络层不需要显示的提供支持
- 网络通过观察loss、delay等网络行为判断是否发生拥塞
- TCP采取这种方法
网络辅助的拥塞控制
- 路由器向发送方显示地反馈网络拥塞信息
- 简单的拥塞指示(1bit):SNA,DECbit,ATM……
- 指示发送方应该采取何种速率
- ATM ABR拥塞控制(available bit rate)
- “弹性服务”:若发送方路径“underloaded”,则使用可用带宽;若发送方路径拥塞,则将发送速率降到最低保障速率
- RM(resource management) cells
- 由发送方发送
- 交换机设置RM cell位
- NI bit:rate不许增长
- CI bit:拥塞指示
- RM cell由接收方返回给发送方
3.7 TCP拥塞控制(Congestion Control)
- 拥塞窗口:cwnd
- LastByteSent - LastByteAcked $\leq$ min{cwnd, rwnd}
- 方法:AIMD(加性增、乘性减)
- Additive Increase:每个RTT将cwnd增大一个MSS(拥塞避免)
- Multiplicative Decrease:发生loss(3个冗余ACK),cwnd减半
1. 慢启动SS
- 初始:cwnd = 1MSS
- 每收到一个ACK,cwnd+=1MSS(指数型增长)
结束:
事件 说明 超时 cwnd置为1,ssthresh置为cwnd/2,重新开始慢启动 cwnd$\geq$ssthresh 进入拥塞避免模式 检测3个冗余ACK 执行快速重传,并进入快速恢复模式
2. 拥塞避免
- 每个RTT只将cwnd的值增加一个MSS(线性增长)
结束:
事件 说明 超时 cwnd置为1,ssthresh置为cwnd/2,进入慢启动 检测3个冗余ACK 执行快速重传,并进入快速恢复模式
3. 快速恢复
- ssthresh = cwnd/2
- cwnd = ssthresh+3·MSS
结束:
事件 说明 超时 cwnd置为1,ssthresh置为cwnd/2,进入慢启动 得到新的ACK cwnd = ssthresh,进入拥塞避免模式 - 案例:TCP Reno
This post is licensed under CC BY 4.0 by the author.