1、浏览器向DNS服务器查找输入URL对应的IP
2、DNS服务器返回网站的IP地址
3、浏览器根据IP地址与目标web服务器在80端口上建立TCP连接
4、浏览器获取请求页面的HTML代码
5、浏览器在显示窗口内渲染HTML
6、窗口关闭时,浏览器终止与服务器的连接
1.域名解析
2.发起TCP的三次握手
3.Web浏览器向服务器发送http请求命令
4.Web浏览器向服务器发送http请求头信息
5.Web服务器应答
6.Web服务器发送应答头信息
7.服务器向浏览器发送数据
8.服务器关闭TCP连接
状态码由3个数字组成,第一个数字定义了响应类别,且有5种可取值:
1XX:指示信息-表示请求已接收,继续处理
100:客户必须继续发出请求
101:客户要求服务器根据请求转换HTTP协议版本
2XX:成功-表示请求已被成功接收、理解、接受
200:成功,服务器已经成功处理了请求,通常,这表示服务器提供了请求网页
201:已创建:请求成功且服务器创建了新的资源
202:已接受,服务器已接受请求,但尚未处理
3XX:重定向,要完成请求必须进行下一步操作
300:多种选择:针对请求,服务器可以执行多种操作,服务器可根据请求者选择一项操作,或提供操作列表供请求者选择
301:永久移动:请求的网页已永久移动到新位置,服务器返回此响应时(对get或head请求),会自动将请求者转到新位置
302:临时移动:服务器目前从不同位置的网页响应请求,但请求者应继续使用原位置来进行以后的请求
4XX:客户端错误-请求有语法错误或请求无法实现
400:错误请求,服务器不理解请求语法
401:未授权,请求者身份验证,对于需要登录的网页,服务器可能返回此响应
403:禁止:服务器拒绝请求
5XX:服务端错误-服务器未能实现合法的请求
500:服务器内部错误:服务器遇到错误,无法完成请求
501:尚未实施:服务器不具备完成请求的功能
502:错误网关:服务器作为网关代理,从上游服务器收到无效响应
503:服务不可用:服务目前无法使用,通常只是暂时状态
504:网关超时:服务器作为网关或代理,但是没有及时从上游服务器收到请求
505:http版本不受支持
Accept:告诉服务器,客户端支持的数据类型
Accept-Charset:告诉服务器,客户端采用的编码
Accept-Encoding:告诉服务器,客户端支持的压缩类型
Accept-Language:告诉服务器,客户端的语言环境
Host:告诉服务器,想要访问的主机名
Date:告诉服务器,当前请求时间
Connection:请求完后是关闭还是保持连接
Cookie:可以向服务器带数据
Referer:告诉服务器,从哪个资源来访问的
GET /sample.Jsp HTTP/1.1 //请求行
Host: www.uuid.online/ //请求的目标域名和端口号
Origin: http://localhost:8081/ //请求的来源域名和端口号 (跨域请求时,浏览器会自动带上这个头信息)
Referer: https:/localhost:8081/link?query=xxxxx //请求资源的完整URI
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36 //浏览器信息
Cookie: BAIDUID=FA89F036:FG=1; BD_HOME=1; sugstore=0 //当前域名下的Cookie
Accept: text/html,image/apng //代表客户端希望接受的数据类型是html或者是png图片类型
Accept-Encoding: gzip, deflate //代表客户端能支持gzip和deflate格式的压缩
Accept-Language: zh-CN,zh;q=0.9 //代表客户端可以支持语言zh-CN或者zh(值得一提的是q(0~1)是优先级权重的意思,不写默认为1,这里zh-CN是1,zh是0.9)
Connection: keep-alive //告诉服务器,客户端需要的tcp连接是一个长连接
响应头部
HTTP/1.1 200 OK // 响应状态行
Date: Mon, 30 Jul 2018 02:50:55 GMT //服务端发送资源时的服务器时间
Expires: Wed, 31 Dec 1969 23:59:59 GMT //比较过时的一种验证缓存的方式,与浏览器(客户端)的时间比较,超过这个时间就不用缓存(不和服务器进行验证),适合版本比较稳定的网页
Cache-Control: no-cache // 现在最多使用的控制缓存的方式,会和服务器进行缓存验证,具体见博文”Cache-Control“
etag: "fb8ba2f80b1d324bb997cbe188f28187-ssl-df" // 一般是Nginx静态服务器发来的静态文件签名,浏览在没有“Disabled cache”情况下,接收到etag后,同一个url第二次请求就会自动带上“If-None-Match”
Last-Modified: Fri, 27 Jul 2018 11:04:55 GMT //是服务器发来的当前资源最后一次修改的时间,下次请求时,如果服务器上当前资源的修改时间大于这个时间,就返回新的资源内容
Content-Type: text/html; charset=utf-8 //如果返回是流式的数据,我们就必须告诉浏览器这个头,不然浏览器会下载这个页面,同时告诉浏览器是utf8编码,否则可能出现乱码
Content-Encoding: gzip //告诉客户端,应该采用gzip对资源进行解码
Connection: keep-alive //告诉客户端服务器的tcp连接也是一个长连接
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
10 MOVE 请求服务器将指定的页面移至另一个网络地址。
11 COPY 请求服务器将指定的页面拷贝至另一个网络地址。
12 LINK 请求服务器建立链接关系。
13 UNLINK 断开链接关系。
14 WRAPPED 允许客户端发送经过封装的请求。
15 Extension-mothed 在不改动协议的前提下,可增加另外的方法
Cookie:是存储在用户本地计算机上,用于保存一些用户操作的历史信息,当用户再次访问服务器的时候,浏览器通过HTTP协议,将他们的本地cookie内容也发到服务器上,从而完成验证
cookie分为会话cookie和持久cookie,区分方法:持久cookie设置了过期时间,没设置过期时间的就是会话cookie
因为设置了过期时间,当前cookie就存在用户的硬盘中,不是内存中。因为不在内存中,所以关闭浏览器还是重启,只有在有效时间内,这个cookie都可用。
Session:保存在服务器上的用户操作信息。当用户访问服务器,服务器会生成一个Session ID,然后把session id存储起来,再把session id发给用户,用户再次访问服务器时,拿着这个session id
就能验证了,当这个id和服务器上存储的id对应起来,即为验证通过。
Cookid和session的不同;
存储方式不同:Cookie存储在客户端上,session存储在服务器上;
安全性上:cookie存在用户机器上,cookie不安全,但是session也不是绝对安全,有session 劫持,xxs攻击
存储大小不同:由于cookie要跟随请求发送到服务器,所以为了访问速度,cookie的大小不能太大,不然仅仅一个cookie的传递,就把网络搞死了。而session只是在用户和服务器之间传递一个id,
所以存储在服务器上的session大小并没太大限制。
请求报文:请求行+请求头部+请求正文
响应报文:状态行+响应头部+响应正文
优点:
1、增加了持久性连接:也就是多个请求和响应可以利用同一个TCP连接,减少了建立和关闭连接的消耗和延迟:Connection:keep-alive
2、增加了管道机制:请求可以同时发出,但是响应必须按照请求顺序依次返回,性能在一定程度上得到改善。
3、分块传输:在HTTP/1.1版本中,可以不必等待数据完全处理完毕再返回,服务器产生部分数据,那么就发送部分数据,很明显此种方式更好一些,可以节省很多等待时间
4、增加host字段:使得一个服务器可以用来创建多个web站点
5、错误提示:引入了warning头域,增加对错误或者警告信息的描述,此外,在HTTP/1.1版本中增加了24个状态响应码(100 101 203 205 206 301 305...)
6、带宽优化:引入了range头域,允许只请求资源的某个部分
缺点:
1、队头阻塞:此版本的网络延迟问题主要由于队头堵塞导致,虽然通过持久性连接得到改善,但是每一个请求的响应依然需要按照顺序排队,如果前面的响应处理较为耗费时间,那么同样非常耗费性能
2、技术不成熟:虽然引入了管道机制,但是存在诸多问题,且默认是关闭的
3、浪费资源:携带冗余的头信息,浪费带宽
优点:
1、二进制分帧:在应用层和传输层之间增加一个二进制分帧层,从而突破HTTP/1.1的性能限制,改进传输性能,降低延时和提高吞吐量
2、多路复用(连接共享):允许同时通过单一的HTTP/2.0连接发起多重请求-响应消息
3、首部压缩:1.1不支持header数据压缩,2.0使用HPACK算法header数据进行压缩,减小数据体积,提高网络传输。
4、服务器推送:2.0中服务器可以对客户端的一个请求发多个响应,即服务器可以额外的向客户端推送资源,无需客户端明确的请求
HTTP通信接口部分用SSL和TSL协议替换
通常HTTP直接和TCP通信,当使用SSL时,演变成先和SSL通信,再由SSL和TCP通信。
模型如下:
HTTP -> HTTP
TCP SSL
IP TCP
IP
在使用了SSL后,HTTP就拥有了HTTPS的加密,证书和完整性保护。
1、客户端发起HTTPS请求;2、服务端配置;3、传送证书;4、客户端解析证书;5、传送加密信息;6、服务端解密信息;7、传输加密后的信息;8、客户端解密信息
https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
http 是超文本传输协议,信息是明文传输, https 则是具有安全性的ssl加密传输协议。
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http 的连接很简单,是无状态的; HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。
浏览器不能执行其他网站的脚本,是由浏览器的同源策略造成的。
同源策略(SOP):浏览器最核心最基本的安全功能,如果缺少了,浏览器很容易受到XSS,CSFR攻击,所谓同源指的是:“协议+域名+端口”相同
同源策略限制了以下行为:
Cookie、LocalStorage 和 IndexDB 无法读取
DOM 和 JS对象无法获取
Ajax请求发送不出去
解决跨域:
nginx代理、node代理、websocket代理
强缓存(本地缓存):利用头部的expries和cache-control两个字段来控制的,用来表示资源的缓存时间。普通刷新会忽略它,但不会清除它,需要强制刷新,
浏览器强制刷新,请求会带上 Cache-Control:no-cache 和 Pragma:no-cache。有缓存命中(有缓存数据且未失效,成功返回)和缓存未命中状态
协商缓存(弱缓存):由服务器来确定缓存资源是否可用,普通刷新会启用弱缓存,忽略强缓存。有缓存命中(有缓存数据且未失效,成功返回)和缓存未命中状态
LRU:最近最少使用
LFU:最不经常使用