Network protocol basic knowledge
网络协议是互联网间的通信的基础,学习来源趣谈网络协议。
介绍
我们从浏览器输入URL观察:
输入URL -> DNS(得到门牌号 IP) -> 浏览器打包HTTP请求 -> TCP传输 -> IP传输 -> MAC层传输
1、应用层:DNS/HTTP/HTTPS是应用层协议。浏览器将数据打包,传至传输层TCP/UDP。打包的数据包含HTTP头和内容。HTTP头包含:POST/GET、URL、协议版本等等。
2、传输层:打包下一步,将TCP头加入传入包。TCP头包含:浏览器端口、请求应用端口。
3、网络层:浏览器将传输层的数据交给操作系统的网络层。网络层是IP协议。将IP头加入数据包,包含本机IP和请求IP。
4、MAC层:操作系统将IP包,传输给网卡。将MAC头写入包,头包含本机MAC和网关的MAC。网关收到包后,会自己判断下一步怎么走。
5、当传输到最后一个网关,它会在局域网内大吼谁是目标IP,目标服务器返回一个MAC地址。网关通过这个MAC地址,将包传输给它。
传输包如:
需要注意点:
IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。
MAC 地址更像是身份证,是一个唯一的标识。
一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。而有门牌号码属性的 IP 地址,才是有远程定位功能的。
网络分层
网络分层和我们代码分层也是一样的,保证每一层职责单一,降低系统整体复杂度。
理解计算机网络概念:
网络包就是一段有格式的Buffer。这种包,可以跑在网络中的各种设备,如服务器、交换机、路由器。而程序做的是,正确的处理这些包,再传输出去。
简单的图形说明:
可以看出,每一层都对网络包进行检测并加工处理。所以,对一个TCP协议的包,必须包含IP层和MAC层,才能发送出去。而所谓二层设备就是工作在MAC层的设备,三层设备工作在IP层。
重点:
- 只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。
查看IP
Linux下也可以通过ip addr查看。结果如下:
|
|
第一个lo是Loopback,又称环回接口。被分配127.0.0.1,仅用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。
来看第二个,link/ether 00:16:3e:00:00:47 brd ff:ff:ff:ff:ff:ff
这是一个MAC地址,它是唯一的。但是消息传递,不能仅仅通过MAC,还需要一个宽泛的定位功能即IP。所以,MAC 地址更像是身份证,是一个唯一的标识。IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。
<BROADCAST,MULTICAST,UP,LOWER_UP>
这是一个网络设备状态标识。
UP 表示网卡处于启动的状态。
BROADCAST 表示这个网卡有广播地址,可以发送广播包。
MULTICAST 表示网卡可以发送多播包。
LOWER_UP 表示网线插着。
MTU1500 最大传输单元MTU为1500,这是以太网的默认值。MTC是MAC层的概念。
qdisc pfifo_fast
这是一个排队规则。表示内核会按照这个规则,将数据包加入队列。
CIDR
Classless Inter-Domain Routing :无类型域间选路
我们知道一个IP地址,会分隔成4个部分,每个部分8bit,所以IP address总共32位,肯定不够用呐。同时32位的IP地址还分成了[5类,每一类都有最大主机数] https://zh.wikipedia.org/wiki/%E5%88%86%E7%B1%BB%E7%BD%91%E7%BB%9C
C类254个太少了,B类65534个又太多了。所以就出现了一个折中的方式:无类型域间选路(CIDR)。
这种方式打破上面的几类地址的做法,将32位的IP地址一分为二,前是网络号
,后是主机号
。
如10.100.122.2/24
,这种地址表示形式就是CIDR。其中/后的24
表示,32位中,前24位是网络号,后8位是主机号。
伴随着CIDR,存在一个广播地址: 10.100.122.255
和 子网掩码: 255.255.255.0
子网掩码 and IP地址 就可以计算出 网络号: 10.100.122.0
一般我们在Internet上使用的是A/B/C的公有IP段,内网中使用的是私有IP段
- A类私有IP:10.0.0.0~10.255.255.255
- B类私有IP:172.16.0.0~172.31.255.255
- C类私有IP:192.168.0.0 ~192.168.255.255
IP配置
网络中的机器要与其他机器通信,就需要一个通信地址,我们给网卡配置这个地址。
配置方式:
|
|
当然,这个地址可以配置错误。如不在一个网段:192.168.1.100和10.10.5.11。这时候10.10.5.11去ping 192.168.1.100会发生什么呢?
首先,网络上传输的包必须是完整的。所以,ping(网络层)时,需要加入MAC头,才能发送出去。
Linux获取MAC分两种情况:
- 同网段调用:通过ARP请求,获取MAC地址。再发出包。
- 跨网段调用:请求发送到网关,MAC头请求MAC是网关的MAC地址。再发出包。
所以对于10.10.5.11->192.168.1.100,传输包的请求目标IP虽然是192.168.1.100,但是请求MAC地址是它的网关的MAC地址,所以192.168.1.100并不会接收这个包。
DHCP
Dynamic Host Configuration Protocol 有个 动态注解配置协议 来帮助我们进行IP配置。
它的主要流程:Discover->Offer->Request->Acknowledge
1、新加入的机器A会向广播地址255.255.255.255发送请求包。
2、DHCP Server收到后,会回复一个offer消息 告知提供的IP信息。
3、A收到offer后,会广播request包,告诉网络中的其他DHCP Server,它接受的IP信息。
4、而被A接受的DHCP Server会回复A一个ACK消息,表示配置成功。此时A就可以合法使用这个IP了。
DHCP 协议主要是用来给客户租用 IP 地址,和房产中介很像,要商谈、签约、续租,广播还不能“抢单”;
组网
机器间通信,如局域网游戏。
物理层
这里的物理层,可以理解成在硬件电路上传输01这样的电平信号。
典型代表:集线器
首先配置机器在同一网段,这是互通的前提。然后,通过集线器连接起来,就可以互相通信了。
集线器没有大脑,它完全在物理层工作。它会将自己收到的每一个字节,都复制到其他端口上去。采用广播模式,每台电脑都能收到。这里通过IP获取目标机器MAC,采用的是ARP协议。因为必须完整的包,才能在网络上传输。
所以,广播就出现了问题。当接入机器多时,传输数据包增多,就会混乱产生广播风暴,造成网络性能下降。
数据链路层
1、网桥:
集线器只能懂物理层的电平信号,而网桥可以分析出数据包,并从中提取出MAC信息,根据MAC信息将数据包精确转发,减少了广播风暴。注意 网桥只是在集线器基础上,进行多个子网的连接。如图:
看出,一个hub里的机器仍会有广播。它的出现,可能受限于当时的硬件水平。
2、交换机:
交换机出现就完全解决了广播。它是工作在MAC层。它有个转发表,记录了 接入口机器的MAC地址 与 对应交换机的出口。从而实现了精确转发。
Ethernet/Internet区别
读到这里需要补充一下基础知识。
Ethernet:以太网。它是局域网内的一种通信协议标准。它是局域网(LAN)中的一种。
Internet:因特网。它是一个专有名词,指的是目前全球使用的最大信息网。采用TCP/IP作为通信协议。前身是美国的ARPNET。
internet:互联网。它是一个通用名词。泛指多个计算机网络连接成的网络。
所以从概念上 可以理解:
Ethernet <= LAN <= internet != Internet
ICMP
ICMP全称:Internet Control Message Protocol。它与IP协议一样处于网络层,并且ICMP报文是封装在IP包里的。
网络包在传输时会遇到各种问题,IP协议并不保证数据被送达,ICMP协议就是来保证传输的一种协议。 ICMP会将网络包传输结果返回出来。
它可分为查询报文类型和差错报文类型
查询报文
ping就是查询报文。通过主动请求,并获得应答。来计算往返时间。
mac下可以通过 tcpdump -i en4 -v -c 20 -e icmp
抓包查看。ping主要用到ICMP echo request 和 ICMP echo reply类型。
差错报文
当传输IP数据报发生错误时,ICMP协议会发送一个ICMP差错报文给源主机,好让源主机做相应处理。
traceroute就是利用差错报文 来追踪数据包经过的路由。它主要利用了IP协议的TTL(可理解数据包允许跳动的次数,一跳就是经过一个路由)。先将TTL=1,当第一个路由收到后,将TTL-1=0表示包失效,返回ICMP差错报文。再将TTL=2,如此反复,直到到达目的主机。
实验: traceroute www.baidu.com 通过wireshark对ip.dst=180.97.33.108进行抓包 如下:
发现本机发出的是一个端口>30000的UDP包,并且一个节点会发三个包。发送后一跳时,TTL会增加1。
注意: 有的服务器不会回ICMP差错报文,这就是traceroute看不到中间路由的原因,也是traceroute无法到达最终节点的原因。
出网关
当请求的IP和本机IP不在同一网段时,数据包就需要通过一个网关,网关通常是一个路由器(一个三层转发的设备)。它的作用:把MAC头和IP头都取下来,然后根据里面内容进行转发。
其中进行转发的方式,通过一个路由算法。简单的如 静态路由,本质是配置一条条规则,记录了要访问IP的下一跳。
在转发的同时,数据包里的MAC地址肯定发生了变化,即MAC头里的 目的MAC地址 改成了网关的MAC地址。
如下图:
数据包里IP变化有两种情况:
1、NAT网关:改变IP
这里先解释一下NAT。NAT主要解决IPv4地址短缺的问题。通过公网的IP+Port来映射内外的IP+Port,进行转发。
例如家里的路由器,我们发出的数据包 最终都会被路由器NAT成运营商的地址。也就是将源IP改成路由器对应的公网IP。
2、转发网关:不改变IP
前提,经过的局域网之间的网段都不会冲突。所以,就不会出现源IP和目的IP都是192.168.1.101这种的情况。也就不会有数据包里的IP变化。