Linux 网络传输学习笔记

这篇是混合《Linux性能优化实战》以及 《Wireshark网络分析就这么简单》的一些关于Linux 网络的学习概念和知识点笔记 ,主要记录网络传输流程以及对于TCP和UDP传输的一些影响因素

Linux 网络传输流程

借用一张倪朋飞先生的《Linux性能优化实战》课程中的图片

接收流程

  1. 网卡收到网络数据包,加入到收包队列
  2. 网卡将网络包写入DMA缓冲区,通知中断处理程序
  3. CPU硬中断锁定DMA缓冲区,将网络包拷贝到内核数据结构 sk_buff 缓冲区,清空并解锁当前DMA缓冲区
  4. 通知软中断,通知内核收到了新的网络帧,内核协议栈从缓冲区中取出网络帧
  5. 在链路层检查报文合法性,找出上层协议类型(ipv4/ipv6),去掉帧头,帧尾,交给网络层
  6. 网络层取出IP头,判断网络走向
    1. 本机的:取出上层协议(TCP/UDP),去掉IP头,交给传输层
    2. 非本机:转发
  7. 传输层取出TCP或者UDP头,根据 < 源 IP、源端口、目的 IP、目的端口 > 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中
  8. 应用程序就可以使用 Socket 接口,读取到新接收到的数据

发送流程

  1. 应用程序通过调用 Socket API(比如 sendmsg,系统调用)发送网络包,这是一个系统调用,所以会陷入到内核态的套接字层中,套接字层会把数据包放到 Socket 发送缓冲区中
  2. 网络协议栈从 Socket 发送缓冲区中,取出数据包
  3. 传输层依据协议增加TCP或UDP头
  4. 网络层增加IP头,通过路由寻找下一条IP,并按照MTU大小分片
  5. 分片后的网络包再送到网络接口层,进行物理寻址,找下一条MAC地址,增加帧头和帧尾
  6. 软中断通知驱动程序,发包队列有新的网络帧需要发送
  7. 驱动通过DMA,从发送队列读取网络帧,并通过物理网卡发送出去

TCP的一些网络影响因素

一些小概念

接收窗口(Receiver Window)

接收窗口表示接收方TCP缓冲区可容纳的数据量。

发送方不能发送超过接收窗口大小的数据,以确保接收方有足够的时间处理数据。接收窗口大小由接收方TCP发送给发送方的窗口大小更新。

发送窗口(Sender Window)

发送窗口表示发送方TCP缓冲区可容纳的数据量。

接收方不能发送超过发送窗口大小的数据,以确保发送方有足够的时间发送数据。发送窗口大小由发送方TCP发送给接收方的窗口大小更新。

一般由接收方的接收窗口和发送方的发送窗口的较小值决定,另外网络的影响也会导致发送窗口变化

MSS 最大分段大小(Maximum Segment Size)

MSS表示TCP报文段的最大长度。

每个TCP连接都有一个MSS值,它取决于网络的最大传输单元(MTU)。发送方将数据分割为适当大小的报文段,以确保数据可以在TCP连接上可靠传输。

MTU 最大传输单元(Maximum Transmission Unit)

MTU表示网络中每个数据包的最大大小。

MTU值取决于所使用的网络和协议。在TCP/IP协议栈中,MTU通常等于接收窗口大小,以确保TCP数据可以在单个数据包中传输。

延迟确认

描述

在发送包时,接收方延迟确认,可以实现多个包一块确认,减少确认包的数量,减轻网络负担

缺点

  • 在丢包较多的情况下,会导致大量的超时重传,极大的影响网络性能,建议开启SACK提供重传效率
  • 接收窗口很小时,由于运输车很小,还要延迟确认,就会导致大量堆积,应该立即配送

过滤

wireshark 的过滤条件

tcp.analysis.ack_rtt >0.2 && tcp.len==0 获取超过200毫秒的确认包

Nagle算法

描述

在发送的数据还未被确认前,新的小包将会被收集,凑满一个MSS或者收到确认后发送

与延迟确认的区别

  1. Nagle算法没有明显的时间规律
  2. 凑满一个MSS或者收到确认后发送
  3. 如果是收到确认包立即发送,就可以判断是Nagle了

关于拥塞

  1. 刚开始建立连接时,拥塞窗口都设定的比较小
  2. 在慢启动阶段,拥塞会指数型增长,直到碰到临界窗口值
  3. 在临界窗口值往上,就会降低增长速度,避免触碰网络拥塞
  4. 碰到拥塞后,会有超时丢包现象,该阶段没有数据传输,称为超时重传时间(RTO)
  5. 超时重传后,会重新进入慢启动阶段,并调整临界值(所以超时重传极大影响网络性能)
    1. Richard Stevens:临界值设为上次发生拥塞的发送窗口的一半
    2. RFC5681 :发生拥塞时没被确认的数据量的一半,并不能小于2个MSS

超时重传

拥塞发生后,发送方发现发出去的包不像往常一样得到确认了,不过考虑收不到确认包可能是网络延迟导致,所以等待一段时间再判断,迟迟未收到就认定丢包了,只能重传,称为超时重传。

发出原始包到重传这个包的这段时间称为超时重传时间(RTO)。

快速重传

当发送方接受到3个或以上重复确认(Dup ACK)时,就意识到相应的包丢了,从而立即重传这些包

一些优化建议

  • 没有拥塞时,发送窗口越大,性能越好。所以在没有带宽限制的时候,应该尽量增大接收窗口
  • 如果经常发生拥塞,限制发送窗口能提高网络性能,因为重传对性能的影响极大
  • 超时重传对性能影响最大,因为有一段RTO重传时间没有任何数据传输,并且会将拥塞窗口设定为1MSS,所以要尽量避免超时重传
  • 快速重传对性能影响相对较小,因为没有等待时间,并且拥塞窗口减小幅度不大
  • SACK和NewReno有利于提高重传效率,提高传输效率
    • 早期TCP (丢包后面的包都重传,效率极低)
    • NewReno (接收方推理出丢掉的包,一个一个请求重传)
    • SACK (将目前接收到的包反馈给发送方,ACK提示丢掉的包)
      • 例如:SACK=9748-9912 ACK=8820 表示8820到9748之间的包未收到
  • 丢包对极小文件的影响比大文件严重,因为读写一个小文件的包数量很少,所以丢包可能也触发不到3个Dup ACK,只能等待超时重传,而大文件更容易触发快速重传

MTU 影响判定

1、如果是防火墙阻止会丢包,但是在三次握手时就会丢弃,而不是握手后访问丢弃

2、网络拥塞会丢包,但一段时间后会恢复

3、只丢大包不丢小包,可能是MTU导致的,特别是1460字节的临界值时

4、ping serverip -l 1472 -f 可以测试MTU是否是1500字节

如果报错说被丢弃,可能链路上存在较小的MTU,考虑调整MTU


关于UDP

1、UDP不管双方的MTU大小,发送方负责分片,接收方负责将分片组装,会消耗资源和影响性能

2、UDP没有重传机制,丢包由应用层处理,丢了就要全部重传,而TCP仅需重传丢的包

3、分片机制不安全,容易被攻击,如果分片的每个包都有More fragment的flag,1表示还有分片,0表示没有;所以,如果被大量发送flag为1的UDP包,就可能导致资源耗尽


LSO(Large Segment Offload 大量传输减负)

描述

为缓解CPU压力,把部分工作offload交给网卡处理

工作方式

TCP层将大于MSS的数据直接传给网卡,网卡负责分段处理

传统方式

TCP层根据MSS分段(CPU负责),再交给网卡处理

位置

Windows 的配置方式

网卡》属性》配置》高级》大量传输减负 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(2.1) —— 任务挂起和恢复

前言 &#xff08;1&#xff09;FreeRTOS是我一天过完的&#xff0c;由此回忆并且记录一下。个人认为&#xff0c;如果只是入门&#xff0c;利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后&#xff0c;再去学习网上的一些其他课程也许会简单很多。 &#xff08;2&am…

Windows 下ffmpeg安装及实践

Windows 下ffmpeg安装及实践 背景安装实践其他 背景 最近负责音频文件处理相关的业务&#xff0c;涉及到 ffmpeg 对一些音频文件格式的校验&#xff0c;记录一下安装过程及踩坑过程。 安装 如图1所示&#xff0c;进入官网&#xff0c;在windows下任选一个文件&#xff1a;h…

day01 深度学习介绍

目录 1.1深度学习介绍 1.2神经网络NN 1、概念&#xff1a; 2、神经元 3、&#xff08;单层&#xff09;神经网络 4、感知机&#xff08;两层&#xff09; 5、多层神经网络 6、激活函数 &#xff08;1&#xff09;饱和与非饱和激活函数 &#xff08;2&#xff09;饱和激活…

写着玩的程序:pycharm实现无限弹窗程序(非病毒程序,仅整蛊使用)

运行环境 PyCharm 2023.2.1 python3.11 具体内容 源代码 import tkinter as tk from tkinter import messagebox import threadingclass PopupGenerator:def __init__(self):self.root tk.Tk()self.root.geometry("200x120")self.root.title("无限弹窗&qu…

LeetCode---380周赛

题目列表 3005. 最大频率元素计数 3006. 找出数组中的美丽下标 I 3007. 价值和小于等于 K 的最大数字 3008. 找出数组中的美丽下标 II 一、最大频率元素计数 这题就是个简单的计数题&#xff0c;正常遍历统计数据即可&#xff0c;关键是你要会写代码逻辑。 代码如下&…

Java设计模式-代理模式(7)

馆长准备了很多学习资料,其中包含java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具 等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多多关注…

steam游戏搬砖项目还能火多久?

最近放假回到老家&#xff0c;见了不少亲戚朋友&#xff0c;大家不约而同都在感叹今年大环境不好&#xff0c;工作不顺&#xff0c;生意效益不好&#xff0c;公司状况不佳&#xff0c;反问我们生意如何&#xff1f;为了让他们心里好受一点&#xff0c;我也假装附和道:也不咋地&…

为什么电脑降价了?

周末&#xff0c;非常意外地用不到3000元买到了一款2023年度发布的华为笔记本I5,16G,500G&#xff0c;基本是主流配置&#xff0c;我非常意外&#xff0c;看了又看&#xff0c;不是什么Hwawii&#xff0c;或者Huuawe。然后也不是二手。为什么呢&#xff1f;因为在ALU和FPU之外&…

Maven 打包时,依赖配置正确,但是类引入出现错误,一般是快照(Snapshot)依赖拉取策略问题

问题描述&#xff1a; 项目打包时&#xff0c;类缺少依赖&#xff0c;操作 pom.xml -> Maven -> Reload project &#xff0c;还是不生效&#xff0c;但是同事&#xff08;别人&#xff09;那里正常。 问题出现的环境&#xff1a; 可能项目是多模块项目&#xff0c;结构…

图论可达性c语言实现

概述 图论中的可达性是指在图中是否存在从一个顶点到另一个顶点的路径。这是图论中的一个基本概念&#xff0c;对于许多实际问题的建模和解决都非常重要。以下是关于图论可达性的一些重要概念和信息&#xff1a; 有向图和无向图&#xff1a; 图可以分为有向图和无向图。在有向图…

MySQL JSON数据类型

在日常开发中&#xff0c;我们经常会在 MySQL 中使用 JSON 字段&#xff0c;比如很多表中都有 extra 字段&#xff0c;用来记录一些特殊字段&#xff0c;通过这种方式不需要更改表结构&#xff0c;使用相对灵活。 目前对于 JSON 字段的实践各个项目不尽相同&#xff0c;MySQL 表…

未来趋势:视频美颜SDK与增强现实(AR)的融合

当下&#xff0c;视频美颜SDK不断演化&#xff0c;成为用户记录和分享生活时不可或缺的一部分。同时&#xff0c;增强现实技术也以其独特的沉浸感和交互性受到青睐&#xff0c;被广泛应用于游戏、教育、医疗等领域。 一、视频美颜与AR的结合 1.实时美颜的AR增值体验 借助AR的…

【Web前端开发基础】CSS的结构伪类选择器、伪元素、浮动

CSS的浮动 目录 CSS的浮动一、学习目标二、文章内容2.1 结构伪类选择器2.2 伪元素2.3 标准流2.4 浮动2.5 清除浮动2.6 拓展&#xff08;BFC&#xff09; 三、综合案例3.1 小米模块案例3.2 网页导航案例 一、学习目标 能够使用结构伪类选择器在HTML中选元素能够说出标准流元素的…

服务器管理平台(5)- 数据展示

数据展示 Grafana导入MySQL数据源进行定制化数据展示&#xff0c;包括品牌分类饼图&#xff0c;详细数据列表等LayUI为开源前端框架&#xff0c;对系统概览、登录日志等信息&#xff0c;划分不同页面使用表格展示详细数据 1、Grafana 对品牌、CPU型号、内存等数据使用饼图展示…

探索全球DNS体系 | 从根服务器到本地解析

DNS 发展 DNS&#xff08;Domain Name System&#xff09;的起源可以追溯到互联网早期。 早期的挑战&#xff1a; 早期互联网主要通过IP地址进行通信&#xff0c;用户需要记住复杂的数字串来访问网站。 需求的催生&#xff1a; 随着互联网的扩大&#xff0c;更简单、易记的…

【剑指offer】重建二叉树

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer&#xff1a;重建二叉树 给定节…

在CentOS 7中配置 RAID服务

实验过程 Xnode1克隆虚拟机raid ps&#xff1a; 阿里云盘Xnode1获取 xnode1 https://www.alipan.com/s/HgLXfoeBWG2 提取码: eb70 编辑虚拟机 添加2硬盘 CRT连接&#xff08;root密码&#xff1a;000000&#xff09; 创建raid 0 [rootdemo ~]# lsblk 安装mdadm [rootdemo…

go语言(十四)----反射

变量的结构 2 举个例子 package mainimport "fmt"type Reader interface {ReadBook() }type Writer interface {WriteBook() }//具体类型 type Book struct {}func (this *Book) ReadBook() {fmt.Println("Read a Book")}func (this *Book) WriteBook() {…

项目工时统计成本核算管理

技术架构: Java 1.8 MySQL 8 Vue 项目基于前后端分离架构&#xff0c;服务端主要技术&#xff1a;SpringBoot 前端主要是Vue。 项目介绍&#xff1a; 轻量级项目工时统计系统&#xff0c;是目前企业进行项工时管理统计的推荐选择。 通过项目工时管理系统&#xff0c;可通过…

Github2024-01-23 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-01-23统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目3Go项目2TypeScript项目2Dart项目1Jupyter Notebook项目1 gpt4free 语言模型集合改进计划 创建周期…