HTTP学习笔记

前言

基本每天都在用HTTP,可是对HTTP又感觉很陌生,最近比较闲,就了解整理点笔记。

待看博客,改天整理

HTTP协议漫谈
关于HTTP协议,一篇就够了

关于HTTP

重温一下大学已经忘差不多的一小点点点 = =|||

Internet四层网络协议模型(也叫TCP/IP四层模型),包括:数据链路层,网络层、传输层和应用层。
网络层最著名的协议:IP协议。
传输层最著名的协议:TCP协议、UDP协议。
应用层协议较多:如FTP协议,POP协议,SMTP协议,DNS协议,TELENT协议,以及今天学习的HTTP协议等。

概念(copy from百度百科)

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。

how it works?

基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。

1
2
3
客户端发起请求,与服务器端完成“TCP三次握手”
客户端向服务器端发出“HTTP请求报文”
客户端与服务器端完成“TCP四次分手”

HTTP协议本身是一种无状态的协议,即每一个HTTP报文不依赖于其前面的报文状态。

PS:附一张小伙伴给我解释TCP三次握手的插曲,haha ^_^

URL

HTTP协议中的URL主要是用于定位服务器端资源的位置,定义如下

1
2
3
4
5
6
http://host[:port][path]
http:// 表示我们要使用HTTP协议;
host 表示一个可用的域名或IP地址;
port 为可选,表示要请求的端口号,缺省情况下为80
path 为可选,表示要请求的资源所在的路径(也叫URI),缺省情况下为/

报文格式

请求报文格式:请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体
响应报文格式:状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

HTTP请求报文方法

1
2
3
4
5
6
7
8
GET方法:请求某资源
POST方法:请求某资源的同时附上一些数据
HEAD方法:请求某资源对应的响应报文头
PUT方法:上传一个资源
DELETE方法:删除一个资源
TRACE方法:让服务器回送请求报文,用于调试和排障
OPTIONS:请求服务器性能信息
CONNECT:预留给代理服务器所用

HTTP状态码

状态码共分五种,总共只有三位,第一位表示状态类别。

1
2
3
4
5
1xx:是进度通知类状态,意思就是说“请求我已经收到了,或你的请求我正在处理”;
2xx:表示“你的请求我已经成功处理了”;
3xx:即重定向,也就是服务器告诉客户端“你要的资源搬家了,你到某某地方再去找他吧”;
4xx:客户端发来的响应报文里有些错误,比如语法错误或请求的资源不存在等;
5xx:服务器端有些问题,已经无法处理完成你的请求了。

列举:

1
2
3
4
5
6
7
8
9
10
11
200 OK:客户端请求成功了,客户端要的东西就在响应报文里了;
301 Moved Permanently:客户端啊,你要请求的资源已经永久的搬家了,我把他的新地址放到了Location头部域中了;
302 Moved Temporarily:客户端啊,你要请求的资源临时有事去别的地方了,我把他的位置放到了Location头部域中了,你可以先去那里找他,不过他应该是会回到他自己的家的;
304 Not Modified:客户端啊,你要请求的资源自从上次你请求之后,就再也没有改动过,我想你是应该早就有这个资源了,所以在响应报文的数据部分我也没有再放这个资源。
400 Bad Request:客户端发来的请求报文里有语法错误,服务器端实在看不懂了;
401 Unauthorized:客户端发来的请求不是合法来源的请求,也就是这个客户端是没有被授权的;
403 Forbidden:服务器端顺利收到了客户端的请求,但是因为某些理由,服务器端拒绝为他提供服务;
404 Not Found:客户端要请求的资源不存在,八成是资源地址写错了;
500 Internal Server Error:很遗憾,服务器不能给你提供服务了,服务器内部出现了不可预知的问题了;
502 Bad Gateway:客户端你好,我是请求报文的代理服务器,持有资源的那个服务器在给我发送资源时出问题了;
503 Server Unavailable:服务器现在可能是太忙了,暂时不能给你这个客户端提供服务了,或许稍后会恢复。

详细截图:



HTTP版本

1
2
3
4
5
6
7
8
9
10
0.9 已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
HTTP/1.0 这是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在:
1 缓存处理
2 带宽优化及网络连接的使用
3 错误通知的管理
4 消息在网络中的发送
5 互联网地址的维护
6 安全性及完整性

一些高级用法mark(copy from http://roclinux.cn/?p=3450)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1 HTTP1.1中,我们可以在报文中使用Cache-Control域来控制缓存策略;而在HTTP1.0中则可以使用Pragma域来控制。为了确保达到效果,我们往往会在HTTP报文中同时设置Cache-Control:no-cache和Pragma:no-cache
2 在请求报文中,我们可以设置Accept头部域来指明客户端希望接受哪些类型的数据,比如Accept:image/gif,则表明客户端希望接收gif图片数据。当然我们可以设置很多种可接受的类型。
3 在请求报文中,Accept-Charset则是用来设置客户端希望接受的字符集。
4 在请求报文中,Accept-Encoding则是用来指定客户端希望接受的编码类型。
5 在请求报文中,Accept-Language是指明客户端希望接受的语言类型,例如Accept-Language:zh-cn,表明客户端希望得到中文的内容
6 在请求报文中,If-Modified-Since域用作缓存策略。具体的原理是这样的,浏览器本地会缓存一些数据,包括网页、图片等,而且还会同时存储这些缓存数据在服务器端的最后修改时间(Last-Modified)。当浏览器再向服务器端发起这些数据的请求时,会同时把这些数据的最后修改时间通过If-Modified-Since一起传给服务器端,服务器端一旦看到这个头部域,就会先拿这个时间戳和相应资源的最后修改时间比较下,如果相同,就说明这个资源一直以来都没有改动过,于是服务器端就不用再把这个数据重复的传给客户端了,而是直接在响应报文中返回304即可,避免了重复传输带来的带宽消耗。
7 有些同学会感觉疑惑,为什么Last-Modified和If-Modified-Since域都是存储“最后修改时间”的,有啥区别呢。他俩的区别在于,Last-Modified域是响应报文中使用的,由服务器端发给客户端的;而If-Modified-Since则是用在请求报文中的,由客户端发给服务器端的。这两者都是用绝对时间来表示的,所以存在时间同步的问题。那有没有更好的解决办法呢,请继续往下看:)
8 为大家隆重推出Etags和If-None-Match这一对兄弟,他俩的关系和“Last-Modified/If-Modified-Since”的关系一样,Etags(Entity Tags)是用于响应报文中的,而If-None-Match是用于请求报文中的。这对兄弟的好处在于,他们不是以绝对时间来判断数据是否被修改过,而是通过数据的某个属性值来判断,例如数据的MD5值,这样就可以很好的避免时间不同步的问题了。(除了If-None-Match外,请求报文的头部域中还可以用If-Match、If-Range来表示希望获取的Etag值)
9 在响应报文中,可以使用Location头部域来实现重定向,比如更换了域名之后。
10 在HTTP协议里,除了Etags/if-None-Match,Last-Modified/If-Modified-Since外,还有两对这样的兄弟,其一是Server/User-Agent,Server是服务器端用来亮明身份的,而User-Agent是客户端用来亮明身份的;另一对是Set-Cookie和Cookie,Set-Cookie用于服务器端向客户端设置cookie的,而Cookie则是客户端告诉服务器端自己的cookie的。
11 在响应报文中,服务器端可以使用Expires域来告诉客户端最多缓存这个数据到什么时间,如果超过这个时间点的话,客户端就不要再缓存这个数据了,而是向服务器端重新发起新的请求。
12 在响应报文中,服务器端可以使用Set-Cookie头部域向客户端设置cookie。其语法很简单,就是由多个name=value组成的,由分号间隔。例如:
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
13 在响应报文中,X-Powered-By头部域表示服务器端使用到的技术名称,例如X-Powered-By: ASP.NET

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2017 (ˇˍˇ) ~ All Rights Reserved.

(´▽`)ノ | (゚▽゚*)