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——无连接和 ...
随机推荐
- Linux-TCP Queue的一些问题
先来回顾下三次握手里面涉及到的问题:1. 当 client 通过 connect 向 server 发出 SYN 包时,client 会维护一个 socket 等待队列,而 server 会维护一个 ...
- HTMLParser使用
htmlparser[1] 是一个纯的java写的html(标准通用标记语言下的一个应用)解析的库,它不依赖于其它的java库文件,主要用于改造或提取html.它能超高速解析html,而且不会出错.现 ...
- SQL:实现流水账的收入、支出、本期余额
有多组数据,分别是收入,支出,余额,它们的关系是:本期余额=上次余额+收入-支出 /* 测试数据: Create Table tbl([日期] smalldatetime,[收入] int ,[支出] ...
- android模拟器停在Waiting for HOME解决方案
直接打开Android SDK Manager然后再从Android SDK Manager里的tools打开Android AVD Manager,删除掉在Eclipse里创建的模拟器.并在新建一个 ...
- 右键添加 CMD 命令提示符
# 右键添加 CMD 命令提示符 当然是修改注册表 - 打开注册表编辑器(按下Win+R打开运行对话框,输入regedit),找到[HKEY_CLASSES_ROOT/Folder/shell] ...
- Html5上传后有所见图片效果前端代码实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js运动框架之掉落的扑克牌(重心、弹起效果)
玩过电脑自带纸牌游戏的同志们应该都知道,游戏过关后扑克牌会依次从上空掉落,落下后又弹起,直至"滚出"屏幕. 效果如图: 这个案例的具体效果就是:点击开始运动,纸牌会从右上角掉 ...
- Android开发资料学习(转载/链接)
http://www.devdiv.com/android_-forum-102-1.html 各种开源控件集合 http://www.cnblogs.com/android-blogs/p/5342 ...
- linux查找日志技巧
对于从事web开发的人员来说.服务器上的日志多如牛毛,如何快速从中找出所需信息非常重要,以下是我在工作中用到的查找日志的简单命令,希望能对您有所帮助: 工具/原料 linux SecureCR ...
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...