# 前言
传输层建立TCP连接三个阶段:
- 建立连接
- 传输数据
- 断开连接
HTTP协议,是建立在TCP基础之上的,属于应用层。
HTTP是一种允许浏览器向服务器获取资源的协议,Web的基础(浏览器使用最广的协议),一般由浏览器发起请求,用来获取不同类型的资源,常见的资源:
- HTML文件
- CSS文件
- JavaScript文件
- 图片
- 视频more...
# 浏览器端发起HTTP请求
# 1. 构造请求
浏览器构建请求行信息,构建完毕,浏览器准备发起网络请求。
GET /index.html HTTP1.1
# 2. 查找缓存
发起网络请求之前,浏览器会先到浏览器缓存中查询是否有需要请求的文件,浏览器缓存是一种在本地保存的资源副本,用于下次请求直接使用缓存的技术。
如果浏览器发现缓存有副本,会拦截请求,返回该资源副本,结束请求。
- 缓解服务器压力,提升性能(资源获取时间更短)
- 对于网站,缓存是实现资源快速加载的重要组成
如果没有发现缓存,则进入网络请求。
# 3. 准备IP地址和端口
浏览器使用HTTP协议作为应用层协议,用于封装请求的文本信息,并使用TCP/IP作为传输层协议来发送到网络。
发起HTTP请求之前,浏览器首先通过TCP与服务器建立连接,HTTP的内容实际在TCP传输数据阶段来实现的。
- 使用DNS(Domain Name System)把域名和IP进行映射(浏览器DNS数据也是有缓存服务的)
- 拿到IP地址后,获取URL(Uniform Resource Identifier)端口号(若URL没有特别指明端口号,则HTTP协议默认是80端口)
# 4. 等待TCP队列
有了IP地址和端口号后并不能立即去建立TCP连接。
Chrome的机制:同一个域名同时最多只能建立6个TCP连接,超过6个的请求会进入排队等待状态,直至进行中的请求完成。若当前请求数量少于6,则直接开始建立TCP连接。
# 5. 建立TCP连接
等待排队结束,就可以开始和服务器握手了。HTTP工作之前,浏览器需要通过TCP和服务器建立连接。
# 发送HTTP请求
一旦建立TCP连接,浏览器就可以和服务器进行通信。HTTP中的数据就是在这个通信过程中进行传输。浏览器向服务器发送请求行(请求方法 + 请求URL + HTTP版本协议),告诉服务器浏览器需要什么资源。
GET请求:
POST请求:一般用于发送数据给服务器,发送的数据一般通过请求体发送。
发送请求行命令后,还需要发送请求头传输一些其他信息,把浏览器的一些基础信息告诉服务器,比如包含了浏览器所使用的操作系统、浏览器内核等信息,以及当前请求的域名信息、浏览器端的Cookie信息等等。
# 服务器处理HTTP请求流程
# 1. 一旦服务器处理结束,返回响应数据
-i可以返回响应行、响应头、响应体数据
curl -i mobs.fun
2
- 响应行:协议版本 + 状态码(200成功、404未找到资源...)
- 响应头:服务器自身的信息,比如生成数据返回的时间、返回的数据类型(JSON、HTML、流媒体)、服务端要在客户端保存的Cookie信息。
- 响应体:HTML实际内容等等
# 2. 断开连接
一般服务器向客户端返回了数据,服务器就要关闭TCP连接了,如果浏览器或服务器在其头信息加入了Connection:Keep-Alive,TCP连接在发送HTTP请求后仍然保持打开状态,这样浏览器可以在同一个TCP连接上发送请求。
保持TCP的连接可以省去下次请求时需要再次建立TCP连接的时间,提高资源加载速度。一个Web页面如果初始化了一个持久TCP连接,就可以复用该连接,来请求其他资源,不需要重新再建立新的TCP连接。
# 3. 重定向 -- 301
响应行返回的状态码是301,状态301就是告诉浏览器,我需要重定向到另外一个网址,而需要重定向的网址正是包含在响应头的Location字段中,然后浏览器获取Location字段中的地址,并使用该地址重新导航,这就是一个完整重定向的执行流程。
-I 获取响应头、响应行,不获取响应体。
curl -I mobs.fun
2
# 为什么很多站点第二次打开速度很快?
如果第二次页面打开很快,主要原因是第一次加载页面过程中,缓存了一些耗时的数据。
- DNS缓存(IP和域名映射表)
- 页面资源缓存
# 服务器返回响应头中Cache-Control缓存资源
Cache-Control字段设置是否缓存该资源,过期时长使用Max-age参数。
- 如果缓存资源未过期,再次请求会直接返回缓存中的资源给浏览器。
- 如果缓存过期,浏览器继续发起网络请求,并在HTTP请求头中带上If-None-Match:"xxxx",服务器接受到请求头,根据If-None-Match来判断请求的资源是否有更新。
- 如果服务器资源有更新,直接返回最新资源。
- 如果没有更新,返回304状态码,刷新缓存新鲜度,告诉浏览器这个缓存可以继续使用,不需要重复发数据给你。
# 保持登录状态
- 服务器接受浏览器提交的信息,生成一段用户身份串并且写到响应头的Set-Cookie字段中。
- 浏览器接收到服务器响应头,解析响应头遇到Set-Cookie字段,浏览器把这个字段信息保存到本地。
- 用户再次访问,浏览器发起HTTP请求,发起请求之前会读取之前保存在Cookie的数据,并把数据写进请求头的Cookie字段中。
- 服务器接收到HTTP请求头数据后,查找请求头中的Cookie字段,返回包含用户信息的数据页面。
# 总结
- 构造请求
- 查找缓存
- 准备IP和端口(DNS)
- 等待TCP队列
- 建立TCP请求
- 发起HTTP请求(Cache Control、Cookie Set)
- 服务器处理请求
- 服务器返回响应
- 断开TCP连接