- 浏览: 1401117 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
首先来看这个ip层的结构:
这里看到非常多的netfilter hook,这是因为netfilter主要是针对ip层的。
ip层的主要任务有下面5个方面:
1 ip数据包的校验
2 防火墙的处理(也就是netfilter子系统)
3 处理options(这里的options包含了一些可选的信息。比如时间戳或者源路由option).
4 切包和组包(由于mtu的存在,因此我们需要切包和组包).
5 接收,输出和转发操作。
接下来我们来看ip头的结构:
这里每个字段的意思也就没什么好解释得了,基本上对网络协议有些了解的都会知道。我下面会介绍几个主要的域。这里可以看到在
首先来看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。
rp问题。。我这边都可以正常显示。。
这里看到非常多的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。
评论
2 楼
simohayha
2009-06-23
dennis_zane 写道
图片不能显示。。
rp问题。。我这边都可以正常显示。。
1 楼
dennis_zane
2009-06-23
图片不能显示。。
发表评论
-
Receive packet steering patch详解
2010-07-25 16:46 12124Receive packet steering简称rp ... -
内核中拥塞窗口初始值对http性能的影响分析
2010-07-11 00:20 9695这个是google的人提出的 ... -
linux 内核tcp拥塞处理(一)
2010-03-12 16:17 9572这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的, ... -
内核tcp协议栈SACK的处理
2010-01-24 21:13 12154上一篇处理ack的blog中我 ... -
内核tcp的ack的处理
2010-01-17 03:06 11155我们来看tcp输入对于ack,段的处理。 先是ack的处理, ... -
内核处理time_wait状态详解
2010-01-10 17:39 6802这次来详细看内核的time_wait状态的实现,在前面介绍定时 ... -
tcp协议栈处理各种事件的分析
2009-12-30 01:29 13622首先我们来看socket如何将一些状态的变化通知给对应的进程, ... -
linux内核sk_buff的结构分析
2009-12-25 00:42 47902我看的内核版本是2.6.32. 在内核中sk_buff表示一 ... -
tcp的输入段的处理
2009-12-18 00:56 8351tcp是全双工的协议,因此每一端都会有流控。一个tcp段有可能 ... -
内核协议栈tcp层的内存管理
2009-11-28 17:13 12061我们先来看tcp内存管理相关的几个内核参数,这些都能通过pro ... -
linux内核定时器的实现
2009-10-31 01:44 10191由于linux还不是一个实时的操作系统,因此如果需要更高精度, ... -
linux内核中tcp连接的断开处理
2009-10-25 21:47 10315我们这次主要来分析相关的两个断开函数close和shotdow ... -
linux内核tcp的定时器管理(二)
2009-10-05 20:52 5413这次我们来看后面的3个定时器; 首先是keep alive定 ... -
linux内核tcp的定时器管理(一)
2009-10-04 23:29 9824在内核中tcp协议栈有6种 ... -
linux 内核tcp接收数据的实现
2009-09-26 20:24 14509相比于发送数据,接收数据更复杂一些。接收数据这里和3层的接口是 ... -
linux 内核tcp数据发送的实现
2009-09-10 01:41 19767在分析之前先来看下SO_RCVTIMEO和SO_SNDTIME ... -
tcp connection setup的实现(三)
2009-09-03 00:34 5185先来看下accept的实现. 其实accept的作用很简单, ... -
tcp connection setup的实现(二)
2009-09-01 00:46 8428首先来看下内核如何处理3次握手的半连接队列和accept队列( ... -
tcp connection setup的实现(一)
2009-08-23 04:10 5808bind的实现: 先来介绍几个地址结构. struct ... -
linux内核中socket的实现
2009-08-15 04:38 21096首先来看整个与socket相关的操作提供了一个统一的接口sys ...
相关推荐
在Linux环境下,对IP数据包进行抓包与分析是一项重要的网络诊断和调试技能。这篇文章将深入探讨如何使用C语言来实现这一目标,并结合Makefile进行编译构建。首先,我们需要了解基本的网络编程概念,包括TCP/IP协议栈...
【基于Linux系统下IP隧道的建立及其应用】 在IT领域,IP隧道技术是网络通信中的一种重要技术,它允许不同协议的数据包通过同一传输层协议进行传输。在Linux操作系统环境下,利用IP隧道技术,可以实现跨越不同的网络...
Linux的TCP/IP层结构是操作系统中的关键组成部分,它负责网络数据的传输和处理。这篇文章主要探讨了Linux操作系统网络层的主要架构、功能以及数据包接收和发送的流程。Linux的网络模块工作在内核态,利用一种称为...
- **背景介绍**:概述了嵌入式系统在网络技术中的重要性,并介绍了Linux TCP/IP协议栈的基本概念。 - **目标与范围**:明确了本书旨在全面讲解如何将Linux TCP/IP协议栈应用于嵌入式系统之中。 ##### 2. 宽带网络...
首先,我们需要了解Linux Socket编程的基本概念。Socket是一种进程间通信机制,它提供了在网络层进行数据交换的接口。在Linux中,我们通常使用`#include <sys/socket.h>`头文件来包含Socket相关的函数和常量。 ...
首先,Linux网络编程涉及到在Linux操作系统环境下编写网络应用程序。这包括使用套接字(socket)API来实现客户端和服务器之间的通信。套接字是进程间通信(IPC)的一种形式,特别适合于网络应用,因为它允许不同...
IP协议在Linux通讯系统中扮演着关键角色,虽然Linux遵循严格的分层概念,并可支持其他协议,但在多数情况下,IP协议是信息包传输不可或缺的桥梁。信息包的传输过程可以分为以下几个步骤: 1. 应用程序生成信息包后...
6. **数据包的发送与接收**:从`send()`和`recv()`函数的调用,到IP层的数据封装,再到物理层的传输,源码将展示这一全过程。 7. **错误处理和重传策略**:TCP协议保证了数据的可靠性,因此会处理丢失、重复和乱序...
- IP层为数据包添加IP头,进行路由选择和分片处理。 - 数据链路层添加帧头和帧尾,将数据包转换为帧格式。 - 物理层将帧转换为比特流,并通过物理媒介发送出去。 2. **数据接收过程**: - 接收端物理层接收到...
这个过程涉及到多个层次的处理,包括网络接口层、IP层以及路由选择表,也就是FIB(Forwarding Information Base)。 FIB是Linux内核中的核心组件之一,它存储了路由规则和对应的网络接口信息。当数据包进入系统时,...
总之,《Linux内核源码剖析 TCP/IP实现》上册是一本深度探索Linux网络内核实现的专业书籍,适合对操作系统和网络感兴趣的开发者阅读,可以帮助他们深入理解网络通信的本质,提升在Linux环境下的网络编程能力。
OSI七层与Linux概念层对应关系,以及对应的网络协议。
深入学习Linux TCP/IP协议栈,需要理解以下关键概念: - **TCP连接建立与释放**:三次握手和四次挥手过程,以及TIME_WAIT状态的处理。 - **TCP流量控制**:滑动窗口机制,如何通过调整接收和发送窗口大小来防止数据...
总的来说,这个压缩包提供了一个学习和实践Linux下TCP/IP编程的实例,涵盖了客户端和服务端的开发,以及远程连接的基本概念。通过分析和运行这些代码,学习者可以深入理解TCP/IP协议的工作原理,以及如何在实际应用...
本文将深入讲解如何使用C语言编写Linux下的TCP/IP服务器(Server)和客户端(Client)程序,并通过提供的压缩包文件“TCPIP”中的源代码进行解析。 首先,我们要理解TCP/IP的基本工作原理。TCP(Transmission ...