从浏览器输入 www.bilibili.com 到底发生了什么
当我们从浏览器输入 www.bilibili.com 这个网址时,会向 b站 的服务器发送一个 http 的请求报文;b站 服务器接收到这个请求报文时,会向我们的浏览器回应一个 http 的响应报文(包含 html、css、js…);浏览器收到这个响应报文后,则对其进行解析、渲染成我们平时看到的页面(包含 视频、评论、文章…)。
在这个过程中,报文会通过 应用层 --> 运输层 --> 网络层 --> 数据链路层 --> 物理层,以电信号(或光信号)的形式在 物理线路 上进行传输直至到达目的地,再通过 物理层 – > 数据链路层 --> 网络层 --> 运输层 --> 应用层(浏览器、服务器就工作在应用层中),而这就是计算机网络中的五层协议。
注:计算机网络体系结构包含 OSI 的七层协议、TCP/IP 的四层协议、五层协议,实际应用是的 TCP/IP 的四层协议,这里之所以选择 五层协议 进行讲述,是因为 从实质上讲,TCP/IP 只有最上面的三层,最下面那一层基本没有什么具体内容,而 OSI 的七层协议又太过于复杂且不实用,因而折中选择了 五层协议(结合 OSI 和 TCP/IP 的优点)。
1、应用层
应用层是报文的起点,也是报文的终点。http 请求报文和响应报文从这里发出,也从这里得到响应和解析。
http 请求报文和响应报文是 HTTP协议 的两类报文,分别用于客户端发送请求和服务端响应请求。HTTP协议 和我们的日常冲浪生活息息相关,例如,访问 b站 www.bilibili.com 、访问 百度 www.baidu.com、访问 微博 www.weibo.com 等等,但你可能会问 http 在哪 ?从这两个网址都看不出 http 一点的信息。而这就要归功于浏览器自动补全功能了,当我们在浏览器输入 www.bilibili.com 时,浏览器会帮我们补全所使用到的协议:https://www.bilibili.com 。这时你可能又会问 为什么 http 后面还有个 s 呢?https 意为 安全的 HTTP协议,是 HTTP协议 在安全方面的加强版。
补充:http 的端口号为 80,https 的端口号为 443。
但在计算机的世界中,它只认识由 0 和 1 构成的 IP 地址,并不认识 www.bilibili.com 这个字符串,这时又要将 www.bilibili.com 解析成 IP 地址,如何做到呢?答案是 域名系统DNS。
域名系统DNS 解析过程其实就是 从 DNS 服务器中找到域名相对应的 IP 地址,而www.bilibili.com 本身就是一个域名,以 ”.“ 号进行分割,可分为三个不同级别的域名,www 为 三级域名、bilibili 为二级域名、com 为顶级域名。之所以需要这样分是因为全世界的 IP 数量过多,如果把这些 IP 都放在一台或几台服务器上,那服务器基本就会瘫痪,而你上网的速度也会明显降低。通过将域名进行分级处理,可以将 IP 地址存放在大量的 DNS服务器上,大大减轻 单个 DNS服务器 处理请求的压力,进而提高我们的上网速度;同时,采取分级的好处也在于可以迅速找到上级域名的 DNS服务器,主要的查询方法有 迭代查询 和 递归查询 两种方式。
经过 域名系统DNS 解析过后,www.bilibili.com 被解析为 120.240.78.231(可以使用 ping 命令进行查看)。
有了 IP 地址之后,就可以给目标服务器发送 http 请求了。
补充:响应状态码
- 1xx 表示通知消息,如请求收到了或正在进行处理
- 2xx 表示成功,如接受或知道了
- 3xx 表示重定向,如要完成请求还必须采取进一步的行动
- 4xx 表示客户的差错,如请求中有错误的语法或不能完成
- 5xx 表示服务器的差错,如服务器失效无法完成请求
2、运输层(传输层)
应用层本身是没有传输能力的,那 http 报文怎么进行传输呢?答案就在应用层的下层:运输层。HTTP/HTTPS 协议 选择的是 运输层中的 TCP协议 进行报文的传输。
运输层中有两个主要的协议:
- 用户数据报协议 UDP(User Datagram Protocol)
- 面向无连接(指不会保持连接)
- 不提供可靠交付
- 提供广播或多播服务
- 传输控制协议 TCP(Transmission Control Protocol)
- 面向连接
- 提供可靠交付(功能保证:确认、流量控制、计时器和连接管理)
- 不提供广播或多播服务
应用层报文 来到 运输层 之后会根据选择的 运输层协议 添加相对应的 协议首部(TCP首部 / UDP首部)形成 运输层报文,这时 端口号 就起作用了,协议首部(无论是 TCP 还是 UDP)会把 端口号 写入其中。
运输层主要负责 应用进程 间的相互通信,而应用进程的位置就由 端口号 确定。当运输层报文 到达目的主机的运输层时,报文就会被还原为 运输层协议首部 和 应用层报文,接着再从协议首部获取目的端口号(80/443),再将应用层报文传输给相对应的应用程序(HTTP/HTTPS服务)。
这样 HTTP/HTTPS 服务 就获取到了 http/https 请求报文,响应报文也是以同种形式 发出和接收。
补充:
TCP 的连接建立(三报文握手)
TCP 的连接释放(四报文握手)
3、网络层
运输层主要负责的是应用程序间的通信,那报文如何到达应用程序所处的主机上呢?答案就在运输层的下层:网络层。而这里就是 IP地址 发挥作用的地方,这里的主要协议就是 IP 协议。
当 运输层报文 向下传输到达 网络层 时,报文会被添加一个 首部 形成 IP数据报,而 IP地址 就被记录在 IP数据报首部 之中。
注:网络层 向上只提供 简单灵活、无连接的、尽最大努力交付 的数据报服务。
当今的计算机网络已成覆盖到我们生活的方方面面,而不同区域使用的网络也不尽相同,那如何将这些不同的网络连接起来呢?网络层给的答案是:路由器 和 IP协议。通过这两者的通力协作,使得世界上各种计算机网络成为了一张大网(IP网 / 互联网)。
有了 b站的 IP地址(120.240.78.231)再加 路由器 的转发作用,http 请求报文(包含在 IP 数据报中)即可顺利到达 b站的 http 服务器(主机)上,http 响应报文也同种形式传输到我们浏览器上。
4、数据链路层
网络层 实现了不同形式网络的大一统,但其统一仅仅体现在逻辑上的统一,要想真正将数据发送到目的主机上,还需要知道目的主机的物理地址(即 MAC地址)。
MAC地址 相当于现实世界的家用邮箱,如果远方的朋友想要写信给你,首先要知道的就是你家的邮箱地址,只有在信封上写上正确的邮箱地址,邮差才能准确无误地将信投入到你家的邮箱中,MAC地址即是如此。
那 MAC地址 在哪呢?就在 主机的 网络适配器(即网卡)上,同时,网络适配器 也负责将 帧 发送到局域网、从局域网 接收 帧。 那什么是帧?当 网络层 的 IP数据报 来到 数据链路层,报文会被添加上 一个首部 和 一个尾部 形成 数据链路层帧(简称:帧)。那怎么获取 目的 IP的 MAC地址 呢?这还要归功于 网络层的 地址解析协议 ARP,它会将 IP地址解析成 MAC地址。
5、物理层
在计算机 0 和 1 的世界,数据链路层 已是信息发送的最终起点,但在现实世界 0 和 1 不过是一个数学逻辑概念,真正表示 0 和 1 的则是 物理量:低电平 / 高电平、低光强 / 高光强 ,真正在物理线路上传输的是:电流(电信号)、光(光信号)。
而物理层要做的则是完成这一转换,在发送信息时,将 数字信号(0 和 1) 转变为 模拟信号(电信号、光信号);在接收信息时,将 模拟信号(电信号、光信号)转变为 数字信号(0 和 1)。
至此,信息的传输落下帷幕。