zoukankan      html  css  js  c++  java
  • IP协议

    IP服务的特点

    IP协议是TCP/IP协议族的动力,为上层协议提供无状态、无连接、不可靠的服务。

    无状态:指IP通信双方不同步传输数据的状态信息,因此所有的IP数据报的发送、传输和接收都是相互独立、没有上下文关系。它的缺点就是无法处理乱序和重复的IP数据报。

    无连接:指IP通信双方都不长久地维持对方的任何信息。所以上层协议每次发送数据的时候都必须明确指定对方的IP地址。

    不可靠:指IP协议不能保证IP数据报准确地到达接收端。发送端的IP模块一旦检测到IP数据报发送失败,就通知上层协议发送失败,而不会重传。

    IPv4头部结构 

    1-1. 4位版本号(version)指定IP协议的版本。对于IPv4来说,其值是4。

    1-2. 4位头部长度(header length)标识该IP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。

    1-3. 8位服务类型(Type Of Service,TOS)包括一个3位的优先权字段(现已被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,根据需要来设置。比如ssh和telnet这样的登录程序需要的是最小延时服务,而文件传输ftp则需要最大吞吐量的服务。

    1-4. 16位总长度(total length)是指整个IP数据报的长度,以字节位单位,因此IP数据报最大长度为65535字节。但由于MTU 的限制,长度超过MTU的数据报都将被分片传输。接下来的3个字段描述了如何实现分片。

    2-1. 16位标识(identification)唯一地标识主机发送的每一个数据报。其初始值由系统随机生成:每发送一个数据报,其值就加1。数据报分片时被复制到每个分片中,同一个数据报的所有分片都具有相同的标识值。

    2-2. 3位标志字段的第一位保留。第二位(DF)表示“禁止分片”,如果设置了就表示IP模块不对数据报进行分片。第三位(MF)表示“更多分片”,除了数据报最后一个分片外,其他分片都要置1.

    2-3. 13位分片偏移(fragmentation offset)是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。每个IP分片的数据部分必须是8的整数倍(保证IP分片拥有合适的偏移值)

    3-1. 8位生存时间(Time to Live,TTL)是数据报到达目的地之前允许经过的路由器跳数(常见的值是64)。每经过一个路由,该值就被减1。当TTL值减为0时,路由器将丢弃数据报,向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环。

    3-2. 8位协议(protocol)用来区分上层协议。/etc/protocols文件中定义了上层协议对应的protocol字段的值。ICMP是1,TCP是6,UDP是17。

    3-3. 16位头部校验和(header checksum)由发送端填充,接收端使用CRC算法以检验IP数据报头部在传输过程中是否损坏。

    4-1(5-1). 32位源端IP地址和目的IP地址用来标识数据报的发送端和接收端。

    6-1. 选项字段(option)是可变长的可选信息。这部分最多包含40字节,因为IP头部最长60字节,前面还有20字节的固定部分。IP选项包括:

        记录路由(record route),告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样就可以跟踪数               据报的传递路径。

        时间戳(timestamp),告诉每个路由器都将数据报被转发的时间填入IP头部的选项部分。

        松散源路由选择(loose source routing),指定一个路由器IP地址列表,数据报发送过程必须经过其中所有的路由器。

        严格路由选择(strict source routing),和松散源路由选择类似,不过数据报只能经过被指定的路由器。

    IP分片

    当IP数据报的长度超过帧的MTU时,它将被分片传输。分片可能发生在发送端,也可能在中转路由器上,而且可能在传输过程中被多次分片,只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。

    以太网帧的MTU是1500字节,它携带的IP数据报的数据部分最多是1480字节(IP头部占用20字节)。

    每个IP分片都包含自己的IP头部(20字节),且除了最后一个IP分片,其他的IP分片头部都设置了MF标志。

    IP层传递给数据链路层的数据可能是一个完整的IP数据报,也可能是一个IP分片,它们统称为IP分组(packet)。

    IP路由

    IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。

    1. IP模块工作流程

    ①IP模块收到来自数据链路层的IP数据报时,对该数据报的头部做CRC校验,确认无误之后开始分析其头部的具体信息。

    ②如果该IP数据报设置了源站选路选项,则IP模块调用数据报转发子模块来处理该数据报。

    ③如果该IP数据报的头部中目标IP是本机的某个IP地址,或者是广播地址,即该数据报是发给本机的,则IP模块就根据数据报头部中的协议字段将它派发给对应的上层协议。

    ④如果不是发给本机的,则调用数据报转发子模块来处理该数据报。

    ⑤数据报转发子模块先检测是否允许转发,如果不允许,将该数据报丢弃。如果允许,就将该数据报交给输出子模块

    IP数据报应该转发给哪个下一跳路由,以及经过哪个网卡来发送,就需要IP路由过程。

    2.路由机制

    ①查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没找到就转步骤②。

    ②查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址。如果找到,就使用该路由项,没找到就转步骤③。

    ③选择默认路由项,则通常意味着下一跳路由是网关。

    3.路由表更新

    route命令可以修改路由表。

     

    第1行表示添加主机192.168.1.109对应的路由项。

    第2行表示删除网络192.168.1.0对应的路由项。

    第3行表示删除默认路由项,后果是无法访问因特网。

    第4行表示重新设置默认路由项,其网关是机器192.168.1.109(不能直接访问因特网的路由器)

    --------------------------------------------------------------------------------------------------------------------------

    通过route命令或其他工具手动修改路由表,是静态的路由更新方式。对于大型的路由器,通常通过BGP(Border Gateway Protocol,边际网关协议)、

    RIP(Routing Information Protocol,路由信息协议)、OSPF等协议来发现路径,更新自己的路由表。(动态的、自动的更新方式)

    IP转发

    对于允许IP数据报转发的主机,数据报子模块将对希望转发的数据报进行以下操作:

      1)检查数据报头部的TTL值。如果TTL值已经为0,则丢弃该数据报。

      2)查看数据报头部的严格源路路由选择选项。如果该选项被设置,则检测数据报的目标IP地址是否为本机的某个IP地址。如果不是,发送一个ICMP源站选路失败报文给发送端。

      3)如果有必要,给源端发送一个ICMP重定向报文,来告诉它一个更合理的下一跳路由器。

      4)将TTL值减1。

      5)处理IP头部选项。

      6)如果有必要,执行IP分片操作。

  • 相关阅读:
    python 连接sql server 解决中文乱码 及配置使用 web 服务使用
    Android调用.net的webservice服务器接收参数为空的情况
    好题推荐
    算法中一些trick和细节
    洛谷P2181 对角线
    新的开始
    文化课倒计时80天
    Electron-vue实现后台多进程(三. 自动化测试篇)
    工作感受月记202107月
    工作感受月记202106月
  • 原文地址:https://www.cnblogs.com/itsad/p/8250467.html
Copyright © 2011-2022 走看看