网络 (TCP/IP 四层协议中常见网络协议)

应用层


DNS (Domain Name System) 域名系统.

DNS 是一整套从域名映射到 IP的系统


NAT 技术

解决 IP 地址不够用的问题. 可以实现私有 IP 和全局 IP 的相互转换


NAPT 技术

使用 IP + Port 唯一确定局域网中的主机


传输层


TCP 协议 (Transmission Control Protocol 传输控制协议)

TCP 协议段格式
在这里插入图片描述
6位标志位:

  • URG : 紧急指针是否有效
  • ACK : 确认序号是否有效
  • PSH : 提示接收端应用程序立刻从 TCP 缓冲区中把数据读走
  • PST : 对方要求重新建立连接. 携带 PST 标识的报文称为复位报文段
  • SYN : 请求建立连接. 把携带 SYN 标识的报文称为同步报文段
  • FIN : 通知对方, 连接要关闭了. 将携带 FIN 标识的报文称为结束报文段

紧急指针: 标识哪部分数据时紧急数据


TCP 的确认应答机制(安全机制)

TCP 将每个字节的数据编号, 即序列号.
每一个 ACK 带有对应的确认序号. 代表该序号之前的数据已经发送完毕, 下一次请从该序号对应的数据开始发.

在这里插入图片描述


TCP 的超时重传机制(安全机制)

主机 A 给主机 B 发送数据后, 主机 A 为收到确认应答 (ACK), 在一个时间间隔的等待后, 会重传数据

未收到确认应答, 有两种情况

  • 数据丢了: 没有办法, 只能重传数据
  • ACK 丢了: 如果主机 A 重传数据, 主机 B 会收到重复的包, 于是就会根据 序号, 对缓冲区内的数据包进行排序, 去重.

TCP 的连接管理机制(安全机制)

三次握手建立连接, 四次挥手断开连接
在这里插入图片描述


滑动窗口 (效率机制)

一收一发效率较低, 因此可以一次发送多条数据 (将多个段的等待时间重叠)
在这里插入图片描述
窗口大小 : 无需等待确认应答而可以继续发送数据的最大值 (这里假定窗口大小为 4000)
OS 内核为了维护滑动窗口, 需要开辟发送缓冲区来记录未应答数据 (应答后删除)
窗口越大, 网络吞吐率越高


丢包处理

丢包有两种情况:

  1. ACK 丢了
    在这里插入图片描述

假设这里的 ACK = 1001 丢了
对于 server 来说, 我已经收到 1~1000 的数据, 不管 1001的ACK有没有被 client 接收到, 当我接收到 1001 ~ 2000 的数据时, 就可以直接返回 ACK = 2001
ACK 的含义是, 确认序号之前数据都已收到, 即对于 2001 的 ACK 来说, 1~2000 的数据都已收到
client 收到 2001的ACK , 即使没有收到 1001 的ACK , 也会默认 1~1000 是发送成功的

部分 ACK 丢失并不要紧, 可以通过后续 ACK 进行确认

  1. 数据包丢了

该机制称为 “高速重发控制” (快重传)
在这里插入图片描述


流量控制 (安全机制)

接收端处理数据能力有限, 如果接收端的缓冲区被打满, 发送端仍发送数据, 那么就会出现丢包, 重传等一系列机制

TCP 支持根据接收端的处理能力, 来控制发送端的发送速度, 该机制称为 “流量控制”

  • 接收端将自己剩余的窗口大小, 通过 ACK 中, TCP 首部的 “窗口大小” 和 “窗口扩大因子” 通知给发送端
  • 发送端根据 ACK 中的信息来决定自身的数据发送速度
  • 如果接收端缓冲区已满, 会将窗口设置为 0.
    此时发送端不再发送数据, 而是会定期发送一个 窗口探测数据段, 来获取接收方的窗口大小信息

拥塞机制 (安全机制)

TCP 连接建立初, 如果突然发送大量数据, 就很可能出现问题

处理方式: 慢启动机制
先发送少量数据, 探测网络拥堵状态, 再决定以多大的速度进行数据传输

引入概念 – 拥塞窗口 cwnd

  • 发送刚开始时, 定义 拥塞窗口大小为 1
  • 每次收到一个 ACK, 拥塞窗口大小加 1 (以传输轮次为标准, 其实每一轮拥塞窗口的大小是翻倍的)
  • 每次发送数据时, 将上次 ACK 中缓冲区窗口大小 和 拥塞窗口大小做比较, 取较小值作为实际发送的窗口大小 (实际发送数据的速度)

慢启动的启动速度慢, 但是增长速度快 (指数级别)
引入概念 – 慢启动的阈值 (ssthresh)

  • 当拥塞窗口超过这个阈值时, 将按照线性方式进行增长
  • 当 TCP 开始启动时, ssthresh 等于窗口最大值
  • 每次超时重发的时候, ssthresh 减到当前拥塞窗口大小的一半 (ssthresh = cwnd [网络拥塞时])
    并且拥塞窗口大小, 会置回 1 (cwnd = 1)

在这里插入图片描述


延迟应答(效率机制)

接收到数据时, 如果接收数据的主机立刻返回 ACK, 则返回的窗口会较小 (返回过程和新数据的传输过程是需要耗时的, 接收数据的主机已经处理了很多数据). 因此我们可以慢一些再返回数据

此外会对 慢一些 进行限制, 防止太慢让发送端误以为丢包, 进行超时重传了

  • 数量限制: 每个 N 条就返回一次 ACK
  • 时间限制: 超过最大延迟时间 (MSL) 就返回一次 ACK
  • 一般 N 取2, MSL 取 200ms

捎带应答(效率机制)

ACK 随接收端返回的数据一同返回


TCP 的性质 : 大小限制

  • 创建 Socket 时, 同时会在操作系统内核中创建一个发送缓冲区和一个接收缓冲区
    1. 调用 write 时, 会将数据先写入发送缓冲区
    2. 如果发送的数据太长, 会被拆分成多个 TCP 的数据包发出
    3. 如果发送的数据太短, 会在缓冲区等待长度差不多, 或者其他时机再发出
    4. 接收数据时, 数据也是从网卡驱动程序到达内核的接收缓冲区
    5. 应用程序调用 read , 从接收缓冲区拿数据
  • 由于缓冲区的存在, TCP 程序的读写操作不需要一一匹配
    1. 写1000字节的数据, 可以写一次大小1000字节, 也可以写100次大小100的字节
    2. 读同理

粘包问题

包 : 应用层数据包
站在传输层角度, TCP 时一个一个的报文过来的, 按照序号有序排放在缓冲区中
站在应用层角度, 能看到的只是一串连续的字节数据
粘包问题就是接收端无法区分应用层数据包之间的边界, 导致读取多个完整或不完整数据包的问题

解决粘包问题的关键是明确数据包的边界

  • 数据包定长: 按照固定大小读取
  • 数据包变长:
    • 在包头位置约定总包长度
    • 在包与包之间, 使用明确分隔符

TCP 异常情况

  • 进程终止 / 程序重启 : 进程结束时会释放文件描述符, 此时仍可以发送 FIN , 即和正常关闭无区别
  • 机器掉电 / 网线断开 : 接收端会认为连接正常, 仍会进行数据收发
    • 当接收端发数据时, 感知到发送端已断开连接, 就会触发 reset
    • 如果接收端不进行发数据操作, 也会有保活机制定期检测对方的状态

基于 TCP 的应用层协议

HTTP / HTTPS / SSH / Telnet / FTP / SMTP


UDP 协议

在这里插入图片描述


UDP 特性 : 面向数据报

应用层交给UDP多长的报文, UDP 原样发送, 既不会拆包, 也不会合并


基于 UDP 的应用层协议

NFS / TFTP / DHCP / BOOTP / DNS


TCP 和 UDP 的应用场景

  • TCP 用于可靠传输情况. eg: 文件传输, 重要状态更新 …
  • UDP 用于高速传输, 对实时性要求高的通信领域. eg: 广播, 视频传输, 早期 QQ

网络层


网络层协议进行路径选择

IP 协议

协议头格式
在这里插入图片描述
标识: 唯一标识 主机发送的报文. 同一报文在链路层的分片 标识相同 (id 相同)
3位标志字段

  • 保留
  • 禁止分片 (1 – 禁止)
  • 更多分片 (类似于结束标志, 0 – 结束)

分片偏移: 分片相对于原始 IP 报文开始处的偏移
生存时间 TTL: 数据到达目的地的最大报文跳数
协议: 表示上层协议是什么


数据链路层


以太网

以太网是一种技术标准, 应用于数据链路层和物理层, 而不是一个具体的网络
以太网帧格式
在这里插入图片描述
地址: MAC 地址
类型: 分为三种

  1. IP
  2. ARP
  3. PARP

MTU 最大传输单元

不同数据链路层对物理层, 产生不同的限制
如果一个数据包从以太网 路由到 拨号链路上, 数据包长度大于 拨号链路的 MTU, 则数据包就要进行分片操作
在这里插入图片描述


ARP 协议

介于网络层和数据链路层之间的协议
作用: 建立主机 IP 和 MAC 地址的映射关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++:范围-based for 循环

范围-based for 循环是 C11 引入的一种循环语法,它简化了遍历容器和数组等序列的操作,使代码更加清晰和简洁。它通常用于遍历容器类(如数组、向量、列表等)中的元素,或者以范围的形式遍历初始化列表。 范围-based for …

AI大模型探索之路-实战篇1:基于OpenAI智能翻译助手实战落地

文章目录 前言一、需求规格描述二、系统架构设计三、技术实施方案四、核心功能说明五、开源技术选型六、代码实现细节1.图形用户界面(GUI)的开发2.大型模型调用的模块化封装3.文档解析翻译结果处理 总结 前言 在全球化的浪潮中,语言翻译需求…

HarmonyOS NEXT 使用Canvas实现模拟时钟案例

介绍 本示例介绍利用 Canvas 和定时器实现模拟时钟场景,该案例多用于用户需要显示自定义模拟时钟的场景。 效果图预览 使用说明 无需任何操作,进入本案例页面后,所见即模拟时钟的展示。 使用说明 无需任何操作,进入本案例页…

20240330-2-XGBoost面试题

XGBoost面试题 1. RF和GBDT的区别 相同点: 都是由多棵树组成,最终的结果都是由多棵树一起决定。 不同点: 集成学习: R F RF RF属于 B a g g i n g Bagging Bagging思想,而 G B D T GBDT GBDT是 B o o s t i n g Bo…

【数据结构2-线性表】

数据结构2-线性表 1 线性表-数组2 线性表-单链式结构2.1 前插顺序单链表2.2 后插顺序单链表2.3 循环单链表2.4 双向链表 总结 线性表、栈、队列、串和数组都属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他…

Django中间件的源码解析流程(上)——中间件载入的前置

目录 1. ​前言​ 2. 请求的入口 3. 中间件加载的入口 4. 源码中的闭包实现 5. 最后 1. 前言 哈喽,大家好,我是小K,今天咋们分享的内容是:在学会Django中间件之后, 我们继续深入底层源码。 在执行中间件时请求到来总是从前往后…

第三方应用类---Phpmyadmin 后台 Getshell 操作

免责声明:本节仅做技术交流学习. 目录 什么是Phpmyadmin? getshell前提条件: 详细步骤: 1-搜集到开放phpmyadmin的web,然后访问进去 2-执行SQL命令查看是否开启了读写权限 3-开启了读写权限-->继续 没有开读写权限--->鸡鸡 4-有读写权限之后,执行SQL语句导出文件…

【Python】函数进阶(纯干货版)

目录 函数的多返回值 多个参数的传递 缺省参数 不定长参数 位置不定长参数传参举例 关键字不定长参数举例 函数作为参数传递 匿名函数 函数的多返回值 在Python中允许一个函数带回多个返回值,写法是一个return 返回值1,返回值2 在接收的时候同样…

快速入门Spring Data JPA

Spring Data JPA是Spring Data框架的一小部分,它能够让开发者能够更加简单的对数据库进行增删改查。 由于Spring Data JPA可以自动生成SQL代码所以一般情况下,简单的增删查改就可以交给Spring Data JPA来完成,而复杂的动态SQL等用MyBatis来完…

软考 系统架构设计师系列知识点之大数据设计理论与实践(14)

接前一篇文章:软考 系统架构设计师系列知识点之大数据设计理论与实践(13) 所属章节: 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.3 Kappa架构的实现 下面以Apache Kafka为例来讲述整个全新架构的过程。 部署Apach…

解线性方程组——直接解法:LU分解、PLU分解(类似列主元消去法) | 北太天元

L: lower triangular 下三角 U: upper triangular 上三角 LU 分解,顾名思义,为 把一个 矩阵 分成 一个下三角矩阵 乘上一个上三角矩阵的形式。 Example 为什么可以这样 几个基本的初等行变换,可以自己验算一下,等式的左边与右边…

Linux管道共享内存

前言 进程虽然是独立运行的个体,但它们之间有时候需要协作才能完成一项工作,比如有两个进程需要同步数据,进程 A 把数据准备好后,想把数据发往进程 B,进程 B 必须被提前通知有数据即将到来,或者进程 A 想发…

腾讯EdgeOne产品测评体验—金字塔般的网络安全守护神

作为一名对网络安全和性能优化充满热情的用户,我决定体验腾讯云下一代 CDN 服务 - EdgeOne。这款引以为傲的全方位服务如数来到,从域名解析、动静态智能加速到四层加速及DDoS/CC/Web/Bot 防护,一应俱全。随着时代风云变幻,日均数千…

kubernetes1.28版本的二进制安装

前言 二进制部署 Kubernetes(K8s)集群相对于其他部署方式(如基于发行版的包管理器、容器化部署工具等)具有一些优势,主要包括: 灵活性:二进制部署方式更加灵活,您可以根据自己的需…

冯喜运:4.21黄金市场失去正常反应?下周黄金原油解析

【黄金消息面解析 】:周五(4月19日),伊朗媒体似乎淡化了以色列袭击的影响,表明地缘政治风险降低,导致避险资产需求放缓,金价回吐涨幅。本周现货黄金价格上涨超2%。美国黄金期货收盘上涨0.7%,至2413.8美元。…

基于SpringBoot的“火车订票管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“火车订票管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 前台首页功能界面图 登录、用…

Shapley量化调峰成本?高比例可再生能源电力系统的调峰成本量化与分摊模型程序代码!

前言 在能源安全、环境污染和气候变化的大背景下,大力发展可再生能源是应对全球气候变化,实现“碳达峰、碳中和”和可持续发展的重大需求。截至2020年底,中国风电总装机容量为281GW,风力发电466.5TWh,同比增长约15%&a…

运动想象 (MI) 分类学习系列 (10) :iWSGL-CSP

运动想象分类学习系列:iWSGL-CSP 0. 引言1. 主要贡献2. 提出的方法3. 结果3.1 在3个数据集上的效果3.2 基线比较 4. 总结欢迎来稿 论文地址:https://www.sciencedirect.com/science/article/abs/pii/S0957417423027884 论文题目:Improvement of motor im…

强固型工业电脑在称重系统+叉车电脑,称重量体扫码一体机,物流分拣线工作站行业应用

称重系统叉车电脑行业应用 背景介绍 在叉车上安装称重传感器,通过对举升压力的自动检测,将压力信号转换为电流或电压信号,经过A/D转换,使模拟信号变为数字信号,经微处理器进行数据处理后通过蓝牙、串口或者USB接口将称…

Cucumber基本介绍

Cucumber 是什么? Cucumber是一种支持行为驱动开发(BDD)的工具 Cucumber读取以纯文本编写的可执行规范,并验证软件是否按照这些规范所说的执行。规范由多个示例或场景组成。例如: Feature: 用户登录功能 作为用户&…