谈谈Linux网络协议以及网络栈结构
gudong366 2025-05-16 16:16 35 浏览
网络协议——TCP/IP协议
简介:
TCP(传输控制协议)和 IP(网际协议)是两个独立且紧密结合的协议,负责管理和引导数据报文在 Internet上的传输。二者使用专门的报文头定义每个报文的内容。TCP 负责和远程主机的连接,IP负责寻址,使报文被送到其该去的地方。
TCP/IP协议模型如下图所示:
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.各层主要协议
6. OSI 模型和 TCP/IP 模型的区别
6.1类似之处
均为层次结构
存在可比的传输层和网络层
均有应用层,但其所提供的服务有所不同
均是一种基于协议数据单元的包交换网络
作为概念上的模型和事实上的标准,具有同等的重要性
6.2不同之处
OSI 模型包括了 7 层,而 TCP/IP 模型只有 4 层。TCP/IP 模型将表示层与会话层包含到了应用层中去完成。另外,TCP/IP模型还将 OSI的数据链路层和物理层包括到了一个网络接口层中。
OSI 参考模型在网络层支持无连接和面向连接的两种服务,而在传输层仅支持面向连接的服务。TCP/IP 模型在网络层则只支持无连接的一种服务,但在传输层支持面向连接和无连接两种服务。
TCP/IP由于有较少的层次,更为简单
协议栈结构的说明
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);
- 上一篇:谈谈TCP和UDP源端口的确定
- 下一篇:详解Linux网络文件系统的注册与挂载流程
相关推荐
- 梦幻诛仙12职业1亿元宝版本架设教程(包含资源下载)
-
架设教程:1;上传脚本zx到bin文件夹,给权限chmod-R777/bin2;输入zx安装宝塔面板输入对应序号,中途输入Y继续3;安装好之后,会给个宝塔地址及账号密码,复制地址...
- Java零基础入门,科普Java你应该了解什么
-
最近很多人问我想学Java但是一点基础没有,网上看了一堆学习线路图还是无从下手。今天耗时3小时整理了一套保姆级的Java入门教程,建议收藏按照线路图一点点学习。一、Java的概况Java是1995年6...
- 01.Java发展历史(java发展历史简要)
-
1.Java发展历史Java由SunMicrosystems公司(现为Oracle公司)的JamesGosling及其团队在1991年开发,最初命名为"Oak",后改名为"...
- Ubuntu16.04.1安装Java8(ubuntu终端安装java)
-
上篇文章讲解了怎么在Windows下安装Java8《Windows10安装Java8》,这里讲解下怎么在Linux下安装Java。由于之前已经安装了Ubuntu16.04.1《VmwareWorkst...
- 性能测试能力提升-JVM GC监控和优化
-
一、背景接着上一篇的知识:性能测试能力提升-JVMGC原理,本篇文章,我们将主要介绍JVMGC监控和优化相关的知识:命令行方式监控GC图形化方式监控GC什么时候需要开始GC优化?GC优化的目的GC...
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
-
你是否在互联网大厂后端开发工作中,遇到过这样的困扰?当完成一个SpringBoot项目开发,准备将Jar包部署到不同环境时,却发现各个环境依赖不同、配置复杂,部署过程繁琐又容易出错,不仅耗费...
- 「JDK 11」关于 Java 模块系统,看这一篇就够了
-
继2014年3月Java8发布之后,时隔4年,2018年9月,Java11如期发布,其间间隔了Java9和Java10两个非LTS(LongTermSupp...
- 对Java学习的10条建议(对java的认识和理解)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- JAVA入门教程-第1章 概述(java入门指南)
-
大道至简-JAVA入门教程在本教程中,你将学习Java语言的基础知识。Java基础内容涵盖:Java基础概念、Java词法结构、Java数组、Java流程控制、Java字符串、Java...
- 推荐一款Java音频视频编码器,很赞
-
Jave2是什么JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式。在示例中,您可以将AVI文件转换为MP...
- 【JAVA教程】JAVA入门及开发环境安装
-
一、Java开发环境概述Java开发需要三个核心组件:JDK(JavaDevelopmentKit)-Java开发工具包,开发、编译、调试Java程序JRE(JavaRuntimeE...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- 记Tomcat优化方案(tomcat优化的几种方法)
-
Tomcat服务吞吐量评估方案问题:评估方案在一台8核16G的linux服务器上,使用tomcat容器部署服务。在正常情况下如何评估这个tomcat服务可处理的连接数,即服务的吞吐量,请在正常情况下考...
- JVM GC诡异问题排查,k8s差点害死我……
-
前言本文将通过一个真实的生产环境案例,详细展示如何系统性地排查和解决JVM垃圾收集问题。这个案例涵盖了从问题发现、分析诊断到最终解决的完整过程,对于理解JVM调优实战具有重要的参考价值。系统背景我们的...
- Thorium Reader - 功能强大的跨平台免费电子书阅读器
-
在日常阅读日益普及的今天,选择一款合适的电子书阅读器至关重要。ThoriumReader作为一款独具特色的阅读应用,正逐渐在众多同类产品中崭露头角,为用户带来了卓越的阅读体验。 跨平台的便捷性...
- 一周热门
- 最近发表
- 标签列表
-
- linux一键安装 (31)
- linux运行java (33)
- ln linux (27)
- linux 磁盘管理 (31)
- linux 内核升级 (30)
- linux 运行python (28)
- linux 备份文件 (30)
- linux 网络测试 (30)
- linux 网关配置 (31)
- linux jre (32)
- linux 杀毒软件 (32)
- linux语法 (33)
- linux博客 (33)
- linux 压缩目录 (37)
- linux 查看任务 (32)
- 制作linux启动u盘 (35)
- linux 查看存储 (29)
- linux乌班图 (31)
- linux挂载镜像 (31)
- linux 软件源 (28)
- linux题目 (30)
- linux 定时脚本 (30)
- linux 网站搭建 (28)
- linux 远程控制 (34)
- linux bind (31)