返回

计算机网络-传输层

计算机网络学习笔记-传输层

传输层概述

传输层的基本理论和基本机制

  • 多路复用/分用
  • 可靠数据传输机制
  • 流量控制机制
  • 拥塞控制机制

Internet的传输层协议

  • UDP(User Datagram Protoco):用户数据报协议
    • 无连接传输服务
    • 不可靠(尽力而为)的交付服务
  • TCP(Transmission Control Protocol):传输控制协议
    • 面向连接的传输服务
    • 可靠的、按序的交付服务
    • 拥塞控制
    • 流量控制
    • 连接建立
  • 两种服务均不保证延迟和带宽

传输层的服务和协议

传输层协议为运行在不同HOST(主机 / 端)上的进程之间提供了一种逻辑通信机制

逻辑通信机制

两个进程之间仿佛是直接连接的,它不需要关心这中间有多远的物理距离、经过了多少个路由器、使用了哪些物理层的媒介

端系统上运行传输层协议的作用

发送方:将应用递交的消息/报文分成一个或多个的Segment(段),并向下传给网络层

接收方:将接收到的Segment(段)组装成消息/报文,并向上交给应用层

传输层和网络层的异同

网络层:提供主机之间的逻辑通信机制

传输层:提供进程间的逻辑通信机制

  • 位于网络层之上
  • 依赖于网络层服务
  • 对网络层服务进行(可能的)增强

复用和分用

发送端进行多路复用

从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层

接收端进行多路分用

传输层依据头部信息将收到的Segment交给正确的Socket,即不同的进程

tips:Socket是应用层和传输层之间的“门”

主机接收到IP数据报(datagram)

  • 每个数据报携带源IP地址、目的IP地址
  • 每个数据报携带一个传输层的段(Segment)
  • 每个段携带源端口号和目的端口号

主机接受到Segment后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket

  • TCP做更多的处理

无连接的多路分用

接收端利用端口号创建Socket

UDP的Socket用二元组标识

  • 目的IP地址,目的端口号

主机收到UDP段后

  • 检查段中的目的端口号
  • 将UDP段导向在该端口号的Socket

面向连接的多路分用

TCP的Socket用四元组标识

  • 源IP地址
  • 源端口号
  • 目的IP地址
  • 目的端口号

接收端利用所有的四个值将段导向合适的Socket

服务器可能同时支持多个TCP的Socket

  • 每个Socket用自己的四元组标识

Web服务器为每个客户端开不同的Socket

无连接传输协议-UDP

UDP协议在Internet IP协议(网络层)的基础上,做了以下扩展:

  • 多用复用/分用
  • 简单的错误校验机制

UDP的服务模型:

  • “Best effort”服务
  • UDP段可能会丢失或非按序到达

UDP是用户数据报协议,是无连接的:

  • UDP发送方和接收方之间不需要握手
  • 每个UDP段的处理独立于其他段

UDP的优点:

  • 低延迟:无需建立连接
  • 实现简单:无需维护连接状态
  • 头部开销少:8字节
  • 易控制:UDP没有拥塞控制,应用层可更好地控制发送时间和速率

UDP的应用:

  • 流媒体应用:容忍丢失、速率敏感
  • DNS
  • SNMP

如何在UDP上实现可靠数据传输:

  • 在应用层增加可靠性机制
  • 应用特定的错误恢复机制

UDP校验和(checksum)

可靠数据传输的基本原理

概述

可靠:不错、不丢、不乱

rdt(Reliable Data Transfer):可靠数据传输

可靠数据传输协议的基本结构:接口

注意图中的单向数据传输和双向信息流动箭头

网络层的IP协议是不可靠的

利用有限状态机(FSM)刻画传输协议

rdt1.0

可靠信道上的可靠数据传输(过于理想)

底层信道完全可靠

  • 不会发生错误(bit error)
  • 不会丢弃分组

发送方和接收方的FSM独立

rdt2.0

只产生位错误(0和1),不产生其他错误(数据不丢失,数据按序到达)的信道。

底层信道可能翻转分组中的位(bit)

  • 利用校验和检测位错误

如何从错误中恢复:

  • 确认机制(Acknowledgements,ACK):接收方显示地告知发送方分组已正确接受
  • NAK:接收方显式地告知发送方分组有错误
  • 发送方收到NAK后,重传分组

基于这种重传机制的rdt协议称为ARQ(Automatic Repeat request)协议

rdt2.0中引入的新机制

  • 差错检测
  • 接收方反馈控制消息:ACK/NAK
  • 重传

rdt2.1

rdt2.0的缺陷:ACK/NAK可能发生错误/被破坏

解决办法:

  1. 为ACK/NCK增加校验和,检错并纠错
  2. 如果ACK/NCK被破坏,发送方重传
    • 不能简单的重传,会产生重复分组

如何解决重复分组问题:

  • 序列号(Sequence number):发送方给每个分组增加序列号
  • 接收方丢弃重复分组

rdt2.2

无NAK消息协议

rdt2.1功能相同,但是只使用ACK不使用NAK

如何实现:

  • 接收方通过ACK告知发送方最后一个被正确接收的分组
  • 在ACK消息中显式地加入被确认分组地序列号

发送方收到重复ACK之后,采取与收到NAK消息相同地动作

  • 重传当前分组

rdt3.0

信道既可能发生错误,也可能丢失分组

如果分组在发送方到接收方过程中丢失,接收方会一直等待;如果ACK在接收方到发送方过程中丢失,发送方会一直等待

rdt2.X中的校验和+序列号+ACK+重传方法无法解决该问题

解决方法:发送方等待“合理”时间

  • 如果没收到ACK,重传
  • 需要定时器

性能分析:

rdt3.0是一个停等操作

滑动窗口协议

流水线机制与滑动窗口协议

流水线机制

如果允许发送方在收到ACK之前连续发送多个分组就需要:

  • 更大的序列号范围
  • 发送方和/或接收方需要更大的存储空间以缓存分组

滑动窗口协议

滑动窗口协议:Sliding-windows protocol

窗口:

  • 允许使用的序列号范围
  • 窗口尺寸为N:最多有N个等待确认的消息

滑动窗口:

  • 随着协议的运行,窗口在序列号空间内向前滑动

滑动窗口协议:GBN、SR

GBN

GBN(Go-Back-N)协议

GBN中乱序到达的分组直接丢弃

SR中乱序到达的分组进行缓存

SR

SR(Selective Repeat)协议

GBN的缺陷:

重传时会重传很多分组

SR协议的改进:单个确认、不丢弃乱序分组

接受方对每个分组单独进行确认

  • 设置缓存机制,缓存乱序到达的分组

发送方只重传那些没收到ACK的分组

  • 为每个分组设置定时器

发送方窗口

  • N个连续的序列号
  • 限制已发送且未确认的分组

发送方窗口/接收方窗口

面向连接传输协议-TCP

TCP概述

TCP的特点

TCP提供的是点对点的通信机制

  • 一个发送方,一个接收方

TCP提供的是可靠的、按序的字节流传输机制。

TCP使用了流水线机制,提高了可靠传输的性能

  • 基于TCP拥塞控制和流量控制机制动态调整窗口尺寸

TCP在发送方和接收方都有缓存

TCP是面向连接的传输协议

  • 通信双方在发送数据之前必须建立连接
  • 连接状态只在连接的两端中维护,在沿途节点中并不维护状态
  • TCP连接包括:两台主机上的缓存、连接状态变量、socket等

TCP是全双工的传输机制,连接的双方都要管理和维护连接,通过连接可以实现双向数据流传输

TCP的段结构

在传输层,我们研究和处理的是Segment.

源端口号、目的端口号、序列号、ACK序列号、紧急数据、ACK是否有效、立刻推送数据、连接的建立和拆除、接受窗口大小(字节大小)、校验和

TCP段中的序列号(sequence number)和ACK number不是段的编号,而是用数据的字节数来计数。

序列号(sequence number)

序列号指的是segment中第一个字节的编号,而不是segment的编号。

有1k字节的数据拆成两个segment,第二个segment的序列号不是2或1,而是500或501,是字节的编号,而不是segment的个数编号

疑问:为什么要这么做?

建立TCP连接时,双方随机选择开始的序列号。

ACK number

希望接受到的下一个字节的序列号

累计确认:该序列号之前的所有字节均已被正确接收到(GBN)

TCP介于GBN和SR之间,偏向SR

乱序到达的分组由TCP实现者决策

TCP可靠数据传输

概述

  • TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务
  • 流水线机制
  • 累计确认
  • TCP使用单一重传定时器
  • 触发重传的事件
    • 超时
    • 收到重复ACK
  • 渐进式
    • 暂不考虑重复ACK
    • 暂不考虑流量控制
    • 暂不考虑拥塞控制

RTT和超时

Round-Trip Time:往返时间

设置定时器的超时时间

  • 大于RTT

如何估计RTT

  • 测量多次求平均

TCP发送方

  • 从应用层收到数据
    • 创建segment,序列号是segment第一个字节的编号
    • 开启计时器,设置超时时间
    • 超时
      • 重传引起超时的segment并重启定时器
    • 收到ACK
      • 如果确认此前未确认的segment
        • 更新SendBase
        • 如果窗口中还有未被确认的分组,重启定时器

TCP流量控制

为什么要控制流量:

接收方为TCP连接分配缓存(buffer)

上层应用如果处理buffer中数据的速度较慢,可能会产生buffer溢出

流量控制(flow control)

控制发送方不会传输的太多太快以至于淹没接收方

流量控制机制原理

  • 接收方通过在segment的头部字段将RevWindow告诉发送方
  • 发送方限制自己已经发送的但还未收到的ACK数据不超过接收方的空闲RcvWindow尺寸

TCP连接管理

TCP是面向连接的传输协议,所以在进行数据传输之前要建立连接,数据传输完成后要关闭连接。这就需要用到连接管理。

建立连接-三次握手

三次握手即建立连接的三个阶段

  • 客户端主机发送TCP SYN段给服务端主机
    • SYN标志位置为1,不发送数据,只告诉服务端需要建立连接
    • 初始化序列号
    • 段中
  • 服务端主机接收到SYN段,答复SYNACK段
    • 服务端为该连接建立缓存
    • 初始化序列号
  • 客户端主机收到SYNACK段,答复ACK段
    • SYN标志位不置为1,可以发送数据

关闭连接

  • 客户机向服务机发送 TCP FIN 控制segment
  • 服务端收到FIN,回复ACK,关闭连接,发送FIN
  • 客户机收到FIN,回复ACK
    • 进入”等待“,如果收到FIN,会重新发送ACK
  • 服务端收到ACK,连接关闭

拥塞控制原理

概述

定义:太多发送主机数据太多,网络无法处理

表现:

  • 分组丢失(路由器缓存溢出)
  • 分组延迟过大(在路由器缓存中排队)

研究对象是网络

流量控制vs拥塞控制

流量控制:控制发送方不要发送的太快,以至于接收方处理不了

拥塞控制:控制发送方不要发送的太快,以至于网络处理不了

拥塞控制的方法

  • 端到端拥塞控制
    • 网络层不需要显式的提供支持
    • 端系统通过观察loss、delay等网络行为判断是否发生拥塞
    • TCP采取这种方法
  • 网络辅助的拥塞控制
    • 路由器向发送方显式地反馈网络拥塞信息
    • 简单的拥塞指示(1 bit):SNA、DECbit、TCP/IP ECN、ATM
    • 指示发送方应该采取何种速率

TCP拥塞控制

基本原理

限制发送方的发送速率 $$ rate = \frac{CongWin}{RTT} $$ 单位:Bytes/sec

CongestionWindow:拥塞窗口

  • 动态调整以改变发送速率
  • 反映所感知到的网络拥塞

如何感知网络拥塞

  • Loss事件:timeout或3个重复ACK
  • 发生Loss时间后,发送方降低速率

如何合理地调整发送速率

加性增——乘性减:AIMD

慢启动:SS

加性增——乘性减

**原理:**逐渐增加发送速率,谨慎探测可用带宽,直到发生loss

**方法:**AIMD

  • Additive Increase:每个RTT将CongWin增大一个MSS(线性减)——拥塞避免
  • Multiplicative Decrease:发生loss后将CongWin减半

慢启动

**原理:**当连接开始时,指数性增长

指数性增长:

  • 每个RTT将CongWin翻倍

  • 收到每个ACK进行操作

  • 初始速率很慢,但是快速攀升

Threshold变量

何时将指数增长切换为线性增长(拥塞避免)

当CongWin达到Loss事件前值的1/2时

实现方法

  • 变量Threshold
  • Loss事件发生时,Threshold被设为Loss事件前CongWin值的1/2

Loss事件的处理

3个重复ACK

  • CongWin切到一半
  • 然后线性增长

Timeout事件

  • CongWin直接设为1MSS
  • 然后指数增长
  • 达到threshold后,再线性增长

3个重复ACK表示网络还能传输一些segments

timeout事件表明拥塞更为严重

总结

  • 当CongWin低于Threshold,发送方处于慢启动阶段,窗口呈指数增长
  • 当CongWin高于Threshold,发送方处于拥塞避免阶段,窗口呈线性增长
  • 当收到三个重复的ACK时,Threshold减为原来的一半,CongWin也减为原来的一半
  • timeout事件发生时,Threshold减为原来的一半,CongWin减为1MSS

传输层总结

传输层服务的基本原理

  • 复用/解复用
  • 可靠数据传输
  • 流量控制
  • 拥塞控制

Internet的传输层

  • UDP
  • TCP

下一章

  • 离开网络“边界”
  • 进入网络“核心”
Built with Hugo
Theme Stack designed by Jimmy