在这篇文章中,我们将为您详细介绍配置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配置)
- Android的四个基本概念(线程通信和GLSurfaceView)
- bash – 在两个IPv4地址之间以CIDR表示法查找IPv4网络的算法
- centos 7 配置多个IP地址
- Centos 7下IPV6 有状态DHCPV6配置
配置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)
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网络的算法
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块,有哪些建议哪些算法很聪明?只是一个建议,我认为哪个方向应该足够:)
解决方法
免责声明:
>这只是一个概念证明
>我在这里重新发明了轮子,因为我没有使用任何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地址
#打开网络配置文件
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配置
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配置的相关知识,请在本站进行查询。
本文标签: