深入理解Linux网络技术内幕——IPv4 概念

1.大蓝图

大蓝图展示了IPv4协议与其他子系统之间的联系,保罗设备驱动、Netfilter、L4 层协议等之间的互动。

IPv4协议中的报文

我们可以大致看出数据在IPv4协议中的流向,

接收报文

设备驱动处理完硬件介绍到的数据后,IPv4协议的ip_rcv函数(net_receive_skb调用)得到了属于IPv4的报文,接着调用ip_rcv_finish对报文进行分析。判断是该转发还是交付本地上层协议。

如果是本地报文,则传给ip_local_deliver处理,如果是转发,那就交付ip_forward进行转发处理。

发送报文

对于接收到的属于转发的报文(来自ip_forward_finish)以及L4层传下来的报文,需要进行分析后传给设备驱动,发往其他系统。其流程主要是通过ip_finish_ouput进行。最后调用hard_start_xmit传给网卡设备驱动程序。

IPv4协议的任务

健康检查:

(略)

防火墙:

Netfilter在报文的生存周期里会多次被调用,以便处理报文。

处理选项:

应用程序设定的一些选项。

分段/重组:

IP报头的len选项可以表达64k数据段的长度,但是实际网络中不能传输那么大的数据,网络传输中一般有一个MTU,当要传输的数据报数据段超过这个MTU时,就必须进行分段、重组。

接收、传输与转发:

(略)

IP报头

服务类型:

(Type of service:TOS) 服务于Qos,现在用于差别服务,用于对报文进行差别对待。

标志:

重要字段

DF:不分段

MF:分段

分段偏移量:用于分段/重组

存活时间: 报文多少秒后就要被抛弃

协议:L4层协议标志

选项:

提供给应用程序对IP报文 是否进行分段、如何传输、路由选择等进行拓展。

分段和重组

前面已经说过,IP报头的len字段可以表达64k数据段的报文长度,但是实际网络无法传输这样大的数据,而存在MTU,报文长度超过MTU时,会被分成若干个长度为MTU的报分段(最后一个分段可能比较小),再分别进行传输。

IP分段一般在目的主机进行重组,(中间设备如果需要查看整个ip报文,那么也需要进行报文重组)。

分段和重组工作会占用CPU和内存,且可能会占用多余的网络带宽,产生比较大的开开销。有时我们需要避免分段和重组。

理论上上层协议不知道IP层在何时进行分段和重组操作,但是应用程序可以通过使用比其可以使用的MTU更小的尺寸传输数据,以避免报文分段工作。(可以看做吧分段放在应用层处理,但实际上它确实能够改善响应时间)。

路径MTU的发现

与用户配置、出口设备、默认值576、ICMP检测等相关。

检验和

检验报文是否错误、甚至修复错误。

时间: 2024-10-20 04:39:14

深入理解Linux网络技术内幕——IPv4 概念的相关文章

深入理解Linux网络技术内幕——IPv4 报文的传输发送

报文传输,指的是报文离开本机,发往其他系统的过程. 传输可以由L4层协议发起,也可以由报文转发发起. 在深入理解Linux网络技术内幕--IPv4 报文的接收(转发与本地传递)一文中,我们可以看到,报文转发最后会调用dst_output与邻居子系统进行交互,然后传给设备驱动程序. 这里,我们从L4层协议发起的传输,最后也会经历这一过程(调用dst_output).本文讨论的是L4层协议发起的传输,在IPv4协议处理(IP层)中的一些环节. 大蓝图 我们先看下传输环节的大蓝图,以便对传输这一过程有

深入理解Linux网络技术内幕——IPv4 报文的接收(转发与本地传递)

我们知道,报文经过网卡驱动处理后,调用net_receive_skb传递给具体的协议处理函数,对于IPv4报文来说,其协议处理函数就是ip_rcv了,ip_rcv在进行一些健康检查等操作后,会调用ip_rcv_finish来处理报文.这也是IPv4协议对报文接收处理的开始. 我们先看下ip_rcv_finish源代码: ip_rcv_finish: //ip数据报文的主要处理程序(ip_rcv仅仅只是对ip数据报做一些健康性检查) //ip_rcv_finish 其实是进行路由表查询,,决定报文

深入理解Linux网络技术内幕——IPv4 分段与重组

封包的分段和重组是IP协议最重要的工作之一. IPv4报头中有一个len字段(用于表示报文的总长度,单位:字节)占16bit,因此,封包的最大尺寸定义为64K,(2^16/1024=64). 但是,在实际网络传输中,没有几个网络接口能够传输64K这么大的封包,而是有一个MTU表示其最大传输单元.这样,当要传输的封包大于MTU时,就需要对封包进行分段. 这里需要说明,我们指的MTU,不仅仅是出口设备的MTU,它取决于很多因素,如路由表项所用的MTU.出口设备的MTU等. 我们先不用过多与关注MTU

深入理解Linux网络技术内幕——路由子系统的概念与高级路由

本文讨论IPv4的路由子系统.(IPv6对路由的处理不同). 基本概念 路由子系统工作在三层,用来转发入口流量. 路由子系统主要设计 路由器.路由.路由表等概念. 路由器: 配备多个网络接口卡(NIC),并且能利用自身网络信息进行入口流量转发的设备. 路由: 流量转发,决定目的地的过程 路由表:转发信息库,该库中储存路由需要本地接收还是转发的信息, 以及转发流量时所需要的信息.(即,信息库用来判断,要不要转发,如果要转发,向哪里转发). 我们了解,路由器有多个网卡,但是多个NIC的设备不一定就是

《深入理解Linux网络技术内幕》阅读笔记 --- 路由

一.Linux内核中路由相关的主要数据结构 struct fib_result:对路由表查找后返回该结构,它的内容并不是简单的包含下一跳信息,而且包含其他特性,例如策略路由所需的更多参数. struct fib_rule:表示由策略路由在路由流量时选择路由表的规则 struct fib_node:一条路由表项.例如,该数据结构用于存储由route add或ip route add命令添加一条路由时生成的信息. struct fn_zone:一个zone表示子网掩码长度相同的一组路由 struct

深入理解Linux网络技术内幕——协议处理函数

网络帧在进入网络层时,需要区分不同的网络协议进行处理,这就需要涉及协议处理函数. 首先我们从驱动接收到一个数据帧,分析数据帧在协议栈中自下而上的传输流程. 设备驱动程序在接收到一个数据帧时,会将其保存在一个sk_buff缓冲区数据结构,并对其进行初始化. struct sk_buff { ...... __be16 protocol:16; ...... } 在这个缓冲区结构体中,有一个protocol字段,用于标识网络层的协议. 我们知道网络帧在设备驱动程序中处理后,设备驱动程序会调用neti

深入理解Linux网络技术内幕——网络设备初始化

概述 内核的初始化过程过程中,与网络相关的工作如下所示: 内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线程init(在Linux3-12中为kernel_init). asmlinkage void __init start_kernel(void) { ... parse_early_param();//间接调用parse_args parse_args(...); //处理内核引导程序(boot loader)

《深入理解Linux网络技术内幕》阅读笔记 --- 路由表

路由表基本概念 1.路由是由多个不同的数据结构的组合来描述的,每个数据结构代表路由信息的不同部分.例如,一个fib_node对应一个单独的子网,一个fib_alias对应一条路由.这样做的原因是只需通过部分字段可以区分多条路由.路由子系统不是维护一个庞大而臃肿的结构而是将路由分散为多个片段,这样更容易在相似的路由间共享通用的信息,因而就可以分离出不同的函数,并在这些函数之间定义更加清晰的接口. 数据结构之间的关系如下所示:fib_table结构包含一个由33个指针组成的向量,每个指针对应一个网络

深入理解Linux网络技术内幕——设备的注册于初始化(一)

副标题:设备注册相关的基本结构的原理框架 设备注册与删除时间 设备在下列两种情况下进行注册: 1)加载NIC驱动时 2)插入热插拔设备时 这里NIC与热插拔设备有些不同.a.对于非热插拔NIC来说,NIC的注册是伴随着其驱动的发生的,而NIC可以内建到内核,也可以作为模块载入,如果内建入内核,则NIC设备和初始化均发生在引导时,如果NIC作为模块加载,则NIC的注册和驱动初始化均发生在模块加载时.b. 对于热插拔NIC设备来说,其驱动已经加载,因此设备的注册发生在插入设备,内核通知关联驱动时.