【net1】tcp,route,iptables,macvlan,网卡rename


1.局域网:CSMA/CD

1.早期通过双绞线(只能有一台设备进行数据发送),通过10100…高低电平就能表示数据信号。标识:1–>3,3需要表明自己身份是3。

2.通过集线器广播给所有设备,2345自己分辨是我的消费了,不是我的数据包丢弃。如果1,2同时广播,4收到2个消息混合解析不出,导致1,2这两个数据包全没法用。针对上面问题提出CSMA/CD协议:发送前进行载波侦听,检测这链路上有没有其他人正在发送数据,没有的话再进行数据发送防冲突。hub集线器缺点:1.进行数据的广播会导致带宽利用率较低。2.在链路上同时只能有一个设备发送数据,链路利用率低。3.没有标识,只是广播出去,让设备自己判断是不是自己的,工作效率低。
在这里插入图片描述
3.如下机器1想发到机器3,通过SW寻址到3号口。SW记录了地址(mac地址)和端口(此处端口不是电脑端口而是交换机端口)的映射关系不用广播。买来SW是张空表,怎么建立映射关系?如下机器A插上来后要向B发送数据,发现是空表,确定A是1号口,B找不到就往每个端口发,4号口对B做出了回应,表记录B对应4号口。桥接(如没有映射关系,C和D都对应5,5口转到另一个SW,量大之后不断桥接引起消息洪泛)实现几千条存储,几千条不够至少几十亿。如下mac和端口的映射表不是路由表,局域网(家庭网,校园网等)使用SW效率高。
在这里插入图片描述
win下ipconfig /all查看无线或有线网的mac地址。
在这里插入图片描述

2.互联网:ARP,NAT,路由表比映射表复杂

SW映射表只能实现几千存储,如果表中记录满了,新的来会把旧的替代,所以跨网用路由器(也称网关)。如下家庭网是整个网络2,每台机器都有自己的路由表如ubuntu有路由表,路由器也是linux系统也有路由表。本台电脑的路由表会写默认网关是192.168.0.1(这个点在路由器上),本台电脑就会把数据包发到路由器上,这个路由器自己也有路由表路由到1.52这个网卡,1.52和1.254和1.1在同一个网段下很容易找到。
在这里插入图片描述
ping 192.168.1.254可通,那么网络内传输如1.52—>1.254即网络内怎么传数据的呢?同一网段一找就找到这样的说法是错的,若是这样为什么有了IP地址还要mac地址呢?ip地址(抽象地址)不能直接通信,只能用mac地址(真实地址)通信:ARP协议广播询问谁的ip是1.254,1.254收到这询问就会回复一下,说我的地址是1.254,我的mac地址是。。。1.52知道了1.254对应的mac地址就会在mac层(数据链路层)进行传输。越往上层(往里)ip层包着还有tcp层,ip数据包里数据部分还会有tcp的头,再往上层(往里)还可能有http的头,最后的数据才是我们要传的数据。
在这里插入图片描述
获取mac地址都是通过ARP协议(cat /proc/net/arp),如下ip的源目地址是不变的,一直为0.102和1.254,只有mac地址一直在切换(竖着对比)。有个特例NAT(网络地址转换协议):源地址ip也会进行切换。
在这里插入图片描述
网线连接机器(ifconfig eth0 192.168.1.123 netmask 255.255.255.0)和PC电脑:更改适配器选项 - 以太网- 右击属性 - 配置 如下。
在这里插入图片描述

# echo $1 |grep -Eq "^([0-9a-f][02468ace])    (([:]([0-9a-f]{2})){5})$"  
# 如 1A ( A这一位也就是bit40必须为偶数 )    :44:bb:66:f3
check_macaddr()
{
   
    re="([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}"  # [[:xdigit:]] 表示匹配任意 一个 十六进制数字(0-9,A-F,a-f),{1,2}表示前面的模式可以出现一次或两次,最后的:表示匹配一个冒号字符
    if [[ ! $* =~ ${re} ]]; then
        usage
    fi
}
check_parameter()
{
   
    mac=$1
    strlen=${
   #mac}
    if [ $# -ne 1 ] || [ "$strlen" -ne 17 ];then
        usage
    fi
    check_macaddr "$mac"
}
set_mac()
{
   
    mac=$(echo "$mac" | sed 's/://g'| tr '[:a-z:]' '[:A-Z:]')  # 删除冒号并将小写转为大写
	# 写mac进eeprom
}

# /recipes-plats/network/files/eth1_mac_fixup.sh  # 上电启动,从eeprom读出mac并写进eth
count=0
while [ $count -lt 3 ]
do
    str=$(fruid-util cmm | grep "BMC Base Mac address" | awk -F ":" '{print $2}')
    str=$(echo $str |sed 's/ //g')
    if [ ${
   #str} -ne 12 ];then   # 获取字符串长度
        logger "Loop $count failed to read BMC FRU:$str"
        count=$(($count + 1))
        sleep 1
        continue
    fi
    mac="${str:0:2}:${str:2:2}:${str:4:2}:${str:6:2}:${str:8:2}:${str:10:2}" #中间有冒号

    if [ -n "$mac" -a "${mac/X/}" = "${mac}" ]; then   # mac有值返回true,不用管X
        logger "Loop $count success to configure BMC MAC: $mac"
        #ip link set dev eth1 address "$mac"  
        #在/etc/rc.d/rc.local里加上如下三句,reboot后就不怕MAC复原了
        /sbin/ifdown eth1
        /sbin/ifconfig eth1 hw ether $mac  # modprobe -r e1000  , modprobe e1000 , ethtool -i eth0
        /sbin/ifup eth1  # ifconfig eth0 up , dhclient eth0
        sleep 1
        exit 0
    fi
    count=$(($count + 1))
    sleep 1
done

3.修改mac:

ifconfig eth0 down\r
ifconfig eth0 hw ether a6:bb:51:b5:07:36\r
ifconfig eth0 up\r
如下临时修改,uboot中net.h。
在这里插入图片描述
如下在uboot中ftgmac100.c中。
在这里插入图片描述
mac address in eeprom is used in kernel: to avoid the operation of eht0 down

// u-boot/drivers/net/aspeednic.c
#define MAC_MADR_REG            0x08
#define MAC_LADR_REG            0x0c 
#ifdef CONFIG_TAMA
    #define RETRY_TIMES           		 3
    #define MAC_ADDR_LENGTH				 0x06  // 6个类似00,6个字节
    #define EEPROM_MAX_READ_LEN          (1024)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农编程录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值