网络层从 网络层IP与子网掩码 前前后后我们也说了两次了,IP 这个东西絮絮叨叨的也一直在提。今天我们来解开IP协议的面纱,还记得我们之前在数据链路层说的物理帧的结构吗?就是这样:

其中Head叫标头,包含源和目的MAC地址,那时我们还没有IP的概念,但是我们用广播的方式也已经能实现全世界范围的通信,但之后我们否定了这种方式,因为会造成网络拥堵,浪费资源。因此就有了子网络,自此,MAC地址和IP地址就随机的结合在了一起,网络通信发送的数据包中也就有了IP地址。但是上面说的帧头部(Head)中只包含MAC地址,并没有IP地址的栏位,那么是否需要修改数据定义,再添加一个栏位呢?

回答是不需要,我们可以把IP数据包直接放进以太网数据包的”数据”部分,因此完全不用修改数据链路层帧的结构。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构。我们先来说IP数据包,具体来说,IP数据包也分为”标头”和”数据”两个部分。

“标头”部分主要包括版本、长度、IP地址等信息,”数据”部分则是IP数据包的具体内容。IP数据包的”标头”部分的长度为20到60字节(下次我们仔细研究),整个数据包的总长度最大为65,535字节。因此,理论上,一个IP数据包的”数据”部分,最长为65,515(65,535-20)字节。前面说过,以太网数据包的”数据”部分,最长只有1500(MTU)字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。我们将它放进以太网数据包后,以太网数据包就变成了下面这样。

上面红色的是网络层的IP数据包,它又作为了数据链路层“帧”的数据部分。是不是就能感受到这种从上向下逐层包装的意思,上层的数据包作为下层的数据部分,下层加入自己的包头组成自己本层完整的数据包。再往下层传递又作为下层的数据包,直到数据链路层的帧,最后被转换成高低电位发送。下面我们研究下IP数据包的包头,如图:

来看看每个字段的具体含义:

  • 版本号 占4位,指IP协议的版本。IPv4的值为 4
  • 头部长度 占4位,标识有多少个32bit字(4字节),4位最大为1111,能表示15,因此IP头部最长为15*4=60字节。
  • 服务类型 占8位,可以设置不同的服务功能,例如小延迟和大吞吐量。
  • 数据报总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
  • 序列号 占16位。能唯一标识主机发送的每一个数据报。
  • 分片标志 三个bit位。第一位保留,未使用。第二位是DF(Don’t Fragment),如果为1,表示未发生分片。第三位是MF(More Fragment),如果为1,表示发生了分片,并且除了分片出的最后一个报文中此标志为0,其余报文中此标志均为1。
  • 偏移量 占13位。分片相对于原始IP数据报开始处的偏移。
  • 生存时间 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。每经过一个路由器时,就把 TTL值减1。当TTL值为0时,就丢弃这个数据报。
  • 上层协议 占8位,协议字段指出此数据报携带的数据是使用何种上层协议,以便使目的主机的IP层知道应将数据部分上交给上层哪个处理过程。
  • 首部检验和 占16位。由发送端填充,接收端对其CRC检验以确定头部是否损坏。
  • 源IP地址  占32位。标识源IP。
  • 目的IP地址 占32位。标识目的IP。

可以看到IP数据包头部还有许多除过IP之外的字段,他们一起配合才实现了网络层的重要功能。

总链:计算机网络漫谈系列文章

计算机网络漫谈之IP数据包的更多相关文章

  1. 九度oj 题目1475:IP数据包解析

    题目描述: 我们都学习过计算机网络,知道网络层IP协议数据包的头部格式如下: 其中IHL表示IP头的长度,单位是4字节:总长表示整个数据包的长度,单位是1字节. 传输层的TCP协议数据段的头部格式如下 ...

  2. 【九度OJ】题目1475:IP数据包解析 解题报告

    [九度OJ]题目1475:IP数据包解析 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1475 题目描述: 我们都学习过计算机网络, ...

  3. SNAT,是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址

    SNAT,可能有人觉得奇怪,好好的为什么要进行ip地址转换啊,为了弄懂这个问题,我们要看一下局域网用户上公网的原理,假设内网主机A(192.168.2.8)要和外网主机B(61.132.62.131) ...

  4. IP报文解析及基于IP 数据包的洪水攻击

    版本(4bit) 报头长度(4bit) 优先级和服务类型(8bit) 总长度(16bit) 标识(16bit) 标志(3bit) 分段偏移(13bit) 存活期(8bit) 协议(8bit) 报头校验 ...

  5. TCP/IP数据包结构具体解释

    [关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构, ...

  6. Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据包访问目标所采取的路径。

    Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据包访问目标所采取的路径.   Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其 ...

  7. [TCP/IP] 网络层-抓包分析IP数据包首部

    ip数据包的结构:首部+数据部分 1.版本(v4或者v6)+首部长度(固定的20字节,所以就没有)+区分服务优先级(我的例子是 assured forwarding 31 0x1a 26,保证转发) ...

  8. TCP/IP 数据包报文格式(IP包、TCP报头、UDP报头)(转)

    reference:http://blog.51cto.com/lyhbwwk/2162568                    https://blog.csdn.net/wangzhen209 ...

  9. [na]ip数据包格式

    IP Datagram Structure 字段名 解释 版本 IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6. 首部长度 IP报头的长度.固定部分的长度(20字节)和可变部分的长 ...

随机推荐

  1. Docker系列(12)- 部署Tomcat

    #官方的使用:我们之前的启动都是后台,停止容器后,容器还是可以看到#docker run -it --rm,一般用来测试,用完就会删除容器,镜像还在[root@localhost ~]# docker ...

  2. 第一次接触linux系统的你,必须要知道的概念

    linux系统一切皆为文件 linux系统一个多用户系统 没有消息就是好消息 linux系统目录结构 Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用"/"表示 ...

  3. Vue 初学

    Vue 的基本代码:      概念简介:Vue.js 是目前最火的一个前端框架,只关注视图层,主要负责MVC中的V这一层     MVC 是后端的分层开发概念:     MVVM是前端视图层的概念, ...

  4. 版本管理 - Git 使用入门

    Git 是一个分布式的版本管理系统,而 SVN 是一个集中式管理系统. 版本控制 Git与SVN的对比 对比 SVN Git 工作方式 集中式 分布式 文件管理 增量式 系统快照 权限控制 对团队中参 ...

  5. iNeuOS工业互联网操作系统部署在华为欧拉(openEuler)国产系统,vmware、openEuler、postgresql、netcore、nginx、ineuos一站式部署

    目       录 1.      概述... 3 2.      创建虚拟机&安装华为欧拉(openEuler)系统... 4 2.1           创建新的虚拟机... 4 2.2  ...

  6. 51nod1675-序列变换【莫比乌斯反演】

    正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1675 题目大意 给出两个长度为\(n\)的序列\(a,b\),求有多少对 ...

  7. P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】

    正题 题目链接:https://www.luogu.com.cn/problem/P4585 题目大意 \(n\)个集合,开始每个集合中有一个数字. 开启新的一天并且往集合\(s\)中插入数字\(v\ ...

  8. 自学 Python,视频教程和代码一看就懂,动手就废,应该这么学

    ​ 一.代码量太少了,看得多做得少,导致一做就错. 每一个测试工程师必定是在大量的时间和代码中提升的自己,如果你只是看视频的话,那永远都停留在理论上,很多问题是要实践才能发现的 我打个比方你看视频的时 ...

  9. 使用 Vue 脚手架,为什么要学 webpack?

    先问大家一个很简单的问题: vue init webpack prjectName 与 vue create projectName 有什么区别呢? 它们是 Vue-cli 2 和 Vue-cli3 ...

  10. Mybatis里@InsertProvider、@UpdateProvider方法里使用if test标签

    例如: ··· insert into TEST1(<if test="base_id!=null and base_id!=''">base_id,</if&g ...