Contents

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地址,将包传输给它。

传输包如:

https://raw.githubusercontent.com/Fedomn/misc-blog-assets/master/network-overview.png

需要注意点:

  • IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。

  • MAC 地址更像是身份证,是一个唯一的标识。

  • 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。而有门牌号码属性的 IP 地址,才是有远程定位功能的。

网络分层

网络分层和我们代码分层也是一样的,保证每一层职责单一,降低系统整体复杂度。

理解计算机网络概念:

网络包就是一段有格式的Buffer。这种包,可以跑在网络中的各种设备,如服务器、交换机、路由器。而程序做的是,正确的处理这些包,再传输出去。

简单的图形说明:

https://raw.githubusercontent.com/Fedomn/misc-blog-assets/master/network-layer.jpg

可以看出,每一层都对网络包进行检测并加工处理。所以,对一个TCP协议的包,必须包含IP层和MAC层,才能发送出去。而所谓二层设备就是工作在MAC层的设备,三层设备工作在IP层。

重点:

  • 只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

查看IP

Linux下也可以通过ip addr查看。结果如下:

1
2
3
4
5
6
7
8
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:00:00:47 brd ff:ff:ff:ff:ff:ff
    inet 10.10.5.11/24 brd 10.10.5.255 scope global eth0
       valid_lft forever preferred_lft forever

第一个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配置

网络中的机器要与其他机器通信,就需要一个通信地址,我们给网卡配置这个地址。

配置方式:

1
2
3
4
5
6
使用 net-tools:
$ sudo ifconfig eth1 10.0.0.1/24
$ sudo ifconfig eth1 up
使用 iproute2:
$ sudo ip addr add 10.0.0.1/24 dev eth1
$ sudo ip link set up eth1

当然,这个地址可以配置错误。如不在一个网段: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信息将数据包精确转发,减少了广播风暴。注意 网桥只是在集线器基础上,进行多个子网的连接。如图:

https://raw.githubusercontent.com/Fedomn/misc-blog-assets/master/network-bridge.png

看出,一个hub里的机器仍会有广播。它的出现,可能受限于当时的硬件水平。

2、交换机:

交换机出现就完全解决了广播。它是工作在MAC层。它有个转发表,记录了 接入口机器的MAC地址 与 对应交换机的出口。从而实现了精确转发。

https://raw.githubusercontent.com/Fedomn/misc-blog-assets/master/network-switch.png

bridge/switch参考

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进行抓包 如下: https://raw.githubusercontent.com/Fedomn/misc-blog-assets/master/network-wireshark-traceroute.png

发现本机发出的是一个端口>30000的UDP包,并且一个节点会发三个包。发送后一跳时,TTL会增加1。

注意: 有的服务器不会回ICMP差错报文,这就是traceroute看不到中间路由的原因,也是traceroute无法到达最终节点的原因。

出网关

当请求的IP和本机IP不在同一网段时,数据包就需要通过一个网关,网关通常是一个路由器(一个三层转发的设备)。它的作用:把MAC头和IP头都取下来,然后根据里面内容进行转发。

其中进行转发的方式,通过一个路由算法。简单的如 静态路由,本质是配置一条条规则,记录了要访问IP的下一跳。

在转发的同时,数据包里的MAC地址肯定发生了变化,即MAC头里的 目的MAC地址 改成了网关的MAC地址。

如下图: https://raw.githubusercontent.com/Fedomn/misc-blog-assets/master/network-mac-ip-head.jpg

数据包里IP变化有两种情况:

1、NAT网关:改变IP

这里先解释一下NAT。NAT主要解决IPv4地址短缺的问题。通过公网的IP+Port来映射内外的IP+Port,进行转发。

例如家里的路由器,我们发出的数据包 最终都会被路由器NAT成运营商的地址。也就是将源IP改成路由器对应的公网IP。

2、转发网关:不改变IP

前提,经过的局域网之间的网段都不会冲突。所以,就不会出现源IP和目的IP都是192.168.1.101这种的情况。也就不会有数据包里的IP变化。