问题

当发出一个HTTP请求时,具体的请求过程是怎么样的呢?

假如我们访问了https://www.google.com,它会经历什么样的历程呢?

解答

我们知道TCP/IP协议。依靠遵循TCP协议的两台主机,可以在不可靠的网络传输中得到可靠的数据传输能力。而HTTP的五层模型可以很好的理解计算机网络,他们分别是应用层,传输层,网络层,数据链路层和物理层。

常见的应用层协议: HTTP, SMTP, FTP, TELNET, SNMP

常见的传输层协议: TCP, UDP

常见的网络层协议: IP, ICMP, ARP

HTTP请求

HTTP是应用层的协议。它配合TCP/IP使用。

一个HTTP请求报文分为请求报文和响应报文。这两种报文都由三个部分组成: request line(请求开始行), header(头部), data(数据)。

请求行由:方法、[空格]、URL、[空格]、HTTP版本组成

常见方法包括:GET、POST、PUT、DELETE、OPTIONS……

响应开始行由: HTTP版本、[空格]、状态码组成

常见状态码都是3位数字

状态码 说明
1xx 表示通知,如请求收到或正在处理
2xx 表示成功,如200
3xx 表示重定向,如304
4xx 表示客户端问题,如路由不存在404
5xx 表示服务器问题,如503

应用层是最接近我们用户的一层。应用层就是用户主机上的一个个进程。当用户在浏览器中输入google的地址时,浏览器会使用DNS协议返回google的物理IP地址,接着应用层会创建一个TCP socket,将这个请求封装成一个http的数据包,并将这个数据包放入socket中。

https是什么?

简单讲就是http的安全版本。基于SSL(Secure Socket Layer), 在http的基础上通过传输加密和身份认证保证了传输过程中的安全性。

DNS

DNS是一个应用层的协议,它选择的传输层协议大部分是UDP协议,但是也有少量的TCP协议,在需要数据传输准确性和稳定性时。因为是UDP协议,所以域名解析过程很迅速。在DNS服务器上存储了域名和域名所对应的IP地址。

常见的顶级域DNS服务器有.com, .gov, .org, .net, .edu……

本地的DNS服务器往往是具有缓存的功能的,通常会保存两天内的访问记录,大部分时候你是感觉不到域名解析的过程的,因为解析时会从缓存中读取。

TCP/UDP

socket分为TCP/UDP这两种协议的套接字,而这两种协议便处于传输层。往往应用层会有很多请求,所以传出层会有很多的socket,他们通过协议头中的IP,端口号进行标识,用来知道传输层收到的响应请求对应哪一个socket。

这里有对TCP的详细理解,这里是对UDP的详细理解,就不一一赘述了。

IP

IP协议是处于网络层的协议,解决的是两台不处于同一子网的主机相互通信的问题。

IPv4的地址长度为4个8字节,即32bit。而IPv6的地址长度为原来的4倍,即128bit。它为了解决IPv4地址耗尽的问题,这里就不细说了。

MAC地址

在网络层的数据通信问题解决后,需要在链路层将IP数据包封装成以太网帧。基本结构(802.3))包含了:前导码, 帧开始符, MAC目标地址,MAC源地址,类型长度以及数据。其中MAC地址是硬件的唯一标识,全世界任意一台主机的MAC地址都是不同的。

所以之前有人问,都有IP地址了,为什么还需要MAC地址呢?

原因是IP在别人不用的时候可以共享出去,但是MAC地址是唯一的。以太网采取了广播的方式向任意主机发送报文。如果一个请求如果不是自己主机发出的,获得相应的报文是会被抛弃掉的。

总结

以上就是一个http请求的整个过程,浏览器就好比一个客户端,当你输入URL时,浏览器会先去请求DNS服务器,获取域名对应的IP地址,再通过IP地址找到对应的服务器,并建立TCP/UDP连接,等待浏览器发送完HTTP请求包后,服务器开始处理请求(request),并返回响应包(response)。客户端收到后,渲染返回主体(body),等收到全部内容后断开TCP连接。