面试的时候,经常被面试官问道一次http请求经历了哪些步骤,总是回答的不是很好,那么这次我们就通 过wireshark抓包来具体看一下。
当我们在浏览器输入https://bc58.net/wp-content/uploads/2020/02/image-22.png的时候,浏览器会执行以下几个步骤:
- 浏览器从URL中解析出服务器的主机名,也就是bc58.net
- 浏览器将服务器的主机名转换成服务器的IP地址(DNS)查出来的ip地址47.95.209.152
- 浏览器将端口号(如果有的话)从URL中解析出来;因为是http请求,默认端口就是80,https的话默认是443
- 浏览器建立一条与47.95.209.152端口80的TCP连接
- 浏览器向服务器发送一条HTTP请求报文;
- 服务器向浏览器回送一条HTTP响应报文;
- 关闭连接,浏览器显示文档
步骤1
统一资源定位符(URL)是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。
大部分URL都遵循一种标准格式,这种格式包含三个部分。
- URL的第一部分被称为方案(scheme),说明了访问资源所使用的协议类型。这部分通常就是HTTP协议(http://)。
- 第二部分给出了服务器的主机名
- 其余部分指定了Web服务器上的某个资源
我们访问的url是https://bc58.net/wp-content/uploads/2020/02/image-22.png,那么根据上面的格式来分,方案是http,服务器的主机名是bc58.net。其余部分就是/wp-content/uploads/2020/02/image-22.png。
用一句大白话来说,就是使用http协议,进入bc58.net 获取名称为/wp-content/uploads/2020/02/image-22.png的资源。
步骤2
我们知道TCP/IP网络是通过IP地址来确定通信对象的,因此不知道IP地址就无法将消息发送给对方。那么大家可能会说,那我们在浏览器直接输入IP地址不就可以了吗,现实生活中,大家记个11位的手机号码都记不清楚,更何况IP地址呢。那么就需要有一种机制可以来通过网址来查询IP地址,那么这种机制就是域名系统(Domain Network System DNS)
关于DNS,我们可以简单抓个包来看一下


步骤3
这里有个端口的概念,我们在网络层已经有IP地址,在数据链路层有了mac地址,那么这个端口是干啥用的。
如今的计算机是可以在同一时间运行多个进程的设备。因特网通信的最终目标是使一个进程能够和另一个进程通信。为了使得这些进程能够同时接收数据,我们需要用一个不同的方法对进程打上标志,也就是说这些进程也需要有地址。在TCP/IP体系结构中,给每一个进程指派的标记就叫做端口。
TCP协议族的运输层协议在建立连接时,需要在连接的两端同时使用IP地址和端口号。IP地址和端口号的组合就称为套接字地址。客户端套接字地址唯一地定义了一个客户进程,正如服务器套接字地址唯一地定义了一个服务器进程一样
步骤4
TCP是一个运输层协议,运输层位于网络层和应用层之间,运输层负责向应用层提供服务,同时它接受来自网络层的服务。运输层的首要任务就是提供进程到进程的通信。在我们了解进程到进程间的通信是怎样的之前,我们先来了解一下主机到主机间的通信和进程到进程间的通信的区别。
网络层负责主机到主机间的通信,网络层只是把报文协议交互给目的主机,但这还不算是完整的交付,报文必须交付到正确的进程,而这正是运输层协议要做的事情。
这里我们用到了步骤2得到的IP地址(47.95.209.152)以及步骤3得到的端口地址(80)

我们已经看到,经过TCP的三次握手,我们已经建立了与目标主机的TCP连接。
步骤5
经过步骤4我们创建了一条与目标主机的TCP连接,那么我们就可以发送一个HTTP请求报文

步骤6
服务器向浏览器回送一条HTTP响应报文;

步骤7
关闭连接,浏览器显示文档

参考书籍:
《http权威指南》
《TCPIP协议族第4版》