IPv4数据报格式及其语义
一、IP数据报的格式如下图所示
版本 |
首部长度 |
服务类型 |
数据报长度 |
|
16比特标识 |
标志 |
13比特片偏移 |
||
寿命 |
上层协议 |
首部检验和 |
||
32比特源IP地址 |
||||
32比特目的IP地址 |
||||
选项(如果有的话) |
||||
数据 |
IPv4数据报格式
二、各部分语义
1)版本(号):4bit,规定了数据包的IP协议版本;通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分
2)首部长度:因为IPV4数据报可包含一些可变数量的选项,所以需要用这4bit来确定首部的长度,以确定IP数据报的数据部分实际从哪里开始。大多数IP数据报不包含选项,所以一般IP数据报具有20字节的首部
3)服务类型:8bit,服务类型包含在首部中以使不同类型的IP数据报能相互区分开来,例如,将实时数据报(如用于IP电话应用)与非实时流量(如FTP)区分开来也许是有用,提供特定等级的服务是一个由路由器管理员决定的策略问题
4)数据报长度:这是IP数据报的总长度(首部加上数据),以字节计,因为该字段长为16bit,所以IP数据报的理论最大长度为65535字节,然而数据报很少有超过1500字节的(因为IP数据还要靠数据链路层运输的,而链路层帧能承载的最大数据量为叫做最大运输单元(Maximum Transmission Unit,MTU))
5)标识、标志、片偏移:
要理解这三个内容,要先理解一些其他知识
(1)分片:把IP数据报中的数据分成两个或者更多个较小的IP数据报,用单独的链路层帧封装成较小的IP数据报,每个这些较小的数据报称为片
(2)为什么要分片:因为每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器,而链路层帧能承载的最大数据量(最大运输单 元(Maximum Transmission Unit,MTU)是一定的,故链路层帧严格限制着IP数据报的长度;而且发送方和与目的路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的MTU,所以就更有可能需要分片了,以便能够使得数据报能够顺利的传递数据报
(3)组装:目的主机从相同源收到一系列数据报时,需要确定哪些数据报是分片,如果是分片的话,还要进一步指导何时收到最后一个分片,如何将接收到的分片拼接起来以形成初始的数据报,故IPV4的设计者将标识、标志和片偏移字段放在IP数据报首部中,当生成一个数据报时,发送主机为该数据报设置源和目的地址的同时,再填上标识号
标识:16bit,源主机发送IP数据报的时候,通常为它发送的每个数据报的标识号加1,所以当某个路由器需要对某一个数据报分片时,形成的每个数据报(分片)具有初始数据报的源地址、目的地址、与标识号,这样目的主机就可以判别哪些分片是属于一个初始数据报的
标志:3bit,由于IP是一种不可靠服务,一个或者多个片可能永远到不了目的地,所以为了让目的主机绝对的相信它已经收到了初始数据报的最后一个片,最后一个片的标志比特被设置为0,而所有其他片的标志比特被设置为1
片偏移:13bit,标示数据相对于初始数据报的偏移值,并且偏移值应当被规定以8字节块为单位。所以除了最后一个片的所有初始有效载荷数据的数量应当是8字节的倍数
6)寿命:8bit,寿命(Time-To_Live ,TTL )字段是用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环,每当数据报由一台路由器处理时,该字段的值减1。若TTL字段减为0,则该数据报必须丢弃。
7)协议:8 bit,该字段仅当一个IP数据报到达其最终目的地才会有用,改字段指示了IP数据报的数据部分应交给哪个特定的运输层协议,如:值为6应该交给TCP,而值为17表示数据部分要交给UDP ,其他可能值查看 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
8)首部检验和: 16bit,首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。首部检验和是这样计算的:将首部中的每2个字节当做一个数,用反码运算对这些数求和;具体到发送方或接收方计算如下:
在发送数据时,为了计算IP数据包的校验和。应该按如下步骤:
(1)把IP数据包的校验和字段置为0;
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;
(3)把得到的结果存入校验和字段中。
在接收数据时,计算数据包的校验和相对简单,按如下步骤:
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
(2)检查计算出的校验和的结果是否等于零(反码应为16个0);
(3)如果等于零,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检验出是个差错,路由器一般会丢弃检测出错误的数据报
9)源和目的IP地址:32bit,当某源生成一个数据报时,在这两个字段中插入发送主机的IP地址和目的地的IP地址,通常源主机DNS查找来决定目的地址
10)选项:32bit,选项字段允许IP首部被扩展。首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段的信息,这样能够节约开销,但是因为有些数据报有选项,有些数据报没有选项,故导致一台路由器处理一个IP数据报所需的时间变化很大。
11)数据(有效荷载):32bit,这是数据报存在的首要理由!大多数情况下,IP数据报中的数据字段包含要交付给目的地运输层报文段(UDP或TCP)
注:注意到一个IP数据报有总长为20字节的首部(假设无选项)如果一个数据报承载一个TCP报文,则每个(无分片的)数据报共承载了总长40字节的首部(20字节的IP数据报加上20字节的TCP首部)以及应用文报文
三、关于标识、标志、片偏移的例子
假设一个4000字节的数据报(20字节加上3980字节IP数据有效荷载)到达路由器,且必须被转发到一条MTU为1500字节链路上,该如何进行分片?
答:初始数据报会被分为3个片,其中的每个片也是一个IP数据报,假定该数据报的发送时,主机给予的标识号为777,三个片的特点如下:
片 |
字节 |
ID |
偏移 |
标志 |
第一片 |
1480 |
ID=777 |
Offset=0 |
Flag=1 |
第二片 |
1480 |
ID=777 |
Offset=185 |
Flag=1 |
第三片 |
1020(3980-1480*2) |
ID=777 |
Offset=370 |
Flag=0 |
注:此时就需要4040个字节来运输初始数据报,所以分片是需要开销的
IPv4数据报格式及其语义的更多相关文章
- MAC帧格式、IPV4数据报格式、TCP报文格式、UDP数据报格式
1.MAC帧格式 类型:2字节,指出数据域中携带的数据应交给哪些协议实体处理 校验码:校验数据段(采用32位CRC冗余校验方式进行校验) 2.IPV4数据报 版本:IP协议版本,这里为4 首部长度:占 ...
- IPv4数据报格式
网络层的分组为数据报,数据报为首部和数据两部分组成,如下图所示. 首部的长度是以4个字节为单位,长度可以是20-60字节,这跟首部的HLEN字段有关. 版本: 这个4位字段定义了IP协议的版本,目前主 ...
- IPv4与IPv6数据报格式详解
摘要: 本文给出IPv4与IPv6数据报格式示意图,并整理了各个字段含义,最后对比IPv4与IPv6数据报格式的区别. 一.IPv4数据报 图1 IPv4数据报格式版本号(version) 不同的IP ...
- IPv4与IPv6数据报格式
IPv4: IPv4数据报中的字段: 版本号:规定了数据报的IP协议版本,通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分,因为不同IP版本使用不同的数据报格式. 首部长度:IPv4数据报可 ...
- IPv6(诞生原因、数据报格式、与IPv4的不同、地址表现形式、基本地址类型、IPv6与IPv4的过渡策略)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105297642 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 以太网帧、TCP与UDP段以及IP数据报格式总结
传输层及其以下的机制由内核提供,是操作系统的一部分,应⽤层由⽤户进程提供应⽤层数据通过协议栈发到⽹络上时,每层协议都要加上⼀个数据⾸部(header),称为封装.不同的协议层对数据包有不同的称谓,在传 ...
- IP数据报格式和IP地址路由
一.IP数据报格式 IP数据报格式如下: 注:需要注意的是网络数据包以大端字节序传输,当然头部也得是大端字节序,也就是说: The most significant bit is numbered 0 ...
- 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
转载:http://www.cnblogs.com/lifan3a/articles/6649970.html 以太网帧格式.IP数据报格式.TCP段格式+UDP段格式 详解 1.ISO开放系统有 ...
- 把IP字符串转换为IPv4标准格式
把IP字符串转换为IPv4标准格式,如一个IP为127.0.0.1转为127.000.000.001格式? 即是说“点”分隔的数据不够三位数字长度,转换为三位数字长度. Insus.NET有尝试写了一 ...
随机推荐
- JPA使用nativequery多表关联查询返回自定义实体类
本文为JPA的学习采坑,如有问题欢迎指正. JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联 ...
- 利用阿里云容器服务打通TensorFlow持续训练链路
本系列将利用Docker和阿里云容器服务,帮助您上手TensorFlow的机器学习方案 第一篇:打造TensorFlow的实验环境 第二篇:轻松搭建TensorFlow Serving集群 第三篇:打 ...
- uva 12003 Array Transformer (线段树套平衡树)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- MySQL锁的用法之行级锁
行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突.但是粒度越小,实现的成本也越高.MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNOD ...
- axios用headers传参,设置请求头token
新建一个配置文件http.js // 导入axios import axios from 'axios'; // 全局配置默认路由 axios.defaults.baseURL = 'http://1 ...
- C++高精度加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...
- Laravel实现找回密码及密码重置的例子
https://mp.weixin.qq.com/s/PO5f5OJPt5FzUZr-7Xz8-g Laravel实现找回密码及密码重置功能在php实现与在这里实现会有什么区别呢,下面我们来看看Lar ...
- laravel 学习笔记blog后台
https://github.com/almasaeed2010/adminlte composer require "almasaeed2010/adminlte=~2.0"
- [C#] 如何把void*转换为byte[]
一般来说,C#库的对外接口应该提供byte[]这样比较容易用的接口,而不应该提供裸的void* 但是有些库确实是这么封装的.那么就有一个如何转换的问题.MSDN推荐的转换方式是使用UnmanagedM ...
- hdu 1016 Prime Ring Problem(dfs)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...