您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

谈谈Linux网络协议以及网络栈结构

时间:2020-01-02 16:54:37  来源:  作者:

谈谈Linux网络协议以及网络栈结构

 

网络协议——TCP/IP协议

简介:

TCP(传输控制协议)和 IP(网际协议)是两个独立且紧密结合的协议,负责管理和引导数据报文在 Internet上的传输。二者使用专门的报文头定义每个报文的内容。TCP 负责和远程主机的连接,IP负责寻址,使报文被送到其该去的地方。

TCP/IP协议模型如下图所示:

谈谈Linux网络协议以及网络栈结构

 

1.网络接口层

有时也称为数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

2.网络层

有时也称为互联网层,处理分组在网络中的活动,例如分组的选路。在T C P / I P协议族中,网络层协议包括I P协议(网际协议),I C M P协议(I n t e r n e t互联网控制报文协议),以及I G M P协议(I n t e r n e t组管理协议)。

3.传输层

主要为两台主机上的应用程序提供端到端的通信。在 TCP/I P协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)

TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于传输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。

UDP为应用层提供一种非常简单的服务。它只是把称为数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。

4.应用层

负责处理特定的应用程序细节

几乎各种不同的 T C P / I P实现都会提供下面这些通用的应用程序:

Telnet 远程登录。

FTP 文件传输协议。

SMTP 简单邮件传送协议。

SNMP 简单网络管理协议。

5.各层主要协议

谈谈Linux网络协议以及网络栈结构

 

6. OSI 模型和 TCP/IP 模型的区别

6.1类似之处

均为层次结构

存在可比的传输层和网络层

均有应用层,但其所提供的服务有所不同

均是一种基于协议数据单元的包交换网络

作为概念上的模型和事实上的标准,具有同等的重要性

6.2不同之处

OSI 模型包括了 7 层,而 TCP/IP 模型只有 4 层。TCP/IP 模型将表示层与会话层包含到了应用层中去完成。另外,TCP/IP模型还将 OSI的数据链路层和物理层包括到了一个网络接口层中。

OSI 参考模型在网络层支持无连接和面向连接的两种服务,而在传输层仅支持面向连接的服务。TCP/IP 模型在网络层则只支持无连接的一种服务,但在传输层支持面向连接和无连接两种服务。

TCP/IP由于有较少的层次,更为简单

谈谈Linux网络协议以及网络栈结构

 

协议栈结构的说明

1、 驱动中,使用ISR/POLL/NAPI等方式从硬件收包

2、 收包接口中通过netif_receive_skb()上交协议栈

3、 在netif_receive_skb()函数中做协议解析

core/dev.c中,为报文处理的第二层,用于分离收到的以太网报文的协议类型,同我们某产品上一个叫做Packet Handler模块一样,逐级分发报文。

该模块有一个list_head链表,链表上挂了很多packet_type数据结构,packet_type数据结构中包括ether_type, dev指针以及func指针等成员。

为加快对报文的分发速度,这个链表实现成了一个HASH表,共16way,使用ethertype作为索引。

内核中常注册的ethertype类型:

ETH_P_IP

ETH_P_ARP

ETH_P_HDLC

ETH_P_DEC

ETH_P_PPP

PKT_TYPE_LACPDU

ETH_P_PPP_SES

ETH_P_PPP_DISC

ETH_P_BPQ

ETH_P_PARP

ETH_P_802_2

ETH_P_TR_802_2

ETH_P_X25

ETH_P_8021Q

ETH_P_ALL用于所有

其中Func是上层协议的钩子函数,常用的有ip_rcv()和arp_rcv()等,然后iprcv()中又会解析ip上的协议,调用icmp_rcv/igmp_rcv/udp_rcv/tcp_rcv()等等。

新的协议类型可以在驱动模块加载时,通过下面的接口增加到packet_type_list中:

void dev_add_pack()用于增加一种协议类型,将其packet_type指针加到链表上。

void dev_remove_pack()用于从list_head上删除一种协议类型

4、 解析完报文协议之后,将报文放到skb_queue队列中

skb_queue为系统底层与应用程序之间一个接口。所有接收到的同类报文都会被挂到这个队列上,然后由协议栈上层接口来取。

5、 协议上层接口通过系统调用获取skb。代码位于net模块下:

sys_recv()

sys_recvfrom()

sock_recvmsg()

__sock_recvmsg()

udp_recvmsg()或者tcp_recvmsg()

__skb_recv_datagram()

ip_cmsg_recv()

从skb接收队列skb_queue收包

 

某项目中的代码

1. 驱动driver使用NAPI方式,从硬件queue中收包

2. 调用netif_receiv_skb()函数,上交收到的报文

这个项目支持NAPT,因此会在该函数中直接调用NAPT回调做NAT,而对于非NAPT印射的报文,进行如下处理:

先遍历ptype_all链表,list_for_each_entry_rcu(),最终调用packet_type.func()

编译内核时选上BRIDGE,则会执行网桥模块br_handle_frame_hook(skb),源文件为bridge/br.c

网桥模块的初始化pkt_type为PACKET_HOST或者PACKET_OTHERHOST

如果编译内核时选上了mac_VLAN模块,则会执行macvlan_handle_frame_hook

初始化为PACKET_BROADCAST、PACKET_MULTICAST、PACKET_HOST

最后一步,判断type==skb->protocol,会查询链表,找到匹配的protocol钩子并且调用。

3. Skb的释放时机

如果是合法报文,放入接收队列,在用户系统调用取包时释放,否则在netif_receiv_skb()函数中释放。

 

802.1q协议模块实现

带802.1qTAG的模块有自己单独的协议类型,一般是0x8100。使用前面说的packet_list操作接口注册一个新的packet_type挂到链表中,这样,所有带TAG的报文会被转发到802.1q的接口上。

应用程序里,每调用vconfig创建一个VLAN,就会创建一个新的net device,这个虚拟扩展的net device会在原来物理的net device上面工作,将VLAN对应的报文都转移到虚拟net device的收发接口上。

new_dev = alloc_netdev(sizeof(struct vlan_dev_info), name,vlan_setup);



Tags:Linux 网络协议   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
网络协议——TCP/IP协议简介:TCP(传输控制协议)和 IP(网际协议)是两个独立且紧密结合的协议,负责管理和引导数据报文在 Internet上的传输。二者使用专门的报文头定义...【详细内容】
2020-01-02  Tags: Linux 网络协议  点击:(119)  评论:(0)  加入收藏
▌简易百科推荐
作用显示文件或目录所占用的磁盘空间使用命令格式du [option] 文件/目录命令功能显示文件或目录所占用的磁盘空间一些写法的区别du -sh xxx 显示总目录的大小,但是不会列出...【详细内容】
2021-12-23  mitsuhide1992    Tags:du命令   点击:(12)  评论:(0)  加入收藏
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  linux上的码农    Tags:linux内核   点击:(15)  评论:(0)  加入收藏
本文将比较 Linux 中 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从 CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 service服务(dae...【详细内容】
2021-12-23  软件架构    Tags:systemctl   点击:(14)  评论:(0)  加入收藏
mv是move的缩写,可以用来移动文件或者重命名文件名,经常用来备份文件或者目录。命令格式mv [选项] 源文件或者目录 目标文件或者目录命令功能mv命令中第二个参数类型的不同(...【详细内容】
2021-12-17  入门小站    Tags:mv命令   点击:(23)  评论:(0)  加入收藏
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  仙风道骨的宝石骑士    Tags:sed命令   点击:(22)  评论:(0)  加入收藏
Node是个啥?  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性地拿了下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段...【详细内容】
2021-12-15  linux上的码农    Tags:node   点击:(25)  评论:(0)  加入收藏
难道只有我一个人觉得Ubuntu的unity桌面非常好用吗?最近把台式机上面的Ubuntu 16.04格式化了,装了黑苹果用了一周,不得不说,MacOS确实很精美,软件生态比Linux丰富很多,比Windows简...【详细内容】
2021-12-14  地球末日村    Tags:ubuntu   点击:(40)  评论:(0)  加入收藏
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行net...【详细内容】
2021-12-13  窥镜天    Tags:Linux netstat   点击:(28)  评论:(0)  加入收藏
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计...【详细内容】
2021-12-13  深度Linux    Tags:Linux   点击:(19)  评论:(0)  加入收藏
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范...【详细内容】
2021-12-10  架构驿站    Tags:eBPF   点击:(29)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条