ssh-agent, ssh agent, ssh forward

ssh-agent, ssh agent, ssh forward ssh agent forward A > B > C 主机 A:运行 ssh-agent,并且已经加载私钥 主机 B:跳板机 主机 C: 目标机,已经配置好公钥,并且运行 sshd 检查主机 A ssh-agent 是否已经在运行 ps -ef | grep ssh-agent 主机 A ssh-agent 已经加载了密钥 ssh-add -l 主机 A 允许入站连接上的 SSH 代理转发, 将 AllowAgentForwarding 的值设置为 yes,表示允许进行代理转发, openssh 中 AllowAgentForwarding 默认值即为yes,所以,如果配置没有修改过,保持默认即可。 vim /etc/ssh/sshd_config AllowAgentForwarding yes 主机 A ssh 配置 ForwardAgent yes vim ~/.ssh/config #content host * ForwardAgent yes 主机 B 不需要运行 ssh-agent, 也不需要配置 ssh 的 ForwardAgent yes, 主机 B 在使用 ssh agent forward 连接 主机 C 成功之后,会创建 环境变量 $SSH_AUTH_SOCK ...

2022-06-07 · 4 min · 661 words · -

socat

socat socat 测试端口连通性, test a remote port is reachable with socat # test tcp port socat /dev/null TCP:192.168.1.15:22 socat - tcp4:192.168.1.15:22,connect-timeout=3 # test udp port # https://serverfault.com/questions/416205/testing-udp-port-connectivity # set up a server listening on UDP port 1234 socat UDP-RECV:1234 STDOUT # or socat STDIO UDP-LISTEN:1234 # test udp port socat - UDP:localhost:1234 http server, 加载本地 .html 文件 echo "foo">foo.html socat -v -v TCP-LISTEN:8000,crlf,reuseaddr,fork SYSTEM:"echo HTTP/1.0 200; echo Content-Type\: text/plain; echo; cat foo.html" https://stackoverflow.com/questions/29739901/socat-fake-http-server-use-a-file-as-server-response ...

2022-04-19 · 3 min · 533 words · -

iproute2 > 路由表, routing table, ip route

iproute2 > 路由表, routing table, ip route commands ip route # 简写, Abbreviations # route: ro, r. # show: list, sh, ls, l. ip route ls tab all ip route Usage: ip route { list | flush } SELECTOR := 表示声明并定义 { xxx | xxx } 表示多选 - 必选 [] 表示可选 SPEC 应该是 specification 的缩写 NH 应该是 next hop 的缩写 PREFIX 就是地址加掩码的格式, 比如 0.0.0.0/0 PREFIX 有个 default 的特殊表示, 等同于 0.0.0.0/0, 也就是默认路由 路由表 linux 系统路由表可以自定义从 1-252 个路由表, 操作系统维护了 4 个路由表: ...

2022-02-11 · 14 min · 2819 words · -

tcpcopy, 流量复制

tcpcopy, 流量复制 公有云环境 https://github.com/session-replay-tools/tcpcopy/issues/336 云环境下,安全策略可能会干扰测试的进行 采用如下步骤可以规避麻烦: 测试机器和 intercept 部署到一台机器 tcpcopy端 -c 参数采用 tcpcopy 所在的线上机器ip地址 在线上机器设置iptables黑洞来过滤掉测试服务器的响应包 iptables -I INPUT -p tcp --sport 测试服务的端口 -j DROP -s 测试服务所在机器的ip地址 千万要注意在测试服务器不要设置路由了,否则会受到干扰 环境 测试用的 tcp 服务 tcp-echo-server 线上服务器, online source server, xxx.xxx.20.50 2000 端口提供服务 (tcp-echo-server) 测试服务器, 目标服务器, target server, xxx.xxx.20.45, 192.168.50.102 3000 端口提供服务 (tcp-echo-server), 不能跟 online server 用同一个端口 辅助服务器, assistant server, xxx.xxx.20.45, intercept 跟测试服务部署到同一个机器, 不使用单独的服务器 线上服务器安装 tcpcopy git clone https://github.com/session-replay-tools/tcpcopy.git cd tcpcopy ./configure --single make make install ls /usr/local/tcpcopy 辅助服务器 (intercept) 安装 git clone https://github.com/session-replay-tools/intercept.git cd intercept ./configure --single make make install ls /usr/local/intercept 实时复制流量 测试服务器 192.168.50.102 测试服务器不添加路由规则. ...

2022-02-11 · 3 min · 630 words · -

chrome command

chrome command # linux 启动浏览器并打开 URL google-chrome-beta gmail.com google-chrome-beta http://localhost:8080 https://stackoverflow.com/questions/28162697/how-can-i-open-google-chrome-from-the-terminal-with-the-url-localhost3000 Chrome 有很多的特性在界面菜单中是没有体现的,你可以通过 chrome:// 命令来访问。本文介绍 12 个非常有用的 chrome:// 命令: chrome://flags 可用来启用或者关闭某些 chrome 的体验特性 chrome://dns 该命令将显示浏览器预抓取的主机名列表 chrome://downloads 该命令同时也可以从菜单中的下载来访问,其快捷键是 Ctrl + J chrome://extensions 该命令等同于菜单 - 工具 - 扩展 chrome://bookmarks 改名了等同于菜单-书签-书签管理器,快捷键 Ctrl+Shift+O chrome://history 该命令可从菜单-历史直接访问,快捷键 Ctrl+H chrome://memory 该命令将重定向到 “chrome://memory-redirect/”. 它将显示浏览器使用内存的情况,以及系统中运行的其他浏览器,包括 firefox。同时还显示浏览器进程的详细信息。 chrome://net-internals 该命令显示网络相关信息,用来捕获浏览器生成的网络事件,可导出数据,可查看DNS主机解析缓存。 其中一个很重要的功能就是"测试",如果你无法访问某个网址,那么可以使用 “chrome://net-internals” -> 点击"Tests" tab -> 输入网址,并点击开始测试,Chrome 将报告具体的问题所在。 chrome://quota-internals 该命令用来显示浏览器所使用磁盘空间配额的情况。 chrome://sessions 该命令用来显示当前运行的浏览器的会话信息数以及详细列表 chrome://settings 该命令可通过菜单-选项直接访问,可用来控制浏览器各项设置值 chrome://sync-internals 用来显示 chrome 的同步状态 最后,如果你想查看 chrome 所有的命令,可使用 chrome://about/ ...

2022-01-22 · 1 min · 77 words · -

Cookie

Cookie Http Cookies 中 Max-age 和 Expires 有什么区别 快速回答 Expires 为 Cookie 的删除设置一个过期的日期 Max-age 设置一个 Cookie 将要过期的秒数 IE 浏览器(ie6、ie7 和 ie8) 不支持 max-age,所有的浏览器都支持 expires 深入一些来说明 expires 参数是当年网景公司推出 Cookies 原有的一部分。在 HTTP1.1 中,expires 被弃用并且被更加易用的 max-age 所替代。你只需说明这个 Cookie 能够存活多久就可以了,而不用像之前那样指定一个日期。设置二者中的一个,Cookie 会在它过期前一直保存,如果你一个都没有设置,这个 Cookie 将会一直存在直到你关闭浏览器,这种称之为 Session Cookie。 https://jiapan.me/2017/cookies-max-age-vs-expires/

2022-01-22 · 1 min · 42 words · -

RESTful API 设计

RESTful API 设计 URI中不应包含结尾的正斜杠(/)。 域名 应该尽量将API部署在专用域名之下。 https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。 https://example.org/api/ 版本 Versioning 应该将API的版本号放入URL。 https://api.example.com/v1/ 另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。 路径 Endpoint 路径又称"终点" endpoint,表示API的具体网址。 在RESTful架构中,每个网址代表一种资源 resource,所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合" collection,所以API 中的名词也应该使用复数。 HTTP动词 对于资源的具体操作类型,由HTTP动词表示。 常用的HTTP动词有下面五个 (括号里是对应的SQL命令)。 GET (SELECT):取出资源 (一项或多项)。 POST (CREATE):新建一个资源。 PUT (UPDATE):更新资源 (客户端提供改变后的完整资源), Replace (Create or Update) 如果存在就替换, 没有就新增. 在HTTP中,PUT被定义为幂等(idempotent)的方法,POST 则不是,这是一个很重要的区别 PATCH (UPDATE):更新资源 (客户端提供改变的属性)。 DELETE (DELETE):删除资源。 还有两个不常用的HTTP动词 HEAD:获取资源的元数据。 OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。 状态码 (Status Codes) 服务器向用户返回的状态码和提示信息,常见的有以下一些 (方括号中是该状态码对应的HTTP动词)。 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的 (Idempotent)。 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 202 Accepted - [*]:表示一个请求已经进入后台排队 (异步任务) 204 NO CONTENT - [DELETE]:用户删除数据成功。 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。 401 Unauthorized - [*]:表示用户没有权限 (令牌、用户名、密码错误),未登录或会话过期 (需要登录但未登录或会话过期) 403 Forbidden - [] 表示用户得到授权 (与401错误相对),但是访问是被禁止的。没有权限访问、操作 (IP受限或已登录但没权限) 404 NOT FOUND - []:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 406 Not Acceptable - [GET]:用户请求的格式不可得 (比如用户请求JSON格式,但是只有XML格式)。 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。 RESTful API 设计指南 作者: 阮一峰 版权声明:自由转载-非商用-非衍生-保持署名 (创意共享3.0许可证) ...

2022-01-21 · 1 min · 188 words · -

无限层级留言

无限层级留言 mysql 邻接表 路径枚举 嵌套集 闭包表 redis https://www.phpbloger.com/article/50.html https://blog.bfw.wiki/user6/16249674164961840043.html

2022-01-18 · 1 min · 9 words · -

archlinux packages

archlinux packages aalib: ASCII art graphic library aardvark-dns: Authoritative dns server for A/AAAA container records adwaita-fonts 是一个包含 Adwaita 字体(Adwaita Fonts) 的软件包。提供了一套由 GNOME 项目开发的字体, wechat sudo abseil-cpp: Collection of C++ library code designed to augment the C++ standard librar ansible ansible-core aom: Alliance for Open Media video codec appstream: Provides a standard for creating app stores across distributions at-spi2-core: Protocol definitions and daemon for D-Bus at-spi audit: Userspace components of the audit framework ...

2021-12-30 · 2 min · 364 words · -

TCP 拥塞控制算法, CUBIC, BBR

BBR 检查是否已经开启了 BBR # 如果结果中带有bbr,则证明你的内核已开启 bbr。 sysctl net.ipv4.tcp_available_congestion_control BBR 对 TCP 性能的提升是巨大的,它能更有效地使用当下网络环境,Youtube 应用后在吞吐量上有平均 4% 提升 (对于日本这样的网络环境有 14% 以上的提升) 报文的往返时延 RTT 降低了 33%,这样如视频这样的大文件传输更快,用户体验更好: 不像 CUBIC 这种基于丢包做拥塞控制,常导致瓶颈路由器大量报文丢失,所以重新缓存的平均间隔时间也有了 11%提升: 在 Linux 4.19 内核中已经将拥塞控制算法从 CUBIC (该算法从 2.6.19 内核就引入 Linux了)改为 BBR, 而即将面世的基于 UDP 的 HTTP3 也使用此算法。许多做应用开发的同学可能并不清楚什么是拥塞控制,BBR 算法到底在做什么, 我在《Web协议详解与抓包实战》这门课程中用了 6 节课在讲相关内容,这里我尝试下用一篇图片比文字还多的文章把这个事说清楚。 TCP 协议是面向字符流的协议,它允许应用层基于 read/write 方法来发送、读取任意长的字符流: 但 TCP 之下的 IP 层是基于块状的 Packet 报文来分片发送的,因此, TCP 协议需要将应用交付给它的字符流拆分成多个 Packet (在 TCP 传输层被称为 Segment)发送,由于网速有变化且接收主机的处理性能有限, TCP 还要决定何时发送这些 Segment。TCP 滑动窗口解决了 Client、Server 这两台主机的问题, 但没有去管连接中大量路由器、交换机转发 IP 报文的问题,因此当瓶颈路由器的输入流大于其输出流时,便会发生拥塞 ...

2021-11-17 · 2 min · 393 words · -

Chubby

Chubby 分布式锁管理系统,也可理解为一个小型强一致性文件系统 http://www.cnblogs.com/linhaohong/archive/2012/11/26/2789394.html 随着云计算的推广,云平台的设计和实现越来越复杂,很多系统属性如一致性和可靠性往往是在系统迭代开发时才被考虑到。如果在原生的系统上重复的实现复杂的一致性算法,这样不仅会破坏原有设计的结构,而且还带来很多开发上的负担。因此很多系统开发人员和架构师努力地进行系统划分,将系统分割成很多组件,分层设计,模块调用,从而最大限度地提高软件复用能力,降低系统设计和开发的难度。 Google在系统的可靠性方面提出了中心化的组件Chubby—粗粒度锁服务,通过锁原语为其他系统实现更高级的服务,比如组成员、域名服务和leader选举等等。Chubby本身也是一个小型的cell (通常由5个chubby结点组成) ,cell内部采用类似于状态机副本形式实现可靠容错。Google的Chubby论文在OSDI上发表后引起了很大的反响,原因很多,主要有两个: 第一,chubby很好的解决了分布式开发的一致性问题; 第二,Google Chubby采用Leslie Lamport提出的paxos算法来实现可靠容错,这是业界关于paxos第一个完整可行的实现。正因为Google Chubby,paxos这个一直沉淀在学术研究的协议,终于曝光在工业界中,之后很快地推广开去。 然而, Google Chubby 并不是开源的, 我们只能通过其论文和其他相关的文档中了解具体的细节。值得庆幸的是,Yahoo!借鉴 Chubby 的设计思想开发了 Zookeeper, 并将其开源。 和 Chubby 相比, Zookeeper 做了很多突破。不像 Chubby 的单点服务的结构, zookeeper 采用多个 server 同时处理客户端的请求, 异步读同步写, 通过 primary 节点来同步数据的 update, 这一点大大改善了读服务的性能, 当然弱化了客户端与服务器之间的一致性。另外, zookeeper 采用 block free 的服务接口, 采用 watch 机制的方式异步处理请求结果和指定数据的变更。Zookeeper 对外提供了更加低级的原语 primitive, 基于此可以实现更多更加复杂的分布式算法, 如 queue、barrier 和 lock 等等。 如今很多云计算系统或者平台都使用 Zookeeper 来做可靠容错, 进行订阅分发服务, 或者其他应用。 和Chubby一样,zookeeper采用paxos的变种来实现消息传输的一致性。Zookeeper开发了原子多播协议 Zab 来实现数据的一致性传输。Zookeeper采用的是primary-backup的结构,primary节点产生non- commutative 事务,通过协议按序的广播到其他backup节点上。在节点无错的情况下,这是非常简单的事情,然而,面对复杂的网络环境,多变的软硬件条件,节点挂掉,重启,数据重复发送,这些异常很常见。Zookeeper如何做到即便是系统出现异常,也能够保证整个系统状态是一致?paxos的变种,Zookeeper的Zab协议很好的保证了这一点。 Zab 协议以epoch的方式执行 (相当与序列号) ,在每个epoch最多只有一个进程多播数据。如果某个进程执行了协议的的第一阶段,那么进程将不再接受之前还没确定提交的epoch的数据。这样一来就保证了在进程在recovery阶段不会出现丢失已提交的数据的情况。在某个epoch下,所有参加这个epoch的进程必须此epoch之前所有已经提交的数据镜像。为了保证一致性,进程在完全恢复之前必须不能广播新的事务。Zab协议的这几个特点处理了primary异常、新旧primary以及backup节点异常的情况,的确保证了primary进程原子多播的order特性。 整个Zab协议的内容分成三个阶段: Discovery、Synchronization和Broadcast阶段。 ...

2021-11-11 · 1 min · 90 words · -

Raft 一致性算法

Raft 一致性算法 raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos。但Paxos是:少数真正理解的人觉得简单,尚未理解的人觉得很难,大多数人都是一知半解。 raft的论文,两位研究者也提到,他们也花了很长的时间来理解Paxos,他们也觉得很难理解,于是研究出了raft算法。 raft是一个共识算法 (consensus algorithm),所谓共识,就是多个节点对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分割的情况下。这些年最为火热的加密货币 (比特币、区块链)就需要共识算法,而在分布式系统中,共识算法更多用于提高系统的容错性,比如分布式存储中的复制集 (replication),在带着问题学习分布式系统之中心化复制集一文中介绍了中心化复制集的相关知识。raft协议就是一种leader-based的共识算法,与之相应的是leaderless的共识算法。 本文基于论文In Search of an Understandable Consensus Algorithm对raft协议进行分析,当然,还是建议读者直接看论文。 本文地址:https://www.cnblogs.com/xybaby/p/10124083.html raft算法概览 回到顶部 Raft算法的头号目标就是容易理解 (UnderStandable),这从论文的标题就可以看出来。当然,Raft增强了可理解性,在性能、可靠性、可用性方面是不输于Paxos的。 Raft more understandable than Paxos and also provides a better foundation for building practical systems 为了达到易于理解的目标,raft做了很多努力,其中最主要是两件事情: 问题分解 状态简化 问题分解是将"复制集中节点一致性"这个复杂的问题划分为数个可以被独立解释、理解、解决的子问题。在raft,子问题包括,leader election, log replication,safety,membership changes。而状态简化更好理解,就是对算法做出一些限制,减少需要考虑的状态数,使得算法更加清晰,更少的不确定性 (比如,保证新选举出来的leader会包含所有commited log entry) Raft implements consensus by first electing a distinguished leader, then giving the leader complete responsibility for managing the replicated log. The leader accepts log entries from clients, replicates them on other servers, and tells servers when it is safe to apply log entries to their state machines. A leader can fail or become disconnected from the other servers, in which case a new leader is elected. ...

2021-11-08 · 6 min · 1101 words · -

nuxt

nuxt https://www.nuxtjs.cn/guide/installation npx create-nuxt-app foo 服务端渲染 (SSR) 服务端渲染 (Server-Side Rendering),是指由服务侧完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程。 优势: 对SEO友好,减小了http请求次数,加速了页面初次渲染速度 缺点: 不灵活,先后端耦合度过高 SSR 常用于以下两个场景: 有 SEO 诉求,用在搜索引擎检索以及社交分享,用在前台类应用。 首屏渲染时长有要求,常用在移动端、弱网情况下。 客户端渲染 (BSR) 前端利用ajax等数据交互手段获取服务端提供的数据以后,渲染到HTML页面。 客户端运行了页面以后才进行json 优势:灵活,真正的先后端分离,方便于先后台各自更新维护后端 缺点: 对SEO不友好,增长了http请求次数,减缓了页面加载速度 什么是预渲染 服务端渲染,首先得有后端服务器 (一般是 Node.js)才可以使用,如果我没有后端服务器,也想用在上面提到的两个场景,那么推荐使用预渲染。 预渲染与服务端渲染唯一的不同点在于渲染时机,服务端渲染的时机是在用户访问时执行渲染 (即服务时渲染,数据一般是最新的),预渲染的时机是在项目构建时,当用户访问时,数据不一定是最新的 (如果数据没有实时性,则可以直接考虑预渲染)。 预渲染 (Pre Render)在构建时执行渲染,将渲染后的 HTML 片段生成静态 HTML 文件。无需使用 web 服务器实时动态编译 HTML,适用于静态站点生成。 https://umijs.org/zh-CN/docs/ssr#%E4%BB%80%E4%B9%88%E6%98%AF%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B8%B2%E6%9F%93%EF%BC%9F yarn add echarts vue-echarts yarn add -D @vue/composition-api yarn add -D @nuxtjs/composition-api

2021-11-02 · 1 min · 59 words · -

linux 报文高速捕获技术对比, napi/libpcap/afpacket/pfring/dpdk/xdp

linux 报文高速捕获技术对比, napi/libpcap/afpacket/pfring/dpdk/xdp 传统linux网络协议栈流程和性能分析 Linux网络协议栈是处理网络数据包的典型系统,它包含了从物理层直到应用层的全过程。 数据包到达网卡设备。 网卡设备依据配置进行DMA操作。 (第1次拷贝:网卡寄存器->内核为网卡分配的缓冲区 ring buffer) 网卡发送中断,唤醒处理器。 驱动软件从ring buffer中读取,填充内核skbuff结构 (第2次拷贝:内核网卡缓冲区ring buffer->内核专用数据结构skbuff) 数据报文达到内核协议栈,进行高层处理。 socket系统调用将数据从内核搬移到用户态。(第3次拷贝:内核空间->用户空间) 研究者们发现,Linux内核协议栈在数据包的收发过程中,内存拷贝操作的时间开销占了整个处理过程时间开销的65%,此外层间传递的系统调用时间也占据了8%~10%。 协议栈的主要问题: 针对单个数据包级别的资源分配和释放 每当一个数据包到达网卡,系统就会分配一个分组描述符用于存储数据包的信息和头部,直到分组传送到用户态空间,其描述符才被释放。此外,sk_buff 庞大的数据结构中的大部分信息对于大多数网络任务而言都是无用的. 流量的串行访问 现代网卡包括多个硬件的接收端扩展(receiver-side scaling, RSS)队列可以将分组按照五元组散列函数分配到不同的接收队列。使用这种技术,分组的捕获过程可以被并行化,因为每个RSS队列可以映射到一个特定的CPU核,并且可以对应相应的NAPI线程。这样整个捕获过程就可以做到并行化。 但是问题出现在之上的层次,Linux中的协议栈在网络层和传输层需要分析合并的所有数据包 ①所有流量在一个单一模块中被处理,产生性能瓶颈; ②用户进程不能够从一个单一的RSS队列接收消息. 这就造成了上层应用无法利用现代硬件的并行化处理能力,这种在用户态分配流量先后序列的过程降低了系统的性能,丢失了驱动层面所获得的加速. 此外,从不同队列合并的流量可能会产生额外的乱序分组 从驱动到用户态的数据拷贝 从网卡收到数据包到应用取走数据的过程中,存在至少2次数据包的复制 内核到用户空间的上下文切换 从应用程序的视角来看,它需要执行系统调用来接收每个分组.每个系统调用包含一次从用户态到内核态的上下文切换,随之而来的是大量的CPU时间消耗.在每个数据包上执行系统调用时产生的上下文切换可能消耗近1 000个CPU周期. 跨内存访问 例如,当接收一个64 B分组时,cache未命中造成了额外13.8%的CPU周期的消耗.另外,在一个基于NUMA的系统中,内存访问的时间取决于访问的存储节点.因此,cache未命中在跨内存块访问环境下会产生更大的内存访问延迟,从而导致性能下降. 提高捕获效率的技术 目前高性能报文捕获引擎中常用的提高捕获效率的技术,这些技术能够克服之前架构的性能限制. 预分配和重用内存资源 这种技术包括: 开始分组接收之前,预先分配好将要到达的数据包所需的内存空间用来存储数据和元数据(分组描述符).尤其体现在,在加载网卡驱动程序时就分配好 N 个描述符队列(每个硬件队列和设备一个). 同样,当一个数据包被传送到用户空间,其对应的描述符也不会被释放,而是重新用于存储新到达的分组.得益于这一策略,在每个数据包分配/释放所产生的性能瓶颈得到了消除.此外,也可以通过简化 sk_buff 的数据结构来减少内存开销. 数据包采用并行直接通道传递. 为了解决序列化的访问流量,需要建立从RSS队列到应用之间的直接并行数据通道.这种技术通过特定的RSS队列、特定的CPU核和应用三者的绑定来实现性能的提升. 这种技术也存在一些缺点: ①数据包可能会乱序地到达用户态,从而影响某些应用的性能; ②RSS使用Hash函数在每个接收队列间分配流量.当不同核的数据包间没有相互关联时,它们可以被独立地分析,但如果同一条流的往返数据包被分配到不同的CPU核上时,就会造成低效的跨核访问. 内存映射. 使用这种方法,应用程序的内存区域可以映射到内核态的内存区域,应用能够在没有中间副本的情况下读写这片内存区域. 用这种方式我们可以使应用直接访问网卡的DMA内存区域,这种技术被称为零拷贝.但零拷贝也存在潜在的安全问题,向应用暴露出网卡环形队列和寄存器会影响系统的安全性和稳定性 . 数据包的批处理. 为了避免对每个数据包的重复操作的开销,可以使用对数据包的批量处理. 这个策略将数据包划分为组,按组分配缓冲区,将它们一起复制到内核/用户内存.运用这种技术减少了系统调用以及随之而来的上下文切换的次数;同时也减少了拷贝的次数,从而减少了平摊到处理和复制每个数据包的开销. 但由于分组必须等到一个批次已满或定时器期满才会递交给上层,批处理技术的主要问题是延迟抖动以及接收报文时间戳误差的增加. 亲和性与预取. 由于程序运行的局部性原理,为进程分配的内存必须与正在执行它的处理器操作的内存块一致,这种技术被称为内存的亲和性. CPU亲和性是一种技术,它允许进程或线程在指定的处理器核心上运行. 在内核与驱动层面,软件和硬件中断可以用同样的方法指定具体的CPU核或处理器来处理,称为中断亲和力.每当一个线程希望访问所接收的数据,如果先前这些数据已被分配到相同CPU核的中断处理程序接收,则它们在本地cache能够更容易被访问到. 典型收包引擎 3.1 libpcap 参考:libpcap实现机制及接口函数 libpcap的包捕获机制是在数据链路层增加一个旁路处理,不干扰系统自身的网路协议栈的处理,对发送和接收的数据包通过Linux内核做过滤和缓冲处理,最后直接传递给上层应用程序。 ...

2021-10-31 · 2 min · 286 words · -

tcp proxy

tcp proxy https://github.com/jpillora/go-tcp-proxy TCP半开连接与半闭连接 https://www.cnblogs.com/cangqinglang/p/9558236.html half-open connection, 半开连接 https://bbs.huaweicloud.com/blogs/301407 处于 establish 状态的服务端如果收到了客户端的 SYN 报文(注意此时的 SYN 报文其实是乱序的,因为 SYN 报文的初始化序列号其实是一个随机数),会回复一个携带了正确序列号和确认号的 ACK 报文,这个 ACK 被称之为 Challenge ACK。 接着,客户端收到这个 Challenge ACK,发现序列号并不是自己期望收到的,于是就会回 RST 报文,服务端收到后,就会释放掉该连接。 RFC 文档解释 rfc793 文档里的第 34 页里,有说到这个例子。 原文的解释我也贴出来给大家看看。 When the SYN arrives at line 3, TCP B, being in a synchronized state, and the incoming segment outside the window, responds with an acknowledgment indicating what sequence it next expects to hear (ACK 100). TCP A sees that this segment does not acknowledge anything it sent and, being unsynchronized, sends a reset (RST) because it has detected a half-open connection. TCP B aborts at line 5. TCP A willcontinue to try to establish the connection;

2021-10-02 · 1 min · 112 words · -

Pulsar

Pulsar Pulsar [ˈpʌlsɑːr] Apache Pulsar (孵化器项目)是一个企业级的发布订阅 (pub-sub)消息系统,最初由 Yahoo 开发,并于 2016 年底开源 https://www.infoq.cn/article/2017/11/apache-pulsar-brief-introduction

2021-09-01 · 1 min · 12 words · -

IPA

IPA, International Phonetic Alphabet, 国际音标 元音字母, 辅音字母 5个元音字母和21个辅音字母组成。 5个元音字母分别为:a[ei]、e[i:]、i[ ai]、o[eu]、u[ju:]; 元音, 辅音 48个英语音标表:20个元音+28个辅音 一、单元音12个 短元音: [i] [ə] [ɒ] [u] [Λ] [æ] [e] 长元音: [i:] [ə:] [ɔ:] [u:] [ɑ:] 二、双元音8个 [ai] [ei] [ɔi] [au] [əu] [iə] [eə] [uə] 三、清浊成对的辅音10对 清辅音:[p] [t] [k] [f] [θ] [s] [tr] [ts] [∫] [t∫] 浊辅音:[b] [d] [g] [v] [ð] [z] [dr] [dz] [ʒ] [dʒ] 四、其他辅音8个 [h] [m ] [n] [ŋ] [l] [r] [w] [j] the在元音前读[ði],在辅音前读[ðə],而元辅音的判断不是第一个单词,而是第一个音素,或说发音。 元音 [æ], half, sat, laugh, cat [ɑ], lock, what, hard, article [ʌ] cut, son, flood ...

2021-08-23 · 1 min · 124 words · -

celery

celery https://github.com/celery/celery celery 是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程, 如 Eventlet,gevent等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)。 # install rabbitmq https://wangyue.dev/rabbitmq # install celery pip install celery # 添加用户跟密码, rabbitmqctl add_user test test123 rabbitmqctl add_user user0 password0 # 添加虚拟主机 rabbitmqctl add_vhost test_vhost rabbitmqctl add_vhost vhost0 # 为用户添加标签, rabbitmqctl set_user_tags test test_tag rabbitmqctl set_user_tags user0 tag0 # 设置用户权限, rabbitmqctl set_permissions -p test_vhost test ".*" ".*" ".*" rabbitmqctl set_permissions -p vhost0 user0 ".*" ".*" ".*" # run celery server celery -A tasks worker --loglevel=INFO ———————————————— 版权声明:本文为CSDN博主「吴秋霖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qiulin_wu/article/details/106119757 ...

2021-08-16 · 2 min · 280 words · -

rabbitmq

rabbitmq nerdctl # nerdctl, network: host nerdctl run -d --hostname host0 --name rabbitmq --network host --memory 2g -p 15672:15672 -p 5672:5672 -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 50000" rabbitmq:3.8.18-management # docker with timeout config docker run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 50000" rabbitmq:3.8.18-management # 查看 版本 rabbitmqctl status docker run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.11.10-management docker run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.8.18-management podman run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.11.10-management rabbitmqctl list_connections rabbitmqctl list_queues rabbitmqctl list_channels rabbitmqctl list_users rabbitmqctl cluster_status # 查看 consumer_timeout 的值 rabbitmqctl eval 'application:get_env(rabbit, consumer_timeout).' 管理页面 使用:http://宿主ip:15672 访问管理页面,默认用户名密码:guest/guest ...

2021-08-16 · 2 min · 311 words · -

sasl

“sasl” SASL - 简单认证和安全层 身份验证是很多C/S模式应用协议的通用需求,为了避免每个协议都单独实现一套验证逻辑,SASL(Simple Authentication and Secure Layer)被提出了, 它定位成为基于可靠连接的应用协议提供身份验证和数据安全服务的通用框架。SASL定义了通用的身份验证信息交换的流程, 并且包含一系列验证机制。这些验证机制完成具体的身份验证逻辑。这样,SASL就成为了一个将应用协议和验证机制相连接的抽象层,如下图所示。 +----+ +----+ +----+ +-------------------+ |SMTP| |LDAP| |XMPP| |Other protocols ...| +--+-+ +--+-+ +--+-+ +--+----------------+ | | | | | | | | ------+--------+---------+--------+------------------ SASL abstraction layer ------+--------+---------+--------+------------------ | | | | | | | | +-----+--+ +--+---+ +--+--+ +--+-----------------+ |EXTERNAL| |GSSAPI| |PLAIN| |Other machanisms ...| +--------+ +------+ +-----+ +--------------------+ 任何应用协议都可以使用任何验证机制,而具体使用哪个机制则由应用协议的客户端和服务器进行协商。 分别以”C:”和”S:”代表客户端和服务端,SASL规定的验证信息交换的基本流程为: C: 请求验证交换 S: 最初的挑战码 C: 最初的响应消息 <额外的挑战码/响应消息> S: 身份验证结果 根据机制不同,流程略有差异。 ...

2021-08-13 · 4 min · 794 words · -