文章目录
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