zoukankan      html  css  js  c++  java
  • tcp/iP协议族——IP工作原理及实例具体解释(下)

    

    IP协议具体解释

    上一篇文章文章主要介绍了IP服务的特点,IPv4头部结构IP分片。并用tcpdump抓取数据包,来观察IP数据报传送过程中IP的格式,以及分片的过程。本文主要介绍IP路由,IP转发,重定向和IPv6头部结构。

    IP路由

    IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。为了理解IP路由过程。我们先简要分析IP模块的基本流程。

    IP模块工作流程

    从右往左分析上图。它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的详细信息。

    假设该IP数据报的头部设置了源站选路选项,则IP模块调用数据报来转发子模块来处理该数据包。假设该IP数据报的头部目标IP地址是本地的某个IP地址,或者是广播地址,即该数据是发送给本机的,则IP模块就依据数据报头部中的协议字段来决定将它派发给哪个上层应用(分用)。假设IP模块发现这个数据报不是发送给本机的,则也调用数据报转发子模块来处理该数据报。

    数据报转发子模块将首先检測系统是否同意转发。假设不同意,IP模块就将数据报丢弃。

    假设同意,数据报转发子模块将对该数据报运行一些操作,然后将它交给IP数据报输出子模块。

    IP数据报应该发送至哪一下一跳路由,以及经过哪个网卡来发送,就是IP路由过程,即图中“计算下一跳路由”子模块。

    IP模块实现数据报路由的核心数据结构是路由表。

    这个表依照数据报的目标IP地址分类,同一类型的IP数据报将被发往同样的下一跳路由器。

    IP输出队列中存放的是全部等待发送的IP数据报。当中除了须要转发的IP数据报之外,还包含封装了本机上层数据(ICMP报文,TCP报文和UDP报文)的IP数据报。

    图中的虚线箭头显示了路由表更新的过程。

    这一过程是指通过路由协议或者route命令调整路由表。使之更新最新的网络拓扑结构,成为IP路由策略。

    路由机制

    我们能够使用route命令或netstat命令查看路由表。在chen123上运行route命令,输出内容例如以下:

    Kernel IP routing table

    Destination    Gateway        Genmask        Flags Metric Ref   Use Iface

    default        192.168.73.2   0.0.0.0        UG   0     0       0 eth0

    192.168.73.0   *              255.255.255.0  U    1     0       0 eth0

    该路由表包括两项。每一项都包括8个字段。

    第一项的目标地址是default,即所谓的默认路由项。该项包括一个“G”标志,说明路由下一跳目标是网管,其地址是192.168.73.2。还有一个路由项的目标地址是192.168.73.0,它指的是本地局域网。

    该路游项的网管地址为*,说明不须要路由中转。能够直接发送给目标机器。

    IP路由机制分为三个步骤:

    1. 查找路由表中和数据报的目标IP地址全然匹配的主机IP地址。假设找到。就是用该路由项,没找到则转步骤2.

    2. 查找路由表中和数据报的目标IP地址具有同样网路IP的网络IP地址。假设找到。就使用该路由项(即上面路由表中的第二项)。没找到转步骤3.

    3. 选择默认路由选项。这通常意味着数据报的下一跳路由是网关。

    路由表更新

    route命令能够改动路由表。举比例如以下:

    chen123@ubuntu:~$ sudo route add -host 192.168.73.130dev eth0

    chen123@ubuntu:~$ sudo route del -net 192.168.73.0netmask 255.255.255.0

    chen123@ubuntu:~$ sudo route del default

    chen123@ubuntu:~$ sudo route add default gw192.168.73.130

    第一行加入主机192.168.73.130相应的路由项,这样设置之后,全部从chen123发送li123的数据报将通过网卡eth0直接发送到目标机器的接收网卡。第二行表示删除网络192.168.70.0相应的路由项。第三行删除默认路由项,这样做的后果是无法訪问因特网。

    第四行表示又一次设置默认路由项。只是这次其网关li123

    经过改动,其输出例如以下

    chen123@ubuntu:~$ route

    Kernel IP routingtable

    Destination    Gateway        Genmask      Flags Metric Ref      UseIface

    default        192.168.73.130  0.0.0.0         UG   0     0       0 eth0

    192.168.73.130 *              255.255.255.255 UH   0     0       0 eth0

    这个路由表中,第一个路由项是主机路由项,所以他被设置了“H”标志。

    通过route或其它工具手动改动路由表是静态的路由更改方式。对于大型的路由器,通常通过BGPRIPOSPF等协议来发现路径,并更新自己的路由表,这样的方式是动态的。自己主动的。

    IP转发

    主机一般仅仅发送和接收数据报。这是由于主机/proc/sys/net/ipv4/ip_forward内核參数默认被设置为0,我们能够通过改动它来使主机有数据转发功能。举比例如以下:

    li123上以root身份运行

    root@ubuntu:/home/li123# sudoecho 1 > /proc/sys/net/ipv4/ip_forward

    在上面命令运行前,在chen123上运行例如以下命令

    root@ubuntu:/home/chen123# pingwww.baidu.com

    输出

    ping: unknownhostwww.baidu.com

    改动ip_forward后,结果输出

    PING www.a.shifen.com (115.239.211.110) 56(84) bytesof data.

    From 192.168.73.130: icmp_seq=1 Redirect Host(Newnexthop: 192.168.73.130)

    64 bytes from 192.168.73.130: icmp_seq=1 ttl=128time=12.4 ms

    64 bytes from 192.168.73.130: icmp_seq=2 ttl=128time=21.7 ms

    64 bytes from 192.168.73.130: icmp_seq=3 ttl=128time=23.7 ms对于IP数据报转发的系统(主机或路由器),数据报转发子模块对期望转发恩德数据报运行例如以下操作:

    1. 检查数据报头部的TTL值。假设TTL值已经是0,则丢弃该数据报

    2. 查看数据报的严格源路由选择选项。假设该选项被设置。则检測数据报的目标地址是否是本机的某个IP地址。

      假设不是,则发送一个ICMP源站选路失败报文给发送端。

    3. 假设有必要,则给源端发送一个ICMP重定向报文,以告诉它一个更合理的下一跳路由器

    4. TTL值减1

    5. 处理IP头部选项

    6. 假设有必要。则运行IP分片操作

    重定向

    ICMP重定向报文的数据部分含义非常明白,它给接收方提供了例如以下两个信息:

    1.引起重定向的IP数据报的源端IP地址

    2.应发使用的路由器的IP地址

    接收主机依据这两个信息就能够判定引起重定向的IP数据报应该使用哪个路由器来转发。而且以此更新路由表。

    /proc/sys/net/ipv4/conf/all/accept_redirects内核參数指定是否同意发送ICMP重定向报文,而/proc/sys/net/ipv4/conf/all/send_redirects内核參数指定是否同意接收ICMP重定向报文。

    IPv6头部结构

    IPv6128位来表示IP地址,是的IP地址总量达到了2128次方个。IPv6地址用十六进制字符串表示。如FE80:0000:0000:0000:1234:5678:0000:0012


    參考Linux高性能server编程

    转载请注明出处,谢谢~~

  • 相关阅读:
    HTTP协议
    Python学习--装饰器、列表生成式、生成器、map filter、json处理
    Python学习--多线程&多进程
    Python学习--发送邮件
    Python学习--异常处理
    【第五节】【Python学习】【configparser模块】
    【第一节】【shell脚本】【文件里的内容与变量中的内容大小写替换】
    【Python】【多线程多进程】
    【Selenium学习】【拖动滚动条】
    【Python】【异常的获取与处理】
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6848903.html
Copyright © 2011-2022 走看看