当前位置: 首页 > article >正文

操作系统学习笔记-5 传输层

文章目录

    • 传输层的寻址
    • UDP协议
      • UDP 的特点
      • UDP 报文格式
      • UDP校验
      • UDP 与 TCP 的对比
    • TCP协议
      • TCP 的特点
      • TCP 报文格式
      • TCP 三次握手和四次挥手
        • 三次握手
        • SYN 泛洪攻击
        • 四次挥手
      • TCP 流量控制
        • 滑动窗口协议
        • 滑动窗口的调整
        • 流量控制过程
        • 流量控制与拥塞控制的区别
        • 拥塞控制

传输层的寻址

在这里插入图片描述

UDP协议

UDP(User Datagram Protocol,用户数据报协议)是传输层协议之一,UDP 是一种无连接、不可靠的传输协议,旨在提供低延迟和简单的数据传输服务。由于其简单性和高效性,UDP 常用于实时应用,如视频流、在线游戏和语音通信。

UDP 的特点

  • 无连接:UDP 在传输数据前不需要建立连接,因此传输延迟较低。
  • 不可靠传输:UDP 不会提供错误检查或重传机制,数据包一旦丢失或顺序错乱,协议本身不会进行恢复。
  • 轻量级:UDP 头部简单,开销低,适用于对时延敏感的应用。
  • 面向数据报:UDP 将数据封装成独立的数据报(Datagram)发送,不会合并或分割数据。
  • 无阻塞控制

UDP 报文格式

UDP 报文非常简单,由头部和数据部分组成。头部长度固定为 8 字节,包含以下字段:

  • 源端口(16 位):发送方的端口号,可选。
  • 目的端口(16 位):接收方的端口号,必选。
  • 长度(16 位):包括头部和数据的总长度。
  • 校验和(16 位):用于检测数据报在传输中是否被篡改。

示例 UDP 报文头部结构

| 源端口 (16 位) | 目的端口 (16 位) |
| 数据报长度 (16 位) | 校验和 (16 位) |

UDP校验

在这里插入图片描述

UDP 与 TCP 的对比

特性UDPTCP
连接类型无连接面向连接
可靠性不保证数据到达和顺序提供可靠传输,重传机制
数据传输面向数据报,不进行流控面向字节流,有流控机制
延迟低,适合对时延敏感的应用高,适合可靠性要求高的应用
应用场景实时应用、DNS、DHCP 等文件传输、电子邮件、Web 浏览

TCP协议

TCP(Transmission Control Protocol,传输控制协议)是传输层最广泛使用的协议之一,

TCP 的特点

  • 面向连接:在数据传输前,通信双方需要通过三次握手建立连接,以确保双方通信的可靠性。
  • 可靠传输:TCP 使用序列号、确认应答(ACK)、超时重传等机制,确保数据包按序到达,不会丢失或重复。
  • 流量控制:TCP 使用滑动窗口机制控制发送方的数据发送速率,以适应接收方的处理能力,避免网络拥塞。
  • 拥塞控制:TCP 实现了拥塞控制算法,防止网络过载,例如慢启动、拥塞避免、快速重传和快速恢复。

TCP 报文格式

TCP 报文头部包含多个字段,用于提供可靠的传输服务。其格式如下:

在这里插入图片描述

主要字段说明

  • 源端口和目的端口:标识通信双方的端口号。
  • 序列号:用于对数据进行编号,确保数据包按序到达。
  • 确认号:接收方用于向发送方确认已接收数据的位置。
  • 数据偏移:指定 TCP 报文头的长度。
  • 控制位:包括 URG、ACK、PSH、RST、SYN、FIN,用于控制连接的建立、数据传输和连接终止。
  • 窗口大小:表示接收方的接收缓冲区大小,用于流量控制。
  • 校验和:检验首部+数据,检验时加上12B伪首部,第四个字段为6确保数据在传输过程中没有被篡改。
  • 紧急指针:在 URG 控制位为 1 时生效,表示紧急数据的结束位置。
  • 选项:提供扩展功能,如最大报文段长度(MSS)等。

TCP 三次握手和四次挥手

TCP 在建立和断开连接时分别使用三次握手和四次挥手机制。

三次握手
  1. 第一次握手:客户端发送一个 SYN 报文给服务器,表示请求建立连接。
  2. 第二次握手:服务器接收到 SYN 报文后,返回一个 SYN-ACK 报文,确认接收并请求建立连接。
  3. 第三次握手:客户端接收到 SYN-ACK 报文后,返回一个 ACK 报文,确认连接建立完成。
    在这里插入图片描述

目的:确保双方都有能力接收和发送数据,防止失效的连接请求误触发连接。

SYN 泛洪攻击

SYN 泛洪攻击是一种常见的拒绝服务(DoS)攻击,它通过滥用 TCP 协议的三次握手过程来消耗服务器的资源,使服务器无法处理正常的网络请求。攻击者向目标服务器发送大量伪造的 TCP SYN 报文,请求建立连接,但攻击者不发送预期的 ACK 报文来完成第三次握手,导致服务器保持“半连接”状态,并等待直到超时。这导致服务器分配资源等待未完成的连接,最终耗尽其连接池和内存资源。

四次挥手
  1. 第一次挥手:客户端发送一个 FIN 报文,表示不再发送数据,请求断开连接。主动关闭TCP连接
  2. 第二次挥手:服务器接收到 FIN 报文后,发送一个 ACK 报文,确认已接收请求。半关闭状态
  3. 第三次挥手:服务器发送 FIN 报文,表示不再发送数据,请求断开连接。
  4. 第四次挥手:客户端接收到 FIN 报文后,发送一个 ACK 报文,等到时间等待计时器设置的2MSL(最长报文段寿命),确认断开连接。

TCP 流量控制

TCP 协议中的流量控制机制用于确保发送方不会以超过接收方处理能力的速度发送数据,从而防止接收方缓存溢出导致数据丢失。流量控制的主要实现方法是 滑动窗口协议

滑动窗口协议

TCP 的滑动窗口是一个动态调整的数据结构,用于控制发送方可以连续发送的数据量,而无需等待每个数据包的确认。这个窗口的大小是由接收方指定的,它在 TCP 报文中通过 window size 字段来通知发送方。

滑动窗口的特点

  • 窗口大小:由接收方根据自己的缓冲区大小决定。
  • 窗口滑动:发送方在接收到来自接收方的 ACK 后会根据新的窗口大小更新发送窗口,使窗口“滑动”到一个新的位置。

示例

  • 假设接收方通知发送方它的窗口大小为 10 个字节,发送方就可以连续发送 10 个字节的数据,而不需要等待 ACK。
  • 发送方发送了 10 个字节后,接收方可能在发出 ACK 时更新窗口大小(例如,窗口收缩到 5 个字节),发送方便会根据接收方新的指示进行数据传输。
滑动窗口的调整

窗口的大小是动态变化的,可以根据网络状况和接收方的处理能力实时调整。接收方通过 ACK 报文中的 window size 字段告知发送方当前可以接受的数据量:

  • 窗口扩大:接收方的缓存有空闲时,会增大窗口大小,允许发送方发送更多数据。
  • 窗口缩小:接收方缓存即将满时,会缩小窗口大小,要求发送方减少发送速度。
  • 零窗口:当接收方的缓存已满且无法处理更多数据时,窗口大小会被设置为零,发送方必须停止发送,等待接收方发送非零的窗口更新。
流量控制过程

假设有两个主机 A(发送方)和 B(接收方):

  1. 发送方 A 开始发送数据,根据接收方 B 提供的窗口大小控制发送的数据量。
  2. 接收方 B 处理接收的数据,并在发送 ACK 报文时通过 window size 字段通知 A 其当前的缓冲区状态。
  3. 发送方 A 根据 B 的反馈调整发送的速率和数据量。
流量控制与拥塞控制的区别
  • 流量控制:针对于发送方和接收方之间,确保发送方不超过接收方的处理能力。
  • 拥塞控制:针对于整个网络,防止网络拥塞而导致性能下降。涉及到慢启动、拥塞避免、快速重传和快速恢复等机制。
拥塞控制
  • 慢启动:发送方从小的拥塞窗口开始,逐步增大窗口以找到网络的最大吞吐量。

  • 拥塞避免:在达到慢启动阈值后,窗口线性增加,避免拥塞。
    新的拥塞值设置为旧的拥塞值的一半
    在这里插入图片描述

  • 快速重传:接收方收到失序的数据报时,发送重复 ACK,促使发送方尽快重传丢失的数据包。

  • 快速恢复:发送方在接收到多个重复 ACK 后,不进入慢启动,而是直接减小窗口并恢复数据发送。
    在这里插入图片描述
    得到三个重复ACK值,无缝降到新的阈值。


http://www.kler.cn/a/398911.html

相关文章:

  • Lua资料
  • torch.stack 张量维度的变化
  • 传奇996_23——杀怪掉落,自动捡取,捡取动画
  • 【Node.js】使用 Node.js 需要了解多少 JavaScript?
  • python机器人Agent编程——多Agent框架的底层逻辑(上)
  • 《C语言程序设计现代方法》note-5 数组
  • Embedding的用法
  • SSDT Hook
  • 小程序-基于java+SpringBoot+Vue的校园失物招领系统设计与实现
  • outlook邮箱关闭垃圾邮件——PowerAutomate自动化任务
  • TCP实现网络通信(多进程与多线程版本)
  • 正则表达式语法详解(python)
  • Area-Composition模型部署指南
  • vue 中使用rem布局
  • Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 优化场景定义
  • AB矩阵秩1乘法,列乘以行
  • AWD脚本编写_1
  • JQuery 基础知识学习(详尽版)2024.11.17
  • 内联函数与普通函数有什么区别?如何定义和使用内联函数?
  • Thinkphp6视图介绍
  • oracle19c开机自启动
  • 洛谷刷题日记||基础篇8
  • HarmonyOs DevEco Studio小技巧31--卡片的生命周期与卡片的开发
  • uni-app快速入门(八)--常用内置组件(上)
  • 人机界面中的数据、信息、知识、算法分层
  • UE5遇到问题记录—在sequence制作时如何让角色隐藏/显示?