计算机网络运输层

Copyright©stonee

约定:本文是针对于《计算机网络》第七版(谢希仁)中第5章的知识点总结,不适合单独看,结合课本或者PPT中的图片复习更佳

一、 运输层概述

运输层为应用进程之间提供端到端的逻辑通信

  • 运输层具有复用分用特点(P204)
  • 需要对报文进行差错检测
  • 运输层下面的网络是不可靠的,但TCP的面向连接会使其相当于全双工的可靠信道
  • 两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)
  • 端口是为了解决OS种类过多,无法锁定进程而诞生的

二、 UDP(User Datagram Protocol)

1. UDP概述
  • 非常简单,首部开销小只有复用/分用差错检错功能

  • 高效但不可靠交付(如视频传输)

  • 单播,广播,多播

  • 面向报文而非面向连接

2. UDP首部格式
  • 源端口(2) + 目的端口(2) + 长度(2) + 检验和(2)
  • 长度最小值是8 = 2+2+2+2 (只有首部)
  • 计算检验和时,需要增加伪首部(是一个临时添加的UDP数据包,用完即毁)
  • 伪首部格式:源IP(4) + 目的IP(4) + 0(1) + 17(1) + UDP长度(2)

三、 TCP(Transmission Control Protocol)

1. TCP概述
  • 面向连接,把连接作为最基本的抽象
  • 面向字节流而非报文流
  • 一对一全双工的可靠交付
  • TCP连接的端点叫套接字(Socket)
  • TCP连接 = {Socket1,Socket2} = {(IP1:port1),(IP2:port2)}
2. TCP 首部格式

TCP 虽然时面向字节流的,但是传送的数据单元时报文段

  • 源端口(2B) + 目的端口(2B) + 序号seq(4B) + 确认号(4B) + 数据偏移(1B) + 0(6b) + URG(1b) + ACK(1b) + PSH(1b) + RST(1b) + SYN(1b) + FIN(1b) + 窗口(2B) + 检验和(2B) + 紧急指针(2B) + 选项(0-40B) + 填充(为了适应选项)
  • 选项中有 MSS 值,默认536B;窗口扩大选项(3B);时间戳 (10)
  • 应用程序把数据传到TCP发送缓存后,默认只要数据达到MSS字节就会封装成TCP报文发送出去
  • 序号是报文段发送数据的第一个字节的序号
  • 确认号是期望收到下个报文段的第一个数据字节的序号
  • 窗口是从确认号开始算起,接收方允许接收的数据量(cwind)
3. 可靠传输的工作原理

发现差错及时重传(可靠传输),同时来不及接收时会通知发送发降低速度(流量和拥塞控制)

  • 停止等待协议

    每发送完一个分组就停止发送,收到确认后再发送下一个

    ①. ARQ(Automatic Repeat Quest)

    • 发送设置一个超时计时器,用来超时重传
    • 发送方发送完分组后需要保留副本并进行编号
    • 接收方对重复发过来的分组要进行重复确认但要丢掉一个,同时接受方也要丢掉一个重复的确认

    ②. 信道利用率

    • U = Td/(Td + PTT + Ta)
    • 流水线式传输
  • 连续ARQ协议

    • 收到几个分组后对按需到达的最后的一个分组发送确认
  • 当通信线路不好时,连续ARQ会带来不好的影响

4. TCP可靠传输的实现
  • 以字节为单位的滑动窗口

    • 3个指针把窗口分为:已发送并收到确认,已发送但未收到确认,允许发送但尚未发送,不允许发送
  • 窗口和缓存的关系

    对于发送发

    • 发送应用程序传送给发送方TCP准备发送的数据
    • TCP已经发送但是未收到确认的数据

    对于接受方

    • 按序到达的,但尚未被接收的数据
    • 未按序到达的数据
  • 超时重传时间的选择

    公式

    • RTTs = ( 1 - α ) * RTTs + α * RTT
    • α = 1 / 8
    • RTTd = ( 1 - β ) * RTTd + β * | RTTs - RTT|
    • β = 1 / 4
    • RTO = RTTs + 4 * RTTd
    • 未重传时用上述公式,重传后需要用Karn算法

    选择确认SACK

5. TCP的流量控制

流量控制通过速度解决缓存问题

  • 接收方通过rwnd数值说明可接受的字节数

  • TCP的窗口单位是字节不是报文段

  • 死锁情况

    • 接收方把rwnd置为0一段时间后恢复rwnd但是发送方没有收到
    • 解决办法:每个连接有个持续计时器,发送方会向接收方隔段时间发送一个零窗口的探测报文段
  • Nagle算法

    • 和前面说到的MSS不是一种方法
    • 刚开始只发送一个字节,收到确认后再根据MSS或者MSS/2发送报文段
    • 让接收方等待一段时间释放缓存是为了解决糊涂窗口综合征
6. TCP的拥塞控制

拥塞是指网络资源小于需求。网络的吞吐量会随着负荷的增大而下降

拥塞控制解决网络资源问题

  • 开环控制:设计网络时考虑周到,系统运行起来后不能改正

  • 闭环控制:基于反馈环路概念,动态解决

  • 判断拥塞的依据是出现了超时

  • 拥塞控制方法

    慢开始和拥塞避免

    • 最初发送窗口cwnd = (2 ~ 4 )SMSS
    • 增加量 = min(N, SMSS)
    • 当cwnd达到慢开始门限ssthresh时,停止慢开始算法
    • 采用拥塞避免算法,此时增加量 = 1
    • 当网络发生拥塞时,ssthresh = cwnd / 2, cwnd = 1

    快重传和快恢复

    • 如果超时不是发生了拥塞而是因为报文段丢失(3次ACK),就需要用快重传对丢失报文段迅速重传

    • 同时执行快恢复算法,ssthresh = cwnd / 2, cwnd = ssthresh

    • 之后执行拥塞避免算法

  • 发送方窗口上限值 = Min[rwnd, cwnd]

  • 主动队列管理AQM

    将拥塞控制和网络层联系起来

    • 尾部丢弃策略:报文丢失的原因可可能是网络层路由器的队列有限,把尾部的TCP报文丢弃
    • AQM是代替尾部丢弃策略的
    • 大概可以理解为随机丢弃(肯定不对,但是考试不考)
7. TCP的运输连接管理
  • 三次握手
    • 客户 SYN = 1, seq = x 服务器
    • 服务器 SYN = 1, ACK = 1, seq = y, ack = x + 1 客户
    • 客户 ACK = 1, seq = x + 1, ack = y + 1 服务器
    • SYN是发起连接,ACK是确认连接,seq是序列号,ack是期待序列号
  • 四次挥手
    • 客户 FIN = 1, seq = u服务器
    • 服务器 ACK = 1, seq = v, ack = u + 1 客户
    • 服务器 FIN = 1, ACK = 1, seq = w + 1, ack = u + 1 客户
    • 客户 ACK = 1, seq = u + 1, ack = w + 2 服务器
    • 客户等待2MSL后关闭
    • FIN是发起关闭请求
  • 有限状态机
    • 图片请查阅课本

四、 说明

  • 可靠并不是指收到的数据都是正确的,而是在正确的基础上保证数据传输的完整性
  • UDP在传输是也需要指定IP和PORT,只不过不称之为套接字而已
  • 不管是UDP还是TCP,它们最基本的封装单位都是报文,但是在传输过程中,对于UDP来说单位是报文,对于TCP来说单位是字节
  • cwind存在于接收窗口中,rwind存在于发送窗口;前者用于流量控制,声明接收方可以接收多少字段,后者用于拥塞控制,表示发送方可以一次性发送多少字段
  • 3次ACK中是为了确认报文丢失而不是拥塞
  • 我的理解是:3次握手中,第一次是检验客户的发送功能,第二次是检验服务器的发送和接收功能,第三次是检验客户的接收功能,但是课本上说第三次是为了防止客户发送两次,一次延时,服务器浪费资源
  • 建立连接后ACK都需要置位1

你可能感兴趣的:(计算机网络)