struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:,
version:;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:,
ihl:;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__be16 -tot_len;
__be16 -id;
__be16 -frag_off;
__u8 ttl;
__u8 protocol;
__be16 -check;
__be32 -saddr;
__be32 -daddr;
};

iphdr->version

版本(4位),目前的协议版本号位4,也称之为IPv4

iphdr->ihl

首部长度(4位),首部长度是指IP层头部占32bit字的数目,也就是IP层头部包含多少个4字节(32b),包括任何选项,由于它是一个4bit(最大表示15)字段,因此首部最长位60个字节.普通IP数据报字段的值为5 ==》5*32/8=20Bytes

iphdr->tos

服务类型字段(8位):服务类型(TOS)字段包括一个3bit的优先权字段(已被忽略),4bit的TOS子字段和1bit未用位但必须置0。4bit的TOS子字段分别表示最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能设置1bit。如果4bit均为0表示这是一般服务。

iphdr->tot_len

总长度字段(16)位指的是整个IP数据包的长度,以字节位单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长1bit,所以IP数据包最长可长达65535字节。

总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网的最小帧长为46字节,但IP数据可能更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。

iphdr->id

标识字段(16bit)唯一地标识主机发送地每一份数据报,通常每发送一份报文他的值就加1。

iphdr->frag_off

frag_off低13位

标识分段偏移(Fragment offset)域指明了该分段在当前数据报中的什么位置上。除了一个数据报的最后一个分段以外,其他所有的分段(分片)必须是8字节的倍数。这是8字节是基本分段单位。由于该域有13个位,所以每个数据报最多有8192个分段。因此最大数据报长度为65536字节,比iphdr->tot_len域还大1。

frag_off高3位:

l  比特0保留,必须为0;

l  比特1是“更多分片”(MF—More Fragment)标志。除了最后一片外,其他每个组成数据报的片都要把该比特置1.

l  比特2是“部分片”(DF—Don’t Fragment)标志,如果将这一比特置1,IP将不对数据报进行分片,这是如果需要进行分片的数据报到来,会丢弃此数据报并发送一个ICMP差错报文给起始端。

iphdr->ttl

TTL(Time to live)8位,生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。TTl的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
TTL(Time to live)域是一个用于限制分组生存期的计数器。这里的计数单位为秒,因此最大生存期为255s。在每一跳上该计数器必须被递减。而且数据报在一台路由器上排队时间较长时,该计数器必须被多倍递减。在实践中,当它递减到0时,分组会被丢弃,路由器给源主机发送一个警告分组。此项特性可以避免数据报长时间地逗留在网络中。

iphdr->protocol

协议字段(8位):根据它可以识别是哪个协议向IP传送数据。

当网络层组装完成一个完整地数据报之后,他需要知道该如何对它进行处理。协议(Protocol)域指明了该将它交给哪个传输进程。TCP或者UDP或者其他协议。

iphdr->check

首部校验和字段(16)位时根据IP首部计算的校验和码。他不对首部后面的数据进行计算。ICMP、IGMP、UDP、TCP在它们各自的首部中均含有同时覆盖首部和数据校验和码。

为了计算一份数据报的IP校验和,首先把校验和字段置为0。然后对首部中每个16bit进行二进制反码求和(整个首部看出时一串16bie的字组成),结果存在校验和字段中。当收到一份IP数据报后,同样对首部中的每个16bit进行二进制反码求和。由于接收方在计算过程中包含了发送方存在首部中的校验和,因此如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该全为1。否则就意味着数据在传输过程中发生错误,IP就会丢弃收到的数据报。但是不生成差错报文,由上层区发现丢失的数据报并进行重传。

iphdr->saddr

32源IP地址

iphdr->daddr

32位目的IP地址

网络字节序

4字节的32bit值以下面的次数传输:

首先是0~7bit

其次是8~15bit

然后试16~23bit

最后是24~21bit

这种传输次数称之为big-endian字节序。由于TCP/IP首部中所有的为二进制整数在网络传输中都要求以这种次序,因此它又被称为网络字节序。

struct iphdr的更多相关文章

  1. struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD

    __LITTLE_ENDIAN_BITFIELD表示小端序,__BIG_ENDIAN_BITFIELD表示大端序. /usr/include/linux/ip.h中有一段代码定义了ip首部的结构体,例 ...

  2. ethhdr、ether_header、iphdr、tcphdr、udphdr 结构介绍

    转自:http://blog.csdn.net/petershina/article/details/8573853 ************************eth的结构*********** ...

  3. iphdr结构

    包含在/usr/src/linux/include/linux/ip.h 1 struct iphdr { 2 #if defined(__LITTLE_ENDIAN_BITFIELD) 3 __u8 ...

  4. Linux网络驱动--snull

    snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...

  5. 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序

    一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...

  6. sk_buff封装和解封装网络数据包的过程详解

    转自:http://www.2cto.com/os/201502/376226.html 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  7. linux 系统内核空间与用户空间通信的实现与分析<转>

    linux 系统内核空间与用户空间通信的实现与分析 2 评论: 陈鑫 (chen.shin@hotmail.com), 自由软件爱好者, 南京邮电学院电子工程系 2004 年 7 月 01 日 内容 ...

  8. IP分片重组的分析和常见碎片攻击 v0.2

    IP分片重组的分析和常见碎片攻击 v0.2http://www.nsfocus.net/index.php?act=magazine&do=view&mid=584 作者:yawl ( ...

  9. netfilter的钩子——数据包在内核态得捕获、修改和转发

    转发:http://blog.csdn.net/stonesharp/article/details/27091391 数据包在内核态得捕获.修改和转发(基于 netfilter)    忙活了好几天 ...

随机推荐

  1. aria2 https

    https://github.com/aria2/aria2/issues/361 ... and also make sure that aria2 was built with HTTPS sup ...

  2. MPSoc之Hello World学习笔记

    XILINX 新一代 SOC,Zynq UltraScale+ MPSOC 系列性能强悍无比,号称相比ZYNQ 7000系列每瓦性能提升5倍,一直想体验.近期因项目需要,入手了一套米尔的MPSoc开发 ...

  3. 【开发笔记】- Java写入、读取文本

    文本写入 public static void createFile(String input) throws IOException { //设置文件路径 String filePath = &qu ...

  4. 英语Petrolaeum原油

    Petrolaeum (英语单词) Petrolaeum是一个英语单词,名词,翻译为石油. 中文名:石油 外文名:petrolaeum,petroleum 目录 1 含义 2 例句 含义 petrol ...

  5. printk打印级别

    默认级别 # cat /proc/sys/kernel/printk 4 4 1 7 分别是:控制台日志级别.默认的消息日志级别.最低的控制台日志级别和默认的控制台日志级别 举例 # echo 0 & ...

  6. Git版本管理工具使用

    1.Git简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核 ...

  7. Mac 指令

    Mac 展示隐藏目录 // 设置隐藏文件不可见 defaults write com.apple.finder AppleShowAllFiles FALSE // 设置隐藏文件可见 defaults ...

  8. MYSQL慢查询优化方法及优化原则

    1.日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改为'yyyy-MM-dd','yyyy-MM'改为'yyyy-MM-dd'[这样MYSQL会 ...

  9. Python+opencv图像识别

    图像识别 最近工作遇到了一个需要识别安全键盘并点击的需求,做自动化嘛,由于安全键盘的键位固定但是键值随机,所以常规的方法不能正确获取触发点击,so,上网查了一下基本思路都是用机器识别. 加载openc ...

  10. Docker05-容器

    目录 容器介绍 创建容器 案例:创建 redis 的容器 查看容器列表 启动容器 案例:启动redis容器 案例:通过redis客户端进行测试 创建并运行容器 案例:创建并运行一个redis容器 停止 ...