网络
蓝子娃娃
越努力,越幸运!!!
展开
-
Linux网络(九)—— epoll
文章目录要让读者清晰明白 EPOLL 为什么性能好。一、从网卡接收数据说起二、如何知道接受了数据?三、进程阻塞为什么不占用 CPU 资源?四、内核接收网络数据全过程五、同时监视多个 socket 的简单方法六、epoll 的设计思路七、epoll 的原理和流程八、epoll 的实现细节九、结论十、水平触发(LT)和边沿触发(ET)十一、自我总结十二、用 epoll 实现简单并发服务器 epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、redis、skynet 和大部分游戏服转载 2020-08-22 20:19:09 · 550 阅读 · 0 评论 -
Linux网络(九)—— poll 模式下的IO多路复用
文章目录poll 多路复用poll 编程模型1. 函数原型2. 参数说明3. 返回值和错误代码4. poll 结构体5. 事件6. 事件描述法7. 事件使用技巧poll 与 select 的区别和联系poll 多路复用poll 的机制与 select 类似,与 select 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll 没有最大文件描述符数量的限制。poll 和 select 同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空转载 2020-08-21 15:46:47 · 374 阅读 · 0 评论 -
Linux 线程池
什么是线程池,为什么要使用线程池?什么是线程池?首先顾名思义,就是把一堆开辟好的线程放在一个池子统一管理,就是一个线程池。为什么要使用线程池?难道来一个请求给它申请一个线程,请求处理完了释放线程不行吗?也行,但是如果创建线程和销毁线程的时间比线程处理请求时间长,而且请求很多的情况下,我们的 CPU 资源都浪费在创建线程和销毁线程上了,所以这种方法效率会比较低。于是,我们可以将若干已经创建好的线程放在一起统一管理,如果来了一个请求,我们就从线程池中取出一个线程来处理请求,处理完了放回池内等待原创 2020-08-18 20:55:34 · 259 阅读 · 0 评论 -
Linux网络(八)—— select模式下服务器(非阻塞,单进程+多进程+多线程)
文章目录前言阻塞和非阻塞两种 I/O 模式select 系统调用函数的返回值宏操作select 使用流程1. 定义 fd_set2. 注册将要被监听的 fd3. 如果 IO 信号到达,识别并处理4. select 使用事项及技巧Linux Socket 编程中 select 的常见用处1. accept 函数的非阻塞实现2. connect 函数的非阻塞实现(TCP)3. select 检测对方 socket 连接关闭select 模式的单进程非阻塞 accept 服务器select 模式的多进程非阻塞 a转载 2020-08-18 13:39:04 · 1048 阅读 · 0 评论 -
Linux网络(七)—— 线程池accept处理高并发connect
前言服务器再调用listen 和 accept后,就会阻塞在accept函数上,accept函数返回后循环调用accept函数等待客户端的TCP连接。我们知道服务器端listen套接字能处理的连接数与监听队列的大小有关,如果这时候有大量的用户同时发起connect连接,那么在listen有队列上限(最大可接受TCP的连接数)的情况下,有多少个connect会成功。实验证明,当连接数远远高于listen的可连接数上限时,客户端的大部分TCP请求会被抛弃,只有当listen监听队列空闲或者放弃某个连接时,转载 2020-08-17 20:26:07 · 1736 阅读 · 0 评论 -
Linux网络(六)—— 基于pthread的多线程的TCP服务器(阻塞+同步+并发))
上节我们实现了一个简单的多进程的服务器程序,这节,我们服务器的框架不做修改,只是将其修改为一个多线程的服务器程序。SocketAPI.h#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <fcntl.h>#include <netinet/in.h>#includ原创 2020-08-17 15:47:07 · 334 阅读 · 0 评论 -
Linux网络(五)—— 基于 fork 多进程的TCP服务器(阻塞+同步+并发)
前言一个简单的改进方案是在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。具体使用多进程还是多线程,并没有一个特定的模式。传统意义上,进程的开销要远远大于线程,所以如果需要同时为较多的客户机提供服务,则不推荐使用多进程;如果单个服务执行体需要消耗较多的CPU资源,譬如需要进行大规模或长时间的数据运算或文件访问,则进程较为安全。通常,使用pthread_create ()创建新线程,fork()创建新进程。那么今原创 2020-08-17 15:06:50 · 362 阅读 · 1 评论 -
Linux网络(四)——简单的TCP套接字应用(迭代型)
前面我们已经基本了解了 TCP/UDP 的基本知识,还说了并发服务器和迭代服务器的区别,我们大多了解的TCP服务器是并发的,大多数UDP服务器是迭代的,即我们在进行数据传送的时候,往往使用服务器与客户之间无连接的UDP报文,但是在用户需要上传下载文件时,就会在客户端和服务器之间建立一条 TCP 连接,进行文件的传送。下面我们来实现一个简单的 TCP 服务器。TCP套接字编程模型图TCP 编程流程说明server 服务器创建监听套接字 socket绑定套接字 bind设置套接字为监听模.原创 2020-08-09 17:11:10 · 264 阅读 · 0 评论 -
Linux网络(三)—— 几种套接字I/O模型
文章目录背景知识一、阻塞与非阻塞1. 阻塞2. 非阻塞二、同步与异步1. 同步2. 异步三. 四种 I/O 的比较四、并发与迭代1. 迭代服务器逻辑2. 并发服务器逻辑五、常见的 I/O 模型背景知识一、阻塞与非阻塞对于一个套接字的 I/O 通信,它会涉及到两个系统对象,一个是调用这个 I/O 的进程或者线程,另一个就是系统内核。比如一个读操作发生时,它会经历两个阶段:等待数据准备将数据从内核拷贝到进程中阻塞:在 Linux 中,默认情况下所有的 socket 都是 blocking,转载 2020-08-07 12:34:44 · 636 阅读 · 0 评论 -
Linux网络(二)—— 套接字 Socket
文章目录套接字简介套接字类型1. 流套接字(SOCK_STREAM)2. 数据报套接字(SOCK_DGRAM)3. 原始套接字(SOCK_RAW)重要的数据结构1. 表示套接口的数据结构 struct socket2. 描述套接口通用地址的数据结构 struct sockaddr3. 描述因特网地址结构的数据结构 struct sockaddr_in(1) AF_UNIX 域套接字格式(2) AF_INET 域套接字格式 IPv4(3) AF_INET6 域套接字格式 IPv6基本接口函数1. 创建套接字的转载 2020-08-04 13:45:53 · 844 阅读 · 0 评论 -
Linux网络(一)---- TCP/UDP的区别和联系
TCP/IP 简介TCP/IP 协议叫做 传输控制/网际协议,又叫网络通信协议TCP/IP 虽然叫 传输控制协议(TCP) 和 网际协议(IP) ,但是实际上是一组协议,包含 ICMP、RIP、ARIP、SMTP、TFTP、FTP、TELENET等。从协议分层模型上来讲,TCP/IP 协议包括四层:应用层,传输层,网络层,网络访问层其中应用层包括:协议名称描述HTTP超文本传输协议万维网的基本协议FTP文件传输文件传输协议TFTP文件传输简单转载 2020-08-02 18:06:36 · 595 阅读 · 0 评论 -
伤脑筋的TCP的三次握手和四次挥手
1. 三次握手三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,并同步连接双方的序列号和确认号,交换TCP窗口大小信息刚开始客户端处于Closed的状态,服务端处于Listen状态。进行三次握手:第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 STN_SENT 状态。首部转载 2020-07-29 14:57:20 · 299 阅读 · 0 评论