一、从一个请求来看网络分层原理
1.1 复杂的网络
以下为一次请求过程中可能遇到的问题,预示着网络的复杂性。
1.2 如何简化复杂度
为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层。
1.2.1 OSI (Open System Interconnection Reference Model): 开放系统互联参考模型
1.2.2 TCP/IP 协议族
1.2.3 两种协议的对应关系
应用层:应用程序负责的部分
传输层:TCP、UDP、SCTP 等
网络层:IPv4、IPv6 等
数据链路层:以太网、无限 LAN (WIFI)
物理层:光纤、双绞线电缆、无线设备
1.3 一个请求的分层解析流程
请求各层之间都是调用对应层的接口 (这个接口可以类比 java 中的接口,它可以有各种实现方式)。
- 在请求过程中域名是无法直接被计算机识别的,必须先转换成 ip,此时先检测本地是否配置了 host,如果没有配置的话会发起一个 dns 请求。
- DNS 使用 UDP 作为传输层,DNS 服务器 IP 配置在你的操作系统中,可以直接获取。
- 数据链路层在接收到网络层调用后,会通过 IP 使用 ARP 协议获取当前 IP 对应的 MAC 地址。
- 最终通过物理层将数据传入路由器,路由器进行逆向解析 (MAC 地址 ->IP),如果路由器判断此信息不是给自己的会将信息继续传给下游电信运营商。
- 运营商判断是 DNS 请求还是 HTTP 请求,如果是 DNS 请求会调用 DNS 服务器换取 IP 并返回。
- 获取 IP 后 DNS 请求完成,此时再次发送一次 HTTP 请求,HTTP 在传输层使用的是 TCP 协议,其他层同理。
- 运营商判断如果非 DNS 请求,那么电信会通过运营商直接的协议进行消息的发送,最终找到 ip 对应的服务器。
- 接收端服务器的物理层接受到此次请求,通过对应的协议进行数据的层层解析获取对应的信息,最终将数据传给本地服务器(nginx、tomcat 等),服务器将响应报文通过 HTTP 方式将数据返回。
一次请求的流转如下图:
二、HTTP 协议
超文本传输协议 (HyperText Transfer Protocol,HTTP): 一种无状态的,以请求 / 应答方式运行的协议,它使用可扩展的语义和自