高性能网络框架笔记

news/2025/1/12 12:17:38/

目录

  • TCP粘包、分包
  • 惊群
  • 断开连接,TCP怎么检测的?
  • 大量的close wait,如何解 ?
  • 双方同时调用close
  • 水平触发和边沿触发的区别

TCP粘包、分包

解决:1.应用层协议头前面pktlen;2.为每一个包加上分隔符;(\r\n)

惊群

解决:多个线程共享一个共性内存,里面存有锁,谁得锁谁去响应。

断开连接,TCP怎么检测的?

1、网线断了,网卡会重启。(应用层检测出来)
2、路由器断电,设计 —> 心跳包
3、客户端直接宕机。-------->心跳包

大量的close wait,如何解 ?

ret=recv(),
ret=0时,此时会清理tcp相关的信息之后,才会调用close。(因此会存在大量的close_wait)
解决:把业务层和网络层数据分离,可以直接调用close。

双方同时调用close

哪些情景会出现:

水平触发和边沿触发的区别

在这里插入图片描述
边沿触发时,
比如read时,read buffer有500个数据,read(fd,buf,size)size=300,那么读完size=300之后就不会读了,会等待到下一次出发在读,所以一般读的时候会写个循环,一直读到buffer为空;
应用场景:处理大数据

水平触发时,
只要文件描述符关联的读内核缓冲区read buffer非空,有数据可以读取,就一直发出可读信号进行通知,

水平触发可以在业务逻辑上只调用一次recv,边沿触发需要用循环来recv。
水平触发可以使用阻塞模式,边沿模式不能。
两者性能差异非常小,一般小数据使用水平触发LT,大数据使用边沿触发ET。
listen fd最好使用水平触发,尽量不要边沿触发。


http://www.ppmy.cn/news/1003793.html

相关文章

电缆故障综合测试仪

一、电缆故障查找仪产品简介 本产品用于地埋电缆故障点的快速、企业产品免费信息发布平台定位、电缆埋设路径及埋设深度的电子商务测(在故障点处获取深度)。 主要特点 1、用特殊结构的声波振动传感器及低噪声专用器件作前置放大,提高了仪器定…

如何高效使用Gherkin

背景 时间回到2022年,我参与了一个使用了Flutter技术构建的Web前端项目。在这个项目上,我们小组的目标是实施Flutter前端自动化测试。 彼时,Flutter 2.x刚在Web端发力不久,Flutter Web上的应用和生态才刚刚开始,而在…

操作系统 - 小记 230803

文章目录 计算机的硬件组成程序的存储和执行程序语言的设计和进化存储设备的层次结构操作系统 https://www.bilibili.com/video/BV1Q5411w7z5?p2 计算机的硬件组成 CPU CU,控制单元ALU,算数逻辑单元寄存器 IO Bridge 处理器和外部交互的桥梁Main Memory…

java 框架

目录 Spring 如何解决 bean 的循环依赖?什么是 AOP?Spring 如何实现的?BeanFactory 和 ApplicationContext 有什么区别?介绍一下 Spring bean 的生命周期Spring 的隔离级别Spring 框架用到了哪些设计模式?并举出典型例子Spring 如何解决 bean 的循环依赖? Spring中引入三…

Mybatis引出的一系列问题-JDBC 的探究

1 引入对JDBC的理解-1 一般来说,Java应用程序访问数据库的过程是: 装载数据库驱动程序;通过jdbc建立数据库连接;访问数据库,执行sql语句;断开数据库连接。 Public void FindAllUsers(){//1、装载sqlserve…

Unity 引擎架构

UI排序和合批 以遮盖数量为准,建立每个renderer的深度,先按深度排序,然后是材质和贴图,排序完成之后进行合批。注:即使两个renderer深度不一样但如果顺序相邻并且贴图一样也会进行合批。 Unity 多线程:

Arduino 项目笔记 | Arduino LED Memory Game 颜色记忆游戏机

成果展示 颜色记忆游戏机 | Arduino DIY 1. 线路链连接 1.1 原理图 1.2 PCB 免费PCB打样 1.3 烧录 Bootloader 第二部分:Burn bootloader 2. 程序实现 #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS…

springboot中排除数据源的自动配置方式循环依赖是什么意思?

在Spring Boot中,有时候我们希望排除自动配置的数据源,而使用自定义的数据源。为了达到这个目的,可以使用EnableAutoConfiguration注解的exclude属性来排除某些自动配置类。 关于循环依赖的问题,它发生在一个或多个对象之间出现了…