上期回顾
首先,我们来回答上一次分享笔者提出的问题,集线器、交换机、路由器 在网络传输 计算机病毒 时也会中病毒么??
先不忙,我们先理解一下计算机病毒原理。我们得明白,计算机病毒它是一个恶意的计算机程序。所以它需要:
1. 执行的底层操作系统
2. 完整的程式
3. 触发的条件
交换机 等设备具备了第一要素,但是不满足第二个要素,因为它们在网络中负责传输的是一个个 数据包,所以不能够形成一个完整的程式,因此,计算机病毒 也无法运行毒害它们。
好了,我们先对前面分享的内容,做一个 小结。
我们已经明白,网络通信 就是 交换数据包。A向B 发送 一个数据包,后者收到了,回复 一个数据包,从而实现两台电脑之间的通信。数据包 的结构,基本上是下面这样:

发送这个包,需要知道 两个地址:
1. 对方的MAC地址
2. 对方的IP地址
有了这 两个地址,数据包 才能准确送到 接收者 手中。但是,前面说过,MAC
地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC
地址,必须通过 网关(gateway
)转发。

于是就把这个数据包发到 网关A。网关A 通过 路由协议,发现 4号 位于 子网络B,又把数据包发给 网关B,网关B 再转发到 4号电脑。
1号 把 数据包 发到 网关A,必须知道 网关A 的MAC
地址。
所以,数据包的 目标地址,实际上分成 两种 情况:
场景 | 数据包地址 |
---|---|
同一个子网络 | 对方的MAC地址,对方的IP地址 |
非同一个子网络 | 网关的MAC地址,对方的IP地址 |
用户视角的网络
- 静态IP地址
你买了一台新MAC
,插上网线,开机,这时MAC
能够上网吃鸡吗?

通常我们必须做一些设置。有时,管理员(或者ISP
)会告诉你下面四个参数,你把它们填入操作系统,计算机就能连上网了:
1. 本机的IP地址
2. 子网掩码
3. 网关的IP地址
4. DNS的IP地址
下图是Windows
系统的设置窗口。

这 四个参数 缺一不可。
由于它们是给定的,计算机每次 开机,都会分到同样的IP
地址,所以这种情况被称作 静态IP地址上网 。
但是,这样的设置很 专业,普通用户 望而生畏,而且如果一台电脑的IP
地址保持不变,其他电脑就不能使用这个地址,不够灵活。出于这两个原因,大多数用户使用 动态IP地址上网。
- 动态
IP
地址
所谓 动态IP地址,指计算机开机后,会 自动分配 到一个IP
地址,不用人为设定。它使用的协议叫做DHCP
协议。
这个协议规定,每一个子网络中,有一台计算机 负责管理本网络 的所有IP地址,它叫做DHCP
服务器。
新的 计算机 加入网络,必须向DHCP
服务器发送一个DHCP
请求数据包,申请IP
地址和相关的网络参数。
上面说过,如果两台计算机在同一个子网络,必须知道对方的MAC
地址和IP
地址,才能发送数据包。
但是,新加入的计算机根本不知道这 两个地址,怎么发送数据包呢?
DHCP 协议做了一些巧妙的规定。
DHCP
协议
首先,它是一种 应用层 协议,建立在UDP
协议之上,所以整个数据包是这样的:

1. 最前面的 以太网标头,设置 发出方(本机) 的MAC
地址和 接收方(DHCP服务器) 的MAC
地址。
前者就是 本机网卡 的MAC
地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF
。
2. 后面的 IP标头 ,设置 发出方的IP地址 和 接收方的IP地址。这时,对于这 两者,本机 都不知道。
于是,发出方的IP
地址就设为0.0.0.0
,接收方的IP地址设为255.255.255.255
。
3. 最后的 UDP标头,设置 发出方的端口 和 接收方的端口。这一部分是DHCP
协议规定好的,发出方是68
端口,接收方是67
端口。
这个数据包 构造完成 后,就可以发出了。以太网 是 广播 发送,同一个 子网络 的每台计算机都收到了这个包。
因为接收方的MAC
地址是FF-FF-FF-FF-FF-FF
,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP
地址,才能确定是不是发给自己的。当看到 发出方IP地址 是0.0.0.0
,接收方是255.255.255.255
。
于是DHCP
服务器知道 这个包是发给我的,而其他计算机就可以 丢弃 这个包。
接下来,DHCP
服务器读出这个包的数据内容,分配好IP
地址,发送回去一个 DHCP响应 数据包。这个响应包的结构也是类似的,以太网标头的MAC
地址是双方的网卡地址,IP
标头的IP
地址是DHCP
服务器的 IP地址(发出方) 和255.255.255.255
(接收方),UDP
标头的端口是67
(发出方)和68
(接收方),分配给 请求端的IP地址 和 本网络的具体参数 则包含在Data
部分。
新加入 的计算机收到这个响应包,于是就知道了自己的 IP地址、子网掩码 、网关地址 、DNS服务器 等等参数。
-
一个实例:访问网页
- 本机参数
我们假定,经过上一节的步骤,用户设置好了自己的网络参数:
1.1 本机的IP地址
192.168.1.100
1.2 子网掩码255.255.255.0
1.3 网关的IP地址192.168.1.1
1.4 DNS的IP地址8.8.8.8
然后我们打开Chrome
,想要访问Google
,在地址栏输入了网址:www.google.com。【没有 科学上网 的同学就打开 百度】

这意味着,Chrome
要向Google
发送一个网页请求的数据包。
- DNS协议
我们知道,发送数据包,必须要知道对方的IP
地址。但是,现在,我们只知道网址www.google.com
,不知道它的IP
地址。
DNS 协议可以帮助我们,将这个网址转换成IP
地址。已知DNS
服务器为8.8.8.8
,于是我们向这个地址发送一个DNS
数据包(53
端口)。

然后,DNS
服务器做出响应,告诉我们Google
的IP
地址是172.194.72.105
。于是,我们知道了对方的IP
地址。
- 子网掩码
接下来,我们要判断,这个IP
地址是不是在 同一个子网络,这就要用到 子网掩码。
已知 子网掩码 是255.255.255.0
,本机用它对自己的IP
地址192.168.1.100
,做一个二进制的AND
运算(两个数位都为1,结果为1,否则为0),计算结果为192.168.1.0
;
然后对Google
的IP
地址172.194.72.105
也做一个AND
运算,计算结果为172.194.72.0
。这两个结果不相等,所以结论是,Google
与本机 不在 同一个子网络。
因此,我们要向Google
发送数据包,必须通过网关192.168.1.1
转发,也就是说,接收方的MAC
地址将是 网关 的MAC
地址。
- 应用层协议
浏览网页用的是HTTP
协议,它的整个数据包构造是这样的:

GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9;
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7
我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。
- TCP协议
TCP 数据包需要设置端口,接收方(Google) 的HTTP
端口默认是 80,**发送方(本机)**的端口是一个随机生成的1024-65535
之间的整数,假定为51775
。
TCP 数据包的标头长度为20
字节,加上嵌入HTTP
的数据包,总长度变为4980
字节。
- IP协议
然后,TCP
数据包再嵌入IP
数据包。IP
数据包需要设置双方的IP
地址,这是已知的,发送方是192.168.1.100
(本机),接收方是172.194.72.105
(Google)。
IP 数据包的标头长度为20
字节,加上嵌入的TCP
数据包,总长度变为5000
字节。
- 以太网协议
最后,IP
数据包嵌入 以太网数据包。以太网数据包需要设置双方的MAC
地址,发送方为本机的网卡MAC
地址,接收方为网关192.168.1.1
的MAC
地址(通过我们前面讲的ARP
协议得到)。
以太网数据包的数据部分,最大长度为1500
字节,而现在的IP
数据包长度为5000
字节。因此,IP
数据包必须分割成 四 个包。因为每个包都有自己的 IP标头(20
字节),所以 四个包 的IP
数据包的长度分别为1500
、1500
、1500
、560
。

- 服务器端响应
经过多个网关的转发,Google
的服务器172.194.72.105
,收到了这 四个 以太网数据包。
根据 IP标头的序号,Google
将四个包拼起来,取出完整的TCP
数据包,然后读出里面的HTTP请求
,接着做出HTTP响应
,再用TCP
协议发回来。
本机收到HTTP
响应以后,就可以将网页显示出来,完成一次网络通信。

愿意与大家分享交流各种技术,个人公众账号[mindev],以及 知识星球[ 极客世界 ]
