三个重要问题:滑动窗口、流量控制、拥塞控制
运输层为相互通信的应用进程提供逻辑通信
运输层协议
- 复用:发送方不同的应用进程都可以使用同一个运输层协议传输数据
- 分用:接收方的运输层在剥去报文的首部后能把这些数据正确交付目的应用进程
- 对数据部分进行差错检测
运输层的两个主要协议
- 用户数据报协议UDP
- 传输控制协议TCP
- UDP传送数据前不需要建立连接,不给出确认,不可靠交付
- TCP提供面向连接的服务,传送前建立连接,结束后释放连接,不广播,不多播,可靠交付。用在:电子邮件,远程终端接入(TELNET),万维网,文件传送
运输层的端口
- 运输层使用协议端口号来识别进程
- 报文中的头部都有源端口和目的端口
- 服务器端的端口号:0~1023:常用端口号;1024~49151:登记端口号
- 客户端的端口号:49152~65535:短暂端口号
用户数据报协议UDP
UDP概述
- 特点:无连接,尽最大努力交付,面向报文,没有拥塞控制,支持一对一,一对多,多对一和多对多的交互通信,首部开销小
- 面向报文:UDP对应用层交下来的报文不合并也不拆分。应用程序必须选择合适大小的报文,否则会IP分片
UDP首部格式
- 数据字段和首部字段,8个字节
- 源端口/目的端口/长度(UDP用户数据报的长度)/校验和
- 如果目的端口号不正确,丢弃报文
控制传输协议TCP概述
TCP最主要特点
- 面向连接
- 每一条TCP只能有两个端点,都是点对点的
- 提供可靠交付服务:无差错不丢失不重复按序到达
- 全双工通信
- 面向字节流
- TCP根据对方的窗口值和当前网络拥塞的程度决定一个报文段有多少字节
TCP的连接
- 端点就是套接字(socket):端口号拼接到IP地址
- 每一条TCP连接唯一地被通信两端的两个套接字所确定
可靠传输的工作原理
停止等待协议
- 每发送完一个分组就停止发送,等待对方的确认。收到确认后再发送下一个分组
- 出现差错
- 接收方检测出差错,丢弃分组
- 发送方超过一段时间没有收到确认,就重传前面发送过的分组。这就是超时重传
- 每发送完一个分组就设置一个超时计时器
- 发送完分组后会暂时保留已发送的分组的副本
- 分组和确认分组都有一个编号
- 超时计时器设置的重传时间应当比数据在分组传输的评价往返时间更长一点
- 即使受到重复的分组也要发送确认;收到重复的确认分组就要丢弃
- 这种可靠传输协议成为自动重传请求ARQ
- 为了提高效率,不再发送完分组就等待确认,采用流水线传输,连续发送多个分组
- 使用流水线分组就用连续ARQ协议和滑动窗口协议
连续ARQ协议
- 发送方维持发送窗口:位于发送窗口内的5个分组都可以连续发送出去,不需要等待对方的确认
- 按分组序号从小到大发送
- 每收到一个确认,就把发送窗口向前滑动一个分组的位置
- 接收方使用累积确认,收到几个分组后,对按序到达的最后一个分组发送确认
TCP可靠传输的实现
以字节为单位的滑动窗口
- TCP的滑动窗口以字节为单位
- 确认报文段包含:窗口,确认号。发送号根据这个构造自己的发送窗口
- 发送窗口一般只会向前移动(收到了新的确认)或者不动(没有收到新的确认)
- 向后收缩是因为对方通知的窗口缩小了,但标准不赞成这么做
- 有三个指针,ACK,SND,ACK+Window-1,表示已发送/已确认和已发送/未确认和未发送/允许发送和未发送/不允许发送
- 接受窗口类似。接受方只能对按序收到的数据中的最高序号给出确认,发送的确认号就是期望收到的序号
- 接受到数据后,接受窗口将数据交付主机,接受窗口向前移动,给发送方发送确认。
- 如果发送窗口的序号用完,但没有收到确认,那么必须停止发送
- 发送方的发送窗口根据接收方的接受窗口设置,还会受到网络状态的影响
- 不按序到达的数据会临时存放在接受窗口中
- 接收方必须要有累积确认的功能,减小传输开销
超时重传时间的选择
- TCP最复杂的问题之一
- 报文段的往返时间RTT:报文段发出的时间和收到相应的确认的时间之差
- 加权平均往返时间RTTs:
新的RTTs = (1 - α)x(旧的RTTs) + α x (新的RTT样本)
α为1/8 - 超时重传时间RTO:
RTO = RTTs + 4 x RTTd
RTTd是RTT的偏差的加权平均值:新的RTTd = (1 - β)x(旧的RTTd) + β x |RTTs - 新的RTT样本|
β为0.25 - 计算RTTs时,只要报文段重传了,就不采用其往返时间样本
- 报文重传一次,新的重传时间为2倍的旧的重传时间,当不再发生报文段的重传时,才使用公式计算时间;这叫Karn算法
选择确认SACK
- 能否只传送缺少的数据而不重传已经正确到达的数据?
- 可以,使用SACK。在TCP首部加上允许SACK的选项
TCP的流量控制
利用滑动窗口实现流量控制
- 流量控制:让发送方的发送速率不要太快,让接收方来得及接收
TCP的拥塞控制
拥塞控制的原理
- **防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载
拥塞控制方法
慢开始和拥塞避免
发送方维持一个拥塞窗口cwnd,发送方让自己的发送窗口等于拥塞窗口。网络没有拥塞,窗口增大一点,否则减小,减少注入到网络中的分组数
- 慢开始:由小到大逐渐增大发送窗口(拥塞窗口),每收到一个新的报文段的确认后,拥塞窗口增加至多一个报文段的数值
- 每经过一个传输轮次,拥塞窗口就会加倍(1->1;2->2;4->4)
- 为了防止拥塞窗口cwnd增长过快,设置一个慢开始门限ssthresh
- 未超过门限,使用慢开始,超过使用拥塞避免,相等时都可以
- 拥塞避免:每经过一个RTTcwnd增加1而不是加倍
- 只要出现拥塞,门限设置为出现拥塞时的发送方窗口值的一半,cwnd设置为1,慢开始
- 这两种算法就是AIMD:加法增大,乘法减小
- 拥塞判断:没有按时收到确认