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——无连接和 ...
随机推荐
- MYSQL file types redo log
https://blogs.oracle.com/mysqlinnodb/entry/data_organization_in_innodb https://blogs.oracle.com/mysq ...
- Google副总裁的管理经验
一.拥挤其实是创新.拥挤喧闹的工作环境会引燃更多的创意火花.办公室应该充满能量和互动,而不是条块分割和等级分化. 二.战略和策略并举.许多人不懂得战略和策略的区别,或者他们认为自己只需要其中一样,其实 ...
- 为什么上传文件的表单里面要加一个属性enctype=multipart/form-data?
首先知道enctype这个属性管理的是表单的MIME编码.共有三个值可选:1.application/x-www-form-urlencoded2.multipart/form-data3.text/ ...
- AWS CloudFormation Template
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "Ba ...
- protobuf C++ 使用示例
1.在.proto文件中定义消息格式 2.使用protobuf编译器 3.使用c++ api来读写消息 0.为何使用protobuf? 1.原始内存数据结构,可以以二进制方式sent/saved.这种 ...
- [Mongodb] Tarball二进制包安装过程
一.缘由: 用在线安装的方式安装mongodb,诚然很方便.但文件过于分散,如果在单机多实例的情况下,就不方便管理. 对于数据库的管理,我习惯将所有数据(配置)文件放在一个地方,方便查找区分. 二.解 ...
- 基于Autofac, Castle.DynamicProxy的动态WCF解决方案(原创)
本方案解决了下面3个主要的问题: 1.减少配置,为了避免每次新增service都需要去修改配置文件,包括服务器端跟各个客户端的. 2.能够使用函数重载,泛型函数,以及泛型类. 3.使项目能够快速地在w ...
- 集合类 toArray(T[])
HashSet<String> deDupe = new LinkedHashSet<>(Arrays.asList(origParams.getParams(paramNam ...
- 如何将Debug文件夹下的资源打包成一个EXE文件直接执行
前言:前段时间写了个小程序,想分享给好友看看,可所以资源都放在Debug文件夹下,整个文件夹发给人家这也太……,为了显得稍微专业一点,想把它们打包一个EXE文件执行,因为我见到到这样的程序,直接一个E ...
- 使用Delphi收发GMail的邮件
GMAIL的端口和连接方式比较特殊:SMTP端口为:456POP3端口为:995都采用安全连接(SSL)这些通过Indy组件就可以实现参考代码如下: object IdConnectionInterc ...