网络编程
Shonm
用blog记录点点滴滴。。。成长的轨迹一步一个印
展开
-
一个典型reactor网络模型实现
这些天一直在研究网络编程源码,发现很多开源项目都用到了reactor网络模式,例如libevent,skynet,muduo等等。现在对reactor模式也有了一定的认识。Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:1)响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多...原创 2018-07-16 23:40:03 · 2566 阅读 · 3 评论 -
自己写http服务器
为了从性能和易用性上测试我写的mu_event的效果,想写一个网络应用来验证一下,正好我的下一个目标是http服务器,所以我决定动手写一个小型的http服务器。其实开源的http服务器有很多,但是出名的都是比较重量级的,不利于学习。所以我找了几个小型的http server项目,抽出其中的http协议解析部分,改动部分代码后,应用在我的项目中使用。我本以为很快就能完成一个基本的项目,后来却...原创 2019-05-25 15:46:56 · 1229 阅读 · 0 评论 -
为什么抓包时IP包会大于MTU
在linux上抓包的时候,发现了很大的包,有的包达到了2800字节,在局域网的时候甚至有10K字节以上的包。这与我们所学的IP数据包不能超过MTU(一般是1500字节)相违背。查资料得知,这是因为网卡有设置tcp-segmentation-offload。这是操作系统为了减轻负担,提高处理效率的一种方法。 我们知道,用TCP/IP协议处理网络流量,要占用大量服务器资源。为了减轻服务器的压力...原创 2018-09-30 14:46:22 · 3141 阅读 · 0 评论 -
UDP协议解惑
由于平时UDP协议接触的少,最近在梳理网络编程知识的时候,发现好多之前没有深入了解过的问题,有的甚至颠覆了以前的网络编程知识。以下是几个很重要的知识点。1 UDP的无连接学过网络编程的朋友都知道,TCP是有连接的,而UDP协议是无连接的。那么这个连接究竟指的什么?从编程的角度来说,连接指的是套接字描述符绑定了通信两端EndPoint的接口。例如TCP建立的连接一定是两个真实有效的两端,...原创 2018-04-27 22:37:51 · 559 阅读 · 0 评论 -
TCP为什么要三次握手
经常有人会问tcp建立连接时为什么要三次握手,两次行不行呢?不行,那可能会死人的,不信我讲个故事。北宋末年,统治阶级奢靡腐败,苛捐杂税压得人们喘不过气来。一时间盗贼四起,纷纷占山为王。盗贼们时不时打家劫舍,骚扰村民,连官府都不敢轻举妄动。后来上任了一位较有作为的县官,不忍看到百姓受苦,决心围剿盗贼。但是盗贼在山头,易守难攻,他们决定兵分两路,分为东边军和西边军,从东边和西边夹击盗贼,一举拿...原创 2018-08-01 19:26:23 · 7012 阅读 · 13 评论 -
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 · 1360 阅读 · 0 评论 -
linux网络编程惊群现象模拟
对于linux服务器的惊群现象早有耳闻,只是不知道他的具体场景,如今在学linux网络编程多进程模型下,正好遇到这个问题。如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进程、多线程、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker多进程异步驱动模型。今天和大家一起讨论一下网络开发中遇到的“惊群”现象。今天周末,结合自己的理解和网上的资料,彻...原创 2018-07-07 14:34:15 · 322 阅读 · 0 评论 -
listen,accept的思考
在网络编程调用listen,accept的时候,我时不时会有这样的疑问:究竟listen函数的第二个参数指的是什么,虽然大致知道是连接队列的意思。但是面对错综复杂的网络环境,特别是在高并发编程中,完全搞清楚他的真实含义很有必要,不至于担心连接跟不上,导致连接这块出问题,至少出了问题能做到心中有数。服务器建立socket连接要调用listen监听socket。listen的第二个参数backlog是...原创 2018-07-06 22:31:54 · 325 阅读 · 0 评论 -
白话TCP运输控制(二) -- TCP的流量控制
上篇讲的是拥塞控制,这篇讲流量控制。还是以运输粮食为场景。虽然运输的拥塞控制能够在运输效率和拥塞之间达到平衡,但是运输粮食的整体效率还受一个关键因数影响,那就是对岸西村粮食的卸货能力。假设粮食运送到对岸后,要卸放在一个仓库里,随后被运往其他地方。如果运输的太快,仓库载货能力有限,粮食又没有及时被消耗,工人们只好等待仓库腾出地方来卸下新的粮食。显然这样会影响这个工程的效率。后来工人们又想了一...原创 2018-07-11 15:58:27 · 633 阅读 · 5 评论 -
白话TCP运输控制(一) -- TCP的拥塞控制
tcp的运输控制分为tcp流量控制和tcp拥塞控制,这里先讲tcp的拥塞控制。为了讲清楚tcp的拥塞控制,还是利用那个渡河的场景。为了更好的说明问题,这里把渡人换成搬粮食。话说东村要往西村运输粮食,只能走水路。每天都会有大量的粮食从东村经码头运往西村。由于工作量繁重,运输工人们都希望能尽快把粮食运输到西村。加上水面交通繁忙,各式各样的商船客船往来络绎不绝,更加加大了搬运的困难性。在开始...原创 2018-07-11 12:27:13 · 1095 阅读 · 2 评论 -
白话讲解Nagle算法和延迟确认
以前对nagle算法有耳闻,利用TCP_NODELAY选项可以禁止他。然后看到延迟ack时,心想TCP_NODELAY选项与他有没有关系呢。其实没有,TCP_NODELAY只是用来禁用nagle算法的。关于他们之间的关系倒可以好好研究下。有以下一个场景,村东和村西隔着一条大河,有几条船在两岸摆渡。由于每次要求过河的人只有一个,如果来一个人就将那个人摆渡过去(假设船只足够多),那势必运输效率非常低,...原创 2018-07-10 21:39:55 · 7823 阅读 · 1 评论 -
自己写一个网络库的心得
总是在看网络相关的代码,还没有完整的实现过一个网络库。南宋大诗人陆游有云,纸上得来终觉浅,绝知此事要躬行。哈哈这也是我们高中的校训之一。这两周抽了点时间实现了一个小型的网络库,深度参考了muduo,只不过我是用C语言实现的,名字就叫muevent。muduo是用C++的,我为什么要用C语言呢,而且我曾经用C++的时间要远多于C。因为C语言更加接近底层实现,C++干了太多不为人知的事,毕竟...原创 2019-04-12 19:50:48 · 1958 阅读 · 0 评论