Linux网络编程
文章平均质量分 54
INGNIGHT
这个作者很懒,什么都没留下…
展开
-
brpc profiler
【代码】brpc mac安装profiler。原创 2024-05-04 20:42:59 · 428 阅读 · 0 评论 -
brpc中http2 grpc协议解析
这个是固定长度的9字节帧头部,length是,3*8bit(3字节),type8bit,flags8bit,streamid(最高32位置,应该是个0,所以&0x8000000是0)解析完9字节帧头部,按照帧头中的type去解析,playload中的内容,假设type类型是header帧类型。playload是Header类型的帧,是hpack编码的。具体解析是Decode函数,按照hpack规则解析。先看下前4个bit为header类型帧哪种编码格式,如果是。解析frame header信息。原创 2024-05-03 21:26:30 · 310 阅读 · 0 评论 -
grpc stream发送
在这个示例中,客户端创建了一个类,并在GetNumbers方法中发送了一个消息,要求服务器端返回 5 个消息。客户端使用接收服务器端返回的流式消息,并在循环中打印出每个结果。最后,客户端调用Finish方法来完成整个 RPC 调用。这个示例展示了如何在 gRPC C++ 中实现服务器端流式 RPC,客户端可以根据需要修改请求的参数和处理返回结果的逻辑。原创 2024-05-03 16:07:13 · 323 阅读 · 0 评论 -
brpc负载均衡load balance和服务发现name servicing
2.2.3nsthread->Start,bthread_start_urgent创建一个协程RunThis->Run->_ns->RunNamingService。3.Channel:包含LoadBalancerWithNaming的指针_lb,new LoadBalancerWithNaming,lb->Init。1.SharedLoadBalancer(load_balancer.h):包含LoadBalancer指针_lb。原创 2024-01-21 22:28:08 · 835 阅读 · 0 评论 -
阻塞、非阻塞、异步、同步
但当IO并发度愈发提高时,blocking IO阻塞一个线程的弊端便显露出来:内核得不停地在线程间切换才能完成有效的工作,一个cpu core上可能只做了一点点事情,就马上又换成了另一个线程,cpu cache没得到充分利用,另外大量的线程会使得依赖thread-local加速的代码性能明显下降,如tcmalloc,一旦malloc变慢,程序整体性能往往也会随之下降。内核把数据准备好了之后,它也是通过read返回的,read一返回,其实也就意味着数据是否准备好。原创 2023-10-07 21:04:10 · 230 阅读 · 0 评论 -
tcp拥塞控制原理
我们在向对端发送数据时,并不是一股脑子任意发送,因为TCP建立连接后,就是建立了一根管道,这跟管道上,实际上有很多的工作设备,比如路由器和交换机等等,他们都会对接收到的TCP包进行缓存,以便实现排序,然后发送,但是这些设备并不是只为一个TCP连接中转数据包,大量的网络包也许会耗尽存储空间,从而导致TCP连接的吞吐量急剧下降。原创 2023-10-03 16:02:00 · 454 阅读 · 1 评论 -
tcp滑动窗口原理
另外,你需要知道网络上有个MTU,对于以太网来说,MTU是1500字节,除去TCP+IP头的40个字节,真正的数据传输可以有1460,这就是所谓的MSS(Max Segment Size)注意,TCP的RFC定义这个MSS的默认值是536,这是因为 RFC 791里说了任何一个IP设备都得最少接收576尺寸的大小(实际上来说576是拨号的网络的MTU,而576减去IP头的20个字节就是536)。要知道,我们的TCP+IP头有40个字节,为了几个字节,要达上这么大的开销,这太不经济了。原创 2023-10-03 15:38:02 · 186 阅读 · 0 评论 -
Log日志库
【代码】Log日志库。原创 2023-09-04 16:55:06 · 67 阅读 · 0 评论 -
Map Reduce
原创 2023-08-01 22:58:57 · 169 阅读 · 0 评论 -
server端统计latency和pv lost
【代码】server端统计latency和pv lost。原创 2023-08-01 22:46:53 · 113 阅读 · 0 评论 -
链路追踪设计
原创 2023-07-30 09:22:26 · 117 阅读 · 0 评论 -
OS-08-事件驱动:C10M是如何实现的?
你好,我是陶辉。上一讲介绍了广播与组播这种一对多通讯方式,从这一讲开始,我们回到主流的一对一通讯方式。早些年我们谈到高并发,总是会提到C10K,这是指服务器同时处理1万个TCP连接。随着服务器性能的提升,近来我们更希望单台服务器的并发能力可以达到C10M,也就是同时可以处理1千万个TCP连接。从C10K到C10M,实现技术并没有本质变化,都是用事件驱动和异步开发实现的。介绍过的协程,也是依赖这二者实现高并发的。原创 2023-07-29 18:09:07 · 274 阅读 · 0 评论 -
计数器限流
【代码】计数器限流。原创 2023-06-08 21:03:13 · 65 阅读 · 0 评论 -
Bucket Sort
原创 2023-05-26 09:42:07 · 50 阅读 · 0 评论 -
Bounded-Buffer
原创 2023-05-25 13:44:49 · 96 阅读 · 0 评论 -
数据库连接池
【代码】数据库连接池。原创 2023-04-10 21:14:50 · 67 阅读 · 0 评论 -
查看虚拟内存和物理内存映射
#include <iostream>#include <fstream>#include <string>#include <stdint.h>#include <unistd.h>#include <sys/mman.h>struct Page{ uint64_t address; uint64_t entry[512]; };uint64_t get_phys_address(uint64_t ent.转载 2021-09-16 12:42:03 · 358 阅读 · 0 评论 -
LockFreeQueue
#pragma once#include <atomic>#include <vector>/* read1 read2 read_index_ write1 write2 write_index_ read write*/template <typename T, size_t N = 1024>class LockFreeQueue{public: struct Element { .转载 2021-09-15 16:58:47 · 120 阅读 · 0 评论 -
陈硕网络编程实战视频教程目录
http://chenshuo.com/practical-network-programming/视频:https://www.bilibili.com/video/BV1sE41137zG?from=search&seid=191319194812128778Course DescriptionTeach common network programming techniques by examples Focus on server-side TCP network progra原创 2020-10-05 18:42:33 · 1194 阅读 · 1 评论 -
Round trip
如果ppm换算成百分号“%”为:1ppm=0.0001%。但在大多数科技期刊中,已经不使用ppm,而改用千分号“‰”,ppm换算成‰为:1ppm=0.001‰。ppm是指part per million,同理b,t分别表示billion和trillion。即1ppm=10^-6数量级,类似的还有ppb,ppt等,分别是-9次和-12次。严格地说他们不是单位,只是比率的表示https://baike.baidu.com/item/ppm/19249422?fr=aladdi...原创 2020-10-05 20:33:33 · 154 阅读 · 0 评论 -
多线程模型
一、什么是线程1.在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”2.一切进程至少都有一个执行线二、进程与线程1.进程是资源竞争的基本单位2.线程是程序执行的最小单位3.线程共享进程数据,但也拥有自己的一部分数据 线程ID,一组寄存器,栈,errno,信号状态,优先级三、fork和创建新线程的区别1.当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它...原创 2020-09-12 12:27:01 · 354 阅读 · 0 评论 -
Tcp keepalive详解
转载:https://www.cnblogs.com/lanyangsh/p/10926806.htmlTCP是面向连接的,一般情况,两端的应用程序可以通过发送和接收数据得知对端的存活。当两端的应用程序都没有数据发送和接收时,如何判断连接是否正常呢?这就是SO_KEEPALIVE的作用。1. SO_KEEPALIVE 的作用1.1 SO_KEEPALIVE的定义SO_KEEPALIVE用于开启或者关闭保活探测,默认情况下是关闭的。当SO_KEEPALIVE开启时,可以保持连接检测对转载 2020-07-15 11:30:28 · 439 阅读 · 0 评论 -
Protocol Buffers数据编码
Protocol Buffers这是要多快好省的建设社会主义啊。理想还是要有的嘛,这里我就来介绍一个向“理想”迈进的GRPC。GRPC首先满足二进制和跨语言这两条,二进制说明压缩效率高,跨语言说明更灵活。但是又是二进制,又是跨语言,这就相当于两个人沟通,你不但说方言,还说缩略语,人家怎么听懂呢?所以,最好双方弄一个协议约定文件,里面规定好双方沟通的专业术语,这样沟通就顺畅多了。对于GRPC来讲,二进制序列化协议是Protocol Buffers。首先,需要定义一个协议文件.proto。我们还原创 2020-07-14 12:05:47 · 261 阅读 · 0 评论 -
Google Perf Tools安装以及使用
Google Performance Tools安装以及使用这边文章都记录在github:https://github.com/NIGHTFIGHTING/gperftools-tutorial一个优化的内存管理算法—tcmalloc性能优于malloc。一个用于CPU profile的工具,用于检测程序的性能热点,这个功能和gprof类似。一个用于堆检查工具,用于检测程序在是够有内存泄露...原创 2020-03-09 00:40:47 · 2169 阅读 · 0 评论 -
57. TCP relay功能描述及Python实现
处理client与server的带宽不匹配代码:https://github.com/chenshuo/recipes/blob/master/python/tcprelay2.py这个版本没有正确处理关闭连接,没有做错误处理目标server接收数据慢,则sendall会阻塞,自然从source读会变慢。不会造成数据堆积。用阻塞io自然解决带宽不匹配的问题如果s...原创 2019-11-01 19:48:47 · 910 阅读 · 0 评论 -
23.使用非阻塞IO 2
非阻塞io另一个情况是对方接收数据缓慢,带宽不匹配水位太高设置high water marklow water mark一般设置0,等待数据全部发完,在接收新的数据non-block 写proxy,在七层http。具体的例子:echo使用non-blocking读,等read事件read去读放在本机缓冲区中。等write事件去写。如果对方只发送不接收,从socket...原创 2019-11-01 18:05:47 · 125 阅读 · 0 评论 -
22.使用非阻塞IO 1
非阻塞io事件驱动,在做很多计算,你的数据就散落在很多回调函数里面比较难的是,一个函数,加一个功能会阻塞,则将一个函数拆成两个,状态想办法暂存起来。保存现场,等网络库通知你ace网络库在非阻塞上面是个不好的例子,有三本书讲,c++网络编程1.2卷,ace编程指南之前的例子是阻塞在write上,是不是可以判断有EPOLLOUT再去写呢...原创 2019-10-31 20:27:37 · 160 阅读 · 0 评论 -
21.IO-multiplexing方式实现Netcat
连接数不太多,线程非常廉价情况在C/C++,Java,线程廉价不满足,解决方法是IO复用,用户态线程出现1993年,linux2.7版本IO复用一个进程可以处理多个文件描述符。tcp/ip 1983 bsd的4.2版本。socket api也是bsd 4.2版本引入的。io复用和socket api出来时间一样长同步,复用线程io复用一般和non-blocking使用...原创 2019-10-31 19:14:40 · 194 阅读 · 0 评论 -
20.第一个Netcat的实现
https://github.com/chenshuo/recipes/blob/master/tpc/bin/netcat.cc准确说不是每个连接对应一个线程,每个连接对应两个线程,每个线程只管半个连接,管理其中一个方向,收/发,读或者写。go语言中线程代价低,go routine,channel,select线程模仿go routine,阻塞队列可以模仿channel主线程...原创 2019-10-30 21:14:59 · 347 阅读 · 0 评论 -
19.多个版本的Netcat概览
netcat服务端与客户端区别在于连接建立的方式,tcp连接建立起来,程序行为一样。一个从stdin读写到socket,一个从socket读写到stdout,两个方向数据流动。server端:./chargen -l 1234系统自带:nc localhost 1234 >/dev/nullc++版本:./netcat localhost 1234 > /d...原创 2019-10-29 18:05:17 · 710 阅读 · 0 评论 -
18.TCP使用的注意事项
程序向对方已经关闭的管道,写数据,会收到SIGPIPE信号。write 系统调用返回-1收到erronoEPIPE, man 2 write。SIGPIPE信号默认行为终止进程。用管道串起一段命令,如果管道末端程序对出,则管道依次收到SIGPIPE信号退出。head找到前十行,产生SIGPIPE信号,避免解压缩整个大文件huge.log.gz文件unix默认使用阻塞IO,自动限速...原创 2019-10-29 16:42:00 · 379 阅读 · 0 评论 -
17.如何正确使用TCP
netcat与socket文件描述符,stdin标准输入,stdout标准输出打交道如何正确关闭tcp连接?tcp是可靠协议,如果程序不正确,传输数据可能出错/不完整为什么IO多轮复用要和非阻塞io使用netcat是瑞士军刀,功能很多(1)信号发生器source,发送大量数据,相当于chargen(2)负载,接收大量数据,相当于discard(3)dd命令产...原创 2019-10-29 11:53:10 · 1150 阅读 · 0 评论 -
socket编程(一)
1.什么是socket?(1)socket可以看成是用户进程与内核网络协议的编程接口。(2)socket不仅可以用于本机的进程间通信,还可以用于网络不同主机的进程间通信。异构架构可以不同(手机<->PC)2.IPV4套接口地址结构IPV4套接口地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在头文件<netinet/in.h>中...原创 2017-06-17 16:56:37 · 352 阅读 · 0 评论 -
socket编程(二)
1.TCP客户/服务器模型2.回射客户/服务器3.socket函数头文件:功能:创建一个套接字用于通信原型:int socket(int domain, int type, int protocol);参数:domain:指定通信协议族(protocol family) type:指定socket类型,流式套接字SOCK_STR原创 2017-06-18 12:55:27 · 282 阅读 · 0 评论 -
socket编程(三)
1.REUSEADDR服务器端尽可能使用REUSEADDR在绑定之前尽可能调用setsockopt来设置REUSEADDR套接字选项。使用REUSEADDR选项可以使得不必等待TIME_WAIT状态消失可以重启服务器。2.处理多客户连接(process-per-connection)echoserver.cpp#include #include #include #i原创 2017-06-18 16:09:24 · 404 阅读 · 0 评论 -
socket编程(四)
1.流协议与粘包TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的。这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的。TCP的发送方无法保证对等方每次接收到的是一个完整的数据包。主机A向主机B发送两个数据包,主机B的接收情况可能是2.粘包产生的原因原创 2017-06-19 23:26:37 · 322 阅读 · 0 评论 -
socket编程(五)
1.read,write与recv,send(1)recv只能接收套接字io(2)recv有Flags选项(3)recv选项:MSG_OOB接收带外数据,通过紧急指针,TCP选项(4)recv选项:MSG_PEEK接收缓冲区中的数据,但是不将缓冲区中的数据清除2.redline实现//从套接口接收数据,但是不从缓冲区中移除MSG_PEEK//只要有偷看到数据就接收,原创 2017-06-20 09:37:59 · 313 阅读 · 0 评论 -
socket编程(六)
1.TCP/IP回射客户/服务器2.TCP是个流协议(1)TCP是个基于字节流传输的,只维护发送出去多少,确认了多少,没有维护消息与消息之间的边界,因而可能导致粘包问题。(2)粘包问题解决方法是在应用层维护消息边界。3.僵进程与SIGCHLD信号(1)signal(SIGCHLD, SIG_IGN);(2)signal(SIGCHLD, handle_sigchld);原创 2017-06-21 00:07:12 · 357 阅读 · 0 评论 -
socket编程(七)
1.TCP11种状态2.观察TCP11种状态1.服务器端与客户端通信的子进程关闭(1)客户端与服务端连接成功(2)kill -9杀死与客户端连接的子进程。服务器端先关闭,进入FIN_WAIT2状态客户端进入CLOSE_WAIT状态,客户端没有输入,read没有返回0(3)输入字符后,客户端返回0,服务器端处于监听状态LISTEN2.客户端关闭(1原创 2017-06-21 12:03:45 · 305 阅读 · 0 评论 -
systen v消息队列(一)
1.消息队列(1)消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(2)每个数据都被认为是有一个类型,接收者进程接收的数据块可以有不同的类性值(3)消息队列也有管道一样的不足,就是每个消息的最大长度(MSGMAX),每个消息队列的总的字节数(MSGMNB),系统上消息队列的总数(MSGMNI)2.IPC数据结构3.消息队列结构4.消息队列在内核中的表示原创 2017-07-02 11:57:12 · 328 阅读 · 0 评论