
Unix网络编程
文章平均质量分 77
狱典司
异步但IO!
展开
-
select、poll、epoll的简要对比
select的几大缺点:(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大(3)select支持的文件描述符数量太小了,默认是1024select 为什么是1024?—— 两个10241,select中存放文件描述符的数组大小FD_SETSIZE为10242,进程的文件描述符上限默认是1024,正是因为这个原因,select设计时才把数组大小设计为1024。原创 2023-01-07 11:14:11 · 897 阅读 · 0 评论 -
从对称加密和非对称加密讲解HTTP到HTTPS的发展思路
解决中间人攻击的方法是通过受信任的第三方交换公钥,具体做法就是服务器不直接向客户端发送公钥,而是要求受信任的第三方,也就是证书认证机构 (Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全。因为每一家CA机构都会给成千上万的网站制作证书,假如攻击者知道abc.com使用的是某家CA机构的证书,那么他也可以同样去这家CA机构申请一个合法的证书,然后在浏览器请求abc.com时对返回的。原创 2022-12-11 17:02:07 · 808 阅读 · 1 评论 -
详解HTTP1.0、1.1、2.0版本区别/优化
HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。本质上是为了减少请求,通过多个js或css合并成一个文件,多张小图片拼合成Sprite图,可以让多个HTTP请求减少为一个,减少额外的协议开销,而提升性能。连接和并行发送请求,这样每次一个请求都需要三次握手,而且其实建立连接和释放连接的这个过程是最耗时的,传输数据相反却不那么耗时。的缓存机制失效的问题。原创 2022-11-21 11:05:29 · 5134 阅读 · 0 评论 -
DNS协议
一个主机通过DNS获取指定主机名对应的IP地址并发起HTTP的TCP连接的过程:**(1)浏览器**截取URL中的主机名字段**,**发送给DNS应用的客户端**;(2)**DNS客户端向DNS服务器发送**一个包含主机名的**请求**;(3)**DNS客户端收到**来自DNS服务器发出的**回答报文**,该报文中包**含对应请求主机名对应的IP地址**;(4)**浏览器接收到**来自DNS的该**IP地址**(5)**浏览器向**位于**该IP地址80端口的HTTP服务器进程发起一个TCP连接原创 2022-11-21 11:01:11 · 2147 阅读 · 0 评论 -
A、B机器正常TCP连接后,B突然断网,A处于什么状态?
几个思考点:是否开启keepalive?是否存在数据交互?进程崩溃;客户端主机宕机(客户端网络不可用 是同种情况);①②使用 kill -9 来模拟进程崩溃的情况,发现在 kill 掉进程后,服务端会发送 FIN 报文,与客户端进行四次挥手。所以,即使没有开启 TCP keepalive,且双方也没有数据交互的情况下,如果其中一方的进程发生了崩溃,这个过程操作系统是可以感知的到的,于是就会发送 FIN 报文给对方,然后与对方进行 TCP 四次挥手。原创 2022-11-21 10:58:26 · 684 阅读 · 0 评论 -
NAT地址转换
同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。2.安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC。原创 2022-11-21 10:53:18 · 567 阅读 · 0 评论 -
MTU & TTL & RTT
往返时延(Round-Trip Time,RTT)也是一个重要的性能指标,它表示从发送方发送数据开始,到发送方收到来自接收方的确认,总共经历的时延。排队时延是分组在所经过的网络结点的缓存队列中排队所经历的时延,排队时延的长短主要取决于网络中当时的通信量,当网络的通信流量大时,排队时间就长,极端情况下,当网络发生拥塞导致分组丢失时,该结点的排队时延视为无穷大。处理时延是分组在中间结点的存储转发过程中而进行的一些必要的处理所花费的时间,这些处理包括提取分组的首部,进行差错校验,为分组寻址和选路等。原创 2022-11-21 10:51:47 · 616 阅读 · 0 评论 -
TCP沾包问题
先来解释一下什么是粘包?所谓粘包就是连续给对端发送两个或者两个以上的数据包,对端在一次收取中收到的数据包数量可能大于 1 个,当大于 1 个时,可能是几个(包括一个)包加上某个包的部分,或者干脆就是几个完整的包在一起。当然,也可能收到的数据只是一个包的部分,这种情况一般也叫半包。粘包示意图如下:原创 2022-11-21 10:49:04 · 1002 阅读 · 0 评论 -
TCP和UDP的优缺点比较
TCP的优点:可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口(流量控制)、(超时)重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。TCP的缺点:慢,效率低,占用系统资源高,易被攻击:TCP在传递数据之前,要先建连接,这会消耗时间,TCP首部大小本身就比UDP首部大,而且在数据传递时基于TCP首部中信息进行的确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,另外还要维护需要保持的传输连接;事实上,每个连接都会占用系统的CPU、内存原创 2022-11-21 10:46:20 · 2030 阅读 · 0 评论 -
TCP四次挥手 & 2MSL & TIME_WAIT详解
4次握手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去。(2)防止lost duplicate对后续新建正常链接的传输造成破坏。lost duplicate在实际的网络中非常常见,经常是由于路由器产生故障,路径无法收敛,导致一个packet在路由器A,B,C之间做类似死循环的跳转(也有可能是网络时延导致)。IP头部有个TTL,限制了一个包在网络中的原创 2022-11-21 10:44:04 · 1276 阅读 · 0 评论 -
详解TCP为什么不能是两次握手
为了确保链路的可靠性,两次握手的过程并不能确保链路以及可靠的建立。这时因为C端和S端并不是一方发送之后就可以确认自己可以正常发送,它们之间隔着网络环境,真正能够确认自端可以正常发送需要依靠对端返回的确认,即ACK。下面具体分析三次握手过程中通信双端的确认状态,?表示未知,✔表示可以确定没有问题:原创 2022-11-21 10:35:16 · 3523 阅读 · 0 评论 -
OSI 7层模型 & TCP/IP协议首部封装格式解析
物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1(端到端)网络层:为在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。原创 2022-11-21 10:27:27 · 914 阅读 · 0 评论 -
一台Linux机器上最多能建立多少个TCP连接?
但是就目前的TCP协议来说,显然这是不可能的,首先,不会有一台机器可以占用所有的ip,其次需要考虑机器是否能正常的打开2^16个端口,以及机器是否支持那么多的打开文件,最最最重要的是,机器能否有那么大的内存和CPU资源来维护这些TCP连接。ip(ipv4)数量的理论最大值,受限于ip的位数 ---- ip长度为32位,那么极限最优条件下(但没有这个可能)单机可以拥有2^32个ip地址,但这样就把世界上所有的ip都用光了。假如是4GB的内存,那么大约可接受的TCP连接数量是100万左右。.........原创 2022-08-12 21:40:21 · 1707 阅读 · 0 评论 -
浅记对于select多路IO网络模型性能调优和BUG解决方案
前些日子接手了一个老项目,是一个网络收发的linux socket程序,接收各地设备发来的数据,进行解码 – 处理数据 – 存数据 – 发数据的工作;项目代码业务逻辑处理没有问题,问题在于该代码运行一阵子之后就收不到数据了,但是进程仍然在跑,且用top命令查看cpu占用率极高,严重影响了云服务器的性能,分析之后,记录调优和debug的心得:这个程序采用了跨平台的多路IO转接函数 —— ,由于select函数设计的比较早,遗留了针对小规模多路IO的性能低下的问题,解决办法是通过用户代码逻辑添加一个额外的数组(原创 2022-06-12 19:45:07 · 434 阅读 · 0 评论 -
浅记线程池模型中多个线程对同个fd接收缓冲区读取争夺的方案
最近在复习实现和思考线程池的时候发现了一个问题:概括说就是 线程池+多路IO(epoll ET)+ 非阻塞轮询处理数据的场景下,同个fd(socket)高频率接收数据,可能导致线程池中多个线程争夺读取该fd接收缓冲区的情况,怎么处理?思考后得到如下的解决方案:............原创 2022-06-12 19:14:24 · 795 阅读 · 3 评论 -
Epoll 反应堆模型核心原理及代码讲解
epoll反应堆模型的三个要素:epoll ET模式非阻塞轮询处理结构体中联合体中的指针 – 实现回调机制socket、bind、listen – epoll_create 创建监听 红黑树 – 返回 epfdepoll_ctl() 向红黑树上添加一个listenfd(监听socket)while(1) {【可选】每轮迭代监测100个连接,若存在超时连接(沉积用户)则主动关闭; 监听 --> 对应监听fd有事件产生 --> 返回监听满足结构集 (即结构体数组);判断返回数组元素 :}原创 2022-06-08 19:23:25 · 834 阅读 · 0 评论 -
Epoll 原理及应用 && ET模式与LT模式
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。目前epell是linux大规模并发网络程序中的热门首选模型。epoll除了提供select/poll那种IO事件的电平触原创 2022-06-08 19:17:57 · 593 阅读 · 0 评论 -
简单封装一个linux socket服务端的listenfd初始化函数
简单封装一个linux socket服务端的listenfd初始化函数,方便快速调用:initlistensocket()参数说明 —— 服务器开启的监听端口 —— listen()函数的连接队列容量(两队列总容量) —— 置1则listenfd设为非阻塞,置0则默认阻塞initlistensocket()返回值暂时未做出错处理,initlistensocket()函数返回socket()函数的返回值,成功调用的情况下返回监听文件描述符......原创 2022-06-08 15:33:10 · 381 阅读 · 0 评论 -
可扩/减容线程池C语言原理讲解及代码实现
客户端相当于生产者,服务端相当于消费者。线程池相比较于传统的多线程模型,每次创建线程和销毁线程的开销是可以被节省的。故放弃每来一个请求就创建一个线程的机制,采用一次性批量产生线程的方式。所谓线程“池”,这个池是一个虚拟的概念,指的是产生的线程被保存在的可访问地址。当没有任务时,线程池里的线程都阻塞()在的条件变量上;当有客户端发来了任务/请求,server需要去唤醒池中的线程:被唤醒的线程从任务队列中取出任务并完成处理后,重新回到线程池中等待任务,即等待被唤醒。多路IO转接处理的是客户端怎么去和服务器建立原创 2022-06-05 20:40:18 · 939 阅读 · 0 评论 -
C/C++ 32位浮点型float转16进制并用字符串输出,简洁明了
C/C++ 32位浮点型float转16进制并用字符串输出C 语言中,指针地址就是IEEE 754 16进制编码,C可以直接调用就不用写函数计算了,C++也是一样的。联合体共用一段内存,可以用一个包含float和char[4]的联合体,给float赋值,然后打印4个char就行;提供一个在线转换工具:在线进制转换(支持在2~36进制之间进行任意转换)代码32位浮点型float(字符串形式)转16进制并用字符串输出#include <stdio.h>#include <s原创 2022-04-06 18:14:20 · 7933 阅读 · 0 评论 -
Linux Shell脚本 && Linux C程序 获取指定的范围内 or 系统可用端口
这里写目录标题Linux Shell脚本 && Linux C程序 获取指定的范围内 or 系统可用端口一、源代码及其运行1. Linux C程序getPort.c源码运行示例2. 脚本文件 getPort.sh源码运行示例二、bash命令说明1. netstat命令2. awk命令3. wc 命令4. shuf命令Linux Shell脚本 && Linux C程序 获取指定的范围内 or 系统可用端口一、源代码及其运行1. Linux C程序getPort.c源码原创 2022-03-14 19:20:31 · 772 阅读 · 0 评论 -
Linux 查看 && 修改端口范围限制
1.显示当前临时端口的范围:sysctl net.ipv4.ip_local_port_range或 cat /proc/sys/net/ipv4/ip_local_port_range一般情形下:linux临时端口号范围是(32768,61000)2.暂时性修改临时端口的范围:#echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range或者 sudo sysctl -w net.ipv4.ip_local_port_range转载 2022-03-14 16:24:43 · 10596 阅读 · 0 评论 -
Linux C程序获取本机可用IP地址 && Linux C程序获取system()函数的标准输出到char *缓冲中
Linux C程序获取本机可用IP地址 &&Linux C程序获取system()函数的标准输出到char *缓冲中方法一:使用pipe匿名管道思路:fork一个子进程,并创建一个匿名管道,在子进程中执行shell命令,并将其标准输出dup到匿名管道的输入端,父进程从管道 中读取,即可获得shell命令的输出。char * get_ipaddr(){ int fd[2]; pipe(fd); int pid = fork();原创 2022-03-12 23:13:02 · 5154 阅读 · 0 评论 -
用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)
用Unix / C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架前言服务器端源码客户端源码自定义库 helper.c 和 helper.hhelper.chelper.hMakefile文件使用前言由于作者本人最近在忙期末复习(KPI压力,害),目前暂时不对该代码的各类结构体、函数单独拎出来做分析了,这项工作等到这个月考完试之后在完成!代码的大部分内容都有比较详细的注释,这一个月内如果有读者有看不懂源码的地方可以在评论区提问,我看到会回复!如有误也欢迎批评指正!这个基于线程池和epol原创 2021-12-09 12:30:56 · 2095 阅读 · 1 评论