linux网络学习
ipv4报文处理流程
1、物理层网卡收到报文,产生中断进入中断处理程序:net_interrupt,判断中断是由接收到分组引发后,控制权转移到net_rx;
2、net_rx函数分配一个新的sk_buf,从网卡取出分组内容到内存;
3、netif_rx负责将接收到的分组放置到一个特定于cpu的等待队列上,标记软中断:NET_RX_SOFTIRQ,并退出中断上下文;
4、net_rx_action从等待队列取出一个套接字缓冲区(分组),分析分组的类型,以便根据分组类型将分组传递给网络层的接收函数,如ip_rcv;
5、ip_rcv检验分组,包括校验和是否一致、分组是否达到了ip首部的最小长度、分组的协议号是否为ipv4),检查后调用netfilter挂钩(NF_IP_PRE_ROUTE),使得用户空间可以对分组数据进行操作,挂钩位置处理完成后(分组可能被修改过),需要路由选择(ip_route_input)进一步的处理,本地处理(ip_local_deliver)or分组转发(ip_forward);
6a、ip_local_deliver,如果ip是分片的,调用ip_defrag重新组合分片分组的各个部分, 属于同一分组的各个分片保存在一个独立的等待队列中,直至所有分片到达后,ip_frag_reasm将各个分片重新组合起来,释放套接字缓冲区,留下了分片缓存(内核在一个独立的缓存中管理原本属于一个分组的各个分片),如果分组的分片没有全部到达,ip_defrag返回一个null指针,终止网络层的分组处理,在所有分片都到达后,恢复处理;
7a、分组分片合并完成后,调用netfilter挂钩NF_IP_LOCAL_IN,恢复在ip_local_deliver_finish函数中的处理;调用传输层对应的接收例程,tcp_v4_rcv/udp_rcv
6b、ip_forward,分组转发:如果目标计算机不在本地网络,需要相邻网络结构和相关的外出路径信息(路由表提供,路由表由内核通过多种数据结构实现并管理),ip_forward在TTL<=1时丢弃分组,否则调用netfilter挂钩NF_IF_FORWARD,然后内核在ip_forward_finish中恢复处理,将分组传递到路由期间选择、保存在skb->dst->output中的发送函数。
8、ip_queue_xmit(网络层发送数据的函数),查找可用于该分组的路由,在发送第一个分组时,内核需要查找一个新的路由。在ip_send_check为分组生成校验和之后,内核调用netfilter挂钩NF_IP_LOCAL_OUT,接下来调用dst_output函数(skb->dst->output:ip_output)
9、ip_output,首先调用挂钩NF_IF_POST_ROUTING,接下来是ip_finish_output。如果有必要进行分组分片,调用ip_fragment,否则,直接调用ip_finish_output2,该函数在有足够空间容纳硬件首部时,调用由路由层设置的函数dst->neighbour->output(通常指向dev_queue_xmit)
源码位置:include/net
相关文件:skbuff.h net/core/dev.c
相关函数:register_netdev
相关命令:ls -l /sys/class/net
TCP/IP模型:应用层(http、ftp)、传输层(tcp、udp)、网络层(ip、icmp、igmp)、物理层(mac)
物理层在Linux体现为网卡驱动程序,struct net_device描述该网卡,物理层接口通过DMAC判断是否收发报文(组播、广播及单播)、快转(查找快转表项forward报文)
网络层负责路由报文、分组、分配ip地址,
传输层负责构建面向连接或无连接的服务
应用层使用(ip_addr,port)唯一标识提供实际的应用,如Http、ftp、pop3、telnet等
为了保证收发时对报文处理的性能,避免各层次之间来回复制分组数据,内核使用了一种特殊的结构体struct sk_buff描述报文,同时使用了sk_buff_head表头实现了套接字缓冲区的等待队列用于管理分组(双向循环列表)
linux网络学习的更多相关文章
- Linux网络学习笔记(二):域名解析(DNS)——以 CoreDNS 为例
个人笔记,观点不一定正确. 适合对 Kubernetes 有一定了解的同学. 前言 最近一直在学习 Kubernetes,但是手头没有个自有域名,要测试 ingress 就比较麻烦,每次都是手动改 h ...
- Linux学习笔记——重点推荐的Linux网络在线学习资源
首先非常感谢百度,感谢网络的搜索引擎技术,也非常感谢学习资源的贡献者和组织! 1:http://billie66.github.io/TLCL/book/zh/ 2:http://www.ha97. ...
- Linux网络编程&内核学习
c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...
- linux视频学习3(shell和网络)
1.shell的学习. shell的种类比较多,主要有三种: /bin/sh, /bin/csh, /bin/ksh. 查看当前使用的是哪种shell : 命令env (显示当前操作系统的环境变量). ...
- Linux网络编程学习计划
由于网络编程是很重要的一块,自己这一块也比较欠缺,只知道一些皮毛,从今天开始系统学习<Linux网络编程>一书,全书分为十四个章节: 第一章 概论 P1-16 第二章 UNIX ...
- Proxy源代码分析——谈谈如何学习Linux网络编程
Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...
- Proxy源代码分析--谈谈如何学习Linux网络编程
http://blog.csdn.net/cloudtech/article/details/1823531 Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux ...
- Linux学习笔记1:配置Linux网络和克隆虚拟机并更改配置
一.配置Linux网络 在安装Linux的时候,一定要保证你的物理网络的IP是手动设置的,要不然会在Linux设置IP连通网络的时候会报network is unreachable 并且怎么也找不到问 ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
随机推荐
- C#与C/C++的交互
引擎内核用C++为了保证运行速度,程序员可以使用C#来编写其他的业务逻辑,可以使用.NET类库中的绝大多数类,这样来降低开发难度,同时也降低了入门难度,可以吸引更多的.NET程序.
- 【Yii2-CookBook】JSON 和 XML 输出
Web 和移动应用程序现在不仅仅只是用来呈现 HTML. 现在开发一个移动客户端,利用服务器 api 驱动前端,所有的用户交互都在客户端哪里.JSON 和 XML 格式通常用于序列化和传输结构化数据通 ...
- case使用例子
echo 'Input a number between 1 to 4' echo 'Your number is:\c' read aNum case $aNum in 1) echo 'You s ...
- 转载:Java的接口及实例
转自:http://blog.csdn.net/liujun13579/article/details/7736116/ 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特 ...
- Microsoft Visual Studio 2012注册密钥
Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥:YKCW6-BPFPF-BT8C9-7DCTH-QXGWCMicrosoft Visual Studi ...
- python3.5学习笔记--利用字典对指定文本字符串进行替换
事情缘起于同事整理excel,需要批量的对某一列的内容进行替换. 举例: 数据格式:以下为一列内容,每行都在一个单元格中,目的是将数字替换为制定的中文字符. 1,2,31 ,4,33 ,21,, 对于 ...
- HTML 动态云启动画面
效果如下: 代码下载:http://files.cnblogs.com/files/zjfree/yun_loading.rar
- Microsoft JScript 运行时错误: '$' 未定义
在运行MVC Music Store时Visual Studio 捕捉到此错误: Microsoft JScript 运行时错误: '$' 未定义 可能是引用的Scripts 引用出错,检查当前文件中 ...
- SparkConf加载与SparkContext创建(源码阅读四)
sparkContext创建还没完呢,紧接着前两天,我们继续探索..作死... 紧接着前几天我们继续SparkContext的创建: 接下来从这里我们可以看到,spark开始加载hadoop的配置信息 ...
- 功能强大的web打印控件lodop的使用
打印是很多web系统都需要的功能,最近找到一款功能强大,使用简单,价格便宜的web打印工具Lodop,免费也能用,不过有水印,也不贵商业开发建议购买. 废话不多说,拿来就用,从简单的打印开始. 1.下 ...