Linux网络模型
文章平均质量分 92
九五一
这个作者很懒,什么都没留下…
展开
-
五种IO模型
所以,如果处理的连接数不是很高的话,使用IO复用的服务器并不一定比使用多线程+非阻塞阻塞 IO的性能更好,可能延迟还更大。以select为例,当用户进程调用了select,那么整个进程会被阻塞,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降底了系统的维护工作量,节省了系统资源。原创 2024-02-03 18:07:23 · 859 阅读 · 0 评论 -
实际运行时间
这样设计的好处,调度器选择下一个被调度任务就变得高效和简单多了,只需要在active优先级数组中选择优先级高,并且队列中有可运行的任务即可。这里使用位图来定义该队列中是否有可运行的任务,如果有,则位图中相应的位就会被置1。这样选择下一个被调用任务的时间就变成了查询位图的操作。原创 2024-02-03 17:56:18 · 919 阅读 · 0 评论 -
深入理解Linux IO系统
在 Linux 系统中,传统的访问方式是通过 write() 和 read() 两个系统调用实现的,通过 read() 函数读取文件到到缓存区中,然后通过 write() 方法把缓存中的数据输出到网络端口。下图分别对应传统 I/O 操作的数据读写流程,整个过程涉及 2 次 CPU 拷贝、2 次 DMA 拷贝,总共 4 次拷贝,以及 4 次上下文切换。由 CPU 直接处理数据的传送,数据拷贝时会一直占用 CPU 的资源。原创 2024-02-02 17:29:29 · 1246 阅读 · 0 评论 -
内核锁机制
对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针替换为新的被修改的数据。后来的处理器都提供了缓存锁定机制,也就说当某个处理器对缓存中的共享变量进行了操作,其他处理器会有个嗅探机制,将其他处理器的该共享变量的缓存失效,待其他线程读取时会重新从主内存中读取最新的数据,基于 MESI 缓存一致性协议来实现的。**解决思路:**增加版本号,每次变量更新时把版本号+1。原创 2024-02-02 11:52:48 · 959 阅读 · 0 评论 -
Linux为何会引入读写锁?
除了mutex,在linux内核中,还有一个经常用到的睡眠锁就是rw semaphore(后文简称为rwsem),它到底和mutex有什么不同呢?为何会有rw semaphore?无他,仅仅是为了增加内核的并发,从而增加性能而已。下图可以抽象rwsem相关的数据结构:我们先看看读写锁的状态。。和读写相关的任务有两类,。对于。然。不过在实际的rwsem实现中,由于跟踪owner们开销比较大,因此也是用一个task struct指针指向其一。原创 2024-02-01 20:43:10 · 852 阅读 · 0 评论 -
Linux内核高端内存
Linux将内核地址空间划分为三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高端内存HIGH_MEM地址空间范围为 0xF8000000 ~ 0xFFFFFFFF(896MB~1024MB)。这种方式很简单,因为通过 vmalloc() ,在”内核动态映射空间”申请内存的时候,就可能从高端内存获得页面(参看 vmalloc 的实现),因此说高端内存有可能映射到”内核动态映射空间”中。:借一段地址空间,建立临时地址映射,用完后释放,达到这段地址空间可以循环使用,访问所有物理内存。原创 2024-02-01 20:28:53 · 791 阅读 · 0 评论 -
【Linux网络模型】9. 传输层协议:套接字Socket
UDP 是没有连接的,所以不需要三次握手,也就不需要调用 listen 和 connect,但是,UDP 的交互仍然需要 IP 和端口号,因而也需要 bind。在一RFC147标准中,这个定义与1971的ARPA网有关,接口指的是一个32位数字,其中偶数的是接收接口,奇数的是发送接口,但是今天通信已经可以实现双向传输,在一个接口中,可以发送的同时还可以接收。远程的套接字地址,以及本地的套接字地址完成连线后,再加上使用的协议(protocol),这个五元组(five-element tuple),作为。原创 2024-01-31 16:46:00 · 833 阅读 · 0 评论 -
【Linux网络模型】传输层协议:TCP协议(下)——运作方式(如何三次握手、四次挥手等)
然后,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。原创 2024-01-31 12:47:31 · 995 阅读 · 0 评论 -
【Linux网络模型】传输层协议:TCP协议(上)——协议结构、主要特点以及应用场景
除外,由于TCP的实现是由操作系统提供,而TCP的悠久历史、系统级别的配置机制,一些特性在特定的网络环境下会成为一种累赘而且无法优化,所以也有一些通过在UDP上重新实现用户层级的类似TCP的面向连接的、可靠的、基于字节流的类传输层协议,来代替TCP,例如。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的。原创 2024-01-31 00:33:02 · 1024 阅读 · 0 评论 -
【Linux网络模型】linux网络-数据包的接收过程
应用层一般有两种方式接收数据,一种是recvfrom函数阻塞在那里等着数据来,这种情况下当socket收到通知后,recvfrom就会被唤醒,然后读取接收队列的数据;网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自己注册进网络模块,当相应的网卡收到数据包时,网络模块会调用相应的驱动程序处理数据。本示例里列出的函数调用关系来自于kernel 3.13.0,如果你的内核不是这个版本,函数名称和相关路径可能不一样,但背后的原理应该是一样的(或者有细微差别)原创 2024-01-30 15:14:22 · 986 阅读 · 0 评论 -
【Linux网络模型】127.0.0.1 之本机网络通信过程
我们来总结一下本机网络 IO 的内核执行流程。回想下跨机网络 IO 的流程是。原创 2024-01-30 11:38:46 · 966 阅读 · 0 评论 -
【Linux网络模型】13. linux网络的相关问题记录
之前文章介绍过 Linux 网络的收发流程。不过相应的,就会有两个问题。首先,这些缓冲区的位置在哪儿?是在网卡硬件中,还是在内存中?这个问题其实仔细想一下,就很容易明白——这些缓冲区都处于内核管理的内存中。其中,,由于需要 DMA 与网卡交互,理应属于网卡设备驱动的范围。,是一个维护网络帧结构的双向链表,链表中的每一个元素都是一个网络帧(Packet)。虽然 TCP/IP 协议栈分了好几层,但上下不同层之间的传递,实际上只需要操作这个数据结构中的指针,而无需进行数据复制。原创 2024-01-29 20:00:30 · 853 阅读 · 0 评论 -
【Linux网络模型】12. 网络性能优化的几个思路(下)将顺着 TCP/IP 网络模型,继续向下,看看如何从传输层、网络层以及链路层中,优化 Linux 网络性能。
上一篇在优化网络的性能时,可以结合 Linux 系统的网络协议栈和网络收发流程,然后从应用程序、套接字、传输层、网络层再到链路层等每个层次,进行逐层优化。这篇文章将顺着 TCP/IP 网络模型,继续向下,看看如何从传输层、网络层以及链路层中,优化 Linux 网络性能。原创 2024-01-29 18:16:27 · 1056 阅读 · 0 评论 -
【Linux网络模型】11. 网络性能优化的几个思路(上)应用层的各种 I/O 模型,冗长的网络协议栈和众多的内核选项,抑或是各种复杂的网络环境,都提高了网络的复杂性。
应用层的各种 I/O 模型,冗长的网络协议栈和众多的内核选项,抑或是各种复杂的网络环境,都提高了网络的复杂性。不过,只要掌握了 Linux 网络的基本原理和常见网络协议的工作流程,再结合各个网络层的性能指标来分析,你会发现,定位网络瓶颈并不难。找到网络性能瓶颈后,下一步要做的就是优化了,也就是如何降低网络延迟,并提高网络的吞吐量。接下面我们通过两篇文章分析优化网络性能问题的思路和一些注意事项。原创 2024-01-29 12:05:27 · 977 阅读 · 0 评论 -
【Linux网络模型】10. 如何优化 NAT 性能?(下)
Linux 中的NAT ,基于内核的连接跟踪模块实现。所以,它维护每个连接状态的同时,也对网络性能有一定影响。那么,碰到 NAT 性能问题时,我们又该怎么办呢?接下来,通过一个案例,学习 NAT 性能问题的分析思路。原创 2024-01-28 17:37:45 · 813 阅读 · 0 评论 -
【Linux网络模型】9. 如何优化 NAT 性能?(上)NAT 技术可以重写 IP 数据包的源 IP 或者目的 IP,被普遍地用来解决公网 IP 地址短缺的问题。它的主要原理就是,网络中的多台主机
在发现网络延迟增大的情况后,可以先从路由、网络包的收发、网络包的处理,再到应用程序等,从各个层级分析网络延迟,等到找出网络延迟的来源层级后,再深入定位瓶颈所在。这一篇文章我们来介绍另一个可能导致网络延迟的因素,即网络地址转换(Network Address Translation),缩写为 NAT。接下来,我们先来学习 NAT 的工作原理,并弄清楚如何优化 NAT 带来的潜在性能问题。原创 2024-01-28 10:12:31 · 1106 阅读 · 0 评论 -
【Linux网络模型】8. 如何排查网络请求延迟变大
提到时,你可能轻松想起它的含义——网络数据传输所用的时间。不过要注意,这个时间可能是单向的,指从源地址发送到目的地址的单程时间;也可能是双向的,即从源地址发送到目的地址,然后又从目的地址发回响应,这个往返全程所用的时间。通常,我们更常用的是双向的往返通信延迟,比如 ping 测试的结果,就是往返延时 RTT(Round-Trip Time)。除了网络延迟外,另一个常用的指标是,它是指,从应用程序接收到请求,再到发回响应,全程所用的时间。原创 2024-01-28 09:03:53 · 845 阅读 · 0 评论 -
【Linux网络模型】7. 怎么缓解 DDoS 攻击带来的性能下降问题?
DDoS 的前身是 DoS(Denail of Service),即拒绝服务攻击,指利用大量的合理请求,来占用过多的目标资源,从而使目标服务无法响应正常请求。DDoS(Distributed Denial of Service) 则是在 DoS 的基础上,采用了分布式架构,利用多台主机同时攻击目标主机。这样,即使目标服务部署了网络防御设备,面对大量网络请求时,还是无力应对。比如,目前已知的最大流量攻击,正是去年 Github 遭受的DDoS 攻击。原创 2024-01-27 19:00:00 · 1741 阅读 · 0 评论 -
【Linux网络模型】6. 怎么使用 tcpdump 和 Wireshark 分析网络流量?
第三条和第四条,是 ICMP echo request 和 ICMP echo reply,响应包的时间戳 14:02:31.539667,减去请求包的时间戳 14:02:31.508164 ,就可以得到,这次 ICMP 所用时间为 30ms。很多情况下,ping 可以帮我们定位出延迟问题,不过有时候遇到网络问题,我们可以抓取ping 命令执行时收发的网络包,然后分析这些网络包,进而找出问题根源。接下来,中间的才是 HTTP 请求和响应包,而最后的三个包,则是 TCP 连接断开时的“三次挥手”包。原创 2024-01-27 17:15:00 · 924 阅读 · 0 评论 -
【Linux网络模型】5. DNS 基本介绍与性能问题排查
IP 地址是 TCP/IP 协议中,用来确定通信双方的一个重要标识。每个 IP 地址又包括了主机号和网络号两部分。相同网络号的主机组成一个子网;不同子网再通过路由器连接,组成一个庞大的网络。然而,IP 地址虽然方便了机器的通信,却给访问这些服务的人们,带来了很重的记忆负担。我相信,没几个人能记得住 GitHub 所在的 IP 地址,因为这串字符,对人脑来说并没有什么含义,不符合我们的记忆逻辑。不过,这并不妨碍我们经常使用这个服务。为什么呢?当然是因为还有更简单、方便的方式。原创 2024-01-27 14:00:00 · 847 阅读 · 0 评论 -
【Linux网络模型】4. 怎么评估linux系统的网络性能?
交换机可以达到线速(满负载时,无差错转发),它的 PPS 就是 1000Mbit 除以以太网帧的大小,即 1000Mbps/((64+20)*8bit) = 1.5 Mpps(其中,20B 为以太网帧前导和帧间距的大小)。要测试 HTTP 的性能,也有大量的工具可以使用,比如 ab、webbench 等,都是常用的 HTTP 压力测试工具。所以,一般情况下,我们需要从上到下,对每个协议层进行性能测试,然后根据性能测试的结果,结合 Linux 网络协议栈的原理,找出导致性能瓶颈的根源,进而优化网络性能。原创 2024-01-26 16:45:00 · 995 阅读 · 0 评论 -
【Linux网络模型】3.C10K 和 C1000K 回顾 Linux 网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层、传输层、网络层、网络接口层四个不同的层次
要解决这个问题,最重要就是跳过内核协议栈的冗长路径,把网络包直接送到要处理的应用程序那里去。这里有两种常见的机制,原创 2024-01-26 11:45:00 · 1656 阅读 · 0 评论 -
【Linux网络模型】2. 性能指标Linux 网络根据 TCP/IP 模型,构建其网络协议栈。TCP/IP 模型由应用层、传输层、网络层、网络接口层等四层组成,这也是 Linux 网络栈最核心的构成
上一篇学习了 Linux 网络的基础原理。Linux 网络根据 TCP/IP 模型,构建其网络协议栈。TCP/IP 模型由应用层、传输层、网络层、网络接口层等四层组成,这也是 Linux 网络栈最核心的构成部分。应用程序通过套接字接口发送数据包时,先要在网络协议栈中从上到下逐层处理,然后才最终送到网卡发送出去;而接收数据包时,也要先经过网络栈从下到上的逐层处理,最后送到应用程序。了解Linux 网络的基本原理和收发流程后,如何去观察网络的性能情况。原创 2024-01-26 09:45:00 · 1000 阅读 · 0 评论 -
【Linux网络模型】1. 网络模型 Linux 网络怎么工作的呢?
Linux 网络怎么工作的呢?又有哪些指标衡量网络的性能呢?接下来的两篇文章,一起学习 Linux 网络的工作原理和性能指标。原创 2024-01-26 08:30:00 · 951 阅读 · 0 评论