5.1 传输层提供的服务

1.传输层提供的功能

  1. 为不同的主机上的进程提供逻辑通信,网络层是为不同的主机提供逻辑通信
  2. 功能
    1. 复用和分用
      1. 复用:不同的进程可以使用同一个协议传输数据
      2. 分用:在传输层接收协议后,剥去首部交付正确的目的进程
    2. 差错检测(首部,数据部分)
    3. 提供两种并存的传输协议(网络层只能选择一种)
    4. 提供透明地数据传输服务,差错控制,流量控制

2.端口与寻址

  1. 端口的作用:应用进程通过端口将数据向下交付给传输层(反之亦然)
  2. 各层的 SAP
    1. 数据链路层:MAC
    2. 网络层:IP 地址
    3. 传输层:端口
      1. 端口用于标识主机进程的
      2. 传输层使用的是软件端口
  3. 端口号
    1. 长度:16 bit
    2. 分类
      1. 服务端使用的端口号
        1. 熟知端口号(0~1023)
          1. 最重要的应用程序
          2. 常用的熟知端口号(如下图)
          3. image.png
        2. 登记端口号(1024~49151)
      2. 客户端使用的端口号(49152~65535):客户进程运行时动态分配
  4. 套接字
    1. 组成:主机 IP 地址+端口号
    2. NOTE:主机 A 发送给 主机 B 的报文段包含了目的端口号和源端口号

note

  1. 在 HTTP 中,服务端的端口号是 80,而客户端是由系统自动分配的

    3.TCP 和 UDP 和 IP

  2. 相同点

    1. 二者均是传输层协议
  3. 不同点
    1. TCP
      1. 面向连接,提供可靠传输服务
      2. 产生时延
      3. 利用滑动窗口和确认重传机制,使得信息传输更加可靠
      4. 不提供广播和组播服务
    2. UDP
      1. 无连接(尽力而为的交付),发送快,需要高层实现可靠传输

**

  1. UDP 和 IP 协议
    1. 相同:都不可靠,都有检验和,出错了都丢弃
    2. 不同:UDP 的检验和要检验首部和数据部分,且包含伪首部,IP 仅检验首部

5.2 UDP 协议

5.2.1 UDP 数据报

  1. UDP 概述
    1. 服务
      1. 复用/分用
      2. 差错检测
    2. 优势
      1. 无须建立连接
      2. 无连接状态
      3. 分组首部开销小
        1. TCP:20B
        2. UDP:8B
    3. UDP 首部的格式
      1. 源端口
      2. 目的端口
      3. 长度:包括了首部和数据
      4. 校验和
    4. 特点
      1. 传输可靠性有应用层完成
      2. 面向报文
        1. 不拆分合并报文,仅添加首部



image.png

image.png

💡 伪首部就是从 IP 首部拿了一些重要的字段参加校验,伪首部中的 17 表示 IP 数据报中中协议字段为 17 及 UDP 的为 17,最后伪首部的 UDP 长度和 UDP 中的长度字段是一样的。
💡 伪首部仅在校验的时候使用

5.2.2 UDP 校验

  1. 计算校验在 UDP 数据报之前临时添加 12B 的伪首部
  2. 校验和的检查范围
    1. UDP首部
    2. 数据部分
    3. 伪首部还包含源目 IP 地址
  3. 步骤
      1. 全 0 放入校验和字段,添加伪首部
      1. 16 位为单位,数据部分不是偶数字节,全 0 补齐
      1. 相加得到 和,并求反码放入校验和字段
      1. 接收方把收到的 UDP 字段进行同样的运算,如果全 1,则成功(此时校验和字段是反码了噢)
  4. NOTE
    1. 补充字段和伪首部都不发送
    2. 校验和功能不是必须的
  5. PS:二进制反码运算

image.png

拓展

IP 数据报与UDP数据报的主要区别
💡 IP 数据报在网络层进行路由转发,而 UDP 使用端口号进行端到端的通信
💡 IP 数据报首部校验和仅对首部信息进行校验,而 UDP 校验和要对数据部分校验

5.3 TCP 协议

1. TCP 协议的特点

  1. 全双工可靠(面向连接)字节流
  2. 一对一通信
  3. 可靠交付
    1. 无差错
    2. 不丢失
    3. 不重复
    4. 有序
  4. 发送缓存和接收缓存

    1. 发送缓存
      1. 准备发送的数据
      2. 发送完毕但还未确认的数据
    2. 接受缓存
      1. 按序到达但还为被应用程序读取的程序
      2. 不按序到达的数据

        2. TCP 报文段

  5. 首部最短为 20B

  6. 作用
    1. 运载数据
    2. 建立连接
    3. 释放连接
    4. 应答
  7. 首部image.png

image.png

💡 窗口值是接收方允许发送的窗口大小,也就是自己能接收的大小
💡 计算窗口值大小 = RTT*带宽
💡 计算序列号大小 = 最大生存周期*带宽
💡 计算TCP数据部分大小 = IP 总长度-IP 首部-TCP 首部

URG=1,发送方报文优先发送
PSH=1,接收方接收缓存中的报文优先上交到应用层

  1. 数据部
  2. TCP 报文段

image.png

udp
第五章 传输层 - 图8

note

  1. 如何计算 TCP 首部长度,即 TCP 首部长度位记录的十进制数*4B
  2. 快速以太网的最小载荷 46B
  3. IP 分组中的标识是计数经过的路由器数量
  4. TCP 采用滑动窗口进行流量控制,接收端返回当前接收窗口的最大值
  5. TCP 的确认号(ack)表示,已经接到 n-1 个报文,期望下一次接收 n 号报文
  6. SYN = 1,ACK = 0,表示此时是连接请求;SYN = 1,ACK = 1,此时是连接接收
  7. 窗口字段表示还可接收或者出动方还有多少缓存空间可以使用
  8. 确认号是 ack (小写),其值表示为对方的序号+1
  9. 数据偏移就是首部(固定首部+可选首部)的长度,是 4B 为单位

3. TCP 连接管理

1.特点

  1. 连接的端口:套接字
  2. 连接的方式
    1. 客户端/服务器
    2. 发起连接的称为客户机,接收连接的称为服务器

PS:ACK 和 ack 的区别
ACK 表示确认连接(存在于双方连接阶段),ack 表示确认序号,就是 TCP 报文段的那个确认序号

2.连接的建立

第五章 传输层 - 图9

  1. 第一步:客户端发起连接。SYN(用于表示建立连接) = 1,随机选择一个 x,作为 seq 的值
  2. 第二步:服务器发送确认报文,SYN = 1,ACK = 1,ack = x+1,本报文的 seq = y
  3. 第三步:客户机返回确认。ACK = 1,seq = x+1,ack = y+1(此处加1,加的是有效载荷)

例题

PS:

  1. 服务端资源在第二次握手分配,客户端资源在第三次握手分配
  2. 服务器容易收到 SYN 泛洪攻击
  3. SYN = 1 的报文,不携带数据,但要消耗序号
  4. ACK = 1 表示**确认连接**;
    ack = seq +1 表示前一个报文的所有字段都接收完成了
  5. 我们的窗口大小单位都是**字节**


🔦 拓展**
1.为什么TCP是三次握手,如果不这样会出现什么情况
假定A向B发送TCP连接请求,而该请求滞留于网络中,A超时重传,与B取得了TCP连接,并交换数据后,关闭连接。
此时,滞留的TCP请求到达B,B以为A又建立连接,于是发送请求确认,A接到请求确认后,由确认号推出该SYN报文无效,于是发送复位报文 RST=1

3.连接的释放
第五章 传输层 - 图10

  1. 第一步:客户机发起释放。FIN(用于表示关闭连接) = 1,seq = x(客户机:我要挂了)
  2. 第二步:服务器发送确认。ACK = 1,seq = v,ack = x+1(服务器:好的)
  3. 第三步:服务器发起释放。FIN = 1,seq = w,ack = x+1(服务器:我要挂了)
  4. 第四步:客户机确认。ACK = 1,seq = h,ack = w+1(客户机:好的)

note

  1. FIN 不携带数据,但是要消耗序号
  2. 客户端和服务端都可以发起连接释放
  3. TCP 是全双工的,所以必须客户端和服务端都释放连接才算完成
  4. 释放完成,等待 2MSL 的原因
  5. 如果在已经建立连接的两个主机端口之间再建立连接,那么建立失败,但是不会影响先前的连接
  6. 图中两个 ack =u+1 可以省略第一个吗?不可以,因为到第一个 ack=u+1 时,仅仅是 A 不在发送数据,但如果 B 继续发送数据,而 A 此时收到的对自己的确认并不完整,就会认为自己发起的 FIN 断开连接失败

4. TCP 可靠传输

TCP 使用校验,序号,确认和重传(认传验号)的机制来实现(差错控制)
1.**序号(序号字段)**

  1. 作用:有序提交和接收
  2. 特点:序号字段的值是本报文数据的第一个字节的序号

PS:**序号是建立在字节流上的,所以是对每个字节进行确认,但同时又累加确认,所以在每个报文段后进行确认
2.**确认
累计确认

image.png

比如,接收已经接收了 0~2 和 6~7 的报文段,缺少 3~5 那么接收方回传给发送的确认号是 3
PS:**发送方的缓存区会继续存储已发送但未确认的报文段**

3. 重传
重传事件

5. TCP 流量控制

1.**作用
接收方抑制发送方的发送速率,防止接收方缓存溢出
2.**机制
滑动窗口
3.**窗口**

  1. 接收窗口(rwnd)
    1. 接收方根据自己接收缓存的大小,调整发送方的发送窗口
    2. 通过窗口字段设置
  2. 拥塞窗口(cwnd):发送方根据当前网络拥塞程度估计的窗口值
  3. 发送窗口 = min{接收窗口,拥塞窗口}。即 rwnd 是接收方对发送方的要求。cwnd 是发送方对自己的要求

PS:

  1. 传输层和链路层的流量控制的区别,**传输层定义端到端,动态变化;(网络层即以下)**链路层定义点到点,非动态变化
  2. TCP 采用 GBN 策略管理流量,所以是累加确认

6. TCP 拥塞控制

1.**作用
防止过多数据注入网络,其中 ACK 机制就是用于拥塞控制中
2.**拥塞的表现
时延增加
3.**拥塞控制和流量控制的区别**
拥塞控制:涉及全局,所有主机和路由器
流量控制:点对点,抑制发送端的发送速率
4.拥塞控制算法

  1. 慢开始
    1. 初始化 cwnd(拥塞窗口)=1,每收到一次确认后,cwnd +1。此处特别注意:比如,如果你一开始 cwnd 为 2,那么经过确认,实际上发送方接收到的是两个确认,所以下一次,每一个确认增加一,实际上发送方的 cwnd 增加了 2 ,数值上好像翻倍了一样。
    2. 直到 cwnd = ssthresh(阈值),使用拥塞避免算法
  2. 拥塞避免
    1. 每收到一次确认后,cwnd += 1
    2. 当出现一次拥塞,ssthresh = 1/2 cwnd,cwnd = 1

image.png

PS

  1. 当 cwnd < ssthresh,使用慢开始
  2. 当 cwnd > ssthresh,使用拥塞避免
  3. 当 cwnd = ssthresh,都可以
  4. 每次翻倍的时候确保 cwnd <= ssthresh,如果大于,则 cwnd = ssthresh
  5. TCP 的窗口单位是字节

  6. 快重传:当发送方收到三个冗余 ACK(确认失序的 ACK),立即重传,无需等待计时器

  7. 快恢复:把 cwnd 值设为慢开始门限改变后的数值后直接进行加法增大

image.png

PS:**出现超时->慢开始和慢结束;出现 3 ACK-> 快重传和快恢复
PS:乘法减小:当出现拥塞的时候,把慢开始门限减半

拓展

🔦简述TCP 和 UDP 两个协议的特点,并进行比较
image.png
🔦 拥塞控制和流量控制的区别
流量控制:接收方限制发送方发送速率,以便接收方能够来得及接收。这是一个点对点,端到端的问题。
拥塞控制:防止过多数据注入网络重,使网络不过载。拥塞控制是一个全局性的过程,涉及到所有的主机,路由器。

🔦 为什么 UDP 是面向报文的,而 TCP 时面向字节流的
因为 UDP 对报文既不拆分,也不合并,仅仅只是向下传递添加首部,向上交付删除首部。而 TCP 将报文视为无结构的字节流

🔦 不是因为拥塞而引起的分组丢失

  1. 分片 IP 数据报未能按序及时到达
  2. 接收端缓存不够
  3. 中途网桥缓存不够