【计算机网络】第三章、传输层

本文深入探讨了互联网传输层,包括TCP和UDP的区别与作用。TCP提供可靠、按序的数据传输,具备流量控制和拥塞控制,而UDP则是无连接的,提供简单、低延迟的服务。多路复用与多路分解在发送和接收过程中起关键作用,确保数据正确送达目标套接字。此外,文章还介绍了可靠数据传输的基本原理和TCP的连接管理,如三次握手和四次挥手。
摘要由CSDN通过智能技术生成

一、概述和传输层服务

传输层和网络层的关系

  • 网络层
    • 主机之间的逻辑通信。
  • 传输层
    • 进程之间的逻辑通信。

Internet传输层概述

  • 发送方
    • 传递一个应用层消息
    • 确定报文段头部值
    • 创建报文段;
    • 传递报文段到网络层。
  • 接收方
    • 从网络层接收报文段;
    • 检查头部值
    • 提取应用层消息;
    • 通过套接字多路分解消息到应用层。
  • TCP
    • 可靠的、按序的交付
    • 提供流量控制
    • 提供拥塞控制
    • 需要连接建立
  • UDP
    • 不可靠、不按序交付
    • 尽力而为
  • 传输层提供
    • 时延保证
    • 带宽保证

二、多路复用与多路分解

dlfy

  • 发送主机多路复用
    • 多个套接字收集数据,用首部封装数据,然后将报文段传递到网络层
  • 接收主机多路分解
    • 使用头部信息将接收到的报文段传递到正确的套接字

多路分解如何工作

  • 主机接收IP数据报
    • 每个数据报有源、目的IPPort(指明了套接字)。
    • 每个数据搬运一个传输层报文段。

无连接多路分解

  • 发送UDP套接字时需指定
    • 目的IP
    • 目的Port
  • 接收UDP套接字时需要
    • 检查报文段中的目的端口号
    • 用端口号指示UDP报文段属于哪个套接字

unconnect

面向连接的多路分解

  • 接收主机使用这四个值来将报文段定位到适合的套接字
    • IP
    • Port
    • 目的IP
    • 目的Port
  • 每个连接的用户都有不同的套接字。
    connection

总结

  • 多路复用/多路分解发生在所有层

Q:为什么TCP用四元组,而UDP只要二元组?
A:

  • UDP套接字仍需要传送自己的源IP和端口给对方,否则对方无法回应请求。
  • 使用UDP传输,不用考虑分组是从哪个客户端来的,所有请求都在同一个套接字处理
  • 用二元组是因为UDP无连接,接收方无需区分发送方

三、无连接运输:UDP(不考)

  • 尽力而为
    • 可能丢失
    • 失序的报文交付到应用程序
  • 无连接
    • 每个UDP段都独立于其他段
  • 为什么有UDP
    • 不需要建立连接
    • 简单
    • 报文段首部
    • 没有/不需要拥塞控制

UDP报文结构

  • 首部开销小
    • 8字节
  • 发送方动作
    • 传递应用层消息
    • 确定UDP头部字段值
    • 创建UDP报文段
    • 传递报文段给IP
  • 接收方动作
    • 接收数据报
    • 检查UDP头部校验和
    • 提取应用层消息
    • 通过套接字多路分解到应用程序
  • 首部格式
    udp

UDP校验和

  • 发送方

    • 将数据看成16bit的整数序列
    • 校验和
      • 数据段内容相加
      • 溢出后在末尾加一
      • 最后求反码
    • 发送者将校验和值放入UDP的校验和域。
  • 接收方

    • 计算接收到数据段的校验和
    • 检查
  • 例子
    checksum

  • 伪首部

    • 为了计算校验和
      head

Q:为什么UDP校验和要算和的反码?
A:

  • 接收者可以直接将所有16bit数据段和校验和一起加起来检验,最后判断是否为全1简单高效

四、可靠数据传输原理

构造可靠数据传输协议

版本特点
rdt1.0假设信道是完全可靠的
rdt2.0增加了ACK和NAK
rdt2.1NAK进行编号
rdt2.2用冗余ACK代替NAK
rdt3.0增加了定时器

在这里插入图片描述

流水线可靠数据传输协议

  • 流水线
    • 允许发送多个、传输中的、没有确认的报文。
    • 序号数目范围增加
    • 双方必须有缓冲区
  • 两个通用形式
    • Go-Back-N
    • 选择性重传

回退N步

gbn

发送方

  • 窗口大小为N,允许连续未被确认的分组进行传输。
  • 分组头部需要k比特表示窗口大小。
  • 累积确认cumulative ACK
    • ACK(n):确认收到n之前的分组。
    • 接收到ACK(n):移动窗口到n+1
  • 第一个传输出去的分组设置定时器

接收方

  • 总是为正确接收最高序号的分组发送ACK
    • 可能产生重复的ACK
    • 只需要记住最早还没确认的位置。

使用技术

  • 序号
  • 累积确认
  • 校验和
  • 定时器
  • 重传

选择性重传

sr

接收方

  • 分别确认所有正确接收的分组
    • 缓存分组
    • 最后按序上传
  • 分组在[rcvbase, rcvbase+N-1]
    • 发送ACK(n)
    • 失序:缓存
    • 有序:上传并滑动窗口
  • 分组在[rcvbase-N,rcvbase-1]
    • 说明该分组为重复分组
    • 发送ACK(n)

发送方

  • 分别重传没有收到确认ACK的分组
    • 每一个没有确认的分组都维持一个定时器。
  • 发送窗口
    • N个连续的序号
    • 限制已发送但未确认的分组数量
  • ACK(n)[sendbase,sendbase+N]
    • 标记分组n被接收
    • 如果n最小的未确认分组,则滑动窗口。

Q:序号空间和窗口长度的关系是什么?
A:

  • 窗口长度小于等于序号空间的一半。

使用技术

  • 序号
  • 逐个确认
  • 校验和
  • 定时器
  • 重传(选择性

五、面向连接的传输:TCP

TCP连接

  • 点到点
  • 可靠、有序的字节流
  • 全双工数据
    • 同一个连接上有双向数据流。
  • MSS(maximum segment size)最大段长度
    • 应用层报文最大大小,默认1460字节。
  • MTU(maximum transmit unit)最大传输单元
    • 网络层报文最大大小,默认1500字节。
      M S S = M T U − l e n g t h T C P   h e a d e r − l e n g t h I P   h e a d e r = M T U − 20 − 20 MSS=MTU-length_{TCP\ header}-length_{IP\ header}=MTU-20-20 MSS=MTUlengthTCP headerlengthIP header=MTU2020
  • 累积确认
  • 流水线
    • 拥塞和流量控制时,设置滑动窗口大小。
  • 面向连接
    • 数据交换前,初始化发送方与接收方状态,进行握手(交换控制信息)。
  • 流量控制
    • 发送方不能淹没接收方。

TCP报文长度

tcp

  • 序号(Seq

    • 报文段中第一个字节在字节流中的位置编号。
  • 确认号(ACK

    • 期望从对方收到的下一个字节的序号
    • 累积确认
      A C K = S e q + l e n ( m e s s a g e ) S e q = A C K ACK=Seq+len(message)\\Seq=ACK ACK=Seq+len(message)Seq=ACK
      ack
  • TCP首部是变长的,所以有首部长度字段。

    • UDP首部固定,就没有这个字段。

往返时间(RTT)的估计与超时

  • SampleRTT
    • 从发送报文段到接收到ACK测量时间(忽略重传)。
    • 取最近的多次测量平均,不仅仅是当前SampleRTT
    • 会变化,但希望估计出来的RTT比较平滑。
  • 指数加权移动平均(EWMA
    E s t i m a t e d R T T = ( 1 − α ) ∗ E s t i m a t e d R T T + α ∗ S a m p l e R T T EstimatedRTT=(1-\alpha)*EstimatedRTT+\alpha*SampleRTT EstimatedRTT=(1α)EstimatedRTT+αSampleRTT
  • 超时间隔=估计RTT+安全余量
    T i m e o u t I n t e r v a l = E s t i m a t e d R T T + 4 ∗ D e v R T T TimeoutInterval=EstimatedRTT+4*DevRTT TimeoutInterval=EstimatedRTT+4DevRTT
  • 安全余量
    D e v R T T = ( 1 − β ) ∗ D e v R T T + β ∗ ∣ S a m p l e R T T − E s t i m a t e d R T T ∣ DevRTT=(1-\beta)*DevRTT+\beta*|SampleRTT-EstimatedRTT| DevRTT=(1β)DevRTT+βSampleRTTEstimatedRTT

可靠数据传输

  • 流水线发送报文段
  • 考虑早期丢失ACK的累积确认
  • 使用单个重传计时器
  • 重传触发事件
    • 超时
    • 重复
  • 三个主要事件
    • 从应用程序接收数据
    • 超时
    • 收到ACK
  • 快速重传
    • 收到重复的ACK,直接发送具有最小序号的未确认的报文段。

流量控制

  • 接收方控制发送方
    • 使得发送方不会发得太多太快,导致接收方缓冲区溢出。
  • TCP头部加入了rwnd,通告其接收缓冲区剩余空间
    r w n d = R c v B u f f e r – ( L a s t B y t e R c v d – L a s t B y t e R e a d ) rwnd = RcvBuffer – (LastByteRcvd – LastByteRead) rwnd=RcvBuffer(LastByteRcvdLastByteRead)

TCP连接管理(不考)

建立连接——3次握手

  • 发送方/接收方在进行数据交换之前,需先进行握手
    • 同意建立连接(彼此知道对方愿意建立连接)
    • 同意连接参数(例如,初始序号 seq #, 接收缓冲区大小 rcvBuffer
      TCP3

关闭连接——4次挥手

close
real

六、拥塞控制原理(不考)

拥塞原因与代价

  • 拥塞原因
    • 太多的源发送太多太快的数据,使网络来不及处理。
  • 拥塞表现
    • 丢包(路由器缓冲区溢出)
    • 时延长(路由器缓冲区中排队)

拥塞控制方法

  • 端到端的拥塞控制
    • 不从网络中得到明确的反馈
    • 从端系统根据观察到的时延和丢失现象推断出拥塞。
  • 网络辅助拥塞控制
    • 路由器利用数据流通过拥塞的路由器,向发送/接收主机提供直接反馈。
    • 可以指示拥塞级别或明确设置发送速率
    • 指示发送方按照一定速率发送。

七、TCP拥塞控制

拥塞控制:AIMD

  • 方法
    • 发送方增加发送速率直到丢包(拥塞)发生,然后在发生丢包事件时降低发送速率。
      aimd
  • 乘性减 (Multiplicative decrease) 的发送速率
    • 检测到 3 个重复 ACK,减半 (TCP Reno)
    • 由于超时而发生丢包,降低到 1 MSS(maximum segment size) (TCP Tahoe)

拥塞控制:详情

  • TCP发送动作
    • 发送cwnd字节,在 RTT 时间内等待 ACKs,然后发送更多的字节。
      L a s t B y t e S e n t – L a s t B y t e A c k e d ≤ c w n d LastByteSent – LastByteAcked ≤ cwnd LastByteSentLastByteAckedcwnd

拥塞控制:三阶段

慢启动

  • 当连接开始的时候,以指数速率增加发送速率,直到第1次报文丢失事件发生为止。
    • 初始 c w n d = 1   M S S cwnd=1\ MSS cwnd=1 MSS
    • 每经过一个RTTcwnd翻倍。
    • 每收到一个ACK,增加cwnd

初始速率很低,但以指数快地增加!

拥塞避免

  • cwnd达到阈值ssthresh若超过,则cwnd取值ssthresh),就从慢启动指数增长)变为线性增长
    • ssthresh在丢包之后,变为cwnd的一半。
      yongse

快速恢复

  • 收到3个重复ACK
    • s s t h r e s h = c w n d / 2 , c w n d = s s t h r e s h + 3 ∗ M S S ssthresh = cwnd/2, cwnd = ssthresh + 3*MSS ssthresh=cwnd/2,cwnd=ssthresh+3MSS
    • 对于引起TCP进入快速恢复的缺失报文段,对收到的每个重复ACKcwnd = cwnd + 1*MSS,依旧处于快速恢复状态。

总结

  • 初始阈值 ssthresh = 64KB (或16MSS),初始窗口 cwnd = 1
  • cwnd < ssthresh 时,发送方处于慢启动阶段,cwnd 指数增长
  • cwnd ≥ ssthresh 时,发送方处于拥塞避免阶段,cwnd 线性增长
  • 当出现3个重复ACK事件时
    • s s t h r e s h = c w n d / 2 T C P   R e n o : c w n d = s s t h r e s h + 3 ∗ M S S T C P   T a h o e : c w n d = 1 ssthresh = cwnd/2\\TCP\ Reno:cwnd = ssthresh + 3*MSS \\TCP\ Tahoe:cwnd = 1 ssthresh=cwnd/2TCP Reno:cwnd=ssthresh+3MSSTCP Tahoe:cwnd=1
    • 发方进入快速恢复阶段,此时每收到一个重复的ACKcwnd 则增加 1 MSS;如果收到新的ACKcwnd = ssthresh
  • 当出现超时事件时, s s t h r e s h = c w n d / 2 c w n d = 1 ssthresh = cwnd/2\\cwnd = 1 ssthresh=cwnd/2cwnd=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值