摘要:

    本文简单介绍了网络层理论知识,详细讲解了IP数据报各个字段,并从Wireshark俘获分组中选取IP数据报进行分析,也阐述了分组和分片的区别。

 

一、IPv4数据报

    网络层是处理端到端数据传输的最低层。网络层关注如何将分组从源端沿着网络路径送达目的端,期间可能需要经过许多跳中间路由器。即提供转发(数据从路由器那个接口出去)、选路(发送方与接收方间的路径)、网络建立(如ATM、帧中继)。这里以IPv4为例,关于IPv6报文格式详见博文《IPv4与IPv6数据报格式详解》。

图1 IPv4数据报格式

版本号(version)

    不同的IP协议版本使用不同的数据报格式。

首部长度(HL, Internet Head Length)

    确定IP数据报中数据部分实际从哪里开始,包含可变数量的选项。若IP数据报没有包含选项,则IP数据报首部长度为20字节。

服务类型(TOS, Type Of Service)

    更好地服务不同类型IP数据报(如实时数据报IP电话应用、非实时通信流FTP),Cisco将TOS前3位标识不同服务等级,即优先级。

数据报长度(TL, Total Length)

    IP数据报长度,即首部+数据。

分片:标识(identification)、标志(flags)、段位移(Fragment Offset)

    这3个字段跟IP分片有关,当目的主机从同一个源收到一批数据报时,需要确定这些数据报是完整数据报还是分片后的数据报,数据报首部标识字段解决这个问题,检查数据报的标识号确定哪些数据报真正是同一个较大数据报的片;如何判断最后一个分片已收到,数据报首部标志字段解决这个问题,将最后一片的标志为0,其他标记为1;如何顺序重组这些片,这就需要记录每个片的在数据报有效净荷的偏移量,这也确定了片是否丢失。若丢失某些片,则丢弃这个不完整的数据报(不会交给传输层)。需要可靠传输怎么办呢,由传输层让源重传原始数据摄中的数据(如TCP)。

寿命(TTL, Time To Live)

    每次数据报经过一台路由器时,该字段的值减1,若TTL字段减为0,则丢弃该数据报,从而确保数据报不会永远在网络循环

上层协议(Protocol)

    该字段用于指明IP数据报的数据部分应该交给哪个传输层协议(6为TCP、17为UDP)。

首部检查和(Header Checksum)

    只是对IP首部进行检验,对整个TCP/UDP报文段检验交由TCP/UDP完成。将首部中的每两个字节当作一个数,用反码运算对这些数求和,该和按1补码值存放在检查和字段。当路由器收到IP数据报时,计算其首部检查和,与该字段值比较,若出错则丢弃该数据报。

    注:因为TTL字段及选项字段可能改变,所以每个路由器上的检查和都须重新计算并存放在原处。(检查后,再更新)

源和目的IP地址(Source/Destination Address)

选项(Options)

    选项字段允许IP首部被扩展,由此导致数据报首部长度可变,故不能预先确定数据字段从何开始,同时也使路由器处理一个IP数据报所需时间差异很大(有的要处理选项,有的不需要)。

数据(Data)

    当使用TCP/UDP协议时,数据即为传输层报文段(TCP/UDP)。数据字段也可承载其他类型数据,如ICMP报文段。

二、实例解析

    以请求百度首页基本HTML为例,因HTTP报文太大(3835字节),网络层对其进行分片,共4片,如下图(截自Wireshark俘获的HTTP响应报文):

图2 数据分片实例

整个HTTP报文传输示意图如下:

图3 HTTP报文传输实例示意图

2.1 分片

    IP数据报首部字段的标识(identification)、标志(flags)、段位移(Fragment Offset) 用来处理分片。当目的主机从同一个源收到一批数据报时,需要确定这些数据报是完整数据报还是分片后的数据报,数据报首部标识字段解决这个问题,检查数据报的标识号确定哪些数据报真正是同一个较大数据报的片;如何判断最后一个分片已收到,数据报首部标志字段解决这个问题,将最后一片的标志为0,其他标记为1;如何顺序重组这些片,这就需要记录每个片的在数据报有效净荷的偏移量,这也确定了片是否丢失。若丢失某些片,则丢弃这个不完整的数据报(不会交给传输层)。需要可靠传输怎么办呢,由传输层让源重传原始数据摄中的数据(如TCP)。

    将该4个IP数据报(组成该完整的HTTP报文)的标识、标志、段位移部分抽出来,如下图所示:

图4 HTTP响应报文的4个IP数据报

    可以看出,IP数据报并没有分片,这是因为这些IP数据报封装成帧并没有超过MTU(以太网MTU为1500字节)。蛮想找一个有分片的IP数据报分析下,可惜俘获的分组没有:-(

    不尽要问,当报文太大时,什么时候划分报文呢?主要是在两个地方:传输层TCP分组、网络层IP分片。

(1)分组

    TCP把应用程序交给它的报文分成合适的小块交给下面网络层,要不要分取决于应用层报文是否大于MSS(想想TCP连接建立时最大报文段MSS大小的协商,注MSS仅包含TCP报文段的净荷数据,不包括TCP首部),怎么分取决于特定的分组算法。本例将3836字节长度HTTP报文分成:411+1440+1440+545。

(2)分片

    IP数据报在发送方与目的地间传输可能选择不同的路径,路径上的每段链路可能使用不同的链路层协议,协议可能具有不同的最大传输单(MTU,链路层数据报能承载的最大数据量)。当出链路的MTU比IP数据报的长度小时,需要将过大的IP数据报分片。IPv4数据报首部字段标识、标志、偏移量解决这个问题。

    值得注意的是,IP数据报分片在网络层重组,重组好了,再交给传输层。TCP报文段在传输层重组,重组好了,再交给应用层。

2.2 IP数据报实例

接下来,取一个完整IP数据报分析(以第一个数据报为例,即27),如下:

图4 IP数据报实例

    IP数据报首部没有选项字段,长度为20字节,数据报长度451=IP数据报首部长度20(没有选项字段)+TCP首部长度20(没有选项字段)+TCP报文段的数据字段411(实为HTTP报文前411字节)。

参考资料:

[1] Andrew S.Tanenbaum.计算机网络[M].

[2] 《计算机网络--自顶向下方法与Internet特色》[M].

 HTTP报文传输实例.rar

 IPv4和IPv6数据报格式.rar

from:http://blog.chinaunix.net/uid-9112803-id-3213492.html

结合Wireshark捕获分组深入理解TCP/IP协议之IP协议的更多相关文章

  1. 结合Wireshark捕获分组深入理解TCP/IP协议栈

    摘要:     本文剖析了浏览器输入URL到整个页面显示的整个过程,以百度首页为例,结合Wireshark俘获分组进行详细分析整个过程,从而更好地了解TCP/IP协议栈.   一.俘获分组 1.1 准 ...

  2. 结合Wireshark捕获分组深入理解TCP/IP协议栈之TCP协议(TCP报文格式+三次握手实例)

    摘要:     本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述     TCP是面向连接的可靠 ...

  3. 结合Wireshark捕获分组深入理解TCP/IP协议栈之DNS协议

    摘要:     本文简单介绍了DNS协议理论知识,给出URL解析步骤,详细讲述了DNS报文各个字段含义,并从Wireshark俘获分组中选取DNS相关报文进行分析. 一.概述 1.1 DNS      ...

  4. 结合Wireshark捕获分组深入理解TCP/IP协议之以太网帧

    摘要:     本文摘抄并整理了以太网相关理论知识,包括CSMA/CD协议机制及工作.LAN互连,详细分析了Ethernet II帧格式,最后给出Ethernet II帧实例. 一.以太网[1] 1. ...

  5. 结合Wireshark捕获分组深入理解TCP/IP协议栈之HTTP协议

    摘要:     本文简单介绍了Web应用层协议理论知识,详细讲述了HTTP请求报文和响应报文各个字段含义,并从Wireshark俘获分组中选取HTTP相关报文进行分析. 一.概述     Web的应用 ...

  6. 如何理解TCP的三次握手协议?

    • TCP是一个面向链接的协议,任何一个面向连接的协议,我们都可以将其类比为我们最熟悉的打电话模型. 如何类比呢?我们可以从建立和销毁两个阶段分别来看这件事情. 建立连接阶段 首先,我们来看看TCP中 ...

  7. Wireshark 捕获过滤器的语法

    转自:http://blog.csdn.net/qq_29277155/article/details/52077239 前言 我们都知道,wireshark可以实现本地抓包,同时Wireshark也 ...

  8. 面试热点|理解TCP/IP传输层拥塞控制算法

    0x00.前言 通过本文你将了解到以下内容: 拥塞控制概念以及其背景 流量控制和拥塞控制的区别与联系 拥塞控制主要过程详解 伙伴们认真学习一下,让offer来得更猛烈些吧! 0x01.TCP/IP协议 ...

  9. 【PHPsocket编程专题(理论篇)】初步理解TCP/IP、Http、Socket.md

    前言 我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API).那TCP/IP又是什么呢?TCP/IP是ISO/OS ...

随机推荐

  1. EF搭建数据库

    http://blog.csdn.net/mss359681091/article/details/52135867http://blog.csdn.net/x_craft/article/detai ...

  2. 如何使用定时器settimeout、setInterval执行能传递参数的函数(转)

    来自: http://www.cnblogs.com/wkylin/archive/2012/09/07/2674911.html var userName="jack";//根据 ...

  3. 03005_SQL查询语句

    查询语句,在开发中使用的次数最多,此处使用“zhangwu” 账务表. 1.准备工作 (1)创建财务表: CREATE TABLE zhangwu ( id INT PRIMARY KEY AUTO_ ...

  4. Android中的MVP架构初探

    说来羞愧,MVP的架构模式已经在Android领域出现一两年了.可是到今天自己才開始Android领域中的MVP架构征程. 闲话不多说,開始吧. 一.架构演变概述 我记得我找第一份工作时,面试官问我& ...

  5. 矩阵乘法java代码实现

    矩阵只有当左边矩阵的列数等于右边矩阵的行数时,它们才可以相乘, 乘积矩阵的行数等于左边矩阵的行数,乘积矩阵的列数等于右边矩阵的列数 即A矩阵m*n,B矩阵n*p,C矩阵m*p: package exa ...

  6. 洛谷P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...

  7. 开源性能测试工具——jemeter介绍+安装说明

    一. Apache JMeter介绍 1. Apache JMeter是什么 Apache JMeter 是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力测试和性能测量. ...

  8. 用vue.js的v-for,v-if,computed写一个分页样式

    在学Vue,总想写个分页,先写了一个样式. 主要看思路: 思路简单,得到总页数,判断总页数,循环. 先判断总页数是否需要分页,总页数==1页就不分了. 再判断总页数<11就不用--. 总页数&g ...

  9. 前端项目中常用es6知识总结 -- let、const及数据类型延伸

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const  2 ...

  10. 免费的EmBitz可替代Keil MDK开发STM32、NXP项目

    一.背景 由于使用之前开发STM32是基于Keil MDK编译环境开发的,由于该软件是收费的,想用个免费开源的软件来替代Keil,EmBitz编译器是免费的,可以完全替代开发.下载程序支持J-Link ...