-
首先http请求是基于tcp/ip协议的,所以要通过DNS服务器将域名解析为相应ip地址如果url里不包含端口号,则会使用该协议的默认端口号。DNS解析详细过程参考https://blog.csdn.net/qq_39393899/article/details/80405979
-
建立一个socket连接,socket相当于tcp/ip协议的接口,便于我们去使用这个协议(比如create,listen,accept,connect,read和write等等)。socket还有心跳机制,用于保持客户端服务端的连接,按照一定的时间间隔发送一个自己命名的包给对方。由于socket连接基于tcp/ip协议,所以要经过三次握手。
-
HTTP请求格式分别是请求行、请求头、空行、消息体,每部分内容占一行。
请求行 :由三部分组成:分别是请求方法( GET/POST/DELETE/PUT/HEAD )、 URI 路径、 HTTP 版本号。
请求头:缓存相关信息(Cache-Control,If-Modified-Since)、客户端身份信息(User-Agent)等键值对信息。空行。
主体:客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。
-
服务器响应HTTP请求
服务器接收处理完请求后返回一个HTTP响应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。
状态行 :有 HTTP 协议版本号, 状态码 和状态说明三部分构成。
响应头:用于说明数据的一些信息,比如数据类型、内容长度等键值对。空行。
消息体:服务端返回给客户端的HTML文本内容。或者其他格式的数据,比如:视频流、图片或者音频数据。
-
浏览器解析html代码,并请求html代码中的资源
浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,向服务器端发起一个HTTP请求,如果服务器端返回304状态码(告诉浏览器服务器端没有修改该资源),那么浏览器会直接读取本地的该资源的缓存文件。否则开启新线程向服务器端去请求下载。(这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源。)
最后,浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,再呈现给用户。