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 的配置方式

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

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

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

相关文章

第二证券:新手也能搞定!新股申购流程攻略

由于参加打新的获利概率较大&#xff0c;也就有许多投资者参加到新股申购中。那么&#xff0c;新股申购流程是怎样的&#xff1f;对此&#xff0c;本文将借助有关知识来展开讨论&#xff0c;为我们供给一个参阅思路。 投资者在参加网上打新时&#xff0c;应首要了解新股的申购日…

测试不拘一格——掌握Pytest插件pytest-random-order

在测试领域,测试用例的执行顺序往往是一个重要的考虑因素。Pytest插件 pytest-random-order 提供了一种有趣且灵活的方式,让你的测试用例能够以随机顺序执行。本文将深入介绍 pytest-random-order 插件的基本用法和实际案例,助你摆脱固定的测试顺序,让测试更具变化和全面性…

yolov5 opencv dnn部署自己的模型

yolov5 opencv dnn部署自己的模型 github开源代码地址使用github源码结合自己导出的onnx模型推理自己的视频推理条件c部署c 推理结果 github开源代码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人&#xff0c;也是上面作者推荐的…

【Electron】Electron是什么

1. Electron是什么 Electron是使用JavaScript、HTML和CSS构建跨平台&#xff08;Windows、MacOs、Linux&#xff09;的桌面应用。Electron其实就是一个可以展示网页内容的壳子&#xff0c;相当于一个独立的浏览器&#xff0c;可以提供给你一些接口&#xff0c;去调用系统的资源…

验证码短信API:企业级安全验证的必备工具

引言 随着数字经济的蓬勃发展&#xff0c;企业对在线服务的安全性要求越来越高。在这种背景下&#xff0c;验证码短信API作为一种有效的安全验证工具&#xff0c;正逐渐成为企业级应用的标配。本文将探讨验证码短信API如何为企业级安全验证提供坚实保障。 验证码短信 API 的优…

MySQL-SQL-DQL

DQL-介绍 DQL-语法 基本查询 1、查询多个字段 2、设置别名 3、去除重复记录 条件查询 1、语法 2、条件 聚合函数 1、介绍 2、常见的聚合函数 3、语法 分组查询 1、语法 2、where与having区别 排序查询 1、语法 2、排序方式 分页查询 1、语法 DQL-执行顺序

关于在微信小程序中使用taro + react-hook后销毁函数无法执行的问题

问题&#xff1a; 在 taro中使用navigageTo() 跳转路由后hook中useEffect 的return函数没有执行 没有执行return函数 框架版本&#xff1a; tarojs: 3.6 react: 18.0 原因&#xff1a; 使用navigateTo() 跳转路由的话并不会销毁页面和组件&#xff0c;会加入一…

智能小程序环境配置流程

App 与智能小程序 在用户使用 App 扫描小程序的二维码或者点击设备&#xff0c;尝试进入小程序时&#xff0c;系统会对 App 当前环境与小程序所需运行环境进行比对&#xff0c;确定环境配置兼容后&#xff0c;App 才能启动并运行小程序。 比对规则中&#xff0c;主要涉及&…

「webpack面试系列」说说你对webpack的理解?解决了什么问题?(收藏好,用时好找)

文章目录 一、背景模块化 二、问题三、是什么webpack的能力&#xff1a; 一、背景 Webpack 最初的目标是实现前端项目的模块化&#xff0c;旨在更高效地管理和维护项目中的每一个资源 模块化 最早的时候&#xff0c;我们会通过文件划分的形式实现模块化&#xff0c;也就是将…

【计算机网络】应用层——HTTP 协议(一)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】 本专栏旨在分享学习计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、什么是 HTTP 协…

Redis(六)

1、Redis的缓存淘汰策略 1.1、内存配置 首先查看Redis最大的占用内存&#xff0c;打开redis配置文件&#xff0c;设置maxmemory参数&#xff0c;maxmemory是bytes字节类型&#xff0c;注意转换。 打开配置文件发现没有配置&#xff0c;那么默认是多少的内存&#xff0c;是这样…

第2章-OSI参考模型与TCP/IP模型

目录 1. 引入 2. OSI参考模型 2.1. 物理层 2.2. 数据链路层 2.3. 网络层 2.4. 传输层 2.5. 会话层 2.6. 表示层 2.7. 应用层 3. 数据的封装与解封装 4. TCP/IP模型 4.1. 背景引入 4.2. TCP/IP模型&#xff08;4层&#xff09; 4.3. 拓展 1. 引入 1&#xff09;产…

Visual Studio2022实用使用技巧集

前言 对于.NET开发者而言Visual Studio是我们日常工作中比较常用的开发工具&#xff0c;掌握一些Visual Studio实用的搜索、查找、替换技巧可以帮助我们大大提高工作效率从而避免996。 Visual Studio更多实用技巧 https://github.com/YSGStudyHards/DotNetGuide 代码和功能搜…

记一次 stackoverflowerror 线上排查过程

一.线上 stackOverFlowError xxx日,突然收到线上日志关键字频繁告警 classCastException.从字面上的报警来看,仅仅是类型转换异常,查看细则发现其实是 stackOverFlowError.很多同学面试的时候总会被问到有没有遇到过线上stackOverFlowError?有么有遇到栈溢出?具体栈溢出怎么来…

植物神经功能紊乱是什么?

植物神经也叫自律神经&#xff0c;它是一种自发的&#xff0c;非主观意识控制的&#xff0c;低级的神经活动。包括呼吸的、心律的、汗腺的、胃肠道的调节等等&#xff0c;都叫植物神经功能调节。 植物神经它的一旦出现了障碍可以有两种倾向&#xff0c;一种倾向就是出汗、兴奋…

Spring Boot3整合knife4j(swagger3)

目录 1.前置条件 2.导依赖 3.配置 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动。 作者版本为3.2.2最新版 2.导依赖 knife4j官网&#xff1a; Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j (xiaominfo.com)http…

Docker初次体验:WSL+Docker+portanier

文章目录 前言Docker是什么&#xff1f;Docker的优点Docker的使用场景&#xff1a;一件安装 Docker安装开启虚拟化安装wsl下载慢的请看这个下载成功 安装Docker修改Docker安装位置 配置Docker安装portanier&#xff08;可视化的Docker操作页面&#xff09;登录网址 总结 前言 …

2008年苏州大学837复试机试C/C++

2008年苏州大学复试机试 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0&#xff0c;X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充&#xff1a;个人觉得这个题目回忆…

Hylicos - MINI2440 - 中断控制

中断 中断源管理 中断是一种异步异常&#xff0c;CPU需要处理很多来自设备的中断请求&#xff0c;而CPU引出的line只有IRQ线和FIQ线&#xff0c;所以就得引入中断控制器帮助CPU搞清楚是中断的来源。 MINI2440的中断控制器&#xff0c;可以接受来自60个中断源的请求。提供这些…

解决vue 2.6通过花生壳ddsn(内网穿透)实时开发报错Invalid Host header和websocket

请先核对自己的vue版本&#xff0c;我的是2.6.14&#xff0c;其他版本未测试 起因 这两天在维护一个基于高德显示多个目标&#xff08;门店&#xff09;位置的项目&#xff0c;由于高德要求定位必须使用https服务&#xff0c;遂在本地无法获取到定位坐标信息&#xff0c;于是…