zoukankan      html  css  js  c++  java
  • 《TCP/IP作品详细解释2:达到》注意事项--IP地址

    1.接口和地址

    如下面的图全部本文中讨论的接口和地址的结构看一个示例配置:


    上图中显示了我们三个接口样例:以太网接口,SLIP接口和环回接口。

    它们都有一个链路层地址作为地址列表中的第一个结点。

    显示的以太网接口有两个IP地址。SLIP接口有一个IP地址,而且环回接口有一个IP地址和一个OSI地址。

    全部的IP地址都被链接到in_ifaddr列表中,而且全部链路层地址能从ifnet_addrs数组訪问。

    后面的部分讨论上图的数据结构以及用来查看和改动这些结构的IP专用ioctl命令。


    2.sockaddr_in结构

    之前讨论了通用的sockaddr和ifaddr结构。如今我们说明IP专用的结构:sockaddr_in和in_ifaddr。

    在Internet域中的地址存放在

    一个sockaddr_in结构:


    因为历史原因,Net/3以网络字节序将Internet地址存储在一个in_addr结构中,这个结构仅仅有一个成员s_addr,它包括这个地址。


    3.in_ifaddr结构

    下图显示了Internet协议定义的接口地址结构。


    对于每一个指派给一个接口的IP地址,分配一个in_ifaddr结构,而且加入到接口地址列表中和IP地址全局列表中。

    下图为以太网、PPP和环回in_ifaddr结构。


    4.地址指派

    当接口结构在系统初始化期间被识别时的初始化。在Internet协议能通过这个接口进行通信前,必须指派一个IP地址。一个Net/3

    内核执行,程序ifconfg就配置这些接口,ifconfig通过在某个插口上的ioctl系统调用来发送配置命令。通常都是通过系统引导时

    调用shell脚本运行的。

    下图是本文涉及到的ioctl命令。命令相关的地址必须是此命令插口所支持的地址族类,对于IP地址。ioctl命令在一个UDP插口上

    发送。


    本文中说明的ioctl的函数。


    SIOCG命令用于获取地址信息。

    SIOCS用于设置地址信息。

    SIOC代表socket ioctl。

    上图中的命令改动一个接口的相关地址信息。因为地址时特定协议使用的,因此。命令处理是与协议相关的。


    4.1.ifioctl函数

    ifioctl协议将协议相关的ioctl命令传递给此插口关联的pr_usrreq函数。将控制权交给udp_usrreq,而且又马上传给in_control,

    在in_control中进行大部分处理。

    我们依照以下的顺序查看这个接口ioctl命令。以及这些命令在in_control中处理。

    1.指派一个地址、网络掩码或目标地址

    2.指派一个广播地址

    3.取回一个地址,网络地址。目标地址或广播地址

    4.给一个接口指派多播地址

    5.删除一个地址

    对于全部这命令,在in_control函数中有两个switch语句。第一个switch语句进行前提处理,然后在第二个switch语句中处理

    命令。


    4.2.前提条件:SIOCSIFADDR、SIOCSIFNETMASK和SIOCSIFDSTADDR

    对于这三个命令in_control函数中第一个switch做同样的处理:

    1.仅用于超级用户

    2.分配并初始化in_ifaddr结构



    4.3.地址指派SIOCSIFADDR

    在第二个switch中处理这个命令,调用in_ifinit完毕全部的工作。

    4.4.in_ifinit函数

    if_ifinit的主要过程例如以下:
    1.将地址拷贝到此结构并将此变化通知硬件。
    2.忽略原来地址配置的不论什么路由。
    3.为这个地址建立一个子网掩码。
    4.建立一个默认路由到连接的网络或主机。
    5.将此接口增加到全部主机组。

    4.5.网络掩码指派:SIOCSIFNETMASK

    in_control函数从ifreq结构中获取网络掩码。并将它以网络字节序保存在ia_sockmask。以主机字节序保存在ia_subnetmask中。


    4.6.目的地址指派:SIOCSIFDSTADDR

    对于点对点接口,在链路还有一端的系统的地址使用该命令指定。

    代码设置新地址后,使用函数if_ioctl通知硬件。假设地址原来有一个关联的路由。首先调用rtinit删除这路由,并再次调用rtinit

    为新地址安装一个路由。


    4.7.获取接口信息

    获取接口信息的过程比較简单。将in_ifaddr相应的信息拷贝到ioctl參数ifreq中。


    4.8.每一个接口多个IP地址

    SIOCG和SIOCS命令仅仅操作一个接口关联的第一个IP地址,为支持每一个接口多个IP地址,必须使用SIOCAIFADDR命令指派和

    配置其它的地址。

    实际上SIOCAIFADDR能完毕SIOCG和SIOCS命令能完毕的操作。

    程序ifconfig使用SIOCAIFADDR来配置一

    个接口的全部地址信息。


    4.9.删除IP地址:SIOCDIFADDR

    命令SIOCDIFADDR从一个接口删除IP地位置。查找并从当前接口要求IP同样的地址结构,并删除任何路由都与此地址相关联。

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    springboot(6)-热部署
    springboot(5)-文件上传
    ubuntu修改tomcat使用的jdk
    jstack使用
    HeapAnalyzer如何使用
    查看linux下tomcat使用的jdk版本
    ubuntu-tomcat安装目录
    vi命令
    211java-jdk安装记录
    linux的java安装目录
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4845982.html
Copyright © 2011-2022 走看看