IPv4报头:

报头长度:20-60字节bytes

白色部分为固定头部部分(20 bytes),绿色option选项部分为可选部分。

固定头部大小计算:

4bit + 4bit + 8bit + 16bit +16bit + 3bit + 13bit + 8bit +8bit + 16bit + 32bit(源IP) + 32bit(目IP) = 160bit = 20byte

所以IP头必须大于等于20byte,最大为60byte意味着Option选项部分取值范围0-40bits

1、 VER(版本):用于区分不同IP版本。如IPv4、IPv5、IPv6,用4bit表示,IPV4=0100

2、  HLEN(头部长度):因为头部长度不固定(Option可选部分不固定),所以需要标识该分

组的头部长度多少,用4bit表示,以4byte为单位,取值范围:5-15,即20-40byte(其他字段也是类似的计算方式,因为bit位是不够表示该字段的值)

3、 Service type(Type of Service服务类型:TOS):用来指定特殊的报文处理方式,又划分为IP precedenc和D/T/R和reserve保留字段,RFC2474的ToS取消了IP precedence字段而使用了DSCP,QoS里有描述,给QoS用来打标签。TOS字段历史:

4、 Total Length(总长度):整个IP分组的长度,可用总长度减去头部长度获得实际报文数据的长度,取值范围0-65535byte,链路只允许1500byte,所以一般都需要MTU分片

5、 Identification(ID:标识符):Fragment ID,通常与标记字段和分片偏移字段一起用于IP报文的分片。

当原始报文大小超过MTU,那么就必须将原始数据进行分片。每个被分片的报文大小不得超过MTU,而这个字段还将在同一原始文件被分片的报文上打上相同的标记,一边接收设备可以识别出属于同一个报文的分片,“类似于进程号”,有时候电信会用他来识别流量是否是同一台主机(因为做了PAT后源ip都是一样的,鸡贼!)

6、 Flags(标记):

第1位没有被使用

第2位D是不分片位(DF),Do not fragment,顾名思义,不要分片,当DF位设置为1时,表示路由器不能对报文进行分片处理

第3位M表示还有后继分片(MF),More fragment,多分片,当路由器对报分进行分片时,除了最后一个分片的MF位设置为0外,其他所有分片的MF位均设置1,以便接收者直到收到MF位为0的分片为止

7、 Fragmentation offset(分片偏移):标识某个分片在分组中的位置.

数据为何要分片(MTU):任何一个物理网络都有一个最大的传输单元,物理介质传输的能力是有限制的,不可能一次可传无限的数据帧。

以太网最大的帧长为1518, IP报文1500byte + 帧头18byte = 1518byte

注意:Ethernet以太网跟802.3以太网有所区别,802.3是由IEEE指定的标准,比较复杂用的比较少,网卡一般两种都支持。

IP数据包的MTU值在各种物理线路环境下对应的MTU取值:(注意:不包含帧头和尾)

8、 Time to live(TTL:生存时间):也就是跳数的大小,即数据包能传多少跳

如ping命令里的TTL,根据操作系统的不同TTL默认最大取值也会有所不同, linxu为

TTL=255,win98为TTL=128,win7为TTL=64这都是由应用程序自由决定的。

注意:TTL并不是一个真正时间值,因为分组的往返所花的时间(包括线路、路由器处理的时间),到底要设置TTL为多少是非常的困难的,所以用跳数来表示,而实际的往返时间计算保存在ICMP所封装的数据里。如下图的time=2ms才是真正的往返时间

最后的接收者是不需要检查该包的TTL值是否为0,因为没再转发的必要。

注意:该显示的TTL值是响应方的TTL值(响应方发送的响应包的TTL值,通过中间减跳后的最终显示在发送者终端上),而不是你自己的TTL值,所以通过ping看TTL值可以简单判断对方是什么操作系统

9、 Protocol(协议):标识出传输层的地址或协议号,也就是说表示数据要进行什么样的上层服务,应该交给自己上一层的哪个协议(ICMP/IGMP/OSPF都介于网络层和传输层之间,但一般视作网络层,因为都需要用IP报头封装。所以1 代表交给ICMP,6代表交给TCP

10、Header checksum(报头校验和):用于校验检查IP报头是差错。

1)只校验头部,数据部分由高层协议校验(TCP头的校验字段包含IP头和数据的校验,IPSec的NAT-T穿越时有讲,链路层的帧校验包含整个帧)

2)无需重复校验数据部分

3)缩短了路由器转发分组时的处理时间,把工作交给终端主机使用高层的协议校验数据

校验和计算方法:

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

11、source ip address源IP地址,32bit

12、Destination ip address目的IP地址,32bit

13、Option可选字段:Option字段很少使用,用于控制、转发要求、测试等

IP报文头详解的更多相关文章

  1. 【转】IP报文格式详解

    下图为常见的IP报文格式表: 上面是IP的报文格式,接下来我们先说明各个字段的意义.然后,用Etheral软件转包分析IP的报文格式. 1.版本:ip报文中,版本占了4位,用来表示该协议采用的是那一个 ...

  2. ip头、tcp头、udp头详解及定义,结合Wireshark抓包看实际情况

    公司的同事们在分析网页加载慢的问题,忽然使用到了Wireshark工具,我就像发现新大陆一样好奇,赶紧看了看,顺便复习了一下相关协议.上学时学的忘的差不多了,汗颜啊! 报文封装整体结构 mac帧头定义 ...

  3. 网络编程之TCP/IP各层详解

    网络编程之TCP/IP各层详解 我们将应用层,表示层,会话层并作应用层,从TCP/IP五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议,就理解了整个物联网通信的原理. 首先,用户感知到的只 ...

  4. 计算机网络(三),TCP报文段详解

    目录 1.TCP(Transmission Control Protocol传输控制协议)作用 2.TCP报文段详解 三.TCP报文段详解 1.TCP(Transmission Control Pro ...

  5. 网络层——IP报文头介绍

    IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP报文头的长度一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节.  ...

  6. 计算机网络(六),UDP报文段详解

    目录 1.UDP作用 2.UDP报文段详解 六.UDP报文段详解 1.UDP作用 (1)面向非连接 (2)不维护连接状态,支持同时向多个客户端传送相同的消息 (3)报文段报头只有8个字节,格外开销较小 ...

  7. JAVA对象头详解(含32位虚拟机与64位虚拟机)

    为什么要学习Java对象头 学习Java对象头主要是为了解synchronized底层原理,synchronized锁升级过程,Java并发编程等. JAVA对象头 由于Java面向对象的思想,在JV ...

  8. HTTP请求头和响应头详解【转】

    最近老猿在开始学习爬虫相关的知识,由于老猿以前只做非web的后台应用,发现相关知识太过匮乏,导致学习很困难,为此不得不从一些基础知识恶补开始,对于这些知识,老猿会将网上找到的比较认可的内容直接转发. ...

  9. IP头、TCP头、UDP头详解以及定义

    一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/typedef struct _MAC_FRAME_HEADER{ char m_cDstMacAddress[6];    //目的m ...

随机推荐

  1. Appium自动化学习1

    1.Appium-desktop配置Desired Capabilities { "platformName": "Android", "platfo ...

  2. Akka详细介绍

    AKKA NOTES - 介绍演员 任何在过去做过多线程的人都不会否认管理多线程应用程序有多么困难和痛苦.我说管理因为它开始很简单,一旦你开始看到性能改进,它变得非常有趣.但是,当您发现没有更简单的方 ...

  3. django用户权限操作

    第一步:创建数据库和超级管理员,为了比较方便使用(里面有些的是没用的),额外新增 chioces , per_method , argument_list # 用户权限# 建立一个权限表,将映射关系存 ...

  4. Rsync备份功能总结

    备份服务笔记====================================================================== Rsync是一款开源的.快速的.多功能的.可实 ...

  5. 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎

    五 虚拟机字节码执行引擎   1 运行时栈帧结构     ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素.     ---栈帧中存储了方法的局部变 ...

  6. 11Linux_sshd_Apache

    1.Linux系统中一切都是文件. 2.配置服务实际上就是在修改配置文件. 3.重启相应服务来加载最新的配置参数. 4.为了保证下次还生效,加入到开机启动项中.

  7. endnote将参考文献导入word中

    在endnote中将目标文献选中 然后返回word 将光标放到目标位置 个人网盘,endnoteX7资源 链接:https://pan.baidu.com/s/1lEocicehiPm1Ypkw768 ...

  8. django 之 ContentType的使用

    1. ContentType 是干什么用的呢: 1. ContentType: 主要的作用就是Django orm的创建表的时候,可以方便多表查询使用,简化多表查询的过程 2.ContentType ...

  9. java 深度复制与浅复制 copyOf、arraycopy、copyOfRange

    1.copyOf 原型:public static <T> T[] copyOf(T[] original, int newLength) original:原数组 newLength:要 ...

  10. keil的自动补全功能

    设置完之后,在.c文件上试一下,发现还是不能自动补全. 后来去各种贴吧里找到了答案,是我的.c文件还没有保存到工程文件中去,所以不能实现这个功能.