![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
TCP/IP
文章平均质量分 87
YZF_Kevin
若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒
展开
-
谈谈Linux epoll惊群问题的原因和解决方案
然而由于select,poll没有可扩展性,存在O(n)O(n)问题,因此在带宽越来越高,服务器性能越来越强的趋势下,越来越多的代码将收敛到使用epoll的情形,所以有必要对其进行深入的讨论。”,显然,epoll_wait刚刚取到事件的时候的时候,不可能马上就调用accept去处理,事实上,逻辑在epoll_wait函数调用的ep_poll中还没返回的,这个时候,显然符合“仍然有未处理的事件”这个条件,显然这个时候为了实现这个语义,需要做的就是通知别的同样阻塞在同一个epoll句柄睡眠队列上的进程!转载 2023-07-12 09:46:39 · 230 阅读 · 0 评论 -
深入学习IO多路复用 select/poll/epoll 实现原理 - 第三篇
被频繁的使用,至少有三处地方:一是阻塞 IO 中数据到达 socket 的等待队列时,通过回调函数唤醒进程,二是 epoll 中数据到达 socket 的等待队列时,通过回调函数 ep_poll_callback 找到 eventpoll 中红黑树的 epitem 节点,并将其加入就绪列队 rdllist,三是通过回调函数 default_wake_func 唤醒用户进程 ,并将 rdllist 传递给用户进程,让用户进程准确读取数据。rdllist:就绪的描述符的链表。转载 2023-02-13 21:04:41 · 299 阅读 · 0 评论 -
深入学习IO多路复用 select/poll/epoll 实现原理 - 第二篇
的问题,服务器引入了 IO 多路复用技术,通过一个进程处理多个 TCP 连接,不仅降低了服务器处理网络请求的进程数,而且不用在每个连接的数据到达时就进行进程切换,进程可以一直运行并只处理有数据到达的连接,当然,如果要监听的所有连接都没有数据到达,进程还是会进入阻塞状态,直到某个连接有数据到达时被回调函数唤醒。为了解决同步阻塞 IO 的问题,操作系统提供了非阻塞的 recv() 函数,这个函数的效果是:如果没有数据从网卡到达内核 socket 的等待队列时,系统调用会直接返回,而不是阻塞的等待。转载 2023-02-13 20:53:48 · 205 阅读 · 0 评论 -
TCP常见的五个异常处理场景
之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问:第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN的时机是什么?第三次握手,如果服务器永远不会收到ACK,服务器就永远都留在 Syn-Recv 状态了吗?退出此状态的时机是什么?第三次挥手,如果客户端永远收不到 FIN,ACK,客户端永远停留在 Fin-Wait-2状态了吗?退出此状态时机是什么时候呢?转载 2022-09-26 21:38:58 · 1258 阅读 · 0 评论 -
深入浅出CDN
CDN 的全称叫 Content Delivery Network,中文名叫「内容分发网络」,它是解决由于长距离而网络访问速度慢的问题。怎么做到的呢?简单来说,CDN 将内容资源分发到位于多个地理位置机房中的服务器上,这样我们在访问内容资源的时候,不用访问源服务器。而是直接访问离我们最近的 CDN 节点 ,这样一来就省去了长途跋涉的时间成本,从而实现了网络加速。CDN 能加速什么类型的内容?CDN 加速的是内容资源是静态资源。转载 2022-09-21 19:57:58 · 384 阅读 · 0 评论 -
tcp_timestamp和tcp_tw_recycle的问题
因为timestamp有更多其他的作用,而tcp_tw_recycle本身就是依赖于timestamp的。至此可以看到:在tcp_timestamp和tcp_tw_recycle同时开启时,会触发Linux的per-host的PAWS机制。当服务器同时开启tcp_timestamps和tcp_tw_recycle选项时,会导致客户反馈连接成功率降低的情况。从上面这个简单的例子可以看到NAT在真实的互联网中是普遍存在的,比如你所在学校,单位都会一定程度上的使用NAT机制。一个具体的例子就是家用的局域网络。转载 2022-09-20 23:28:45 · 686 阅读 · 0 评论 -
TCP timestamp详解
RTTM规定了一些使用TSecr计算RTT的原则,具体如下(英文水平有限,为保持原意就使用RFC中的原话了)在ACK被重传的数据时,应该使用重传数据包中的TSval进行回复如果对以上的特殊情况有疑问,还请直接去看RFC,里面有example解释。最后,实际上计算RTO除了以上使用TSecr的原则外,还有一些更复杂的计算方法RFC 7323。比如对于每一个RTT采样R,目的是解决在高带宽下,TCP序号可能被重复使用而带来的问题。PAWS同样依赖于timestamp,并且假设在一个TCP流中,转载 2022-09-20 23:27:02 · 3833 阅读 · 0 评论 -
已经被废弃的 tcp_tw_recycle
如果TIME-WAIT的条目已经被新连接所复用,则新连接的SYN包会被忽略掉,并且会收到FIN包的重传,本地会回复一个RST包(因为此时本地连接为SYN-SENT状态),这会让远程端跳出LAST-ACK状态,最初的SYN包也会在1秒后重新发送,然后完成连接的建立,整个过程不会中断,只是有轻微的延迟。又回到了上面说到的 IP 网络本身尽力而为的传输机制,并不保证数据包在底层传输的时候,接收方收到的数据包的数据顺序不一定是按照发送方的顺序,再加上数据传输延迟,就让上图的问题发生的情况成为了大概率事件。转载 2022-09-20 23:08:14 · 4210 阅读 · 2 评论 -
彻底理解并解决服务器出现大量TIME_WAIT - 第四篇
对于大部分局域网或者公司内网应用来说,满足条件都是没有问题的,因此官方手册里面的警告其实也没那么可怕。1. tcp_tw_reuse选项和tcp_timestamps选项也必须同时打开;第一篇博客中我们讲了 TIME_WAIT 出现的原理,引发的问题,解决办法等,如下。4. 打开tcp_tw_recycle和tcp_timestamps选项。5. 打开tcp_tw_reuse和tcp_timestamps选项。6. 设置tcp_max_tw_buckets为一个很小的值。协议什么情况下认为是安全的。原创 2022-09-19 12:19:18 · 1228 阅读 · 0 评论 -
彻底理解并解决服务器出现大量TIME_WAIT - 第三篇
这里的HZ是1s,因此可以得出RTO最大是120s,最小是200ms,对于局域网的机器来说,正常情况下RTO基本上就是200ms,因此3.5 RTO就是。这两个选项是linux内核提供的控制选项,和具体的应用程序没有关系,而且网上也能够查询到大量的相关资料,但信息都不够完整,最主要的几个问题如下;2)有的资料说只要打开tcp_tw_recycle即可,有的又说要tcp_timestamps同时打开,到底是哪个正确?第一篇博客中我们讲了 TIME_WAIT 出现的原理,引发的问题,解决办法等,如下。原创 2022-09-18 23:22:47 · 2517 阅读 · 0 评论 -
彻底理解并解决服务器出现大量TIME_WAIT - 第二篇
2. 设置 l_onoff 为1,l_linger为0,则连接立即终止,TCP将丢弃残留在发送缓冲区中的任何数据并发送一个RST报文给对方,而不是通常的四分组终止序列。只是代名层的修改往往会比较大。这里的HZ是1s,因此可以得出RTO最大是120s,最小是200ms,对于局域网的机器来说,正常情况下RTO基本上就是200ms,因此3.5 RTO就是。这两个选项是linux内核提供的控制选项,和具体的应用程序没有关系,而且网上也能够查询到大量的相关资料,但信息都不够完整,最主要的几个问题如下;原创 2022-09-18 23:18:48 · 1279 阅读 · 0 评论 -
彻底理解并解决服务器出现大量TIME_WAIT - 第一篇
举例:我们把主动断开连接的一方称为C端,被动断开连接的一方称为S端,由于网络不可靠,C端发送的最后一个ACK报文可能没成功发送到S端,那么S端就会重新发上一个报文即FIN,如果C端处于TIME_WAIT状态下,就可以重新发送报文ACK,然后重新计时2MSL时间才会进入CLOSED状态,S端收到ACK后就可以正常关闭TCP连接了。1. 由于处于TIME_WAIT状态,连接并未关闭,占据了大量的CPU,内存,文件描述符等,造成新的连接无法建立,客户端表现就是连接失败。原创 2022-09-16 23:27:31 · 1812 阅读 · 0 评论 -
epoll 的本质是什么?
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么?网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。本文核心思想是:要让读者清晰明白 epoll转载 2022-06-29 20:52:21 · 295 阅读 · 0 评论 -
c++无锁环形队列的实现原理
简言1.初始化一个大小固定的char数组,从左往右,一个线程在写入,一个线程读取。像一个管道,FIFO2.一个线程写入后,累加 m_nIn 值。另一个线程读取后,累计m_nOut 的值。m_nIn,m_nOut的值只增不减,且m_nIn永远大于等于m_nOut的值,所以要用uint64_t类型的值,确保永不溢出3. 由于数组大小有限,写入/读取到一定程度后m_nIn,m_nOut的值超过了数组大小,这个时候要注意操作技巧实验流程1. 建立一个8K大小的char数组2. 一个线程不断.原创 2021-11-03 20:17:38 · 1180 阅读 · 1 评论 -
netstat命令总结
简介1. netstat是一个监控TCP/IP网络的非常有用的命令,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况2. netstat中的各个参数可以组合使用,具体请参考本博客的举例执行下netstat命令后结果如下图netstat的输出结果可以分为两个部分(上图中已经用两个红框标识出来了)1、Active Internet connections即有..原创 2021-10-09 17:33:45 · 4529 阅读 · 0 评论 -
网络抓包工具 wireshark教程
Wireshark(前称Ethereal)是一个网络数据包分析软件。网络数据包分析软件的功能是截取网络数据包,并尽可能显示出最为详细的网络数据包数据。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。网络管理员使用Wireshark来检测网络问题,网络安全工程师使用Wireshark来检查资讯安全相关问题,开发者使用Wireshark来为新的通讯协定除错,普通使用者使用...转载 2019-03-10 13:23:15 · 339 阅读 · 0 评论