请求过程
HTTP请求大致可以分为如下步骤:
1. URL解析
之前在简述 URL 中说过,当我们在浏览器中输入一段 URL 的时候,会通过一系列规则,匹配到相应的唯一资源,比如说:http://mu-mu.cn/example/index.html,则是告诉浏览器,我们需要通过http协议,在mu-mu.cn这个服务端,在默认的80端口下,在/example目录下,请求index.html这个资源。
2. DNS解析
根据访问的域名找到其IP地址。DNS查找过程如下:
- 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
- 系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
- 路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。
- ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。
3. 建立TCP连接(三次握手)
HTTP是应用层协议,他的工作还需要数据层协议的支持,最常与它搭配的就是TCP协议(应用层、数据层是OSI七层模型中的,以后有机会会说到的)。
TCP协议称为数据传输协议,是可靠传输,面向连接的,并且面向字节流的。它有如下特点:
- 面向连接:通信之前先建立连接,确保双方在线。
- 可靠传输:在网络正常的情况下,数据不会丢失。
- 面向字节流:传输灵活,但是TCP的传输存在粘包问题,没有明显的数据约定。
在正式发送HTTP请求之前,需要先建立TCP连接。建立TCP连接的过程简单地来说就是客户端和服务端之间发送三次消息来确保连接的建立,这个过程称为三次握手。
4. 发送请求
TCP连接建立完毕之后,客户端就可以向服务端发送请求报文来请求资源了。请求报文分为请求行、请求头、空行和请求体,服务端通过请求行和请求头中的内容获取客户端的信息,通过请求体中的内容获取客户端传过来的数据。
5. 响应回答
在接收到客户端发来的请求报文并且确认完毕之后,服务端会向客户端发送响应报文。响应报文由状态行、响应头、空行和响应体组成,服务端通过状态行和响应头告诉客户端请求的状态和如何对数据处理等信息,真正的数据则在响应体中传输给客户端。
6. 断开TCP连接(四次挥手)
当请求完成后,还需断开TCP连接。断开的过程简单地说就算客户端和服务端之间发送四次信息来确保连接的断开,所以称为四次挥手。
请求特性
一、单向请求
HTTP请求是单向的,是只能由客户端发起请求,由服务端响应的请求-响应模式。(如果你需要双向请求,可以用socket)
二、基于TCP协议
HTTP是应用层协议,所以其数据传输部分是基于TCP协议实现的。
三、无状态
HTTP请求是无状态的,即没有记忆功能,不能获取之前请求或响应的内容。起初这种简单的模式,能够加快处理速度,保证协议的稳定,但是随着应用的发展,这种无状态的模式会使我们的业务实现变得麻烦,比如说需要保存用户的登录状态,就得专门使用数据库来实现。于是乎,为了实现状态的保持,引入了Cookie技术来管理状态。
四、无连接
HTTP协议不能保存连接状态,每次连接只处理一个请求,用完即断,从而达到节约传输时间、提高并发性。在TCP连接断开之后,客户端和服务端就像陌生人一样,下次再发送请求,就得重新建立连接了。有时候,当我们需要发送一段频繁的请求时,这种无连接的状态反而会耗费更多的请求时间(因为建立和断开连接本身也需要时间),于是乎,HTTP1.1中提出了持久连接的概念,可以在请求头中设置Connection: keep-alive来实现。
END!!