zoukankan      html  css  js  c++  java
  • IP协议解读(二)

    IP协议是TCP协议栈中的核心协议,也是网络编程的基础之中的一个。


    我们接着在IP协议解读(一)继续学习

    网络层作用

    IP分片:

    • IP数据报的长度超过帧的MTU时,将会被分片传输。

      分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片。终于会在接收器上被IP模块又一次组装。

    • IP协议解读(一)中讲述了16位数据报标识、3位的标识。13位的片偏移给分片和重组提供了足够的信息。一个IP数据报的每一个分片都具有自己的头部。他们具有同样的标识值。但具有不同的片偏移。

    • 以太网的MTU位1500字节,因此它能携带的最大字节量位1480字节,由于IP头部包括20个字节。

      假如我们使用以太网帧传输用IP数据报封装的1481个字节的ICMP数据报。

      这个时候>1480字节,所以就会出现分片现象

      那么1481个字节的数据+20字节的IP头部=1501字节的IP数据报=IP分片(1500字节)+IP分片(21字节)

      结构如图所看到的:

    这里写图片描写叙述

    从以上的图片我能够分析出来。ICMP头部的8个字节被分配到第一个分片中,当中1472字节的ICMP的数据也被分配到第一个分片中,这样IP头+ICMP头部结构+部分ICMP数据组成了最大的IP分片(1500字节),剩下的一个个字节的ICMP数据被分配到第二个IP分片中(21字节)

    以下我们用实例演示:

    我们使用ping命令指定每次发送的大小位1473个字节

    ping www.baidu.com -s 1473
    

    这里写图片描写叙述

    我们使用tcpdump命令抓取ping过程中的icmp数据包

    tcpdump -ntv -i eth0 icmp
    

    这里写图片描写叙述

    ===============查看分析抓去结果=====================

    结果如图所看到的:

    这里写图片描写叙述

    从图片中我们能够看出,前两个数据报的ip分片id(标识值)都是27300,说明这两个是同一个分片,第一个分片的offset(偏移值)为0,第二个分片的offset(偏移值)为0位1480.依据信息显示,第一个ICMP占1480个字节,第二个长度为21.

    IP路由选择机制:

    路由选择是IP协议的核心任务,指定了发送数据报到目标路径的途径

    这里写图片描写叙述

    • 当IP模块接受到来自网络驱动程序发来的IP数据报时。首先对头部进行CRC校验。确定这个数据包在传输过程中没有被损坏。

    • 假设发现IP头部信息中带有源站选路选项,那么IP模块调用数据报转发子模块处理这个数据报。
    • 假设这个IP数据报头部结构中目标IP地址是本机的IP地址或是广播地址,就是说明这个数据报是发送给本机的IP模块就必须依据数据报的头部结构协议字段将它发给哪个上层应用。

    • 假设IP模块发现这个数据报不是发送给本机的,同样也掉中转发子模块处理这个数据报,转发子模块首先须要检验这个数据报是否被同意转发。

      不同意的话这个数据报就会被丢弃。

      同意的话数据报转发子模块将对这个数据报进行一系列的操作,然后将它交给IP数据报输出子模块。

    • 事实上呢,IP数据报应该发送到哪一个吓一跳路由。经过哪个网卡来发送,是计算吓一跳路由这个模块完毕的。
    • IP模块实现数据报路由的核心数据结构就是路由表。这个表是依照目的IP进行分类。

    • IP输出队列中是全部等待发出的数据报。
    • 虚线箭头是整个路由表的更新过程

    IP路由选择过程:

    • 查找全然匹配的主机地址,假设找到就是用该路由项,假设未找到,进入下一个步骤
    • 查找同样网络ID的网络IP地址,假设找到就是用该路由项。假设未找到,进入下第三个步骤
    • 选择默认路由项。这意味着下一跳的路由地址是网关

    IP转发过程:

    路由器转发模块的运行步骤例如以下:

    • 检查数据报头部的TTL值(TTL为0丢弃这个数据报)。
    • 查看数据包的严格源路由的选择选项。假设被设置,检測数据报的目的IP地址是否和本机的某个IP地址同样。假设不是。发送一个ICMP差错报文。
    • 给源端发送一个ICMP重定向报文(下一个文章分享)。
    • 将TTL值减1
    • 处理IP头部选项
    • 假设有必要。运行IP分片操作

    路由表更新:

    路由表必须具备更新。反应网络中的连接的变化。这样IP模块才干准确,高效的转发数据报。

    进行实例演示。

    Linux下使用明route命令查看当前主机下的路由表信息。
    这里写图片描写叙述

    第一行表示子系统下的默认路由

    使用route命令加入路由表

    这里写图片描写叙述

    删除相应项

    这里写图片描写叙述

    删除默认路由项,这样做的后果就是无法訪问因特网。

    这里写图片描写叙述

  • 相关阅读:
    Android 图片文字单位 px、dp、sp区别
    替换Fragment 报错 The specified child already has a parent. You must call removeView() on the child's parent first.
    Android 程序怎么打log
    Android 启动项 Activity
    Actiivity 生命周期
    Oracle 监听/数据库 启动/关闭
    【HDU-2049】不容易系列之(4)——考新郎
    Linux内存子系统——Locking Pages(内存锁定)
    command三国杀开发日记20200915
    command三国杀开发日记20200914
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7212328.html
Copyright © 2011-2022 走看看