`
simohayha
  • 浏览: 1386838 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

linux下ip层的一些概念

阅读更多
首先来看这个ip层的结构:




这里看到非常多的netfilter hook,这是因为netfilter主要是针对ip层的。

ip层的主要任务有下面5个方面:

1 ip数据包的校验

2 防火墙的处理(也就是netfilter子系统)

3 处理options(这里的options包含了一些可选的信息。比如时间戳或者源路由option).

4 切包和组包(由于mtu的存在,因此我们需要切包和组包).

5 接收,输出和转发操作。


接下来我们来看ip头的结构:





struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
	__u8	ihl:4,
		version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
	__u8	version:4,
  		ihl:4;
#else
#error	"Please fix <asm/byteorder.h>"
#endif
	__u8	tos;
	__be16	tot_len;
	__be16	id;
///这里要注意DF,MF和Fragment offset表示为frag_off一个域.
	__be16	frag_off;
	__u8	ttl;
	__u8	protocol;
	__sum16	check;
	__be32	saddr;
	__be32	daddr;
	/*The options start here. */
};


这里每个字段的意思也就没什么好解释得了,基本上对网络协议有些了解的都会知道。我下面会介绍几个主要的域。这里可以看到在

首先来看options域。

前面已经说过了,这个域也就是包含一些其他程序(比如路由)需要的信息。这个域的大小为0到40位,一般不会超过40个位,再大的options基本上很罕见。

options被分为2种,一种是单字节的,一种是多字节的。下面我们就来看这两种的结构:



先来看type字段,它的结构:





clas也就是这个options的类型了,copied如果被设置,则当数据包切片的时候,这个option必须被复制到每一个切好的包。而number则是类型所对应的值:下面这个图就是ip option的一些类型值:




主要的类型定义在linux/ip.h里面。

接下来length表示这个option的长度。poionter这个指针表示options的起始位移。option data存储一些需要的数据。

随便举个ip options的例子,比如record route option,这个option用来保存输出接口的ip地址,但它有大小限制,只能保存9个地址们如果超过九个就会忽略,接下来看下面的图,a主机发送包到b主机:




最后我们来看一下数据报的切片和组包。

首先来看相关的ip头里面的域:


DF,表示不切片,因为有时切片并组包耗时太长,影响性能。可是如何解决mtu等问题呢,这里linux采用了Path MTU Discovery算法,来取得所能传输的最大mtu,而不是根据输入帧的头来判断。

MF表示需要更多的切好的片。当一个包被切片之后,它设置mg为true,知道最后一个分片,而这个分片的MF会被设置为false(也就是0).当接收端接收到这最后一个切片时,就会开始组包,哪怕其他的切片还没到达。

Fragment offset表示这个分片的数据包在原来数据包中的位移,只有凭借这个才能正确组包。

ID,ip包的id,一个ip包的所有帧切片的id都是相同的。通过这个域,接受者能知道那些切片是属于同一个包的。




我们再来看切片和组包有可能会出现的问题。

先来看丢包的问题,首先我们要知道只有当ip包全部接收到(也就是被切片的包)之后,才会组包并将此数据包发送给高层。

丢包有3种情况:

1 有可能被路由器丢掉。

2 有可能由于crc校验不通过而被丢掉。

3 有可能被防火墙过滤掉。

解决方法就是,如果一些切片没有在给定的时间内到达的话,每一个路由器和主机都有一个定时器来清理发送过的ip包的切片。

这里要注意,ip层是没有重传机制的(ip协议是无连接的),因此必须等待高层来告诉它重传整个数据包。

重传的数据包不能重新使用未传输成功的数据报的id,也就是id不能相同。

由于kernel不能交换数据到硬盘,因此handling切片在内存中,会影响路由器的性能,因此linux对于切片的内存有了一个限制。

由于ip是一个无连接的协议,因此没有流量控制什么的,所以这些都交给上层去做。

标识每一个切片是属于哪一个数据包,在linux中使用4个域来确定:

源地址,目的地址,ip包id,l4协议类型。

可是这有一个问题,那就是有可能不同的包,这四个参数都是相同的,比如经过nat转发后的数据包。比如下面的例子,当pc1,pc2发出去的包被路由r修改掉源地址,并切片后,然后同时抵达S,这时就会出问题:




而ipv6就会更好的处理这个问题,他将只允许在原始的host进行切片。

最后看一下packet ID,在linux中,是每个目的地址一个ip packet id,每个id是一个16位的整数。这样的话就降低了数据包的id有可能老的还没到,新的就要重新使用老的的id。







  • 大小: 75.8 KB
  • 大小: 25.7 KB
  • 大小: 11.6 KB
  • 大小: 9.1 KB
  • 大小: 69.4 KB
  • 大小: 48 KB
  • 大小: 44.5 KB
  • 大小: 28.4 KB
分享到:
评论
2 楼 simohayha 2009-06-23  
dennis_zane 写道
图片不能显示。。

rp问题。。我这边都可以正常显示。。
1 楼 dennis_zane 2009-06-23  
图片不能显示。。

相关推荐

    OSI七层与Linux概念层对应关系

    OSI七层与Linux概念层对应关系,以及对应的网络协议。

    Linux netfilter 学习笔记

    本文档主要为本人博客里的《Linux netfilter学习笔记》的集合,本文主要包括《ip 层netfilter的hook 注册以及执行hook函数的概要分析》、《ip层netfilter的table、rule、match、target结构分析》、《 ip层netfilter...

    鸟哥Linux私房菜-基础网络概念

    这部份最重要的是 TCP/IP 与 OSI 七层协议的相关概念了,这部份难的很~难的很~ 在这一章中,鸟哥以较为口语的方式来介绍这些基础网络架构,希望能带给朋友们快速了解网络是啥。 当然,想要更了解网络相关功能的话...

    Linux网络编程c++百度云.txt

    Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等...

    LINUX 下防火墙的研究与实现(详细配置)

    3.3 Linux下代理的实现 29 3.3.1代理服务器概述 29 3.3.1.1 什么是代理服务器 29 3.3.1.2 代理服务器的功能 30 3.3.2 代理软件的简介和比较 33 结 论 36 致 谢 38 参考文献 39 摘要 随着计算机网络,特别是近年...

    LINUX网站建设技术指南

    本书介绍如何在Linux下建立,运行并维护站点的综合技术,它适合于有一定的Linux或Linux基本操作基础的网络建立者。 本书从建站的准备工作开始,写到建立功能强大的INTERNET网站,层层深入,涉及到网站建设中所遇到的...

    鸟哥的 Linux 私房菜 -- 基础网络概念.pdf

    鸟哥的 Linux 私房菜 -- 基础网络概念.pdf。 第二章 基础网络概念,主要内容包括TCP/IP 协议,一些协议的链接层、网络层、传输层等内容

    LINUX 下防火墙的研究与实现

    3.3 Linux下代理的实现 29 3.3.1代理服务器概述 29 3.3.1.1 什么是代理服务器 29 3.3.1.2 代理服务器的功能 30 3.3.2 代理软件的简介和比较 33 结 论 36 致 谢 38 参考文献 39 摘要 随着计算机网络,特别是近年...

    linux网络编程-宋敬彬-part3

    2.2 Linux下的GCC编译器工具集 19 2.2.1 GCC简介 19 2.2.2 编译程序的基本知识 21 2.2.3 单个文件编译成执行文件 22 2.2.4 编译生成目标文件 22 2.2.5 多文件编译 23 2.2.6 预处理 24 2.2.7 编译成...

    linux网络编程-宋敬彬-part2

    2.2 Linux下的GCC编译器工具集 19 2.2.1 GCC简介 19 2.2.2 编译程序的基本知识 21 2.2.3 单个文件编译成执行文件 22 2.2.4 编译生成目标文件 22 2.2.5 多文件编译 23 2.2.6 预处理 24 2.2.7 编译成...

    网络编程中使用tun虚拟网络接口建立IP隧道的实例

    本文简单介绍一下Linux虚拟网卡的概念,并以tun设备为例在客户端和服务器端分别建立一个实际的虚拟网卡,最终实现一个从客户端到服务器的简单的IP隧道,希望本文能对理解虚拟网卡和IP隧道有所帮助,本文将提供完整的...

    Linux编程从入门到精通

    8.5 IP层 100 8.5.1 套接字缓冲区 100 8.5.2 接收IP报文 101 8.5.3 发送IP报文 102 8.5.4 数据分片 102 8.6 地址解析协议 103 8.7 IP路由 104 第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107...

    TCP/IP协议与网络编程技术

    主要内容有IP数据报格式、IP层的功能、IP地址、ICMP协议、地址转换协议并介绍了IP的最新版本IP v6等。 第4章:介绍TCP/IP协议层次结构中传输层及其相关知识。主要内容有端口的概念、TCP协议和UDP协议的协议数据格式...

    LINUX编程白皮书 (全集)

    8.5 IP层 100 8.5.1 套接字缓冲区 100 8.5.2 接收IP报文 101 8.5.3 发送IP报文 102 8.5.4 数据分片 102 8.6 地址解析协议 103 8.7 IP路由 104 第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107...

    linux编程白皮书

    8.5 IP层 100 8.5.1 套接字缓冲区 100 8.5.2 接收IP报文 101 8.5.3 发送IP报文 102 8.5.4 数据分片 102 8.6 地址解析协议 103 8.7 IP路由 104 第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107...

    深入理解LINUX网络内幕(英文版).chm

    同其他O'Reilly的流行书籍一样,《深入理解Linux网络内幕》清楚地阐述了网络的基本概念,并指导你如何用C语言实现。虽然早先的TCP/IP经验是有用的,但初学者通过本书仍然可以学习到协议本身和大量的应用信息。一旦...

    Linux网络编程 视频 教程

    TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础(三) IP数据报格式 网际校验和 路由 04TCPIP基础...

    基于Linux 的防火墙技术研究

    摘 要:介绍了防火墙的基本概念及其主要功能,分析了Linux 内核防火墙Netfilter 的架构、构建防火墙的工作原 理及其与内核的交互.最后给出了Netfilter 构建防火墙的一个实例。 关键词:防火墙 Linux Netfilter 包...

    Linux网络开发必学教程(包含课件和例子代码).rar

    linux系统的网络开发必学教程;包含课件和例子代码;包含以下内容: 0:课程定位:目标与安排 1:网络编程的概念与模式 2:服务端编程初体验 3:深入浅出 IP 地址 4:尝鲜 select 多路复用 5:基于多路复用的服务端 ...

    C++教程网《Linux网络编程》视频百度云地址

    TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础(三) IP数据报格式 网际校验和 路由 04TCPIP基础...

Global site tag (gtag.js) - Google Analytics