linux网络编程
文章平均质量分 74
Shonm
用blog记录点点滴滴。。。成长的轨迹一步一个印
展开
-
select函数中的算法
先讨论与IO无关的东西.调用select 的流程是1 将要监听的文件描述符(集)a,b,c选入一个集合S2 调用select,可以设置超时参数4 函数内部设置S集合中的描述符3 函数返回,解析S中还有哪些述符怎样高效的来实现上述的过程.我们知道文件描述符是一个较小递增不重复的int,根据这个特点,我们可以用bitmap算法来实现,本质是一个映射关系.用几个较少的数来表示很多的数首先我们来讨论一下怎...原创 2018-03-14 14:59:41 · 557 阅读 · 0 评论 -
白话TCP运输控制(二) -- TCP的流量控制
上篇讲的是拥塞控制,这篇讲流量控制。还是以运输粮食为场景。虽然运输的拥塞控制能够在运输效率和拥塞之间达到平衡,但是运输粮食的整体效率还受一个关键因数影响,那就是对岸西村粮食的卸货能力。假设粮食运送到对岸后,要卸放在一个仓库里,随后被运往其他地方。如果运输的太快,仓库载货能力有限,粮食又没有及时被消耗,工人们只好等待仓库腾出地方来卸下新的粮食。显然这样会影响这个工程的效率。后来工人们又想了一...原创 2018-07-11 15:58:27 · 623 阅读 · 5 评论 -
listen,accept的思考
在网络编程调用listen,accept的时候,我时不时会有这样的疑问:究竟listen函数的第二个参数指的是什么,虽然大致知道是连接队列的意思。但是面对错综复杂的网络环境,特别是在高并发编程中,完全搞清楚他的真实含义很有必要,不至于担心连接跟不上,导致连接这块出问题,至少出了问题能做到心中有数。服务器建立socket连接要调用listen监听socket。listen的第二个参数backlog是...原创 2018-07-06 22:31:54 · 309 阅读 · 0 评论 -
linux网络编程惊群现象模拟
对于linux服务器的惊群现象早有耳闻,只是不知道他的具体场景,如今在学linux网络编程多进程模型下,正好遇到这个问题。如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进程、多线程、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker多进程异步驱动模型。今天和大家一起讨论一下网络开发中遇到的“惊群”现象。今天周末,结合自己的理解和网上的资料,彻...原创 2018-07-07 14:34:15 · 305 阅读 · 0 评论 -
muduo一个简单echo服务器的分析
muduo一个简单echo服务器的分析前两篇写muduo网络框架线程处理,这两篇通过一个小的echo服务器来完整说明这个网络事件处理的流程。echo是muduo自带的例子,十分简单:int main(){ LOG_INFO << "pid = " << getpid(); muduo::net::EventLoop loop; muduo::net:...原创 2018-08-03 17:53:40 · 1339 阅读 · 0 评论 -
一个故事读懂git基本工作方式
快毕业了,张小明要完成毕业论文,限期3个月完成。负责论文的李老师会定期要学生上交论文,抽查论文完成的情况。而且还规定要保留原稿,以证明论文不是抄袭的。由于论文篇幅很长,内容繁杂,而且那时候还没有计算机,不能写电子文档,修修改改是避免不了的,所以张小明自己想了一个法子,来对付论文。张小明每次写一段论文时,都先在草稿本上写,哪怕修修改改写的很乱也没有关系,因为只有他一个人看得到。在草稿本上修改...原创 2018-07-31 10:26:35 · 535 阅读 · 1 评论 -
TCP为什么要三次握手
经常有人会问tcp建立连接时为什么要三次握手,两次行不行呢?不行,那可能会死人的,不信我讲个故事。北宋末年,统治阶级奢靡腐败,苛捐杂税压得人们喘不过气来。一时间盗贼四起,纷纷占山为王。盗贼们时不时打家劫舍,骚扰村民,连官府都不敢轻举妄动。后来上任了一位较有作为的县官,不忍看到百姓受苦,决心围剿盗贼。但是盗贼在山头,易守难攻,他们决定兵分两路,分为东边军和西边军,从东边和西边夹击盗贼,一举拿...原创 2018-08-01 19:26:23 · 6996 阅读 · 13 评论 -
muduo 多线程的处理
一般网络编程中为什么会用到多线程呢,无非是充分利用服务器多核的特性,提高网络并发量,吞吐率等。一般情况下,我们可以轻松想到这样的模型:主线程中监听socket连接事件,当产生新的连接时生成新的线程来处理。这种方式比较直接,但是有些不好处理的地方,例如线程的数量,真的是一个连接开一个线程吗。其实可以用线程池来解决这个问题,那说到线程池,那又如何解决线程与连接对应的问题,毕竟一个连接肯定是始终要在一个...原创 2018-08-03 11:26:45 · 2084 阅读 · 1 评论 -
muduo多线程的启动
上篇说了多线程处理的概述,这篇说说具体实现。muduo的多线程是由线程池中启动的。线程池类EventLoopThreadPool在TcpServer类中创建一个新的实例。发现在muduo中,各种类的关系基本上引用和包含即组合关系,很少有派生关系的,没有继承关系就没有虚函数的应用了。可能陈硕觉得继承关系比较复杂,耦合度太高,破坏整体设计。但是我觉得muduo中那么多不同种类的智能指针,还有基...原创 2018-08-03 16:08:06 · 838 阅读 · 0 评论 -
UDP协议解惑
由于平时UDP协议接触的少,最近在梳理网络编程知识的时候,发现好多之前没有深入了解过的问题,有的甚至颠覆了以前的网络编程知识。以下是几个很重要的知识点。1 UDP的无连接学过网络编程的朋友都知道,TCP是有连接的,而UDP协议是无连接的。那么这个连接究竟指的什么?从编程的角度来说,连接指的是套接字描述符绑定了通信两端EndPoint的接口。例如TCP建立的连接一定是两个真实有效的两端,...原创 2018-04-27 22:37:51 · 550 阅读 · 0 评论 -
白话TCP运输控制(一) -- TCP的拥塞控制
tcp的运输控制分为tcp流量控制和tcp拥塞控制,这里先讲tcp的拥塞控制。为了讲清楚tcp的拥塞控制,还是利用那个渡河的场景。为了更好的说明问题,这里把渡人换成搬粮食。话说东村要往西村运输粮食,只能走水路。每天都会有大量的粮食从东村经码头运往西村。由于工作量繁重,运输工人们都希望能尽快把粮食运输到西村。加上水面交通繁忙,各式各样的商船客船往来络绎不绝,更加加大了搬运的困难性。在开始...原创 2018-07-11 12:27:13 · 1078 阅读 · 2 评论 -
白话讲解Nagle算法和延迟确认
以前对nagle算法有耳闻,利用TCP_NODELAY选项可以禁止他。然后看到延迟ack时,心想TCP_NODELAY选项与他有没有关系呢。其实没有,TCP_NODELAY只是用来禁用nagle算法的。关于他们之间的关系倒可以好好研究下。有以下一个场景,村东和村西隔着一条大河,有几条船在两岸摆渡。由于每次要求过河的人只有一个,如果来一个人就将那个人摆渡过去(假设船只足够多),那势必运输效率非常低,...原创 2018-07-10 21:39:55 · 7662 阅读 · 1 评论 -
epoll EPOLLLT模式和EPOLLET模式
Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上没读写完的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降...原创 2018-03-14 15:30:25 · 1025 阅读 · 0 评论 -
以太网数据帧结构以及大小限制
以太网数据帧结构 以太网是目前最流行的一种局域网组网技术(其他常见局域网组网技术还有令牌环局域网、无线局域网、ATM局域网),以太网技术的正式标准是IEEE 802.3标准,它规定了在以太网中传输的数据帧结构,如下图所示。 1、前导码/帧起始定界符:7字节0x55,一串1、0间隔,用于信号同步,1字节0xD5(10101011),表示一帧...原创 2018-04-09 21:47:58 · 9235 阅读 · 0 评论 -
http服务器究竟做了什么(一)
本篇文章旨在从服务器后台开发的角度剖析一个简单的http服务器的运行原理.我们知道浏览器是http(s)的客户端,目的是连接远程的http服务器,然后服务器返回浏览器数据.浏览器接收数据解析数据之后展现出来.我们看到的外在表现就是,浏览器访问一个url,然后就得到相应的web页面.同样我们知道,浏览器与http服务器是通过http协议,传输层是tcp协议,因为他是有连接,可靠的协议.关于http协...原创 2018-04-18 21:09:55 · 4275 阅读 · 0 评论 -
http服务器究竟做了什么(二)
上篇http服务器究竟做了什么(一)提到http服务器会有接口让第三方程序来接入,从而实现业务分离的作用.接口肯定有接口的规范,例如我国家用插座输出电压规范是220v,厂商都是根据这个规范来生产家电的.那么http服务器接口的规范是什么呢?他有有个专有名词:Common Gateway Interface(通用网关接口),简称CGI.服务器与CGI主要通过标准输入输出来通信和交互.CGI本质上是一...原创 2018-04-20 11:34:29 · 695 阅读 · 0 评论 -
匿名管道为什么可以在父子进程间通信
网上关于匿名管道的用法已经非常多了,这里就不再过多的介绍,只关注本篇的主题.匿名管道创建函数pipe()系统调用底层的实现就相当于一个特殊的文件系统,每次调用的时候创建一个inode关联着两个file,一个用于读,一个用于写,从而实现数据的单向流动.一个管道实际上就是一个无形(只存在于内存中)的文件,对这个文件的操作要通过两个已经打开的文件进行,分别代表该管道的两端 .每个文件都是有一个inode...原创 2018-04-20 19:52:14 · 2447 阅读 · 0 评论 -
muduo源码分析(一)
muduo是个基于现代C++高效的高并发网络库,他依赖boost库,由陈硕大神编写,更多详情介绍,请看点击打开链接muduo代码结构比较清晰易懂,各个细节处理的非常完美,是一个非常值得学习的开源库。基于他是个网络库,开篇我剖析他的网络相关部分的结果,各个类的继承,调用关系。网络服务器要处理的对象无外乎,监听者TcpServer,连接接收者Acceptor,连接者TcpConnection等...原创 2018-06-14 11:50:30 · 21164 阅读 · 2 评论 -
epoll EPOLLL、EPOLLET模式与阻塞、非阻塞
EPOLLLT,EPOLLET是epoll两种不同的模式,前面已经讲过他们的区别:触发的时机不一致。读取数据的方式因此也不一样,下面我们分别讨论。在EPOLLLT(水平触发)模式下,也就是默认的模式,epoll_wait返回可读事件,表明socket一定收到了数据,我们可以调用read函数来读取数据。如果指定读取的数据大于缓冲区数据,无论socket是阻塞还是非阻塞的,read不会阻塞,read返...原创 2018-05-31 19:01:40 · 14965 阅读 · 12 评论 -
tcp/udp建立连接并通信的过程
基于TCP的socket编程的服务器程序流程如下:1.创建套接字SOCKETsockSrv = socket(AF_INET, SOCK_STREAM, 0) ;2.将套接字绑定到本地地址和端口上 SOCKADDR_INaddrSrv ; ...原创 2014-07-21 15:31:51 · 16149 阅读 · 0 评论 -
一个典型reactor网络模型实现
这些天一直在研究网络编程源码,发现很多开源项目都用到了reactor网络模式,例如libevent,skynet,muduo等等。现在对reactor模式也有了一定的认识。Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:1)响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多...原创 2018-07-16 23:40:03 · 2544 阅读 · 3 评论 -
为什么抓包时IP包会大于MTU
在linux上抓包的时候,发现了很大的包,有的包达到了2800字节,在局域网的时候甚至有10K字节以上的包。这与我们所学的IP数据包不能超过MTU(一般是1500字节)相违背。查资料得知,这是因为网卡有设置tcp-segmentation-offload。这是操作系统为了减轻负担,提高处理效率的一种方法。 我们知道,用TCP/IP协议处理网络流量,要占用大量服务器资源。为了减轻服务器的压力...原创 2018-09-30 14:46:22 · 3061 阅读 · 0 评论