拧巴的 tcp
本来想说说 tcp fastopen(tfo),但没什么意义,看 rfc7413 好了,还是 tcp 的惯常套路,引入一个新特性,解决了某个问题,带来一些新问题,然后就是各种 tradeoff,哪里适用哪里不适用。久而久之,tcp 就成了一个极其拧巴的协议,都烦,但谁也逃不过,但凡 tcp 问题都不是容易解决的,都是仁者见仁的形而上。
昨天刷到一个搞云原生项目管理的经理 up 主竟然单独出一期视频讲 tcp 超时,我就拧巴了,说明 tcp 真就是一团乱麻,得好好理一下。
tcp 是 internet(首字母 i 应该大写) 开山协议,后来从中分出了 ip,就是 tcp/ip 第四版,可见前面至少折腾了三个版本,其实远远不止。事后来看,这就是 tcp 拧巴的核心原因,如果 tcp/ip 是设计出来而不是进化出来的,应该是个反过来的过程,先有一个尽力而为的 ip 奠定瘦网胖端的细腰基础,然后在其上铺设其它协议。
果真如此的话,分层协议就没了传输层,协议会更加平坦,不会有 tcp 协议,更不会有 udp,而是 app 自决,由 app 自行规定传输控制语义,标准化的过程会更自然,哪个 app 比较流行,哪个 app 规定的传输控制语义就是标准,就像 quic 后来做的那样,其底色就是流行的 http,但 quic 却不为路由器交换机所知,这才是真正的端到端。
但事实和理想是相反的,tcp/ip 不是设计出来的,而是进化出来的,所以 iso/osi 说好的分层协议层间隔离就成了瞎话,它们本质是不同的东西。tcp 既没有隔离上层,也没有隔离下层,我就说几个例子。
对上层,程序员完全在 tcp 之上编程(inet steam socket),如果 tcp 发生异常比如断了,程序员必须显式处理,一大堆恶心缠绕的代码在处理异常,这种习惯慢慢成了范式,以至于 quic 已经有了连接迁移能力时,程序员依然害怕五元组变化。当谈到 google 家的 plb 时,人们首先想到的不是它的作用,而是它的问题,“它是如何更换五元祖不导致连接挂掉的?” 连接挂就挂了呗,为什么 app 和 tcp 之间没有一个 lib 解决这个问题呢。程序员害怕 tcp 断,但其实 tcp 本不该被程序员感知。
对下层,tso/gso,lro/gro 依赖顺序 stream,但传输优化却要乱序,这两者相悖,但网卡还是害怕 tcp socket 在 cpu 间迁移,不然它那些个 offloading,rss 就不起作用,空耗复杂性,当我提到这两者相悖时,程序员怼我,拼命维护 offloading 和 rss,大意是 “我靠,你怎么连优秀的 rss 都喷”,我就说,有了 rss,你怎么玩乱序。
网络和 cpu 完全不同,带宽的发展是无关比特并行度的提高,而 cpu 则被串行流约束,两者如不解耦,性能根本上不去,然而程序员思维大大偏向 cpu,他们根本无法理解如果取消了流的串行约束,还能剩下什么。
核心交换容量都 100Tbps 了,还在玩 lro/gro,你们难道不知道它们受限于 cpu 吗,这还没考虑内存墙,你们懂交换容量吗,你们拼命节省 cpu,但你们忍心浪费核心交换机的背板能耗吗。懂网络的程序员很少,无论 xdp,dpdk,offloading,用户态,在他们没看懂近乎无限的交换容量前,他们完全不懂如何浪费这种容量,将精力集中在 cpu 没错,但错在他们忽略了带宽。
tcp 已经运行 40 年,虽然大家都在谈 tcp/ip 分层,但它和分层思想是相悖的,tcp 贯穿了从 socket 到网卡,在路由器,交换机,都有 tcp,tcp 无处不在,侵染了系统思想。
一个 web 前端程序员懂 tcp,一个网卡驱动程序员也懂 tcp,看起来都很精通,但其实并不懂,不怪人,只怪 tcp 太拧巴。当然,说的都是经理。
吃饭了。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
拧巴的 tcp
本来想说说 tcp fastopen(tfo),但没什么意义,看 rfc7413 好了,还是 tcp 的惯常套路,引入一个新特性,解决了某个问题,带来一些新问题,然后就是各种 tradeoff,哪里适用哪里不适用。久而…...
java servlet 学生管理系统myeclipse开发oracle数据库BS模式java编程网
一、源码特点 java servlet 学生管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助servletbeandao (mvc模式开发),系统具有完整的源代码和数据库,开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Oracle 10g…...
使用buildx构建多架构镜像
使用buildx构建多架构镜像 1. 前置条件 docker 19.03以上版本 ubuntu 22.04 2. 安装相关组件 2.1 安装docker sudo apt-get updatesudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-commoncurl -fsSL https://mirrors.…...
Crow:run的流程4 准备接收http请求
完成tcp的accept后,下一步需要接收tcp的数据,同时完成http的分析 class Connection { public:void start(){adaptor_.start([this](const asio::error_code& ec) {if (!ec){start_deadline();parser_.clear();do_read();}else{CROW_LOG_ERROR << "Could not …...
Springboot集成RabbitMq一
0、知识点 1、创建项目-生产者 默认官方start.spring.io已不支持自动生成低版本jkd的Spring项目,自定义用阿里云的starter即可:https://start.aliyun.com 2、创建配置类 package com.wym.rabbitmqprovider.utils;import org.springframework.amqp.core.…...
零知识证明(zk-SNARK)- groth16(一)
全称为 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge,简洁非交互式零知识证明,简洁性使得运行该协议时,即便 statement 非常大,它的 proof 大小也仅有几百个bytes,并且验证一个 proof 的时间可以达…...
Spring java和go并发的实现策略
Spring Java框架和Go框架在处理并发请求时采用了不同的策略。 1. Spring Java框架: Spring框架基于Java语言,通常使用线程池来处理并发请求。具体来说,Spring框架中的Servlet容器(如Tomcat、Jetty等)会使用线程池来管…...
第二十五章 JDBC 和数据库连接池
一、JDBC 概述(P821) 1. 基本介绍 (1)JDBC 为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。 (2)Java 程序员使用 JDBC,可以连接任何提供了 JDBC 驱动程序的数据库系统…...
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在NEOAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过NEOAPI SDK设置相机固定…...
基于Java课堂签到系统
基于Java课堂签到系统 功能需求 1、用户登录:学生需要使用学号或手机号等唯一标识登录系统。 2、签到功能:在课堂开始时,学生可以通过系统进行签到,以证明出席。 3、签出功能:在课堂结束时,学生可以通过…...
springboot整合webservice使用总结
因为做的项目中用到了webservice,所以在此总结一下。 一、webservice简介 Web Service也叫XML Web Service, WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使…...
MySQL中的索引之分类,原理,作用,优缺点和执行计划
索引 索引的作用:加速查找 例如: 300w条数据的表中查询,无索引需要700s, 利用索引可能只需要1s用索引的时机是,数据量巨大,并且搜索快速 索引为什么能实现加速查找 基于索引的内部存储结构索引底层基于 BTree 的数据结构存储的在…...
如何做好档案数字化前的鉴定工作
要做好档案数字化前的鉴定工作,可以按照以下步骤进行: 1. 确定鉴定目标:明确要鉴定的档案的内容、数量和性质,确定鉴定的范围和目标。 2. 进行档案清点:对档案进行全面清点和登记,包括数量、种类、状况等信…...
pytorch04:网络模型创建
目录 一、模型创建过程1.1 以LeNet网络为例1.2 LeNet结构1.3 nn.Module 二、网络层容器(Containers)2.1 nn.Sequential2.1.1 常规方法实现2.1.2 OrderedDict方法实现 2.2 nn.ModuleList2.3 nn.ModuleDict2.4 三种容器构建总结 三、AlexNet网络构建 一、模型创建过程 1.1 以LeNe…...
用js让用户输入一个数累加和
需求:用户输入一个数, 计算 1 到这个数的和。 比如 用户输入的是 5, 则计算 1~5 之间的累加和 并且输出到控制台 <body><script>let numprompt(请输入一个数)let sum0for(let i1;i<num;i){sumi}console.log(sum)</script…...
踩坑记录-安装nuxt3报错:Error: Failed to download template from registry: fetch failed;
报错复现 安装nuxt3报错:Error: Failed to download template from registry: fetch failednpx nuxi init nuxt-demo 初始化nuxt 项目 报错 Error: Failed to download template from registry: fetch faile 解决方法 配置hosts Mac电脑:/etc/hostswin电…...
大数据学习(31)-Spark非常用及重要特性
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
【教学类-43-14】 20240103 (4宫格数独:正确版:576套) 不重复的基础模板数量:576套
作品展示::——4宫格 576套不重复模板(48页*12套题) 背景需求: 生成4宫格基础模板768套,观看64页内容时,明显看到有错误 【教学类-43-13】 20240103 (4宫格数独:错误版…...
AIGC开发:调用openai的API接口实现简单机器人
简介 开始进行最简单的使用:通过API调用openai的模型能力 OpenAI的能力如下图: 文本生成模型 OpenAI 的文本生成模型(通常称为生成式预训练 Transformer 或大型语言模型)经过训练可以理解自然语言、代码和图像。这些模型提供文…...
c基础(二)
指针: 含义:是一个值,一个值代表着一个内存地址,类似于存放路径 * 运算符 : 1 字符*表示指针 作用:通常跟在类型关键字的后面,表示指针指向的是什么类型的值 int * foo, * bar;声明指针后会…...
人工智能趋势报告解读:ai野蛮式生长的背后是机遇还是危机?
近期,Enterprise WordPress发布了生成式人工智能在营销中的应用程度的报告,这是一个人工智能迅猛发展的时代,目前人工智能已经广泛运用到内容创作等领域,可以预见的是人工智能及其扩展应用还将延伸到我们工作与生活中的方方面面。…...
三、C语言中的分支与循环—goto语句 (10) (完)
在C语言中,goto语句允许程序无条件地跳转到同一函数内的标记位置。这个标记位置通过一个标签和冒号(:)来标示。goto语句可以用于从深层嵌套的循环或条件语句中直接跳出,或者跳过某些代码执行。尽管goto语句在某些情况下可以使程序逻辑变得清晰࿰…...
RabbitMQ 常见问题
1. 如何保证消息顺序消费 在RabbitMQ中,消息最终会保存在队列中,在同一个队列中,消息是顺序的,保持先进先出的原则,这个由Rabbitmq保证。而不同队列中的消息,RabbitMQ 是无法保证其顺序性。顺序消费主要是…...
阶段二-Day10-日期类
日期类结构: 1.java.util.Date是日期类 2.DateFormat是日期格式类、SimpleDateFormat是日期格式类的子类 Timezone代表时区 3.Calendar是日历类,GregorianCalendar是日历的子类 一. 常用类-Date 1.1 Date构造方法 Date(long date) 使用给定的毫秒时间价值构建…...
多任务并行处理相关面试题
我自己面试时被问过两次多任务并行相关的问题: 假设现在有10个任务,要求同时处理,并且必须所有任务全部完成才返回结果 这个面试题的难点是: 既然要同时处理,那么肯定要用多线程。怎么设计多线程同时处理任务呢&…...
Shell脚本学习笔记
1. 写在前面 工作中,需要用到写一些shell脚本去完成一些简单的重复性工作, 于是就想系统的学习下shell脚本的相关知识, 本篇文章是学习shell脚本整理的学习笔记,内容参考主要来自C语言中文网, 学习过程中,…...
ROS-安装xacro
安装 运行下列命令进行安装,xxxxxx处更改为自己的版本 sudo apt-get install ros-xxxxxx-xacro运行 输入下列命令 roscd xacro如果没有报错,并且进入了xacro软件包的目录,则表示安装成功。 参考: [1]https://wenku.csdn.net/ans…...
为什么说 $mash 是 Solana 上最正统的铭文通证?
早在 2023 年的 11 月,包括 Solana、Avalanche、Polygon、Arbitrum、zkSync 等生态正在承接比特币铭文生态外溢的价值。当然,因铭文赛道过于火爆,当 Avalanche、BNB Chain 以及 Polygon 等链上 Gas 飙升至极值,Arbitrum、zkSync 等…...
安装elasticsearch、kibana、IK分词器、扩展IK词典
安装elasticsearch、kibana、IK分词器、扩展IK词典 后面还会安装kibana,这个会提供可视化界面方面学习。 需要注意的是elasticsearch和kibana版本一定要一样!!! 否则就像这样 elasticsearch 1、创建网络 因为我们还需要部署k…...
Spring中常见的BeanFactory后处理器
常见的BeanFacatory后处理器 先给出没有添加任何BeanFactory后处理器的测试代码 public class TestBeanFactoryPostProcessor {public static void main(String[] args) {GenericApplicationContext context new GenericApplicationContext();context.registerBean("co…...
新疆 网站开发/哪里能搜索引擎优化
安装问题 PHP Fatal error: Uncaught Error: Call to undefined function tsingsun\swoole\server\posix_kill() in /data/app/im/vendor/tsingsun/yii2-swoole/src/server/Server.php:248 查了下,php的扩展posix没开,php版本php7.1,环境CentOS7,使用如下…...
wordpress++分页/宁波超值关键词优化
一个无锁消息队列引发的血案(四)——月:RingQueue(上) 自旋锁 - shines77 - 博客园 #ifndef _RINGQUEUE_ #define _RINGQUEUE_#include <stdbool.h> #include <stdio.h> #include <string.h>// 队列包含的信息 typedef str…...
单县网站建设/上海最新发布最新
很受用的一句话: 你吃不了学习的苦,就要吃生活的苦 相信很多的人在初入互联网行业的时候,都会很迷茫,不知道自己要干什么,能发展到什么程度,薪水会达到什么水平,自己能否养活自己,甚至是一家人 我身边有很…...
河北外贸网站建设/搜索引擎调价工具哪个好
ssl证书是一种安全证书,这也是数字证书的一种,一般都是使用于网站的服务器当中的,因此又被称之服务器证书。很多企业都会给网站配置ssl证书,目的是为了保护网站信息安全,防止信息被不法分子盗用。因此,ssl加…...
asp网站开发上传组建/电商推广
http://www.runoob.com/sqlite/sqlite-select.html SQLite Select 语句 SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。 语法 SQLite 的 SELECT 语句的基本语法如下: SELECT column1, colu…...
有没有做q版头像的网站/微博营销策略
1、 什么叫 Spring Boot?什么叫 Spring Boot ?分开来看Spring Boot 是由 Spring 和 Boot 构成,Spring 即 Spring 框架,换句话而言,Spring Boot 是基于 Spring框架进行构建,Boot 就是 BootStrap(…...