HTTP基础知识提炼
这是计算机网络相关的第六篇文章。这里简单记录一些关于HTTP的基本概念,比较基础。下面的内容是对《图解HTTP》提炼的再提炼,主要原因是很多重要的东西前面已经详细说过了,还有一些东西知道即可,用到再去查,作为一个后端攻城狮,也没有必要了解那么琐碎。
HTTP是不保存状态的协议
HTTP是无状态协议。自身不对请求和响应之间通信状态进行保存(即不做持久化处理)。 HTTP之所以设计得如此简单,是为了更快地处理大量事物,确保协议的可伸缩性。 HTTP/1.1 随时无状态协议,但可通过 Cookie 技术保存状态。
告知服务器意图的HTTP方法
- GET:获取资源
- POST:传输实体主体
- PUT:传输文件
- HEAD:获得报文首部,与GET方法一样,只是不返回报文主体内容。用于确认URI的有效性及资源更新的日期时间等。
- DELETE:删除文件,与PUT相反(响应返回204 No Content)。
- OPTIONS:询问支持的方法,查询针对请求URI指定的资源支持的方法(Allow:GET、POST、HEAD、OPTIONS)。
- TRACE:追踪路径
- CONNECT:要求用隧道协议连接代理(主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输)。
URI、URL
官方解释都是什么乱起八糟的东西。各种博客也是跟着抄,这两者到底是什么关系和意义?
统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。
对应于实际例子就是:每个人都有身份证,这个身份证号码就对应这个人。比如张三的身份证号码为123456,那么我只要知道123456就可以找到这个人。
那什么是URL呢?从名字看是:统一资源定位器。
如果做类比,URL就是:动物住址协议://地球/中国/浙江省/杭州市/西湖区/某大学/14号宿舍楼/525号寝/张三.人
我们通过这个详细的地址也可以找到张三这个人。
那么他们俩到底是什么关系呢?
URI是以某种规则唯一地标识资源,手段不限,比如身份证号。当然了,地址可以唯一标识,那么也属于URI的一种手段。所以说URL是URI的子集。
回到Web上,假设所有的Html文档都有唯一的编号,记作html:xxxxx,xxxxx是一串数字,即Html文档的身份证号码,这个能唯一标识一个Html文档,那么这个号码就是一个URI。
而URL则通过描述是哪个主机上哪个路径上的文件来唯一确定一个资源,也就是定位的方式来实现的URI。
对于现在网址我更倾向于叫它URL,毕竟它提供了资源的位置信息,如果有一天网址通过号码来标识变成了http://741236985.html,那感觉叫成URI更为合适。
HTTP请求报文
返回结果的HTTP状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。 状态码如200 OK,以3为数字和原因短语组成。 数字中的第一位定义了响应类别,后两位无分类。响应类别有以下五种:
类别 | 原因短语 |
---|---|
1XX | Informational(信息性状态码) |
2XX | Success(成功状态码) |
3XX | Redirection(重定向状态码) |
4XX | Client Error(客户端错误状态码) |
5XX | Server Error(服务器错误状态码) |
⭐2XX 成功
- 200 OK:请求被正常处理
- 204 No Content:一般在只需从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
- 206 Partial Content:客户端进行范围请求
⭐3XX 重定向
- 301 Moved Permanently:永久重定向。表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。 也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存。
- 302 Found:临时性重定向。表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。 和301 Moved Permanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。比如,用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,而是仍旧保留返回302状态码的页面对应的URI(在Chrome中,还是会保存为重定向后的URI,不解)。
- 303 See Other:表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。这与302类似,但303明确表示客户端应当采用GET方法获取资源。
- 304 Not Modified:该状态码表示客户端发送附带条件的请求(指采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-March,If-Range,If-Unmodified-Since中任一首部。)时,服务器端允许请求访问资源,但因发生请求为满足条件的情况后,直接返回304(服务器端资源未改变,可直接使用客户端未过期的缓存)。304状态码返回时,不包含任何响应的主体部分。
304虽被划分在3XX类别,但是和重定向没有关系。 - 307 Temporary Redirect:临时重定向。与302有相同含义。307遵守浏览器标准,不会从POST变成GET。
⭐4XX 客户端错误
4XX的响应结果表明客户端是发生错误的原因所在。
- 400 Bad Request:表示请求报文中存在语法错误。
- 401 Unauthorized:表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。
- 403 Forbidden:表明对请求资源的访问被服务器拒绝了。服务器端可在实体的主体部分对原因进行描述(可选)
- 404 Not Found:表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时时用。
⭐5XX 服务器错误
5XX的响应结果表明服务器本身发生错误。
- 500 Interval Server Error:表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
- 503 Service Unavailable:表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
HTTP的瓶颈
- 一条连接上只可发送一个请求(前面讲到,持久化可保持TCP连接状态,但仍完成一次请求/响应后才能进行下一次请求/响应,而管线化方式可让一个TCP连接并行发送多个请求。)
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大
- 发送冗长(重复)的首部。每次互相发送相同的首部造成的浪费较多
SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。因此,可照常使用HTTP的GET和POST等方法、Cookie以及HTTP报文等。
使用 SPDY后,HTTP协议额外获得以下功能。
- 多路复用流:通过单一的TCP连接,可以无限制处理多个HTTP请求。所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。
- 赋予请求优先级:SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题。
- 压缩HTTP首部:压缩HTTP请求和响应的首部。
- 推送功能:支持服务器主动向客户端推送数据的功能。
- 服务器提示功能:服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求。
WebSocket
利用Ajax
和Comet
技术进行通信可以提升Web
的浏览速度。但问题在于通信若使用HTTP
协议,就无法彻底解决瓶颈问题。
WebSocket
技术主要是为了解决Ajax
和Comet
里XMLHttpRequst
附带的缺陷所引起的问题。
一旦Web服务器与客户端之间建立起WebSocket
协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON
、XML
、HTML
或图片等任意格式的数据。
WebSocket
的主要特点:
- 推送功能:支持由服务器向客户端推送数据。
- 减少通信量:和
HTTP
相比,不但每次连接时的总开销减少,而且由于WebSocket
的首部信息很小,通信量也相应较少。
为了实现WebSocket
通信,在HTTP连接建立之后,需要完成一次“握手”的步骤。
- 握手·请求:为了实现
WebSocket
通信,需要用到HTTP的Upgrade
首部字段,告知服务器通信协议发生改变,以达到握手的目的。 - 握手·响应:对于之前的请求,返回状态码
101 Switching Protocols
的响应。
成功握手确立WebSocket
连接后,通信时不再使用HTTP的数据帧,而采用WebSocket
独立的数据帧。
由于是建立在HTTP
基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket
通信连接,不论服务器端还是客户端,任意一方都可直接向对方发送报文。
整理自:https://github.com/JChehe/blog/blob/master/posts/《图解HTTP》读书笔记.md