学习《图解http》总结

Web前端 来源:kingliguo 62℃ 0评论

1.什么是http?

HTTP(Hypertext TransferProtocol),即超文本传输协议。是client-server之间的处在应用层的通讯协议。HTTP协议是基于TCP/IP之上的协议。通俗来讲是服务器和客户端之间传输数据的一些约定。

 

2.那什么又是TCP/IP呢?

TCP/IP是在IP协议的通信过程中,使用到的协议族的统称。其分为以下四层:

应用层:决定了想用户提供引用服务时通信的活动,比如FTP,DNS,当然http也在这一层;

传输层:传输层对上层应用层提供服务,负责提供处于网络连接中两台计算机之间的数据传输;著名的TCP和UDP协议就是在这一层;

网络层:该层用来处理网络上流动的数据包(网络传输的直销数据单位),选择传输数据的路径;

链路层:和硬件打交道的就在这一层了;

 

3.与HTTP协议密切相关的IP,TCP,和DNS

IP协议(位于网络层)负责把各种数据包传送给对方,而要完成这一看似简单的过程,却需要两个最重要的东西,一个是IP地址,一个是MAC地址(物理地址);

如下图所示,在输入202.108.22.5,和输入www.baidu.com 的效果是一样的,他同样到达了百度;实际上计算机网络只认识如“202.108.22.5”格式的ip地址,在我们输入www.baidu.com的时候实际上走了一遍DNS服务器(负责将域名解析成IP地址),DNS服务器将地址转换成了202.108.22.5;在转换成了Ip地址后还需要通过ARP协议将IP地址转换层MAC地址,以确保能到达某一台物理计算机;

而上面这些繁琐的工作就是IP协议在负责;

 

当计算机在实现真正的数据传输的时候,是在依靠TCP协议(传输层)来确保数据传输的可靠性,著名的“三次握手”就是在这里握的;在这里不对TCP做更多的解释,具体可以参考《图解TCP/IP》。

 

4.http协议用于客户端和服务器端之间的通信

       请求访问资源的一端称为客户端,而提供资源响应的一端称为服务器端,http协议规定,请求从客户端发起,最后在服务器端响应该请求并返回。总结来说,肯定是先从客户端开始建立通信的,服务器端在收到请求之前是不会主动发送响应的

 

5.http是不保存状态的协议

       也就是说在http这个级别,协议对于发送过的请求或响应都不做持久化处理,这样好处是什么呢?当然,可以保证处理大量食物,确保协议的可伸缩性,http/1.1虽然是无状态的,但为了实现期望的保持状态,引入了cookies技术,稍后会详细介绍cookies。

 

6.告知服务器意图的HTTP方法

方法

说明

支持的http版本

GET

获取资源

1.0、1.1

POST

传输实体主体

1.0、1.1

PUT

传输文件

1.1、1.1

HEAD

获得报文首部

1.0、1.1

DELETE

删除文件

1.0、1.1

OPTIONS

询问支持的方法

1.1

TRACE

追踪路径

1.1

CONNECT

要求使用隧道协议连接代理

1.1

LINK

建立和资源之间的关系

1.0

UNLINK

断开连接关系

1.0

 

7、持久连接节省通信量

初始的http是 每进行一次http通信就要断开一次TCP连接,这在今日的互联网需求下显然是不可以的,因此,为了解决这个问题有了以下几个方案。

A.持久连接,也就是 connection 设置为keep-alive,这样之后,只要任意一段没有明确提出断开连接就会保持TCP连接状态。以百度首页响应头为例:

          

 

B.管线化:持久连接有一个问题那就是,尽管TCP没有断开,但是每次请求都得等上一次请求得到响应之后才可以进行下一个请求,如果一个页面有很多个http请求那就 麻烦了,还得排队一个一个来。这太反人类了,因此有了管线化,采用管线化方式之后可以并行发送多个请求,而不需要一个接一个地等待响应。真是两全其美的方案。

 

8.使用cookies的状态管理

       由于http是无状态协议,那么假设要求登录验证的web页面本身无法进行状态的管理,那么每次跳转新页面就得重新登录,这很不好,可是我们知道http协议无状态有它的好处,比如可以减少服务器CPU的内存消耗,因此,在不改变这个协议的情况下,引入了cookies技术,cookies技术通过在请求和响应报文中写入cookies信息来控制客户端的状态,cookies会根据从服务器发送的响应报文内的一个叫做set-cookies的首部字段信息,通知客户端保存cookies,当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入cookies之后发送出去,由此,服务器便知道了状态信息。

 

9.编码提升传输速率

       A.内容编码 gzip,compress,deflate等

       B.分块传输编码

 

10.获取部分内容的范围请求,

       假设一个场景,我们在下载一部电影,突然断网了,那就必须得重头开始下载么?事实上并不是这样的,我们可以断点处继续下载,而这功能就依托于http的范围请求

只需在首部字段Range制定资源的byte范围就可以了,

例如:获取5001-10000字节:Range:bytes=5001-10000

         获取5001字节之后全部的:Range:bytes=5001-

         假如被服务器正确处理,返回206状态码

 

11.内容协商返回最合适的内容   

 

如请求头中的Accept,Accept-Language等代表媒体类型,其中以分号隔开,后面一个q又是什么呢?其实这个q代表的是权重值,范围在0~1;默认是1;

当需要响应较多媒体类型时,服务器会较先响应权重值高德媒体类型。

 

12.状态码告知从服务器返回的请求结果[手册]

1**系列

接收的请求正在处理

2**系列

请求正常处理完毕

200 ok

表示客户端发来的请求在服务器端被正常处理了;

204 no content:

 

该状态码代表服务器接收的请求已处理成功,但在返回的相应报文中不含实体的主体部分;

206 Partial Content

 

该状态码表示客户端进行了范围请求,二服务器成功执行了这部分的GET请求,并且响应报文中包含由content-range制定范围的实体内容

3**系列

需要进行附加操作以完成请求

301 Moved Permanently

永久性重定向

302 Found

临时性重定向

303 See Other

 

该状态码表示由于请求对应的资源存在另一个URI,应使用GET方法定

向获取请求的资源,和302状态码有着相同的功能,但303明确表示客

户端应该采用GET方法资源。

304 Not Modified

该状态码表示客户端发送附带条件(如If-Modified-Since)时,未匹配到

307 Temporary Redirect

零时重定向

4**系列

客户端错误

400 Bad Request

请求报文存在语法错误

401 Unauthorized

需要认证信息

403 Forbidden

访问被服务器拒绝

404 Not Found

服务器上没有请求的资源

5**系列

服务器错误

500 Internal Server Error

请求时发生错误,可能是bug或者是临时的故障

503 Service Unavailable

服务器暂时处于超负载或正在进行停机维护,无法处理请求

 

13.http的四中首部字段类型

       A.通用首部字段:请求报文和详情报文两方都会使用的首部

B.请求首部字段:请求报文使用的首部

C.响应首部字段:响应报文使用的首部

D.实体首部字段:补充信息

 

14.常见的首部字段:(归纳来自:http://blog.csdn.net/linhaiman/article/details/7025336)

通用首部字段:
Cache-Control
: no-cache (*) // no-cache:不缓存过期资源 no-store:都不缓存
Connection: close           //用于指定处理完本次请求后是否保持连接. 如果为close时就处理完响应        就断开连接(HTTP1.1默认是打开持久连接.如果没有close就默认是连接的.)
Date:Tue, 11 Jul 2000 18:23:51 GMT
Pragma:no-cache     //HTTP1.0中指定不要缓存的HTTP头.
Trailer:Date           //指于在实体信息后面可以出现那些头字段
Transfer_Encoding:chunked    //传输的编码方式.给HTTP内容分段传送。chunked是指每个分段开始都有一个16进制的长度.后后一个分段必须为零的分段.
Upgrade:HTTP/2.0 ,sHTTP/1.3 //希望使用什么协议来通知.
Via:HTTP/1.1 Proxy1,Http/1.1 Proxy2 //代理服务器的信息,如果经过多个,就会在via中加后面依次加入多个.

注:Content-Length和Transfer_Encoding分别什么时候用,如果程序在缓冲中知道内容长度就使用Content-Length,如果缓冲区一次不能缓冲,那就只能使用Transfer_Encoding,然后分段传输.

请求首部字段:
Accept:text/html,image/*          //支持的文件格式
Accept-Charset:ISO-8859-1,unicode-1-1 //支持的字符集
Accept-Encoding:gzip,compress //支持的编码方式
Accept-language:en-gb,zh-cn   //支持的语言
Authorization:Basic asdfsadfsafdaenh4 //加密认证方法
Host: www.php-oa.com:80    //指定客户端打开的主机名和端口号
if-Match:"aaa","bbb"         //实体标签.用来查看是否是和当前的信息一样.
if-Modified-Since: Tue, 11 Jul 2008 18:03:00 GMT //上次缓存的网页缓存时间
if-None-Match:"aaa","bbb"    //和if-match相反
if-Range: Tue, 11 Jul 2008 18:03:00 GMT   //只能和Range一起使用.
if_Unmodified-Since:Tue,11 Jul 2008 18:03:00 GMT 和if-Modified-Sinc相反.
Max-Forwards: 1   //通过代理服务器的数量,象ttl值.
Proxy-authorization: //代理时的方法
Range:bytes=100-599 //断点续传时使用的HTTP
Referer:HTTP://www.php-oa.com/index.php //上一跳来源的网站
TE:trailers.deflate //说明客户除了chunked还能使用什么方法
User-Agent:Mozilla/40(compatible;MSIE5.5;Windows NT 5.0) //浏览器信息

响应首部字段:

Allow :GET.POST
Content-Encoding:gzip
Content-Language:zh-cn
Content-Length:800                  //大小
Content-Location:HTTP://www.php-oa.com/index.html   //重定向到
Content-MD5:ABDEDFDEFERDFEFE==          //指出md5,可以算出内容是否被改变过
Content-Range:bytes 2543-4532/7878        //断点续传时用.
Content-Type:text/html;charset=GB2312     //指定文件类型,和字符集
Expires: Tue, 28 Jul 200816:49:49          //过期时间
Last-Modified:Tue 11 Jul 2008 16:49:4      //最后更新时间

扩展头:
HTTP1.1中没有定义的字段.比如下面的这些.
Cookie
Set-Cookie
Refersh: 1; url=HTTP://www.php-oa.com
Content-Disposition
 Content-Type:application/octet-stream
 Content-Disposition:attachment;filename=aaa.zip //filename为文件保存的名字

 

15.说了这么多http的好,那http有什么缺点呢?

            A.通信使用明文(不加密),内容可能被窃听

            B.不验证同心坊的身份,因此有可能遭遇伪装

            C.无法证明报文的完整性,所以有可能已遭篡改

 

16.https

        http+加密+认证+完整性保护 = https

https是身披SSL外壳的http

https采用混合加密方式,建立通信使用对称加密,传输数据使用非对称加密

 

17.常见web的攻击技术[永远不要相信用户的输入]

        A.跨站脚本攻击

B.SQL注入攻击

C.OS注入攻击

D.HTTP首部注入攻击