GVKun编程网logo

配置CentOS网络前必知的四个IPv4基本概念(centos ip配置)

10

在这篇文章中,我们将为您详细介绍配置CentOS网络前必知的四个IPv4基本概念的内容,并且讨论关于centosip配置的相关问题。此外,我们还会涉及一些关于Android的四个基本概念(线程通信和G

在这篇文章中,我们将为您详细介绍配置CentOS网络前必知的四个IPv4基本概念的内容,并且讨论关于centos ip配置的相关问题。此外,我们还会涉及一些关于Android的四个基本概念(线程通信和GLSurfaceView)、bash – 在两个IPv4地址之间以CIDR表示法查找IPv4网络的算法、centos 7 配置多个IP地址、Centos 7下IPV6 有状态DHCPV6配置的知识,以帮助您更全面地了解这个主题。

本文目录一览:

配置CentOS网络前必知的四个IPv4基本概念(centos ip配置)

配置CentOS网络前必知的四个IPv4基本概念(centos ip配置)

IPv4协议,是目前应用对多的IP协议,其中v是version(版本)的意思。

1、IPADDR,即IP地址:

总共由32位组成,每8位称为一段,总共4段。这32bit可区分为网络部分和主机部分,网络部分是用来区分网段的,主机部分是用来区分同一网段里的不同主机,网段相同,可以理解为处于同一局域网内。在同一网段内进行主机间的通讯,需要用到ARP协议,即Address Resolution Protocol,这个协议主要用于将IP地址解析为网卡的MAC地址,也就是说,在同一网段里,主机间的通信是通过MAC地址进行通信的。

举个例子,主机A要发送某个文件给主机B,但是主机A只知道主机B的IP地址,不知道主机B的MAC地址,于是主机A向同一网段里的所有主机发送该IP地址,请求与对应的主机通信。这时,主机B收到了主机A的数据,发现主机A在call自己,于是便响应了主机A,同时把MAC地址给主机A,这样子,主机A便可以通过MAC与主机B实现通信了。

由这个ARP协议引发了一种黑客技术,ARP欺骗,不过该技术只能针对局域网,对外网无效。

2、NETMASK,即子网掩码:

子网掩码用来确定IP地址中的网络部分,同时也确定了主机部分。也就是说,子网掩码可以判断多台主机是否处于同一网段。

3、GATEWAY,即网关:

可以形象理解为一个网段通往另一个网段的门。即同一网段里的所有IP地址都需要通过它才可以对外网进行访问。

4、DNS,Domain Name Server,即DNS服务器,域名解析服务器。

只有设置了DNS,才可以直接用域名访问外网。例如,126.com便是一个域名,其中的com部分用来标注该域名的类型,常见的还有net、edu、org等。而www则是主机名,约定俗成表示网页服务器。常见的DNS有Google的8.8.8.8。

Android的四个基本概念(线程通信和GLSurfaceView)

Android的四个基本概念(线程通信和GLSurfaceView)

GLSurfaceView提供了下列特性:

1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。

关于ContenValues类

他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值都是基本类型

Android中Looper的实现原理,为什么调用Looper.prepare()就在当前线程关联了一个Looper对象,它是如何实现的。

1、线程间通信机制

首先,looper、handler、messagequeue三者共同实现了android系统里线程间通信机制。如在A、B两个子线程之间需要传递消息,首先给每个子线程绑定一套handler、looper、messagequeue机制,然后这三个对象都与其所属线程对应。然后A线程通过调用B线程的Handler对象,发送消息。这个消息会被Handler发送到B线程的messagequeue中,而属于B线程的Looper对象一直在for循环里无限遍历MessageQueue, 一旦发现该消息队列里收到了新的消息,就会去对消息进行处理,处理过程中会回调自身Handler的heandleMessage方法。从而实现了不同线程间通信。

2、Looper实现原理

Looper类里包含一个消息队列对象和一个线程对象。当创建Looper时,会自动创建一个消息队列,同时将内部线程对象指向创建Looper的线程。当开启Looper后(looper.loop()),会自动进入无限for循环中,不断去遍历消息队列,如果没有消息则阻塞,有消息则回调handler的handlemessage方法进行处理。

3、Looper.prepare()

首先,要使用Looper机制一般会在当前线程中创建Handler对象,里面会自动创建一个looper对象和消息队列,这里面的消息队列属于当前线程空间。但此时的looper还不会去遍历,也没有绑定到当前线程。其中,looper对象内部也包含一个空消息队列对象和空线程。通过Looper.prepare()方法,先让该消息队列指向当前线程的消息队列,让空线程也指向当前线程。从而实现了绑定。

简述Andriod如何处理UI与耗时操作的通信,有哪些方式及各自的优缺点。

主要有三种方法,一为Handler,二为AsyncTask,三为自己开子线程执行耗时操作,然后调用Activity的runOnUiThread()方法更新ui;
handler机制是,在主线程中创建handler对象,
当执行耗时操作时,新建一个线程,在这个线程中执行耗时操作,通过调用handler的sendMessage,post等方法,更新ui界面;

AsyncTask本质上是一个线程池,所有的异步任务都会在这个线程池中的工作线程中执行,当需要操作ui界面时,会和工作线程通过handler传递消息。

自己开子线程执行耗时操作,然后调用Activity的runOnUiThread()方法更新ui,这种方法需要把context对象强制转换成activity后使用

handler机制的优点是 结构清晰,功能明确,但是代码过多;
asyncTask简单,快捷,但是可能会新开大量线程,消耗系统资源,造成FC
第三种方法最好用,代码也非常简单,只是需要传递context对象

我的微信二维码如下,欢迎交流讨论

这里写图片描述

欢迎关注《IT面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧

微信订阅号二维码如下:

这里写图片描述

bash – 在两个IPv4地址之间以CIDR表示法查找IPv4网络的算法

bash – 在两个IPv4地址之间以CIDR表示法查找IPv4网络的算法

我想找出这两个网络之间CIDR表示法中的所有IPv4网络:

10.11.3.64-10.11.3.127
10.11.52.0-10.11.52.255

IPv4网络应具有尽可能短的子网掩码.

将10.11.3.127转换为二进制,添加1并转换回十进制以获得网络的第一个地址相当容易.然后将10.11.52.0转换为二进制,减去1并转换回十进制,以获得网络的最后一个地址.但是,为了找出10.11.3.128-10.11.51.255范围内的CIDR块,有哪些建议哪些算法很聪明?只是一个建议,我认为哪个方向应该足够:)

解决方法

我真的很喜欢这个问题,我昨晚看了一眼并决定试一试.在这一点上,我有一个概念证明shell脚本工作.

免责声明:

>这只是一个概念证明
>我在这里重新发明了轮子,因为我没有使用任何TCP / IP库
>我没有实现输入验证
>如果用编程语言而不是bash编写,这段代码可能会快得多,尽管对于这种特定的网络范围并不是那么慢

值得一提的另一件事是我的理解:

IPv4网络应具有尽可能短的子网掩码.

我们应该尝试从保留的8位网络到提供的最大cidr,在这种情况下为25.

好的,让我们看看脚本在运行:

[root@TIAGO-TEST2 tmp]# time bash  ip.sh   10.11.3.64/25 10.11.52.0/24 
10.11.3.128/25
10.11.4.0/22
10.11.8.0/21
10.11.16.0/20
10.11.32.0/20
10.11.48.0/22

real    0m48.376s
user    0m6.174s
sys     0m34.644s

代码下方:

#! /bin/bash

function split_octet {
    sed -re "s/\./ /g" <<< "$1"
}

function dec2bin {
    perl -e 'printf "%0'"$1"'b\n",'"$2"';'
}

function bin2dec {
    perl -le 'print 0b'"$1"';'
}

function ip2bin {
    str=""
    for octet in $(split_octet $1); do
        str="${str}$(dec2bin 8 $octet)"
    done
    echo "$str"
}

function bin2ip {
    str=""
    for octet in $(grep -Eo '.{8}' <<< $1); do
        dec=$(bin2dec $octet)
        str="${str}.${dec}"
    done
    echo "$str" | sed -re 's/^\.|\.$//g'
}

function ip2dec {
    ip=$1
    bin2dec $(ip2bin $ip )
}

function dec2ip  {
    dec=$1
    bin2ip $(dec2bin 32 $dec )
}

function AND {
    perl -e '   $a=0b'"$1"' & 0b'"$2"';
                        printf "%032b\n",$a
                    '
}

function OR {
    perl -e '   $a=0b'"$1"' | 0b'"$2"';
                        printf "%032b\n",$a
                    '
}

function NOT {
    perl -le '  $a= (~ 0b'"$1"') & 0xFFFFFFFF; 
                            printf "%032b\n",$a
                     '
}

function get_network {
    ip=$1; mask=$2;

    if [ -n "$ip" -a -n "$mask" ];then
    echo $(bin2ip $(AND $(ip2bin $ip) $(ip2bin $mask)))
        return
    fi

    grep -qP "\d+\.\d+\.\d+.\d+/\d+" <<< "$ip"
    if [ "$?" == 0 ];then
        ip=$(get_ip_from_cidr $1 )
        mask=$(get_mask_from_cidr $1)
        echo $( bin2ip $(AND $(ip2bin $ip) $(ip2bin $mask)))
    fi
}

function get_broadcast {
    ip=$1; mask=$2;

    if [ -n "$ip" -a -n "$mask" ];then
        echo $( bin2ip $(OR $(ip2bin $ip) $(NOT $(ip2bin $mask) ) ))
        return
    fi

    grep -qP "\d+\.\d+\.\d+.\d+/\d+" <<< "$ip"
    if [ "$?" == 0 ];then
        ip=$(get_ip_from_cidr $1 )
        mask=$(get_mask_from_cidr $1)
        echo $( bin2ip $(OR $(ip2bin $ip) $(NOT $(ip2bin $mask) ) ))
    fi

}

function get_ip_from_cidr {
    awk -F/ '{print $1}' <<< "$1"
}

function get_mask_from_cidr {
    mask=$(awk -F/ '{print $2}' <<< "$1")
    mask=$(cidr $mask)
    mask=$(bin2ip $mask)
    echo $mask
}

function cidr {
    perl -e '
                        $n='"$1"';
                        $diff=32-$n;
                        print "1"x$n . "0"x$diff;
                    '
}


snet_cidr=$1
enet_cidr=$2

largest_cidr=$(echo -e "$snet_cidr\n$enet_cidr"| awk -F/ '{print $2}' | sort -rn | head -1 )

snet_dec=$( ip2dec $(get_ip_from_cidr $snet_cidr))
enet_dec=$( ip2dec $(get_ip_from_cidr $enet_cidr))

sbc_ip=$(get_broadcast $snet_cidr)
ebc_ip=$(get_broadcast $enet_cidr)

sbc_dec=$(ip2dec $sbc_ip)
ebc_dec=$(ip2dec $ebc_ip)

counter=$sbc_dec

while [ $counter -lt $enet_dec ];do
    tip=$(dec2ip $counter)
    for cidr in $(seq 8 $largest_cidr) ; do 
        tnet_ip=$(get_network $tip/$cidr)
        tnet_cidr=$tnet_ip/$cidr
        tbc_ip=$(get_broadcast $tnet_cidr)
        tnet_dec=$( ip2dec $(get_ip_from_cidr $tnet_cidr))
        tbc_dec=$(ip2dec $tbc_ip)
        if [ $sbc_dec -lt $tnet_dec -a $enet_dec -gt $tbc_dec ];then
            echo $tnet_cidr 
            counter=$tbc_dec
            break
        fi  
    done
    let counter++
done

编辑解释这些变量是什么可能是一个好主意:

> snet_cidr:以cidr表示法启动net
> enet_cidr:cidr中的结束网
> snet_dec:以十进制开始网
> enet_dec:以十进制表示的结束网
> sbc_ip:启动广播ip
> ebc_ip:end broadcast ip
> sbc_dec:启动广播ip
> ebc_dec:结束广播ip

无论你在哪里看到tnet或tbc都是temp net,temp broadcast,temp,因为它在循环内部.

centos 7 配置多个IP地址

centos 7 配置多个IP地址

centos 7 配置多个IP地址

#打开网络配置文件
cd /etc/sysconfig/network-scripts/
vim ifcfg-eno167

找到IPADDR的位置,在下面再增加需要的地址(红色部分):

IPADDR="192.168.8.4"
PREFIX="24"
IPADDR1="192.168.8.5"
PREFIX1="24"
IPADDR2="192.168.8.6"
PREFIX2="24"
GATEWAY="192.168.8.1"
...

注意,增加的配置放在文件最后可能不管用,请放在示例的位置。

重启网络配置:

service network restart

然后查看网络情况,可以看到刚添加的连个地址:

[rootr@localhost ~]$ ip addr
   ...
    inet 192.168.8.4/24 brd 192.168.8.255 scope global eno167
       valid_lft forever preferred_lft forever
    inet 192.168.8.5/24 brd 192.168.8.255 scope global secondary eno167
       valid_lft forever preferred_lft forever
   inet 192.168.8.6/24 brd 192.168.8.255 scope global secondary eno167
       valid_lft forever preferred_lft forever

这时候如果使用ping命令检测的话,如果没有作用,可以等待一段时间再检测。


Centos 7下IPV6 有状态DHCPV6配置

Centos 7下IPV6 有状态DHCPV6配置

yum源安装kea

yum install epel-release

yum install kea



DEMON

ps aux| grep kea

rpm -qa kea


查看dhcpv6默认配置

cat /etc/kea/kea.conf


启动kea-dhcpv6并查看kea启动过程

systemctl start kea-dhcp6

systemctl status kea-dhcp6

systemctl -l status kea-dhcp6


通过tcpdump查看服务器数据包交互过程

tcpdump -i eth0 -w dhcp6.pcap




关闭防火墙

systemctl stop firewalld.service

注意:必须要关闭防火墙否则造成dhcpv6分配地址无法下发。


用到的文件:

/var/lib/kea/kea-leases6.csv 默认情况下存放ipv6地址以及终端的设备信息,可查看到域账号mac地址等信息。

/var/log/kea-dhcp6.log 我开的debug模式。可查看dhcp6运行状态的日志。



Centos 7 修改dns

修改/etc/NetworkManager/NetworkManager.conf

[main]

plugins=ifcfg-rh

dns=none

手工修改 /etc/resolv.conf

nameserver 114.114.114.114

nameserver 8.8.8.8


服务器网卡静态ipv6配置:


[root@localhost kea]# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736

TYPE=Ethernet

BOOTPROTO=static

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=no

IPV6_DEFROUTE=yes

IPV6_PEERDNS=yes

IPV6_PEERROUTES=yes

IPV6_FAILURE_FATAL=no

NAME=eno16777736

UUID=03b35ca7-4678-48ca-ab46-5782367cd56a

DEVICE=eno16777736

ONBOOT=yes

IPADDR=X.X.X.X

GATEWAY=X.X.X.X

NETMASK=X.X.X.X

IPVADDR=2001:da8:XXXX:XXXX:24::125

IPV6_DEFAULTGW=2001:da8:XXXX:XXXX:24::1

IPV6ADDR=2001:da8:XXXX:XXXX:24::125/80




kea-dhcpv6 配置:


{


"Dhcp6":

{

# Add names of interfaces to listen on.

"interfaces-config": {

"interfaces": ["eno16777736/2001:da8:XXXX:XXXX:24:aefd:ddb0:7d02"]

},


"option-data": [{"name": "unicast","data": "2001:da8:XXXX:XXXX:24:aefd:ddb0:7d02"} ],

# Use Memfile lease database backend to store leases in a CSV file.


# Setup reclamation of the expired leases and leases affinity.

# Expired leases will be reclaimed every 10 seconds. Every 25

# seconds reclaimed leases,which have expired more than 3600

# seconds ago,will be removed. The limits for leases reclamation

# are 100 leases or 250 ms for a single cycle. A warning message

# will be logged if there are still expired leases in the

# database after 5 consecutive reclamation cycles.

# "expired-leases-processing": {

# "reclaim-timer-wait-time": 10,

# "flush-reclaimed-timer-wait-time": 25,

# "hold-reclaimed-time": 3600,

# "max-reclaim-leases": 100,

# "max-reclaim-time": 250,

# "unwarned-reclaim-cycles": 5

# },


# Addresses will be assigned with preferred and valid lifetimes

# being 3000 and 4000,respectively. Client is told to start

# renewing after 1000 seconds. If the server does not respond

# after 2000 seconds since the lease was granted,client is supposed

# to start REBIND procedure (emergency renewal that allows switching

# to a different server).

"preferred-lifetime": 3000,

"valid-lifetime": 4000,

"renew-timer": 1000,

"rebind-timer": 2000,


# The following list defines subnets. Uncomment to enable them.

"subnet6": [

{ "subnet": "2001:da8:XXXX:XXXX:25::/80",

"pools": [ { "pool": "2001:da8:XXXX:XXXX:25::/80" } ],

"interface-id":"vlan25"


},


{ "subnet": "2001:da8:XXXX:XXXX:26::/80",

"pools": [ { "pool": "2001:da8:XXXX:XXXX:26::/80" } ],

"interface-id":"vlan26"


},

# { "subnet": "2001:db8:3::/64",

# "pools": [ { "pool": "2001:db8:3::/80" } ] },

# { "subnet": "2001:db8:4::/64",

# "pools": [ { "pool": "2001:db8:4::/80" } ] }

]

},


# DHCP DDNS configuration starts here.


# Logging configuration starts here. It tells Kea servers to store

# all log messages (on severity INFO or more) in a file.

# debuglevel variable is used on DEBUG level only.

"Logging":

{

"loggers": [

{

"name": "kea-dhcp4",

"output_options": [

{

"output": "/var/log/kea-dhcp4.log"

}

],

"severity": "INFO",

"debuglevel": 0

},

{

"name": "kea-dhcp6",

"output_options": [

{

"output": "/var/log/kea-dhcp6.log"

}

],

"severity": "DEBUG",/日志开启到debug级别,可以查看分配的地址信息。

"debuglevel": 99

},

{

"name": "kea-dhcp-ddns",

"output_options": [

{

"output": "/var/log/kea-ddns.log"

}

],

"debuglevel": 0

}

]

}


}



如果自己网段内需要dhcpv6服务 需开通以下:




[root@localhost kea]# cat /etc/kea/kea.conf

# This is a basic configuration for the Kea DHCPv4 and DHCPv6 servers.

# subnet declarations are commented out and no interfaces are listed.

# Therefore,the servers will not listen or respond to any queries.

# The basic configuration must be extended to specify interfaces on

# which the servers should listen. Also,subnets and options must be

# declared.

{


# DHCPv4 configuration starts here.

#"Dhcp4":

#{

# Add names of interfaces to listen on.

# "interfaces-config": {

# "interfaces": [ ]

# },


# Use Memfile lease database backend to store leases in a CSV file.

# "lease-database": {

# "type": "memfile"

# },


# Setup reclamation of the expired leases and leases affinity.

# Expired leases will be reclaimed every 10 seconds. Every 25

# seconds reclaimed leases,


# Global (inherited by all subnets) lease lifetime is mandatory parameter.

# "valid-lifetime": 4000,


# Below an example of the simple subnet declaration. Uncomment to

# enable it. This is a list,denoted with [ ],of structure,denoted

# with { }. Each structure describes a single subnet and may have

# several parameters. One of those parameters is "pools" that is

# also a list of structures.

# "subnet4": [

# { "subnet": "192.0.2.0/24",

# "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ] }

# ]

#},


# DHCPv6 configuration starts here.

"Dhcp6":

{

# Add names of interfaces to listen on.

"interfaces-config": {

"interfaces": ["eno16777736/2001:da8:XXXX:XXXX:24::125"]

},"data": "2001:da8:XXXX:XXXX:24::125"} ],


{ "subnet": "2001:da8:XXXX:XXXX:24::/80",

"pools": [ { "pool": "2001:da8:XXXX:XXXX:24::/80" } ],

"interface":"eno16777736"


},

{ "subnet": "2001:da8:XXXX:XXXX:26::/80",

"debuglevel": 99

},

"debuglevel": 0

}

]

}


}

今天的关于配置CentOS网络前必知的四个IPv4基本概念centos ip配置的分享已经结束,谢谢您的关注,如果想了解更多关于Android的四个基本概念(线程通信和GLSurfaceView)、bash – 在两个IPv4地址之间以CIDR表示法查找IPv4网络的算法、centos 7 配置多个IP地址、Centos 7下IPV6 有状态DHCPV6配置的相关知识,请在本站进行查询。

本文标签: