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或其它工具手动改动路由表是静态的路由更改方式。对于大型的路由器,通常通过BGP、RIP、OSPF等协议来发现路径,并更新自己的路由表,这样的方式是动态的。自己主动的。

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分片操作

重定向

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Fsa2Vya2Fscg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

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头部结构

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

參考Linux高性能server编程

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

tcp/iP协议族——IP工作原理及实例具体解释(下)的更多相关文章

  1. TCP/IP协议族——IP工作原理及实例具体解释(上)

     IP协议具体解释 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包.来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出如今每一个 ...

  2. TCP/IP协议原理与应用笔记10:TCP/IP协议族

    1. 协议族视图如下:(这里我们列举重要的,并不是所有的) (1)网络接入层(数据链路层 和 物理层): 通过接入的物理网络的 功能 和 覆盖范围 进行分析划分为: •LANs :局域网(Local ...

  3. <TCP/IP原理> (二) OSI模型和TCP/IP协议族

    1.OSI参考模型 1)作用 2)各层的名称和功能 2.对分层网络协议体系的理解 1)不同节点:层次组成不同,作用不同 2)横向理解:虚通信.对等实体.协议.PDU 3)纵向理解:封装与解封.服务.接 ...

  4. iOS的TCP/IP协议族剖析&&Socket

    原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有S ...

  5. 服务器编程入门(1)TCP/IP协议族

    问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层:     职责:实现网卡接口的网络 ...

  6. Linux 高性能服务器编程——TCP/IP协议族

    1 TCP/IP协议族体系结构 数据链路层:     职责:实现网卡接口的网络驱动程序,一处理数据在物理媒介(如以太网.令牌环等)上的传输.     常用协议:ARP协议(地址解析协议),RARP协议 ...

  7. 第一章 了解TCP/IP协议族

    第一章 了解TCP/IP协议族 1.1 TCP/IP协议族体系结构以及主要协议 IP和TCP协议对编写程序具有最直接的影响,后面的章节会详细的讲到. TCP/IP的体系结构有应用层,传输层,网络层,数 ...

  8. 深入浅出--iOS的TCP/IP协议族剖析&&Socket

    深入浅出--iOS的TCP/IP协议族剖析&&Socket   简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久! ...

  9. linux高性能服务器编程 (一) --Tcp/Ip协议族

    前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...

随机推荐

  1. iOS:自定义代码块{ }

    1.Xcode本身带有编码常用的代码块可供使用,如下图 调用方法: (1)直接拖到代码区域中: (2)使用快捷键,键入 “while”, Xcode就会出现自动完成的提示 也可以自定义自己常用的代码块 ...

  2. C++发送HTTP请求---亲测可行(转)

    转自:http://hi.baidu.com/benbearlove/item/1671c23017575825b3c0c53f 环境:xp sp3,vs2008,在静态库中使用 MFC #inclu ...

  3. Windows右击无新建文本文档怎么办

    右击无新建文本文档2008-07-26 16:51 刚在网上找的,在运行项输入notepad,把下面的复制进去,然后保存为123.reg,双击导入. REGEDIT4 [HKEY_CLASSES_RO ...

  4. FileZilla_Server如何配置

    安装采用默认直接安装.   2.下图直接点OK   进入主界面,如下     3.配置账户 选择 Edit->USERS 开始创建账户 点击ADD 按钮添加账户user1 点OK 后,回到创建账 ...

  5. Python基础之字符串的练习

    练习1 #!/usr/bin/python -tt # Copyright 2010 Google Inc. # Licensed under the Apache License, Version ...

  6. PHP-php-fpm配置优化

    前言: 1.少安装PHP模块, 费内存 2.调高linux内核打开文件数量,可以使用这些命令(必须是root帐号)(我是修改/etc/rc.local,加入ulimit -SHn 51200的) ec ...

  7. WebLogic92数据源配置

    一. 将数据库连接所需的包导入(非常重要) 最简单的方法就是,将所需jar包复制至%MYDOMAIN_HOME%/lib中,约定本应用域的名称为“ MyDomain”,根路径为%MYDOMAIN_HO ...

  8. python机器学习-逻辑回归

    1.逻辑函数 假设数据集有n个独立的特征,x1到xn为样本的n个特征.常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小: 而我们希望这样的f(x)能够具有很好的逻辑判断性质,最 ...

  9. 【MyBatis学习07】动态sql

    1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装.就拿上一篇博文中对用户的综合查询一例来 ...

  10. ie6、ie7下JSON.parse JSON未定义的解决方法

    解决方法一: var jsons = req.responseText; var s; if (typeof(JSON) == 'undefined'){ s = eval("(" ...