互联网的层与协议,以及用户上网的基本过程

之前看过阮老师的几篇关于互联网的文章,讲解得简单易懂,但自己还是没能完全记住。

同时像很常见的一个问题:从URL输入到页面展现到底发生什么?

以及TCP 的三次握手、四次挥手的意思等等,很多东西我之前都没有去弄。

虽然有时看了明白了,但总觉得懵懵懂懂的,一知半解的,还是得自己整理一番才行。

参考文章:

http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html(互联网协议入门(一))

http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html(互联网协议入门(二))

https://github.com/ljianshu/Blog/issues/24(从URL输入到页面展现到底发生什么?)

https://baijiahao.baidu.com/s?id=1593714120815701015&wfr=spider&for=pc(对TCP三次握手四次分手还不清楚,超简单解析)

https://www.zhihu.com/question/19813460?utm_campaign=rss&utm_medium=rss&utm_source=rss&utm_content=title(为什么局域网的IP普遍是192.168开头?)

1、互联网的实现

(1)五层模型

互联网是一项庞大的工程,所以分了好几层去实现,每一层都有其对应的功能,而下层的功能支持着上层功能的实现。

为了描述互联网的分层关系,人们提出了许多的模型,称为“网络模型”。

不同的“网络模型”对互联网的分层不一样,比如我们以前在课本上学习到的以下两种(从下至上分层):

“TCP/IP 四层模型“:链路层、网络层、运输层、应用层

“OSI 参考模型”:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

而根据实际互联网的实现来看,分为“五层模型”更容易理解,如下图:

越靠近上层,越贴近用户;越靠近下层,越贴近硬件。

(2)协议

互联网的每一层都有其对应的功能,而为了实现对应的功能,就需要大家遵循共同的规则。

大家都遵循的规则,也就是“协议”。

互联网的每一层都有其相关的一些协议,所有层的协议一起组成了“互联网协议”。

2、实体层(又称“物理层”)

要实现互联网,就需要把电脑连接起来。

连接方式可以是光缆、电缆、双绞线、无线电波等。

“实体层”的功能,就是把电脑等实体用物理手段连接起来,规定网络的一些电气特性,负责传输 0 和 1 电信号。

3、链接层(又称“链路层”)

(1)功能

单纯的 0 和 1 电信号是没有意义的,需要规定解读方式才行。

比如:多少电信号为一组?每个电信号有什么意义?

“链接层”的功能,就是规定电信号的分组方式,以及 0 和 1 的意义等。

(2)以太网协议

最开始,电信号的分组方式有很多,但后面慢慢都统一了,这个统一的规定称为“以太网协议”。

“以太网协议”的内容:

1、一组电信号构成一个数据包,叫做"帧"(Frame)。

2、每一帧分为两部分(如下图):标头(head,固定占 18 字节,存放数据包的说明信息,如发送者、接受者、数据类型等)、数据(data,最短为 46 字节,最长为1500字节,存放数据包的具体内容)

3、每组电信号(又称“每一帧”、“一个数据包”)由标头和数据的长度可推出,最短为 64 字节,最长为 1518 字节。

(3)MAC 地址(又称“物理地址”)

“以太网协议”规定,数据包的标头中包含了数据包的说明信息,如发送者、接收者等。

但如何标识发送者和接收者呢?

“以太网协议”规定,接入网络的设备必须有“网卡”接口,数据包只能从一块网卡传到另一块网卡。

所以标头中的发送者和接收者实际上就是“网卡”,具体的值就是网卡的地址,称为 MAC 地址。

MAC 地址,又称为物理地址,具体如下:

1、每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址。

2、MAC 地址占 48 个二进制位,即 6 个字节,常用 12 个十六进制数表示,如下图。

3、MAC 地址的前 6 个十六进制数指:厂商编号。后 6 个十六进制数指:此厂商的网卡流水号。

(4)广播

当知道网卡的 MAC 地址后,“以太网协议”不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机根据对应的 MAC 地址,判断自己是否为接收方。这种发送方式称为“广播”。

有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。

注意“链路层”中只有在同一个子网络的计算机,才能相互发送数据包,而且同个子网络中每台计算机都会接收到数据包。

4、网络层

(1)功能

互联网是由无数个子网络共同组成的矩形网络。

由于“链接层”中,“以太网协议”通过广播方式向同个子网络所有计算机数据包,所以效率很低,而且不能向其他子网络中的计算机发送数据包。

“网络层”的功能,就是提供一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。

这套新的地址,称为“网络地址”,简称“网址”。

当属于同一个子网络时,采用广播方式发送数据,否则采用"路由"方式(暂不了解,百度百科:路由

(2)IP 协议

规定“网络地址”的协议,称为 IP 协议(Internet Protocol)。

IP 协议所规定的网络地址,称为 IP 地址。

目前最广泛采用的是 IP 协议第四版(即 IPv4 ),具体内容如下:

1、IP 地址占 32 个二进制位,即 4 个字节,通常用 4 个十进制数表示,从 0.0.0.0 到 255.255.255.255,如下图:

2、IP 地址中一部分为网络信息,一部分为主机信息,具体是哪部分,需要和“子网掩码”进行 AND 运算才能得知。

3、“子网掩码”是表示子网络特征的一个参数,形式和 IP 地址一样,不过网络部分全为 1,主机部分全为 0。

4、IP 地址与“子网掩码”进行 AND 运算后,主机部分肯定都为 0,所以比较 AND 后的结果是否一样,就能得知网络部分是否一样,从而判断 IP 地址是否在同一个子网络内。

综上:IP 协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

(3)IP 地址

从 IP 协议的内容,我们知道 IPv4 中 IP 地址的范围为:0.0.0.0 到 255.255.255.255 。

为了更好的管理 IP 地址,IPv4 将 IP 地址分为了 A、B、C、D、E 五类。

其中 D、E 两类为特殊作用而使用,剩下的 A、B、C 三类才是我们常用的。

A、B、C 类中绝大多数的 IP 地址都是公有地址,需要向国际互联网信息中心申请注册。

但是在 IPv4 协议中预留了  3 个IP地址段,作为私有地址,供组织机构内部使用。范围如下:

1、A 类:10.0.0.0——10.255.255.255(可表示 2^24 种 IP 地址)

2、B 类:172.16.0.0——172.31.255.255(可表示 16 * 2^8 = 2^12 种 IP 地址)

3、C 类:192.168.0.0——192.168.255.255(可表示 2^8 种 IP 地址)

根据局域网内主机的数量,来选择用哪个 IP 段作为私有地址,所以一般局域网主机比较少,选择 C 类。

一些大型公司,局域网的主机比较多,就选择 B 类或者 A 类作为私有地址 IP 段。

(4)IP 数据包

根据 IP 协议发送的数据包,称为 IP 数据包。

IP 数据包也分为"标头"(占 20 到 60 字节,包含版本、长度、IP地址等信息)和"数据"(最长为65,515字节,包含IP 数据包的具体内容)两个部分。

IP 数据包放置于“以太网协议”规定的数据包的“数据”部分,这里就把之前“以太网协议”规定的数据包,称为“以太网数据包”,如下图:

当 IP 数据包的长度过大,超过了“以太网数据包”的数据部分的长度,则需要划分成多个“以太网数据包”进行传输了。

(5)ARP 协议

由于 IP 数据包是放在“以太网数据包”的“数据”部分,进行传输的,所以需要知道接收方的 MAC 地址,以及 IP 地址。

通常情况下,接收方的 IP 地址是已知的,而 MAC 地址并不知道,于是需要一种方法,能根据 IP 地址得到 MAC 地址。

如果两台主机不在同一个子网络,则无法得知 MAC 地址,只能把数据包发给两个子网络的“网关”,让“网关”进行数据的传输。

如果两台主机在同一个子网络,则可以通过“ARP 协议”来获取 MAC 地址,具体如下:

1、根据“ARP 协议”,在“以太网数据包”的数据部分,放入一个数据包,包含对方的 IP 地址,而 MAC 地址栏是固定的 FF:FF:FF:FF:FF:FF。

2、“ARP 协议”采用广播的方式,向子网络内的每台主机发送数据包。

3、每台主机取出 ARP 数据包,根据其中 IP 地址和自己的 IP 地址进行匹配,如果相同,则返回 MAC 地址。

5、传输层

(1)端口、套接字

通过 MAC 地址和 IP 地址,数据就可以在互联网上任意主机进行传输。

但每台主机上有很多不同的程序,如何确定传输的数据是哪个程序需要的呢?

主机上的程序在使用网卡时都有一个编号,称为“端口”(port),相关信息如下:

1、"端口"是 0 到 65535 之间的一个整数,正好 16 个二进制位。

2、0 到 1023 的端口被系统占用(比如默认的网页 http 端口为 80,https 的为443),用户只能选用大于 1023 的端口。

3、不管是浏览网页还是在线聊天的程序,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

4、端口可以是应用程序随机选取,也可以是人为指定,但不能为 0~1023。

5、只要把数据包发送到主机的程序所用的端口,不同的程序就能取到自己所需要的数据。

“传输层”的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。

只要确定主机和端口,我们就能实现程序之间的交流。

Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

(2)UDP 协议

为了加入端口信息,需要新的协议,最简单的实现叫做“UDP 协议”。

“UDP 协议”规定的数据包称为“UDP 数据包”。

“UDP 数据包”也分为“标头”(占 8 个字节,发出端口和接收端口)和“数据”(具体内容)两部分。

UDP数据包放在IP数据包的"数据"部分,IP数据包放在以太网数据包的“数据部分”,所以如下:

(3)TCP 协议

“UDP 协议”的优点是比较简单,容易实现,但可靠性低,一旦数据包发出,无法知道对方是否收到。

为了解决可靠性的问题,出现了“TCP 协议”。

“TCP 协议”比较复杂,存在“三次握手”和“四次挥手”,如下图(A 为客户端,B 为服务器):

但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。

TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。

如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

6、应用层

应用程序收到"传输层"的数据,接下来就要进行解读。

由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。

"应用层"的功能,就是规定应用程序的数据格式。

举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP、HTTP、DHCP等等。

那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。

7、最终的数据包

实体层(物理层):规定了电脑的连接方式,以及网络的电气特性,用于传递 0 和 1 的电信号。

链接层(链路层):“以太网协议”指定了网卡的 MAC 地址。

网络层:“IP 协议”分配了 IP 地址,确定了是否为同一个子网络。

传输层:“UDP 协议”和“TCP 协议”规定了程序通信的端口。

应用层:各种各样的应用程序协议(如https、ftp、websocket、DHCP等),规定了程序的数据以及数据格式等。

综上,最终的数据包,如下图:

8、用户上网设置

(1)数据传输所需条件

通过对互联网的层和协议的了解,我们知道网络通信,实际上就是不同网卡之间相互传输数据包。

数据包中各个数据包的标头的内容具体如下:

1、以太网标头:存放发送方和接收方的 MAC 地址

2、IP 标头:存放发送方和接收方的 IP 地址

3、TCP 标头:存放发送方和接收方的端口(port)

端口通常是约定好了的,所以我们传输数据,主要需要对方的 MAC 地址和 IP 地址。

同一个子网络内,根据 MAC 地址,主机间可以直接传输数据。不同的子网络内,则需要先传给网关,再由网关传给对应的主机。

所以,如下为数据传输所需的条件:

(2)静态 IP 地址

用户想上网的话,就得根据数据传输所需的条件,设定相关的信息,如下:

1、本机的 IP 地址

2、子网掩码

3、网关的 IP 地址

4、DNS 的 IP 地址

如果每次开机,都是同样的 IP 地址,这些 IP 地址就称为“静态 IP 地址”。

如下图 Windows中静态 IP 地址的设置:

“静态 IP 地址”的设置对于普通用户来说,比较复杂,而且 IP 地址一直被占用也不好,所以有了“动态 IP 地址”。

(3)动态 IP 地址、DHCP 协议

为了解决“静态 IP 地址”设置较复杂,且地址被占用的问题,出现了“动态 IP 地址”。

对“动态 IP 地址”进行规定的协议,称为“DHCP 协议”(Dynamic Host Configuration Protocol,动态主机设置协议)。

“DHCP 协议”的具体内容如下:

1、每一个子网络内,有一台计算机负责管理本网络的所有IP地址,它叫做"DHCP 服务器"。

2、新的计算机加入子网络时,不知道本机的 IP 地址,也不知道“DHCP 服务器”的 IP 地址和 MAC 地址。

3、新的计算机加入子网络,必须向"DHCP 服务器"发送一个"DHCP 请求"数据包,申请 IP 地址和相关的网络参数。

4、“DHCP 协议”是应用层的协议,基于 UDP 协议,所以数据包如下图:

——“以太网标头”:包含本机的 MAC 地址和“DHCP 服务器”的 MAC 地址(由于不知道,所以设为 FF:FF:FF:FF:FF:FF,表示广播)。

——“IP 标头”:由于本机和“DHCP 服务器”的 IP 地址都不知道,所以本机设为 0.0.0.0,“DHCP 服务器”的设为 255.255.255.255。

——“UDP 标头”:存放端口(DHCP协议规定好的,发出方是 68 端口,接收方是 67 端口)。

5、当子网络内每台主机接收到数据包后,根据 MAC 地址并不知道是发给谁的,所以看 IP 地址。

6、当看到 IP 地址,发送方为 0.0.0.0,接收方为 255.255.255.255 时,就知道是发送给“DHCP 服务器”的。

7、“DHCP 服务器”读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。

8、最终新加入的主机就知道自己的 IP 地址、子网掩码、网关地址、DNS 服务器地址等了

9、用户上网实例:访问网页

这是一个经典的面试题:从 URL 输入到页面展现到底发生了什么?

(1)URL

URL,是 Uniform Resource Locator 的缩写,中文为统一资源定位符(俗称:网址)。

URL 的作用是,定位互联网上的资源。

为了定位互联网上的资源,那么 URL 就需要由统一的解释,所以需要遵循以下的语法规则。

语法规则为:scheme://host.domain:port/path/filename

假设 URL 为:http://www.w3school.com.cn/html/index.asp

1、scheme:互联网服务的类型(或者“应用层协议”,常见的有 http、https、ftp、file)

2、host:域主机(http 的默认主机是 www)

3、domain:域名(如:w3school.com.cn)

4、port:主机上的端口(http 默认为 80,https 默认为 443)

5、path:资源路径

6、filename:资源名称

(2)从浏览器输入网页的 URL

假定本机已弄好上网设置,然后想访问一个网页,如谷歌。

用户在浏览器输入谷歌的 URL :www.google.com

(3)域名解析(DNS 协议)

发送数据包,MAC 地址和 IP 地址是必需的,而 MAC 地址可以由“ARP 协议”通过 IP 地址得知。

所以我们在访问网页时,必须得知道 IP 地址。

现在我们知道网页的 URL(即网址)为:www.google.com,但不知道 IP 地址是多少。

通过网页 URL 中的域名(domain)得知 IP 地址的操作,称为“域名解析”。

而制定“域名解析”的规则,称为“DNS 协议”。

专门负责进行“域名解析”的计算机,称为“DNS 服务器”,所以上网必须设置 DNS 服务器的 IP 地址。

“DNS 协议”和“DHCP 协议”都是基于“UDP 协议”的,所以数据包如下,端口默认为 53:

DNS服务器做出响应,告诉我们谷歌的IP地址是 172.194.72.105。于是,我们知道了对方的IP地址。

(4)浏览器根据 URL 中的域名查找 IP 地址

当输入网址后,浏览器不是一来就去 DNS 服务器查询 IP 地址,而是有一定的查询先后,如下:

1、浏览器缓存:浏览器会按一定的频率缓存 DNS 记录,所以浏览器会先看浏览器缓存里有没有对应的 DNS 记录,如果有,则直接返回对应的 IP 地址。

2、操作系统缓存:当浏览器缓存中没有时,操作系统缓存中可能有

3、路由器缓存:当操作系统缓存中没有时,路由器中可能有 DNS 缓存记录

4、ISP 的 DNS 服务器:当缓存里都没有时,就去 ISP(Internet Service Provider,互联网服务提供商)专门的 DNS 服务器去查询

5、根服务器:当 ISP 的 DNS 服务器中都找不到,则去根服务器找,进行递归查询(如www.baidu.com.cn,就会依次去 .cn、.com、.baidu的 DNS 服务器去找)。

(5)通过子网掩码判断 IP 地址是否在同个子网络

子网掩码的格式和 IP 地址一样,都占 32 个二进制位,即 8 个字节。

子网掩码中网络部分都为 1,主机部分都为 0,所以可以用来表示 IP 地址中哪些为网络部分,哪些为主机部分。

将 IP 地址与子网掩码进行 AND 运算,最终主机部分都为 0,而网络部分不变,所以比较最终结果是否相同,就能判断网络部分是否相同,从而得知是否在同一个子网络。

当不在同一个子网络时,必须通过网关转发,所以接收方的 MAC 地址是网关的 MAC 地址。

(6)建立 TCP 链接(三次握手)

得知了 IP 地址和 MAC 地址后,我们实现了主机之间的通信。

为了实现程序与程序之间的通信,还需要端口,一般都是已知的。

为了保证端口与端口之间的连接,就需要进行 TCP 连接。方式是“三次握手”,具体如下:

首先进行对图中出现字符的意思,做下说明:

1、字符区分大小写,比如:ACK 和 ack 是不一样的意思。

2、字符的值,1 代表是,0 代表否。

2、SYN:请求创建连接

3、FIN:请求关闭连接

4、ACK:确认接收

5、seq:发送方当前的序列号(序列号是数据包过大时,拆分成的各个数据包的编号。初始序列号是随机生成的,避免冲突,方便重组)

6、ack:接收方下一次序列号(为了保证下一次交互的是同一个接收方)

根据图,以及字符的解释,可得出“三次握手”的过程:

1、SYN=1,ACK=0,seq=x:客户端请求创建连接、服务器还没确认接收、序列号为x

2、SYN=1,ACK=1,seq=y,ack=x+1:服务端请求创建连接、服务器确认接收、序列号为y,客户端下一次数据包编号为x+1

3、ACK=1,seq=x+1,ack=y+1:客户端确认接收、序列号为 x+1、服务器下一个数据包的编号为 y+1

简单的描述“三次握手”,就如下:

1、客户端说:我请求建立连接

2、服务器说:我收到你的请求了,你可以连接,同时我也请求建立连接

3、客户端说:我收到你的请求了,你可以连接

最终,客户端和服务器连接上了,每次发送数据包,都需要“三次握手”。

“三次握手”主要是为了防止已失效的连接请求报文突然又传到服务器,从而导致报错。

(7)发送 HTTP 请求

建立好 TCP 链接后,程序之间就可以发送数据了。

访问网页,采取的应用层协议是 http 协议。

http 数据包就放置在 TCP 数据包的“数据”部分,如下:

具体的数据构造顺序如下:

1、HTTP 数据包:请求行(请求方法、URL、协议版本等)、请求头(请求的附加信息)、请求体(请求参数等)

2、TCP 标头:接收方的 HTTP 端口默认是 80,请求方可以选用 1024~65535 的端口。

3、IP 标头:双方的 IP 地址

4、以太网标头:双方的 MAC 地址

当数据包过长时,就会分为把其中的 TCP 数据包分成多个 TCP 数据包,如下:

(8)服务器处理请求并返回 HTTP 报文

服务器收到数据包后,取出完整的 TCP 数据包,然后读出里面的"HTTP请求",接着做出"HTTP响应",再用TCP协议发回来。

HTTP 响应报文通常包含响应行(协议版本、状态码、状态码描述)、响应头(报文的附加信息)、响应体(响应数据)。

(9)浏览器解析渲染页面

浏览器拿到 HTTP 响应报文后,得到响应体中的 HTML,然后进行解析和渲染:

1、根据 HTML 解析出 DOM 树(顺序为“深度优先遍历”、js 会阻塞 DOM 树解析)

2、根据 CSS 解析生成 CSS 规则树(解析 CSS 规则树时 js 会暂停执行、CSS 规则树的解析会阻塞渲染但不会阻塞 DOM 树解析)

3、结合 DOM 树和 CSS 规则树,生成渲染树(DOM 树和 CSS 规则树都解析好了,才构建渲染树)

4、根据渲染树计算每个节点的信息(布局:根据渲染树中每个渲染对象的信息,计算出位置和尺寸。回流:如果布局完了,发现布局有变化,则又重新渲染)

5、根据计算好的信息绘制页面(绘制阶段、重绘、回流)

(10)断开 TCP 连接(四次挥手)

当数据传送完毕,需要断开 TCP 连接,此时发起 TCP 四次挥手,如下:

首先,还是和“三次握手”一样,对进行对图中出现字符的意思,做下说明:

1、字符区分大小写,比如:ACK 和 ack 是不一样的意思。

2、字符的值,1 代表是,0 代表否。

2、SYN:请求创建连接

3、FIN:请求关闭连接

4、ACK:确认接收

5、seq:发送方当前的序列号(序列号是数据包过大时,拆分成的各个数据包的编号。初始序列号是随机生成的,避免冲突,方便重组)

6、ack:接收方下一次的序列号(为了保证下一次交互的是同一个接收方)

根据图,以及字符的解释,可得出“四次挥手”的过程:

1、FIN=1,seq=u:客户端请求关闭连接,序列号为u

2、ACK=1,seq=v,ack=u+1:服务器确认接收,序列号为v,客户端下次的序列号为u+1(此时服务器确认了客户端可以关闭,但客户端还没确认服务器能不能关闭)

3、FIN=1,seq=w,ack=u+1:服务器请求关闭连接,序列号为 w,客户端下次的序列号为 u+1

4、ACK=1,seq=u+1,ack=w+1:客户端确认接收,序列号为 u+1,服务器下次的序列号为 w+1(此时客户端和服务器都可以关闭了)

简单描述下“四次握手”,就如下:

1、客户端说:我请求关闭连接

2、服务端说:我收到你的请求了,你可以关闭

3、服务端说:我也请求关闭连接

4、客户端说:我收到你的请求了,你也可以关闭

最终,客户端和服务器都关闭连接了

 

转载于:https://my.oschina.net/u/3185947/blog/3013066

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值