IP封包格式(IPv4包首部长度为20字节)

Internet Header Format0                   1                   2                   3           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|Version|  IHL  |Type of Service|          Total Length         |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|         Identification        |Flags|      Fragment Offset    |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|  Time to Live |    Protocol   |         Header Checksum       |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                       Source Address                          |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                    Destination Address                        |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                    Options                    |    Padding    |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Version (4) Internet Header Length (4) Type of Service (8) Total Length (16)  
Identification (16) Flags (3) Fragment Offset (13)  
Time To Live (8) Protocol (8) Header checksum (16)  
Source Address (32)  
Destination Address (32)  
Options (Variable) Padding (0-24)

Data

IP包字段含义

在上图中括号之内的数字就是各部件的长度(bit)如果您够细心就会计算得出每一列的总长度都是32bit。下面我们分别对各部件名称解释一下

Version  
版本(VER)。表示的是IP规格版本目前的IP规格多为版本4(version 4)所以这里的数值通常为 0x4 (注意封包使用的数字通常都是十六进位的)。

Internet Header Length(值5,表示包头长度为5行,即5个32位,5行=5*32bit=20*8bit=20byte=0x14byte)
标头长度(IHL)。从IP封包规格中看到前面6行为header,如果Options和Padding没有的话,也就只有5行,所以这里长度为“5”。我们知道每行有32bit也就是4byte,那麽5行就是20byte了,20这个数值换成16进制就成了0x14,所以当封包标头长度为最短的时候这里数值最终会被换算为0x14。

让我们看看我们撷取的ICMP封包其中属於IP部份的开头

在这里我们看到的数值是“45”前面的“4”就是版本号数而後面的“5”则是标头长度。

Type of Service  
服务类型(TOS)。这里指的是IP封包在传送过程中要求的服务类型其中一共由8个bit组成其中每个bit的组合分别代表不同的意思

000..... Routine 设定IP顺序预设为0否则数值越高越优先  
...0.... Delay 延迟要求0是正常值1为低要求  
....0... Throughput 通讯量要求0为正常值1为高要求  
.....0.. Reliability 可靠性要求0为正常值1为高要求  
......00 Not Used 未使用

在下例中我们可以看到TOS的值为0也就是全部设置为正常值

Total Length  
封包总长(TL)。通常以byte做单位来表示该封包的总长度此数值包括标头和数据的总和。

从上图我们看到的十六进位数值是“003C”换成十进位就是“60”了。

Identification  
识别码(ID)。每一个IP封包都有一个16bit的唯一识别码。我们从OSI的网路层级知识里面知道当程序产生的数据要通过网络传送时都会被拆散成封包形式发送,当封包要进行重组的时候这个ID就是依据了。

从上图我们可以看到此封包的ID为40973 (将 a00d 换成十进制就知道了)。

Flag  
标记(FL)。这是当封包在传输过程中进行最佳组合时使用的3个bit的识别记号。请参考下表

000. Reserved Fragment 当此值为0的时候表示目前未被使用。  
.0.. Don't Fragment 当此值为0的时候表示封包可以被分割,如果为1则不能被分割。  
..0. More Fragment 当上一个值为0时:此值为0就示该封包是最後一个封包,如果为1则表示其後还有被分割的封包。

在下例中我们看到这个封包的标记为“0”也就是目前并未使用。

Fragment Offset  
分割定位(FO)。当封包被切开之後由於网路情况或其它因素影响其抵达顺序并不会和当初切割顺序一至的。所以当封包进行切割的时候会为各片段做好定位记录所以在重组的时候就能够依号入座了。

因为我们刚才撷取到的封包并没有被切割所以暂时找不到例子参考在上例中我们看到的FO为“0”。

Time To Live  
延续时间(TTL)。这个TTL我们在许多网路设定上都会碰到当一个物件被赋予TTL值(以秒为单位)之後就会进行计时如果物件在到达TTL值的时候还没被处理的话就会被遗弃。 不过并不是所有的 TTL 都以时间为单位例如 ICMP 协定的 TTL则以封包路由过程中的跳站数目(Hop Count)做单位。TTL 值每经过一个跳站(或被一个 router 处理)之後就会被减低一个数值 。这样当封包在传递过程中由於某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面。

上图中我们看到的数值可不是 20 哦因为这是个十六进位数字要换成十进位才知道 TTL 原来是 32 个跳站。

Protocol  
协定(PROT)。这里指的是该封包所使用的网路协定类型例如ICMPDNS等。要注意的是这里使用的协定是网路层的协定这和上层的程式协定(如FTPPOP等)是不同的。您可以从Linux的/etc/protocol这个档案中找到这些协定和其代号此档案也存放於NT的/winnt/system32/drivers/etc目录里面。其内容如下

------------------------------------------------------ 
ip      0       IP              # internet protocol, pseudo protocol number 
icmp    1       ICMP            # internet control message protocol 
igmp    2       IGMP            # Internet Group Management 
ggp     3       GGP             # gateway-gateway protocol 
ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'') 
st      5       ST              # ST datagram mode 
tcp     6       TCP             # transmission control protocol 
egp     8       EGP             # exterior gateway protocol 
pup     12      PUP             # PARC universal packet protocol 
udp     17      UDP             # user datagram protocol 
hmp     20      HMP             # host monitoring protocol 
xns-idp 22      XNS-IDP         # Xerox NS IDP 
rdp     27      RDP             # "reliable datagram" protocol 
iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4 
xtp     36      XTP             # Xpress Tranfer Protocol 
ddp     37      DDP             # Datagram Delivery Protocol 
idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport 
rspf    73      RSPF            #Radio Shortest Path First. 
vmtp    81      VMTP            # Versatile Message Transport 
ospf    89      OSPFIGP         # Open Shortest Path First IGP 
ipip    94      IPIP            # Yet Another IP encapsulation 
encap   98      ENCAP           # Yet Another IP encapsulation 
------------------------------------------------------ 
在我们这个例子中可以看得出PROT的号码为“01”对照/etc/protocol档案我们可以知道这是一个ICMP协定。

Header Checksum
标头检验值(HC)。这个数值主要用来检错用的用以确保封包被正确无误的接收到。当封包开始进行传送後接收端主机会利用这个检验值会来检验馀下的封包如果一切看来无误就会发出确认信息表示接收正常。  
上图中我们看到的封包之HC为“9049”。

Source IP Address  
来源地址(SA)。相信这个不用多解释了就是发送端的IP地址是也。  
我们将“c0.a8.00.0f”换成十进位就可以得出“192.168.0.15”这个地址了。

Destination IP Address  
目的地址(DA)。也就是接收端的IP地址啦。  
看看你能不能将“a8.5f.01.54”换成“168.95.1.84”

Options & Padding  
这两个选项甚少使用只有某些特殊的封包需要特定的控制才会利用到。这里也不作细表啦。

struct ip //看一看IP的结构定义

#if __BYTE_ORDER == __LITTLE_ENDIAN 
unsigned int ip_hl:4; /* header length */ 
unsigned int ip_v:4; /* version */ 
#endif 
#if __BYTE_ORDER == __BIG_ENDIAN 
unsigned int ip_v:4; /* version */ 
unsigned int ip_hl:4; /* header length */ 
#endif 
u_int8_t ip_tos; /* type of service */ 
u_short ip_len; /* total length */ 
u_short ip_id; /* identification */ 
u_short ip_off; /* fragment offset field */ 
#define IP_RF 0x8000 /* Reserved Fragment flag */ 
#define IP_DF 0x4000 /* Don't Fragment flag即第二位为1(不可分包) */ 
#define IP_MF 0x2000 /* More Fragments flag即二三位为00(可分包,此为最后一个包)或01(还有后继包) */ 
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ 
u_int8_t ip_ttl; /* time to live */ 
u_int8_t ip_p; /* protocol */ 
u_short ip_sum; /* checksum */ 
struct in_addr ip_src, ip_dst; /* source and dest address */ 
}; 
ip_v IP协议的版本号,这里是4,现在IPV6已经出来了

ip_hl IP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5.

ip_tos服务类型,说明提供的优先权.

ip_len说明IP数据的长度.以字节为单位.

ip_id标识这个IP数据包.

ip_off碎片偏移,这和上面ID一起用来重组碎片的.

ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃.

ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议.

ip_sum首部校验和,提供对首部数据的校验.

ip_src,ip_dst发送者和接收者的IP地址

IP协议(RFC791)-IP包格式相关推荐

  1. 计算机网络基础知识--TCP/IP协议、IP分组、TCP传输

    转 计算机网络基础知识--TCP/IP协议.IP分组.TCP传输 2017年12月08日 08:35:09 孔维昊 阅读数 1820 查看全文 http://www.taodudu.cc/news/s ...

  2. DSP6678 RapidIO基本原理之二——RapidIO协议结构及包格式

    一.RapidIO协议结构及包格式                 为了满足灵活性和可扩展性的要求,RapidIO协议分为三层:逻辑层.传输层和物理层.下图说明了RapidIO协议的分层结构. 逻辑层 ...

  3. 【计算机网络】6. 网络基础4之详解IP协议( IP协议头格式、IP地址管理、路由选择)

    目录 1. IP协议头格式 2. IP地址管理 2.1 IP地址的早期划分方式 2.1.1 A类 2.1.2 B类 2.1.3 C类 2.2 现在分配IP的方式:CIDR方式 2.2.1 引入子网掩码 ...

  4. IP协议及IP数据包详解

    本文转自至:https://blog.csdn.net/super_yc/article/details/72290931 回忆一下网络层的主要功能:通过TCP或者UDP协议绘制网络地图,数据包选取合 ...

  5. IP协议以及IP地址分类

    网络层(network layer)是实现互联网的最重要的一层.正是在网络层面上,各个局域网根据IP协议相互连接,最终构成覆盖全球的Internet.更高层的协议,无论是TCP还是UDP,必须通过网络 ...

  6. 【网络】网络的基础知识--TCP/IP协议、IP分组、TCP传输

    1.OSI参考模型: OSI(Open System Interconnect),即开放式系统互联.一般都称为OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型.该体系结构标 ...

  7. 【计算机网络】网络层 : IPv6 协议 ( IPv6 数据包格式 | IPv6 地址表示 | IPv6 地址类型 | IPv4 与 IPv6 协议对比 | IPv4 -> IPv6 过渡策略 )

    文章目录 一.IPv6 发展 二.IPv6 数据报格式 三.IPv6 和 IPv4 对比 四.IPv6 地址表示 五.IPv6 地址 类型 六.IPv4 向 IPv6 过渡策略 一.IPv6 发展 I ...

  8. 系列TCP/IP协议-动态IP选路协议(008)

    一.引言 前一章已经说过了IP数据包是如何分发的.为啥这一章还要说这个问题?在网络很小.只有单个连接点.没有多余的路由的时候,使用静态选路是可以的.但是一旦网络变大一点就会出现各种问题.在大网络中的网 ...

  9. TCPIP之IP协议及IP地址详解

    一.什么是IP? IP是Internet Protocol(网际互连协议)的缩写,IP是整个TCP/IP协议族的核心,也是构成互联网的基础.IP位于TCP/IP模型的网络层(相当于OSI模型的网络层) ...

最新文章

  1. Linux中的粘滞位
  2. 分区视图(转自小春BOOK)
  3. PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排
  4. 2007武汉.NET俱乐部沙龙-VS2008、WPF、Silverlight
  5. [html] 你了解什么是无障碍web(WAI)吗?在开发过程中要怎么做呢
  6. 1.gloox开发环境搭建
  7. 数字电平(一):TTL和CMOS
  8. postgres初始化数据库
  9. win10任务栏透明_几款软件让你的 Win10 与众不同(简洁篇)
  10. vs 2010下载地址
  11. 全国各省市固定资本形成额数据 (1990-2018年)
  12. 关于学习Godot时遇到的问题(未解决)
  13. 【矢量图】PyEcharts导出图片并矢量化
  14. win10删除提示找不到该项目
  15. 什么是数据标准化?在Python中如何进行数据标准化?「必学」
  16. Redis-NoSql结构化数据库
  17. hdu 4745 区间dp
  18. signature=2abb9e363faa3aa7323b2a3393a36011,Winhex软件的使用
  19. 2061:【例1.2】梯形面积
  20. Cesium:入门教程(三)之视窗配置

热门文章

  1. SpringCloud Consul 服务注册与发现
  2. 江苏省高邮2021年高考成绩查询,2021年江苏高考成绩排名及一分一段表
  3. Python wxpy通过ModBus控制电脑鼠标和键盘
  4. hanlp加载预训练模型
  5. BUU OJ 做题记录
  6. 20175126《Java程序设计》第四周学习总结
  7. 我的github网址链接
  8. HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容
  9. [转]G++与GCC的区别
  10. DataTemplate和ControlTemplate的关系