网络协议栈
文章平均质量分 93
计算机网络中的一种软件架构,用于实现网络通信的各种协议。它是一种层次化的结构,由多个协议层次组成,每个层次负责不同的功能,从而实现网络通信的各种功能。
简说Linux内核
这个作者很懒,什么都没留下…
展开
-
计算机网络的166个核心概念,你知道吗?
上回我整理了一下计算机网络中所有的关键概念,很多小伙伴觉得很有帮助,但是有一个需要优化的点就是这些概念不知道出自哪里,所以理解起来像是在云里穿梭,一会儿在聊应用层的概念,一会儿又跑到网络层协议了。针对这种情况,我重新根据不同的章节来进行整理和汇总,这篇文章理解起来,应该会舒服很多了。计算机网络的 166 个核心概念,你知道吗?交换机和集线器的功能非常相似,交换机具有记忆功能,它广播之后能够缓存目标 Mac,后续的数据包就会直接通过缓存的路径发送,交换机是一种全双工通信模式。而集线器工作的时候,如果局域网中的原创 2023-02-22 14:39:45 · 384 阅读 · 0 评论 -
Linux网络编程必学的TCP/IP协议——图解分层(通俗易懂)【建议新手收藏】
带你解决问题所在!实战出发,直击痛点!网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如 T C P / I P,是一组不同层次上的多个协议的组合。 T C P / I P通常被认为是一个四层协议系统。链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在T C P / I P协议族中,网络层协议原创 2021-01-30 17:24:36 · 1385 阅读 · 1 评论 -
Linux网络编程的5种IO模型(二)——多路复用Poll
前言:我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO,对于其中的 阻塞/非阻塞IO 进行了说明。这一讲我们来看 多路复用机制。IO复用模型 ( I/O multiplexing )所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。这种机制的使用需要额外的功能来配合: select、poll、epoll。select、poll,epoll本质上都是同步I/O,因为他们都需要在读写事件.原创 2021-01-27 11:42:39 · 1012 阅读 · 2 评论 -
探索Linux内核4.4版本带来的网络新特性
本文题目有点大,但其实我只想描述一些我个人一直比较关注的特性,并且不会太详细,跟往常一样,主要是帮忙理清思路的,不会分析源码。这主要是为了哪一天突然忘了的时候,一目十行扫一眼就能记忆当时的理解,不然写得太细节了,自己都看不懂了。原创 2022-12-21 17:34:08 · 762 阅读 · 0 评论 -
Linux网络编程的5种IO模型一阻塞IO与非阻塞IO(内含现实生活举例说明)通俗易懂【建议新手收藏】
前言:整理之前学习socket编程的时候复习到了多路复用,搜索了有关资料,了解到多路复用也有局限性,本着打破砂锅问到底的精神,最终找到了关于IO模型的知识点。一、概述在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。我们在这里就介绍并实现这5种模型。介绍之前,请允许我引用某段比喻阻塞IO, 给女神发一条短信, 说我来找你了, 然后就默默的一直等着女神下楼, 这个期间除了等待你不会做其他事情, 属于备胎做法.非阻塞IO, 给女神.原创 2021-01-26 17:28:16 · 748 阅读 · 0 评论 -
Linux网络编程的5种IO模型(三)——多路复用Epoll
前言:epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll 那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发原创 2021-01-28 11:56:51 · 166 阅读 · 0 评论 -
网络编程:TCP粘包和分包的原因分析和解决
在学习粘包之前,先纠正一下读音,很多视频教程中将“粘”读作“nián”。经过调研,个人更倾向于读“zhān bāo”。如果在百度百科上搜索“粘包”,对应的读音便是“zhān bāo”,语义解释为:网络技术术语。指TCP协议中,发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。TCP是面向字节流的协议,就是没有界限的一串数据,本没有“包”的概念,“粘包”和“拆包”一说是为了有助于形象地理解这两种现象。原创 2022-11-07 16:52:57 · 1345 阅读 · 0 评论 -
Linux 内核网络栈分析: 接收数据
本文基于内核3.13,驱动采用 igb 作为参考来熟悉流程[1]。对于RSS/多队列,通过对packet头(五元组,可修改)做哈希选择对应的RX如果RX 队列有足够的帧,包会通过 DMA 写入到内存中触发配置的硬中断处理函数,将 napi_struct 放入到 perCPU 的 softnet_data,其中唤醒软中断处理函数执行NAPI处理循环。原创 2022-12-20 21:45:15 · 857 阅读 · 0 评论 -
Linux网络编程的5种IO模型(一)——多路复用Select
前言:我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO,对于其中的 阻塞/非阻塞IO 进行了说明。这一讲我们来看 多路复用机制。IO复用模型 ( I/O multiplexing )所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。这种机制的使用需要额外的功能来配合: select、poll、epoll。select、poll,epoll本质上都是同步I/O,因为他们都需要在读写事件.原创 2021-01-26 20:46:20 · 357 阅读 · 0 评论 -
网络基本功:http报文及TCP拥塞控制机制
二、数据包守恒原则。对车流量进行控制:例如限制车辆进入主公路,根据实际的情况,如果某一时间段车辆少,则可以慢慢增加车辆进入该公路段,但是当达到一个 阈值,就要放缓车辆进入的速度,并实时地探测整条路的状况,如果情况紧急,则立刻将车流量减少一半,将车流量降到最低,然后在重新回到慢启动转态。第三个丢失,其他正常,那么客户端会收到3个包2的ACK,而4、5正常到达后会被服务器缓存起来但是不会发送相应包的ACK,因为TCP是基于积累确认机制,以确保丢失的包能被重发,数据接收准确,ACK必须是连续的。原创 2022-12-27 15:37:58 · 152 阅读 · 0 评论 -
Linux内核网络协议栈套接字缓冲区原理
对于skb数据结构的其他操作主要放在skbuff.h文件中,主要有skb_reserve()、skb_put()、skb_push()、skb_pull()、skb_trim()等等,都是对skb的head、data、tail、end、len等字段进行操作。需要指出的是,内核编译之后,由某些选项所控制的数据结构是固定的而不是动态变化的。Alloc_skb()用来分配SKB,数据缓存区描述符是两个不同的实体,这就意味着,在分配一个SKB时,需要分配两块内存,一块是数据缓存区,一块是SKB描述符。原创 2023-02-24 22:16:59 · 643 阅读 · 0 评论 -
盘点Linux内核网络知识100道题,这篇就够了
套接字是个API,是应用程序和网络的接口。进程可类比于一座房子,而它的套接字可以类比于它的门。当一个进程想向位于另外一台主机上的另一个进程发送报文时,它把报文推出该门。原创 2023-02-17 21:04:39 · 1051 阅读 · 0 评论 -
深入了解Golang网络库中socket阻塞调度源码
前言:本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理。代码中大部分是Go代码,小部分是汇编代码。完整理解本文需要Go语言知识,并且用Golang写过网络程序,更重要的是,需要提前理解goroutine的调度原理。一、TCP的连接对象连接对象:在net.go中有一个名为Conn的接口,提供了对于连接的读写和其他操作type Conn interface { Read(b []byte) (n int, err error) Write(b []b.原创 2020-12-01 14:20:31 · 1896 阅读 · 1 评论 -
Linux网络编程的5种IO模型(三)——多路复用Epoll
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。原创 2022-10-22 17:33:51 · 654 阅读 · 0 评论 -
趣谈网络协议栈,以太网基础MAC和PHY
MDI是正常的UTP或STP连接,而MDI-X连接器的发送和接收对是在内部反接的,这就使得不同的设备(如集线器-集线器或集电器-交换机),可以利用常规的UTP或STP电缆实现背靠背的级联。RMII是简化的MII接口,在数据的收发上它比MII接口少了一倍的信号线(2数据位),所以它一般要求是50MHz的总线时钟。MII 数据接口总共需要 16 个信号,包括 TX_ER,TXD[3:0],TX_EN,TX_CLK,COL,RXD[3:0],RX_ER,RX_CLK,CRS,RX_DV 等。原创 2023-01-07 21:31:30 · 1204 阅读 · 0 评论 -
趣谈网络协议栈,以太网基础MAC和PHY
对于上述三部分,并不一定都是独立的芯片,主要有以下几种情况CPU内部集成了MAC和PHY,难度较高CPU内部集成MAC,PHY采用独立芯片(主流方案)CPU不集成MAC和PHY,MAC和PHY采用独立芯片或者集成芯片(高端采用)PHY整合了大量模拟硬件,而MAC是典型的全数字器件,芯片面积及模拟/数字混合架构是为什么先将MAC集成进微控制器而将PHY留在片外的原因。更灵活、密度更高的芯片技术已经可以实现MAC和PHY的单芯片整合。原创 2022-10-26 16:06:16 · 813 阅读 · 0 评论 -
Linux内核中网络数据包的接收框架
本文就来介绍一下关于这两个边界的这两件事是怎么一个细节,关乎网卡中断,NAPI,网卡poll,select/poll/epoll等细节,并假设你已经大约懂了这些。原创 2022-12-22 22:30:17 · 499 阅读 · 0 评论 -
Linux内核网络分层模型——skb核心操作
也就是说,可以通过相对于skb的head指针的偏移来定位协议头的位置,也可以通过绝对 地址来定位,具体使用哪一种取决于系统有没有定义NET_SKBUFF_DATA_USES_OFFSET宏,以上的 skb->network_header = p明显是通过绝对地址来定位的,一旦系统定义了NET_SKBUFF_DATA_USES_OFFSET宏,肯定就不对了。好了,基本就是这些。在具体的操作上,数据包最终形成的过程就是一层 一层封装的过程,在栈上形成一段连续的数据,我们可以称作是一层一层的push操作。原创 2022-12-22 22:14:53 · 1259 阅读 · 0 评论