http是应用层的协议。
当浏览器输入一个URL按回车的时候会经历以下步骤:
1、redirectStart:进行重定向,浏览器可能已经记录了你当前输入的这个URL永久跳转到一个新的URL上了。
2、看缓存 有可能你请求的资源已经缓存过了,查看APP cache,检查当前请求资源是否已被缓存。若没有被缓存则去实际的服务器上请求资源。
3、请求实际服务器的时候,当然涉及到域名与IP地址的转换,需要走DNS服务器,获取请求URL对应的IP地址。
4、经过三次握手建立TCP连接
5、发送request请求。
6、服务端返回结果。
关于上述第四步,三次握手,可以通过抓包看到:
需要注意的问题:
同一个tcp连接中,可以发送多个http请求,并不是一个http请求对应一个TCP连接,http1.0版本及之前版本的确是一个http请求对应一个tcp连接,返回结果结束,就关闭连接。但是http1.1之后,考虑到效率问题,同一个tcp连接中,可以发送多个http请求了。
http2.0 所有数据都是以二进制方式传输。
头信息可以被压缩了,因为之前版本例如 context Type这些字段都是以字符流传输,现在改为二进制。
新增推送功能:之前版本加载页面,例如加载一个html,是先请求到html,再通过html里的图片链接,css链接等再次发送请求。http2.0可以在收到请求的时候,除了返回html以外,还可以同步推送css,js等给客户端浏览器,让之前的串行变成并行。提高了效率。
URI:包含了URL与URN
URN:永久资源定位,请求一个资源,这个资源可能会改动,改动之后URL无法再次访问到,一般报404,URN是用于解决即使资源改动了位置,依然可以使用之前的URL访问到该资源,目前没有成熟的方案去实现。
http请求包:
分为:
首行(不属于headers头部):
1、包含method:对于一个完成度比较高的web来说,对于同一个url不同方法对应的处理不一样,例如GET获取一个资源,post上传一个资源,delete删除一个资源,put更新一个资源,不过这些method只是写在纸上的一种规范,更新你完全也可以用GET,但是并不好,这就像 老师让你不许骂人,但是你完全可以骂人,虽然骂人不文明…
2、包含路由信息,例如http://www.baidu.com 这里的baidu.com就是路由信息,在上图中为:/test/hi-there.txt
3、协议版本,上图中为:http 1.0版本
头部:除了http的首行以外,剩下的都是header,那怎么区分header和body呢?header与body之间有一个完整的空行,来区分。
主要包含body中的一些信息,这里之后再更新