第三章 传输层

是除应用层外唯一的端到端层,即只存在于端系统,路由器等网络设备中实现
提供端到端报文传输服务
在传输层角度,端不是主机,而是其中应用程序

基本服务

核心任务:提供端到端逻辑通信服务
两个主要协议:TCP,UDP
分段:将应用层报文切分并封装上首部信息(用于分解)成传输层报文段,反过程为重组
其他重要功能:差错检验,复用,分解,流量控制,拥塞控制

寻址和端口

标识应用进程的寻址方式:IP地址+端口号port

端口号

共16位,即65536个
0-1023为熟知端口号

复用和分解

复用:同一主机,多个应用程序利用同一传输协议进行网络通信
分解:根据首部信息,将接收到的报文段交付给正确应用程序
关键:传输层协议唯一标识一个套接字

无连接的多路复用和分解

重要依据:创建UDP套接字时自动分配或使用bind()绑定端口号
UDP报文段包括:应用数据,源端口号,目的端口号
通过目的端口号实现将报文段分解到相应套接字
唯一标识一个UDP套接字:目的IP地址,目的端口号
目的IP地址位于网络层IP数据报首部字段

面向连接的复用和分解

唯一标识TCP套接字四元组:源/目标ip,端口
也唯一标识TCP连接
两种Ip地址位于网络层IP数据报首部字段
端口号位于TCP报文段首部字段

等-停与滑动窗口

TCP报文段要交给IP传送,IP只提供尽力服务,即不可靠数据传输服务
因此需要在不可靠的网络层基础上实现可靠数据传输

可靠数据传输

理想传输信道:不产生差错,按序交付
可能出现的问题:

  • 比特差错
  • 乱序
  • 数据丢失
    实现可靠传输的措施:
  • 差错检验:通过数据上冗余差错编码信息,实现传输过程比特差错检验与纠正
  • 确认:基于差错编码,如果接收方确认数据没差错,则发送ACK数据包,即肯定确认,否则发送NAK数据包,即否定确认
  • 重传:如果发送方收到NAK,重新发送
  • 序号:解决乱序到达与重复接收并提交问题
  • 计时器:计时器超时未收到接收方确认,则重发

停-等协议

最简单的自动重传请求协议ARQ
基本策略:
发送一个报文段后,停下来等待接收方确认,NAK或超时则重发

变化与细节

  1. ACK与NAK也需要差错检验,如果发送方发现有差错,采取有错推断原则
  2. 序列号只需要一位,即0和1两种,模2运算实现向前移动
  3. 一般不实用NAK,通过ACK加序列号发送,重复ACK序列号组合视为NAK
  4. 计时器过短会导致过多数据重传,过长会导致传输对数据包丢失反应迟钝

滑动窗口协议

解决停-等协议信道利用率低的问题
信道利用率:
发送信息时间与总时间只比
由于RTT远远大于发送时间,所以停-等低
例题与公式见P102
解决思路:

  • 增加序列号范围,以标记多个同时发送的数据包
  • 发送方或接收方需缓存多个分组,保证按序提交

流水线协议(管道协议)

在等待确认之前,连续发送多个分组
如3个,则引导利用率提高三倍
最典型的流水线协议:滑动窗口协议

滑动窗口协议

发送方需缓存已发送但未收到确认的分组,方便重发
接收方需缓存已正确接收的分组,实现按序提交
即发送方和接收方各维护一个窗口Ws和Wr
最具代表性的为:

  • 回退N步协议GBN
  • 选择重传协议SR

GBN

发送端缓存能力较强,即Ws较大,Wr往往为1
只要发送窗口不满就能持续发送
累计确认方式:
当收到ACKn表示n以下的数据都已被正确接收,窗口滑动至n+1并重启计时器
当n小于窗口基序号,不予理会
只有一个计时器,指向窗口基序号,超时,重发所有窗口中分组
优点:接收方操作简单
缺点:会丢弃所有未按序到达分组,浪费网络资源
适用于:信道丢包率低,误码率低,接收方缓存能力低的情况

SR

避免正确到达分组被接收方丢弃
增加接收方缓存能力,Wr>1,往往Ws=Wr
减少不必要的重传,改进协议性能
发送方仅重传未被正确接收的分组
在两个窗口中必须有足够序列号位数k,实现每一个分组序列号唯一,即窗口总数=2^k

无论GBN还是SR,引导利用率都是Ws倍停等

用户数据报协议UDP

提供无连接,不可靠,尽力传输服务
可能乱序到达,没有拥塞控制
有复用,分解与简单差错检验,几乎与网络层的IP相同
通过设计可靠传输机制,可以实现可靠传输
典型应用:DNS,媒体应用等希望速率高,且能容忍部分数据丢失的情况
优点:

  • 容易控制发送什么数据与何时发,无拥塞控制,传输速率更高
  • 无需建立连接,更少时延
  • 无需维护连接状态,系统开销小
  • 首部开销小:8字节,TCP20

UDP数据报结构

首部四个字段,每个2字节

  • 源端口号
  • 目的端口号
  • 长度
  • 校验和

校验和

检验传输过程,数据是否发生过改变
所有数据按16位对齐,依次相加,最高位进位的数字加到最低位,最后将结果取反,得到校验和
没有差错恢复能力,丢弃错误报文段,或交给应用层,由应用层决策如何处理

传输控制协议TCP

必须先建立TCP连接,最后释放
无差错,不丢失,不重复
面向字节流:TCP把数据视为无结构字节流
全双工通信:通信双方都能随时向信道发送和接收数据,两端也设有缓存
发送时,TCP可以从缓存中取出数据并放入报文段
取出的数据量受限于最大报文段长度MSS,即报文段封装的应用层数据的最大长度
接收时,TCP将数据放入缓存,供应用程序适时读取
TCP将大文件划分成长度为MSS的若干块,

三次握手

图见P116

  • 第一次握手:
    • A的TCP向B发出连接请求报文段(SYN段)
    • 不含应用层数据
    • 同部位SYN为1
    • 指定初始序列号seq=x
    • SYN段要消耗一个序号
    • 此时A处于SYN_SENT状态
    • B处于LISTEN状态
  • 第二次握手
    • 如果B同意连接,发回确认报文段(SYNACK段)
    • 不包含应用层数据
    • SYN=1
    • ACK=1
    • 确认序号ack_seq=x+1
    • 自己选择的初始序号seq=y
    • 此时B处于SYN_RCVD状态
  • 第三次握手
    • A接收到SYNACK段,向B发送确认报文段
    • 可携带应用层数据
    • ACK=1
    • SYN=0(因为已完成连接)
    • seq=x+1
    • ack_seq=y+1
    • 此时A处于ESTABLISHED 状态
    • B收到确认消息后也进入ESTABLISHED状态

为什么不用二次握手

  • 确保双方完全了解对方状态
  • 预防过期,失效的连接申请到达,导致半连接,即只有一方建立了连接

四次挥手

任何一方都能请求终止连接,释放资源

  • 第一次挥手
    • A向B发送释放连接报文段
    • FIN=1
    • seq=u
    • 此时A处于FIN_WAIT状态,能收不能发数据
  • 第二次挥手
    • B向A响应
    • ACK=1
    • seq=v
    • 确认序号ack_seq=u+1
    • B处于CLOSE_WAIT状态,仍可发数据
  • 第三次挥手
    • B向A发送释放连接报文段
    • FIN=1
    • seq=w
    • 确认序号ack_seq=u+1
    • 此时B处于LAST_ACK,不再能发送数据
  • 第四次挥手
    • A向B发送响应
    • ACK=1
    • seq=u+1
    • ack_seq=w+1
    • A发送后进入TIME_WAIT,为确保另一端能正确接收到,等待一段时间后再CLOSE
    • 等待时机为2最大段生存时间MSL
    • B收到后CLOSE

可靠数据传输

实现机制:

  • 差错编码
  • 确认:累积确认
  • 序号:每个字节编号
  • 重传:主要针对计时器超时和三次确认
  • 计时器:单一的重传计时器,自适应算法设置超时时间,当报文传送给IP,启动计时器
    基于:滑动窗口协议,发送窗口大小动态变化,即
    Ws=流量控制(接收端窗口)RcvWin与拥塞控制窗口CongWin中最小值

超时时间

比RTT大一些即可
通过RTT采样SampleRTT来估计RTT大小,即某报文段发出到确认收到时间间隔,取未重传的某次发送时间
由于SampleRTT会随网络情况波动,因此采用:
指数加权移动平均的方法来计算均值EstimatedRTT
公式见P120
阿尔法为加权系数,通常为0.125
越新的RTT计算新均值权重越大
RTT偏差DevRTT用于表现变化程度,即网络平稳程度,越小越平稳
贝塔为加权系数,通常为0.25
超时时间TimeoutInterval=ERTT+4DevRTT
超时即发送发送窗口基序号SendBase指向的报文段
同报文段每次重传下一次超时时间都是之前的两倍,而不是上面计算出的值,即指数型增长,这也增加了端到端延迟,因此添加了:
快速重传,即收到3次同样ACK即视为NAK,立即重发
注意:

  • 此处为第四次收到ack_seq=x,即重发seq=x
  • 发送seq期待收到的ack_seq为期待的下一个数据的序号

流量控制

即控制发送窗口大小
避免发送方速度太快,超过接收方接收能力,导致被淹没
不仅用于传输层,也用于数据链路层
TCP首部2字节告知接受窗大小,发送窗不能超过该值

拥塞控制

避免发送方速度太快,超过网络处理能力,数据拥挤在中间设备
分为拥塞预防和拥塞消除
通过超时和三次重复ack判断是否发生拥塞
通过窗口大小调节发送速率

基本策略

发送端维持一个拥塞窗口CongWin,表示未收到确认的情况下,可连续发送的字节数,初始为1MSS
未发生拥塞时,加性增大窗口
发生时,乘性减小窗口
即AIMD
这是一种拥塞消除
一般分为:

  • 慢启动阶段:每收到一个确认,CongWin+1MSS,即每经过一个RTT,翻倍
  • 拥塞避免阶段:CongWin达到阈值Threshold后,每个RTT,发送的报文段全部确认后,CongWin+1MSS
  • 发生拥塞:
    • Threshold=CongWin/2
    • CongWin=1MSS
    • 称为TCP Tahoe算法
  • 快速重传:收到3次重复确认,立即发送重复确认报文段
  • 快速恢复:
    • 当发生超时,表示拥塞严重
    • 当发送三次确认,表示拥塞不严重,直从新阈值开始,进入拥塞避免阶段
    • 称为TCP Reno算法
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信