![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux网络协议栈开发
文章平均质量分 87
zqixiao_09
这个作者很懒,什么都没留下…
展开
-
语音业务VOIP开发之SIP协议篇(三) —— SIP报文解析
下面深入了解SIP报文: SIP是基于一个类似HTTP协议的请求应答的通讯模式。每一个通讯都包含对某个功能的请求,并且起码需要一个应答。在这个应答中,Alice的软电话发送一个含有Bbo的SIP URI抵制的INVITE通讯请求。INVITE是一个SIP请求的例子,表示请求方(Alice)希望服务方(Bob)应答。INVTE请求包含一系列的包头域(Header fields)。包头中包原创 2018-03-11 20:45:43 · 13617 阅读 · 2 评论 -
Linux 网络协议栈之内核锁(一)—— 进程调度
学习内核锁之前,我们先了解一下关于内核的基础知识,以便更好的学习内核锁的使用! 下面我们先学习一下进程调度:一、进程调度调度什么时候发生?即:schedule()函数什么时候被调用?调度的发生有两种方式:1、主动式在内核中直接调用schedule()。当进程需要等待资源等而暂时停止运行时,会把状态置于挂起(睡眠),并主动请求调度,让出CPU。主动放原创 2018-02-05 22:11:13 · 1541 阅读 · 0 评论 -
Linux 网络协议栈开发代码分析篇之数据收发(二) —— dev_queue_xmit()函数
当所有的信息都准备好了之后,例如,出口设备,下一跳的地址,以及链路层地址。就会调用dev.c文件中的dev_queue_xmin函数,该函数是设备驱动程序执行传输的接口。也就是所有的数据包在填充完成后,最终发送数据时,都会调用该函数。 Dev_queue_xmit函数只接收一个skb_buff结构作为输入的值。此数据结构包含了此函数所需要的一切信息。Skb->dev是出口设备,skb-原创 2018-01-28 12:37:48 · 4501 阅读 · 0 评论 -
Linux 网络协议栈开发代码分析篇之数据收发(一) —— netif_receive_skb()函数
提到网络协议栈,数据的收发是核心,我们先来看下数据的接收函数 netif_receive_skb() 先统一介绍下数据收发 对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。原创 2018-01-28 12:19:37 · 10867 阅读 · 1 评论 -
Linux 网络协议栈开发代码分析篇之VLAN(三)—— VLAN收发处理
转自:http://blog.chinaunix.net/uid/28541347/year-201606-list-1.htmlVLAN报文格式 基于802.1Q的VLAN帧格式如下:Type:长度为2字节,取值为0x8100,表示此帧的类型为802.1Q Tag帧。PRI:长度为3比特,可取0~7之间的值,表示帧的优先级,值越大优转载 2018-01-28 11:30:49 · 9544 阅读 · 0 评论 -
Linux 网络协议栈开发代码分析篇之VLAN(二)—— Linux下VLAN功能的实现概述
1.Linux网络栈下两层实现1.1简介 VLAN是网络栈的一个附加功能,且位于下两层。首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去。下两层涉及到具体的硬件设备,日趋完善的Linux内核已经做到了很好的代码隔离,对网络设备驱动也是如此,如下图所示:这里要注意的是,Linux下的网络设备net_dev并不原创 2018-01-28 11:26:30 · 2061 阅读 · 0 评论 -
Linux 网络协议栈开发代码分析篇之VLAN(一)—— vlan 功能模块分析
整理自:http://blog.csdn.net/lickylin/article/details/41832967本文代码基于linux3.14 Vlan即虚拟局域网,一个vlan能够模拟一个常规的交换网络,实现了将一个物理的交换机划分成多个逻辑的交换网络。而不同的vlan之间如果要进行通信就要通过三层协议来实现。 在linux中vlan的配置使用vconfig原创 2018-01-28 11:22:31 · 4924 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(十一)—— 组播IGMP Snooping理论知识详解
IGMP Snooping配置在二层组播设备上,通过对上游三层设备和下游用户之间的IGMP报文进行分析,建立和维护二层组播转发表,实现组播数据报文在数据链路层的按需分发。IGMP Snooping (Internet Group Management Protocol Snooping)是一种IPv4二层组播协议,通过侦听三层组播设备和用户主机之间发送的组播协议报文来维护组播报文的出接口信息,原创 2018-01-27 19:51:34 · 3071 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(十)—— 组播(Multicast)基础
一、组播(Multicast)传输 在发送者和每一接收者之间实现点对多点网络连接。 如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用原创 2018-01-27 19:49:28 · 5108 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(六)—— NAT原理介绍
介绍NAT之前,我们需要先理解下公有地址及私有地址的概念: IP地址分为两部分,网络号和主机号,这种分法应用在私有和公有IP地址上。一个局域网中,为了该局域网的安全,我们应用了私有IP地址,为了和Internet中的其他主机进行通信,我们用的私有IP地址必须为: A级:10.0.0.0 - 10.255.255.255 B级:172.16.0.0 - 172.31.255.2原创 2018-01-25 21:51:27 · 2233 阅读 · 1 评论 -
Linux 网络协议栈之内核锁(二)—— 内核抢占
一、内核抢占 早期的Linux核心是不可抢占的。它的调度方法是:一个进程可以通过schedule()函数自愿地启动一次调度。非自愿的强制性调度只能发生在每次从系统调用返回的前夕以及每次从中断或异常处理返回到用户空间的前夕。但是,如果在系统空间发生中断或异常是不会引起调度的。这种方式使内核实现得以简化。但常存在下面两个问题:1、如果这样的中断发生在内核中,本次中断返回是不会引起调度的,原创 2018-02-05 22:36:00 · 1055 阅读 · 0 评论 -
Linux 网络协议栈之内核锁(三)—— Linux内核抢占和进程调度总结
1 用户抢占内核即将返回用户空间的时候,如果need resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占。在内核返回用户空间的时候,它知道自己是安全的。所以,内核无论是在从中断处理程序还是在系统调用后返回,都会检查need resched标志。如果它被设置了,那么,内核会选择一个其他(更合适的)进程投入运行。简而言之,用户抢占在以下情况时产生:1) 从原创 2018-02-05 22:40:19 · 1048 阅读 · 0 评论 -
Linux 网络协议栈之内核锁(四)—— 进程上下文与中断上下文的理解
一.什么是内核态和用户态内核态:在内核空间执行,通常是驱动程序,中断相关程序,内核调度程序,内存管理及其操作程序。用户态:用户程序运行空间。二.什么是进程上下文与中断上下文1.进程上下文:(1)进程上文:其是指进程由用户态切换到内核态是需要保存用户态时cpu寄存器中的值,进程状态以及堆栈上的内容,即保存当前进程的进程上下文,以便再次执行该进程时,能够原创 2018-02-05 23:00:29 · 1380 阅读 · 0 评论 -
语音业务VOIP开发之SIP协议篇(二) —— SIP报文浅析
一、SIP消息 SIP消息是SIP客户终端和服务器之间通信的的基本信息单元。SIP消息基于文本,采用UTF-8编码(RFC 2279)中的ISO 10646字符集。SIP协议借鉴了HTTP协议(RFC 2068)的设计思想,有很多消息格式与之相同。SIP协议支持UDP传输协议 SIP消息消息分两类:请求消息 和 响应消息请求消息(Request):客户端原创 2018-03-11 20:22:51 · 18048 阅读 · 1 评论 -
语音业务VOIP开发之SIP协议篇(一) —— SIP基本场景分析
一、SIP业务基本知识1、业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始、管理和终止网络中的语音和视频会话,具体地说就是用来生成、修改和终结一个或多个参与者之间的会话。SIP的业务模式是一个点对点协议,其中有两个要素——SIP用户代理和SIP网络服务器。 用户代理(UA)是呼叫的终端系统元素,而SIP服务器是处理与原创 2018-03-11 20:10:44 · 40798 阅读 · 2 评论 -
Linux 网络协议栈开发基础篇(十三)——TCP/IP协议各报文头格式
一、TCP报文 TCP是TCP/IP体系中面向连接的运输层协议,提供全双工的和可靠交付的服务。TCP报文段的格式如下图所示源端口和目的端口:各占2个字节,是运输层与应用层的服务接口。序号:占4个字节。TCP连接传送的数据流中的每一个字节都被编上一个序号。首部中序号字段的值指的是本报文段所发送的数据的第一个字节的序号。确认号:占4个字节,是原创 2018-02-07 23:14:27 · 4310 阅读 · 1 评论 -
Linux 网络协议栈开发基础篇(十二)—— 使用wireshark分析TCP/IP协议中TCP包头的格式
摘要:本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析。一、概述TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息。连接建立整个过程如下(即三次握手协议):首先,客户原创 2018-02-07 22:38:37 · 1239 阅读 · 0 评论 -
Linux 网络协议栈之内核锁(九)—— RCU锁机制
一、 引言众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用。但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,原创 2018-02-07 22:34:16 · 2207 阅读 · 1 评论 -
Linux 网络协议栈之内核锁(五)—— 自旋锁在抢占(非抢占)单核和多核中的作用
一、自旋锁的实现linux上的自旋锁有三种实现:1. 在单cpu,不可抢占内核中,自旋锁为空操作。2. 在单cpu,可抢占内核中,自旋锁实现为“禁止内核抢占”,并不实现“自旋”。3. 在多cpu,可抢占内核中,自旋锁实现为“禁止内核抢占” + “自旋”。关于抢占式内核与非抢占式内核:a、非抢占式内核如果一个进程在内核态运行,其只有在以下两种情况会被切换:1.原创 2018-02-05 23:00:56 · 2640 阅读 · 0 评论 -
Linux 网络协议栈之内核锁(八)—— RCU锁
RCU的设计思想比较明确,通过新老指针替换的方式来实现免锁方式的共享保护。但是具体到代码的层面,理解起来多少还是会有些困难。在《深入Linux设备驱动程序内核机制》第4章中,已经非常明确地叙述了RCU背后所遵循的规则,这些规则是从一个比较高的视角来看,因为我觉得过多的代码分析反而容易让读者在细节上迷失方向。最近拿到书后,我又重头仔细看了RCU部分的文字,觉得还应该补充一点点内容,因为有些东西不一定原创 2018-02-05 23:18:39 · 1001 阅读 · 0 评论 -
Linux 网络协议栈之内核锁(七)—— 读写自旋锁
读写自旋锁(rwlock)是一种比自旋锁粒度更小的自旋锁机制,它保留了“自旋”的概念。但是在写操作方面,只能最多有一个写进程,在读方面,同时可拥有多个执行单元,当然读和写也不能同时进行。一句话:防写不防读读写自旋锁的实现原理,它其实是自旋锁的升级版。同样,我们先看看它能实现的功能:针对写:最多只有一个写进程;针对读:可以同时有多个读写单元。但读和写不能同时进行。它于in原创 2018-02-05 23:14:29 · 1233 阅读 · 3 评论 -
Linux 网络协议栈之内核锁(六)—— 互斥锁、读写锁 、 自旋锁和RCU锁简述
互斥锁 mutex:在访问共享资源之前对进行加锁操作,在访问完成之后进行解锁操作。 加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前进程解锁。 如果解锁时有一个以上的线程阻塞,那么所有该锁上的线程都被编程就绪状态, 第一个变为就绪状态的线程又执行加锁操作,那么其他的线程又会进入等待。 在这种方式下,只有一个线程能够访问被互斥锁保护的资源。读写锁 rwlock(也原创 2018-02-05 23:09:29 · 1042 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(九)—— VID与PVID
一、PVID的作用及和VID的区别 PVID和VID经常出现于二、三层交换机里,由于PVID和VID的设置不合理,造成VLAN划分变得混乱。 PVID是交换机上的概念,说的是进入该端口的报文如果没有打vlan id就按PVID的值打上,VID是报文上的vlan tag的意思。1、什么是PVID PVID英文解释为Port-base VLAN ID原创 2018-01-27 15:41:19 · 3961 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(八)—— VLAN原理概述
一、vlan的含义 局域网LAN的发展是VLAN产生的基础,因而先介绍一下局域网LAN 由Hub、网桥或交换机等网络设备连接同一网段内的所有节点形成局域网(LAN),通常是一个单独的广播域。处于同一个局域网LAN之内的网络节点之间可以直接通信,处于不同局域网段的设备之间的通信则必须经过路由器才能通信。 上述传统拓扑结构的关键在于用三层设备,即路由器,原创 2018-01-27 14:54:01 · 1484 阅读 · 0 评论 -
Linux 网络协议栈开发番外篇(三)—— ping命令执行过程详解
先看拓朴图: 在这里讲ping的两情况:一种是同一网段内,一种是跨网段的ping。一、同一网段内首先,如果主机A,要去ping主机B,那么主机A,就要封装二层报文,他会先查自己的MAC地址表,如果没有B的MAC地址,就会向外发送一个ARP广播包,如图:原创 2018-01-24 21:37:01 · 1418 阅读 · 0 评论 -
Linux 网络协议栈开发番外篇(二)—— list_head 学习
在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用,有点类似于C++的继承机制(希望有机会写篇文章研究一下C语言的面向对象机制)。下面就是kernel中的list_head结构定义:struct li原创 2018-01-18 22:28:07 · 676 阅读 · 0 评论 -
Linux 网络协议栈开发(八)—— 基于VLAN的二层转发
一、VLAN是什么 (这里不详细介绍VLAN,只做简单说明) VLAN(Vitual Local Area Network,虚拟局域网)是将物理网络划分成多个逻辑局域网的技术。一个VLAN就是一个广播域,亦即一个逻辑子网,在其内的站点可位于不同物理LAN上,但站点间像在同一个普通局域网上那样自由通信而不受物理位置的限制。利用VLAN技术,网络管理者可根据实际应用需原创 2018-01-16 21:06:05 · 2616 阅读 · 0 评论 -
Linux 网络协议栈开发(四)—— 二层桥实现原理
(转自 http://blog.csdn.net/u010246947/article/details/18223263)网桥原理: 网桥工作在链路层,所以它是二层的东西,对于以太网来说网桥和二层网络设备交换机的工作方式几乎是一样的,每个交换机包含一系列以太网接口,交换机通过其内部的硬件交换芯片实现对这些以太网接口出入报文的二层接收转发及过滤等二层qos功能,网桥在功能上和交换机原创 2018-01-14 15:42:28 · 10172 阅读 · 1 评论 -
Linux 网络协议栈开发(七)—— Netfilter 概述及其hook点
Netfilter概述 Netfilter/IPTables是Linux2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性。其重要工具模块IPTables从用户态的iptables连接到内核态的Netfilter的架构中,Netfilter与IP协议栈是无缝契合的,并允许使用者对数据报进行过滤、地址转换原创 2018-01-14 16:22:20 · 3365 阅读 · 0 评论 -
Linux 网络协议栈开发(六)—— 二层桥转发蓝图(下)
上一节我们了解到,数据包如何走进桥,这一节我们简单看看,入口帧处理函数br_handle_frame_finish. 作用:br_handle_frame_finish函数主要是决策将不同类别的数据包做不同的分发路径。其函数处理的过程如下图所示:首先判断该数据包是否符合桥转发的条件:(1)桥端口状态是否是开启状态,如果没有开启则丢掉数据原创 2018-01-14 16:18:29 · 3586 阅读 · 1 评论 -
Linux 网络协议栈开发(五)—— 二层桥转发蓝图(上)
一、看一张桥转发时函数调用的一个基本蓝图。这张图中,简单的展示了,数据的接收和发送,其中还包括netfilet的钩子点所处的位置。需要说明的是:1).我们先暂时忽略数据包从一开始是怎么从驱动进入到netif_receive_skb的,因为这个暂时不影响我们理解这幅图的流程。2).由于桥转发的篇幅较大,图中没有标示出,数据包中途被丢弃的情况。约定数原创 2018-01-14 16:11:40 · 3246 阅读 · 0 评论 -
Linux 网络协议栈开发(三)—— 链路层基础
(转自 http://blog.csdn.net/u010246947/article/details/18223085)一、链路层原理:1、链路层在干什么: 在报文接收方向上,网卡驱动把接收到的数据按照其对应的链路层协议(如以太网)组装成报文,然后把它上交给链路层,接口是netif_receive_skb,至此网卡驱动的任务就结束了,报文交给链路层处理;原创 2018-01-14 15:28:15 · 1671 阅读 · 0 评论 -
Linux 网络协议栈开发(二)—— 二层桥转发基础
做为网络设备,二层转发是最基本的功能。要想继续学习linux 内核协议栈,必须明白二层转发的流程。这篇文章举例讲一讲二层转发的流程。 二层转发是根据报文的目的MAC直接进行转发,转发过程中不用对报文的头部做任何的修改。 三层转发是根据报文的ip 地址来进行转发,并且要对报文的二层头部进行相应的修改。 进行二层转发的设备一般叫做网桥(bridge)。桥可以是原创 2018-01-14 15:07:43 · 5776 阅读 · 0 评论 -
Linux 网络协议栈开发番外篇(四)—— Wireshark-ICMP数据报分析
ICMP是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。 ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议,属于网络层协议。 ICMP报文是在IP数据报内被传输的。在实际传输中的数据包结构:20字节IP首部 + 8字节ICMP首部+ 1472字节38字节。原创 2018-01-24 23:17:42 · 604 阅读 · 0 评论 -
Linux 网络协议栈开发番外篇(五)—— Linux路由表详解
linux 路由表维护查看 Linux 内核路由表使用下面的 route 命令可以查看 Linux 内核路由表。# routeDestination Gateway Genmask Flags Metric Ref Use Iface192.168.0.0 * 255.2原创 2018-01-25 18:48:30 · 1000 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(七)—— 网桥br0
一、桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。 交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换机的报文转发而互相通信。 如下图:主机A发送的报文被送到交换机S1的eth0口,原创 2018-01-27 14:19:03 · 4035 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(四)—— IP协议补充协议ARP
1.学习ARP前要了解的内容建立TCP连接与ARP的关系应用接受用户提交的数据,触发TCP建立连接,TCP的第一个SYN报文通过connect函数到达IP层,IP层通过查询路由表: 如果目的IP和自己在同一个网段: 当IP层的ARP高速缓存表中存在目的IP对应的MAC地址时,则调用网络接口send函数(参数为IP Packet和目的MAC))将数据提交给网络接口原创 2018-01-25 21:21:42 · 858 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(三)—— TCP对比UDP
TCP与UDP基本区别 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少; 3.UDP程序结构较简单 4.流模式(TCP)与数据报模式(UDP); 5.TCP保证数据正确性,UDP可能丢包 6.TCP保证数据顺序,UDP不保证 UDP应用场景: 1.面向数据报方式 2.网络数据大多为短消息 3.拥有大量Clie原创 2018-01-25 21:10:38 · 740 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(二)—— TCP协议浅析
一、TCP 协议的作用互联网由一整套协议构成。TCP 只是其中的一层,有着自己的分工。(图片说明:TCP 是以太网协议和 IP 协议的上层协议,也是应用层协议的下层协议。)最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。(图片说明:以太网协议解决了局域网的点对点通信。)但是,以太原创 2018-01-25 21:02:52 · 906 阅读 · 0 评论 -
Linux 网络协议栈开发基础篇(一)—— TCP/IP协议报文格式解析
一、传输层报文1、TCP数据包的头typedef struct _TCP_HEADER { USHORT nSourPort ; // 源端口号16bit USHORT nDestPort ; // 目的端口号16bit UINT nSequNum ; // 序列号32bit UINT nAcknowledgeNum ; // 确认号32bi原创 2018-01-25 20:57:31 · 4900 阅读 · 1 评论