网络分层
思考一个问题?
为什么网络要分层?
因为复杂的程序都要分层,这是程序设计的要求
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,计算机整个体系从上到下都是按照严格的层次结构设计的。
理解计算机网路中的概念,一个很好的角度就是:想象网络包就是一段buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。你想象自己有很多的网口,从某个口拿进一个网络包来,用自己的程序处理一下,再从另一个网口发送出去。
web开发中,三层架构模型,以及MVC
只要在网络上跑的包,都是完整的。可以有下层没上层,但是绝对不可能有上层没下层。
以TCP协议来说,我们都知道TCP建立连接需要三次握手。那TCP在进行三次握手的时候,IP和MAC层在做什么呢?
当然是TCP每发送一个消息,都会带着IP层和MAC层了。因为TCP每发送一个消息,IP层和MAC层的所有机制都要运行一遍。而你可能会认为只有TCP进行了三次握手,其实IP层和MAC层也为此忙活很久了。
IP地址
如何查看IP地址
windows下ipconfig
Linux ifconfig & ip addr
ora@ora:~$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:e9:73:04:0f
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
enp0s31f6 Link encap:Ethernet HWaddr e0:d5:5e:45:69:59
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:16 Memory:ef200000-ef220000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4816126 errors:0 dropped:0 overruns:0 frame:0
TX packets:4816126 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6481363724 (6.4 GB) TX bytes:6481363724 (6.4 GB)
wlx64fb81657322 Link encap:Ethernet HWaddr 64:fb:81:65:73:22
inet addr:192.168.198.152 Bcast:192.168.198.255 Mask:255.255.255.0
inet6 addr: fe80::30fb:fe91:31f:884a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1025544 errors:0 dropped:0 overruns:0 frame:0
TX packets:198910 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:372764486 (372.7 MB) TX bytes:23978433 (23.9 MB)
ora@ora:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether e0:d5:5e:45:69:59 brd ff:ff:ff:ff:ff:ff
3: wlx64fb81657322: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 64:fb:81:65:73:22 brd ff:ff:ff:ff:ff:ff
inet 192.168.198.152/24 brd 192.168.198.255 scope global dynamic wlx64fb81657322
valid_lft 36645sec preferred_lft 36645sec
inet6 fe80::30fb:fe91:31f:884a/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:e9:73:04:0f brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
ifconfig & ip addr
区别:net-tools和iproute2
想象你登录一个被剪裁过的非常小的Linux系统中,发现既没有ifconfig也没有ip addr命令,你可能会觉得这个系统压根儿没法用。这个时候,你可以自行安装net-tools和iproute这两个工具。大多时候,这两个命令是系统自带的。
net-tools起源于BSD,自2001年起,Linux社区已经停止对其维护,而iproute2旨在取代net-tools,并提供了一些新功能。一些Linux发行版已经停止支持net-tools,只支持iproute2。net-tools通过procfs/proc和ioctl系统调用去访问和改变内核的网络配置。iproute2则通过netlink套接字接口与内核通讯。
net-tools中工具的名字比较杂乱,而iproute2则相对整齐和直观,基本是ip命令加后面的子命令。很多年过去了,net-tools还是广泛使用,并没有完全取代,所以对于两者的命令最好都能够掌握。
IP地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。
IPv4是32位地址,后来因为IP地址不够用,又有了IPv6,有128位,现在看来是够了,但是未来计算机数量不断增多,会不会出现不够用的情况还是未知。
类别 | IP地址范围 | 最大主机数 | 私有IP地址范围 |
---|---|---|---|
A | 0.0.0.0 - 127.255.255.255 | 16777214 | 10.0.0.0 - 10.255.255.255 |
B | 128.0.0.0 - 191.255.255.255 | 65534 | 172.16.0.0 - 172.31.255.255 |
C | 192.0.0.0 - 223.255.255.255 | 254 | 192.168.0.0 - 192.168.255.255 |
由上图可以看出,对于C类地址,包含的最大主机数量太少了,只有254个。而B类地址的最大主机数量又太多了。6万多台机器放在一个网络下面,一般企业基本达不到这个规模,闲着的地址就会造成浪费。
无类型域间选路(CIDR)
出于以上的问题,于是有了一个折中的方式,CIDR。这种方式打破了原来设计的几类地址的做法,而是把32的IP地址一分为二,前面是网络号,后面是主机号。至于从哪里分,我们可以看到这类地址后面有个/加一个数字。如10.100.100.1/24。即表示前24位是网络号,后8位是主机号
伴随着CIDR存在的,一个是广播地址10.100.100.255。如果发送这个地址,所有10.100.100网络里的机器都可以收到。另一个是子网掩码 255.255.255.0
将子网掩码和IP地址按位计算AND,就可以得到网络号
MAC地址
link/ether e0:d5:5e:45:69:59 brd ff:ff:ff:ff:ff:ff
MAC地址,是一个网卡的物理地址,用16进制,6个byte表示
这里大家思考一个问题:
MAC地址号称全局唯一,不会有两个网卡有相同的MAC地址,而且MAC地址是在网卡生产出来时就确定了的。那为什么整个互联网的通信,不直接全部使用MAC地址呢?按理说只要知道对方的MAC地址,就可以把信息直接传过去呀。
这样当然是不行的。一个网络包要从一个地方到另一个地方,除了要有确定的地址,还需要有定位功能。而有门牌号码属性的IP地址,才是有远程定位功能的。
我们举个简单的例子,我目前坐标是杭州市西湖区浙大路38号智权大楼D座5层,你为了找到我,可以通过在校园内问人,智权大楼在哪里?D座在哪里?你应该是可以找到D座的。但是如果我只告诉你我的身份证号码,你要寻找我,肯定无从找起,几乎没有人会知道身份证号码为0000的人在哪里。
MAC地址更像是身份证,是一个唯一的标识。
为什么设置成唯一的?
为了在组网的时候,不同的网卡放在一个网络的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识。
我们可以简单的理解对于IP地址,有定位功能;MAC是身份证,无定位功能。
MAC其实也是有一定的定位的功能的,只不过范围很小,局限在一个子网里面。比如你找到了D座5层,但是我具体在哪一个办公室,你并不知道。这个时候,你就要发挥你河东狮吼的本事,大吼一声,身份证号为411527—-的是哪位?我听到后,就会站出来,说是我啊,我在这里。但这里的前提是我要在D座5层,如果我压根就不在杭州,或者说我不在智权楼,你即使是喊破嗓子我也是听不到的,你也无法找到我。
这里可以看出MAC的通信范围比较小,局限在一个子网里面。例如,从IP地址为192.168.10.2/24这台主机访问192.168.10.2/24这台主机,是可以直接使用MAC地址的。一旦跨子网,即从192.168.10.2/24到192.168.11.2/24,MAC地址就不行了,需要IP地址起作用。