随笔分类 - 网络编程
摘要:###buffer对象 buffer对象:顾名思义,就是一个缓冲区对象,缓存了从套接字接收来的数据以及需要发往套接字的数据。 如果是从套接字接受来的数据,事件处理回调函数在不断地往buffer对象增加数据,同时,应用程序需要不断把buffer对象中的数据处理掉,这样,buffer对象才可以空出新的位
阅读全文
摘要:###多线程设计的几个考虑 在反应堆reactor框架设计中,main reactor线程是一个acceptor线程,这个线程一旦创建,会以event_loop形式阻塞在event_dispatcher的dispatch方法上,实际上它是在等待监听套接字上的事件发生,即已完成的连接,一旦有连接完成,
阅读全文
摘要:https://app.yinxiang.com/fx/7e601cad-6501-4fe7-8e4e-f0fbd9d02c4b TCP 高性能网络框架需要满足的需求有以下三点: 1)采用 reactor 模型,可以灵活使用 poll/epoll 作为事件分发实现。 2)必须支持多线程,从而可以支持
阅读全文
摘要:###事件驱动模型 事件驱动的好处:占用资源少,效率高,可扩展性强,是支持高性能高并发的不二之选。 事件驱动模型也叫作反应堆模型(reactor),或者是Event loop模型,该模型的核心有两点: 1、它存在一个无限循环的事件分发线程,或者叫做reactor线程、Event loop线程。这个事
阅读全文
摘要:###线程 进程模型在处理用户请求的过程中,进程切换上下文的代价比较高,而,一种轻量级的模型可以处理多用户连接请求,那就是线程模型。 线程(thread)是运行在进程中的一个“逻辑流”,现代操作系统都允许在单进程中运行多个线程。**线程由操作系统内核管理。**每个线程都有自己的上下文(context
阅读全文
摘要:###父进程和子进程 进程是程序执行的最小单位,一个进程有完整的地址空间、程序计数器等,如果想创建一个新的进程,使用函数 fork 就可以 pid_t fork(void) 返回:在子进程中为0,在父进程中为子进程ID,若出错则为-1 fork函数实现的时候,实际上会把当前父进程的所有相关值都克隆一
阅读全文
摘要:###C10K问题 C10K问题就是如何一台物理机上同时服务10000个用户?C代表并发,10K就是10000 C10K 问题是由一个叫 Dan Kegel 的工程师提出并总结归纳的,你可以通过访问http://www.kegel.com/c10k.html获取最新相关信息 ###操作系统层面 C1
阅读全文
摘要:###原理 select 的几个缺点: 1)每次调用select,都需要把fd集合从用户空间拷贝到内核空间,这个开销在fd很多时会很大 2)每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也会很大 3)select支持的文件描述符数量太小了,默认是1024 在调用接口上,
阅读全文
摘要:###阻塞VS非阻塞 阻塞I/O:应用程序会被挂起,等待内核完成操作,实际上,内核所做的事情是将CPU时间切换给其他有需要的进程,网络应用程序在这种情况下是得不到CPU时间做该做的事情的。 非阻塞I/O:当应用程序调用非阻塞I/O完成某个操作,内核立即返回,不会把CPU时间切换给某个其他进程,应用程
阅读全文
摘要:###原理 和select类似,只是描述fd集合的方式不同,poll使用pollfd结构而非select的fd_set结构。 管理多个描述符也是进行轮询,根据描述符的状态进行处理,但poll没有最大文件描述符数量的限制。 ####select 和poll的区别 select采用的是位掩码的模型,参考
阅读全文
摘要:###原理:参考:https://my.oschina.net/fileoptions/blog/911091 select中内核函数有哪些 源码实现: #undef __NFDBITS #define __NFDBITS (8 * sizeof(unsigned long)) #undef __F
阅读全文
摘要:###要求: 写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互,支持的交互命令包括: pwd:显示服务器应用程序启动时的当前路径。 cd:改变服务器应用程序的当前路径。 ls:显示服务器应用程序当前路径下的文件列表。 quit:客户端进程退出,但是服务器端不能退出
阅读全文
摘要:###故障模式总结 异常情况可归结为两大类: 第一类,是对端无FIN包发送出来的情况;第二类是对端有FIN包发出来 ###对端无FIN包发送出 网络终端造成对端无FIN包 很多原因都会造成网络中断,这种情况,TCP程序并不能及时感知异常信息。除非网络中的其他设备,如路由器发送出一条ICMP报文,说明
阅读全文
摘要:###TCP是一种流式协议 TCP数据是流式的特性,可分别从发送端和接收端来阐述 发送端:当调用send函数完成数据“发送”后,数据并没有真正从网络上发送出去,只是从应用程序拷贝到了操作系统内核协议栈中,至于什么时候发送,取决于发送窗口、拥塞窗口以及当前发送缓冲区的大小等条件,也就是说,不能假设每次
阅读全文
摘要:###问题 当通过服务端发起的关闭连接操作,引发了一个已有的TCP连接处于TIME_WAIT状态,此时,服务器重启,继续绑定原来ip与端口号,返回了Address already in use的错误。 ###重用套接字选项 一个TCP连接时通过四元组(源地址、源端口、目的地址、目的端口)来唯一确定。
阅读全文
摘要:###UDP connect的作用 UDP connect函数的调用,并不会引起像TCP连接那样,和服务器目标端网络交互,并不会触发所谓的“握手”报文发送和应答。 UDP套接字进行connect操作其主要是为了让应用程序能够接受“异步错误”的信息。 在udp编程中,如果不调用connect操作的客户
阅读全文
摘要:从TCP角度看待数据流的发送和接收。 ###调用数据发送接口后,发生了什么呢? 调用这些send/write等接口并不意味着数据被真正发送到网络上,其实这些数据只是从应用程序中被拷贝到了系统内核的套接字缓冲区中,或者说是发送缓冲区中,等待协议栈的处理,什么时候发送出去?有操作系统内核的TCP协议栈来
阅读全文
摘要:心跳检测-gateway-worker手册 ###为什么需要心跳检测? 正常的情况客户端断开连接会向服务端发送一个fin包,服务端收到fin包后得知客户端连接断开,则立刻触发onClose事件回调。 但是有些极端情况如客户端掉电、网络关闭、拔网线、路由故障等,这些极端情况客户端无法发送fin包给服务
阅读全文
摘要:参考:盛延敏:网络编程实战 ####一、close函数 close函数: int close(int sockfd) 对已连接的套接字执行 close 操作就可以,若成功则为 0,若出错则为 -1。这个函数会对套接字引用计数减一,一旦发现套接字引用计数到 0,就会对套接字进行彻底释放,并且会关闭 T
阅读全文
摘要:###一、TIME_WAIT 1、TIME_WAIT发生的场景 **故障:**一次升级线上应用服务后,发现该服务的可用性时好时坏,一段时间可以对外提供服务,一段时间突然又不可以了。使用netstat命令发现主机有成千上万处于TIME_WAIT状态的连接。 **为啥?**该应用服务需要通过发起TCP连
阅读全文