Http协议
Http协议是什么
Http协议(超文本传输协议),是一种在互联网中常用的通信协议,比如网页
在网页中,我们使用URL格式来获得我们需要访问的资源。
URL(统一资源管理器)的格式如下。
`http://hostname[:port]path[?][para]
在URL中,存在一些特殊的字符,如(? / : +)等,还比如汉字等这些特殊字符,如果这些字符出现在URL的非格式位置,则其会被解释为特殊符号。
一般解释为( %+符号的16进制表示 )。
URL中的问号用于区分URI和参数,参数使用K=V的格式传递,同时参数与参数之间使用&进行分割。
同时URL中,path不一定是在服务器主机中的真实路径,在服务器中,存在一个叫做默认目录,在path中,表现出 ‘/’ ,一般来说,默认目录在服务器中的名字是wwwroot,默认目录是可以更改的。
同时,如果http请求发送的是一个目录,则返回的是该目录下的index.html文件,该文件被成为默认首页。
同时,URL中的path不一定是服务器中的某个路径下的网页,也可能是某个服务,该服务可以通过计算机语言进行编写,从而实现通过path,动态访问服务器上的某个服务,比如说百度搜索的/s就是一个服务。
Http request格式
Http请求报文如上,可以分为三部分。
1.请求行
2.请求报头
3.空行
在下面慢慢解析。
Http请求行解析
Http请求行格式如下。
方法 空格 URI 空格 版本 回车换行。
版本值为客户端的Http版本。
Http request方法表如下。
上述方法表中,只有GET,POST,HEAD等几个方法较为重要。
1).GET方法:从指定的资源(服务器)获得数据,GET方法传递参数是通过URI的方式提交参数。
2).POST方法:向指定的资源(服务器)提交数据,POST方法传递参数是通过正文方式提交参数。
对比GET和POST方法,POST方法传递参数比GET方法更加安全,同时能够传递更多参数。
而GET方法更安全(及不会改变服务器的内容),并且是幂等的(多次执行相同操作,得到的结果是相同的)。
POST方法不安全,并且不是幂等的。
3).HEAD方法:获得资源的首部。
Http请求报文解析
Http请求报文如下。
首部字段 冒号 空格 值 回车换行。
Http 请求报文的格式是K-V格式的,K值有如下的选择。
1).Contant_length:返回正文的长度。
2).Host:是服务器的Ip和Port。
3).User-Agent:返回当前使用的浏览器版本以及当前的OS内核版本。
4).Cookie:用于在客户端存储少量内容,用于会话功能,让Http实现记忆功能。
5).Connection:在Http1.1后加入的字段值,Http1.0每次发送Http Request都需要新建立TCP链接,而在Http1.1后,使用该字段并且赋值为keep-alive,Http的TCP链接就是长链接。
6).referer:代表当前网页是从那个网页跳转来的。
Http response格式
Http响应报文如上,可以分为三部分。
1.响应行
2.响应报头
3.空行
在下面慢慢解析。
Http应答行解析
Http应答行如下。
版本 空格 状态码 空格 状态短语 回车换行。
以下是状态码的类型,以及状态短语。
较为重要的状态码如下。
1).202:其状态短语为OK。
2).301:永久重定向,一般给搜索引擎用于更新域名的。
3).302,307:都是临时重定向。
4).404:代表未找到资源。
Http应答报文解析
Http应答格式如下。
首部字段 冒号 空格 值 回车换行。
Http 请求报文的格式是K-V格式的,K值有如下的选择。
处理Http请求报文的首部字段外,还存在一些字段主要用于Http应答报文。
1).Contant_type:用于显示当前资源的资源类型,存在一个对照表。
以下是部分对照表,如.html为text/html…
2).Location:搭配3xx(重定向)使用,告诉客户端接下来要访问的网页的域名。
HTTP缓存技术
当用户频繁访问某个网页时,我们可以将[请求 – 响应]缓存在本地的,当我们再次请求该网页时,就可以从本地得到内容,从而大大提升了访问的效率。
HTTP缓存存在两种方式,1.强制缓存,2.协商缓存。
1).强制缓存
强制缓存主要与response报文的Cache-Control和Expires字段有关,Cache-Control字段代表相对时间,而Expires字段代表绝对时间,同时如果两个字段同时存在的化,Cache-Control的优先级高于Expires,Cache-Control字段更加精细,建议使用该字段。
强制缓存工作原理
1).客户端第一次向服务器请求资源时,在服务器返回资源时会设置Cache-Control字段。
2).当客户端再次访问服务器请求相同资源时,会先将当前时间与Cache-Control时间对比,如果没有过期,则直接访问缓存,否则客户端在向服务器请求资源。
3).服务器再次收到请求后,会再次更新 response 头部的 Cache-Control。
2).协商缓存
协商缓存可以与强制缓存一起使用,协商缓存是服务器告知客户端是否可以使用本地缓存的方式。
与协商缓存有关的字段主要有以下4种。
1).响应头部中的Last-Modified,代表最后修改时间,同时请求头部中的If-Modified-Since,当本地资源过期后,发现响应头中具有 Last-Modified 声明,请求头部带入If-Modified-Since字段,并且将Last-Modified字段的值赋给If-Modified-Since,当服务器接收到请求字段后,用该字段与服务器中的资源的最后修改时间进行对比,如果最后修改时间较新(大),代表资源被修改了,则HTTP响应报文返回码为200,并且将新资源返回,如果最后修改时间较旧(小),代表资源没被修改,则HTTP响应报文返回码为304,客户端访问缓存。
2).响应头部中的Etag,标识唯一一个响应资源,同时请求头部中的If-None-Match的作用是,当本地资源过期时,并且响应报头带有Etag,则将If-None-Match字段赋值为响应报头的Etag,发送给服务器,同时服务器接收到后与该资源进行对比,如果改变了,则返回200,并且将新资源返回,否则返回304,使用本地缓存。
如下,Etag的优先级大于Last_Modified。
HTTP Cookie和Session
HTTP是无状态,且无连接的,所谓无状态,就是我们每次对HTTP申请,都不会在服务器中留下用户访问的状态,每次访问都需要从头开始,为了解决该问题,有人提出了Cookie。
Cookie是维护在客户端的一些登录数据,当我们第一次向服务器申请资源时,服务器会将设置Set-Cookie字段,Set-Cookie字段格式如下。
Set-Cookie:< Cookie name >=< val >;[属性1]=[val];[属性2]=[val]…
首先是设置当前的Cookie的名字,一个Set-Cookie字段只能设置一个Cookie,名字叫做Cookie name。
同时Cookie的常用字段有以下一些。
1).expires属性:是设置该Cookie的过期时间(时间的格式是UTC),如果不设置该字段,则默认关闭浏览器Cookie就被删除。
2).path属性:只有用户访问path路径时,才会携带Cookie属性。
3).domain属性:domain是一个服务器的IP,只有访问该IP时,才会携带Cookie属性。
Cookie的缺点如下。
1),由于Cookie的数据都存储在客户端,所以可能被窃取,存在安全问题。
2).存在他人使用该信息登录网站的安全问题。
为了解决Cookie的缺点,则可以使用Session,两者搭配在一起,能较好的解决Cookie的缺点。
这是因为客户的信息是存储在服务器中的,而服务器被窃取的可能性就十分小了。
实际上,在服务端,会维护一个Session对象,同时,每个Session对象都会有一个唯一的ID,来标识一个客户,当客户端首次访问服务器时,会根据客户端的信息建立一个Session对象,并且创建一个唯一的SessionID,并且设置Set-Cookie字段,将SessionID返回到客户端,客户端只需要维护一个SessionID,下次使用SessionID访问服务器,就能找到SessionID对应的Session对象。
Cookie和Session一起使用,是当今web使用的策略。
两者一起使用,解决了有人直接从客户端窃取用户信息的安全问题。
但是,能否解决他人使用该信息登录网站的安全问题,这需要结合服务器的业务。