引子
HTTP(HyperText Transfer Protocol),超文本传输协议,是一个应用层协议,它是互联网上应用最为广泛的一种网络协议,都听说过HTTP协议,但是HTTP协议到底用来干啥,有什么特点,可能就不是很清楚了,在这里我写一些对HTTP的介绍和常见HTTP状态码的解析,帮助大家也帮助自己加深对HTTP的理解。
什么是HTTP
HTTP,超文本传输协议,是一种应用层协议,最初是为了约定HTML的发布与接受方法和规范,它使用在客户端与服务端之间,确保计算机能够正确快速的传输超文本文档,属于TCP/IP的一个子集。
HTTP的特点
HTTP特点有很多,在这里重点阐述HTTP的一个重要特点——无状态。
HTTP早期为了便于使用与设计,是一种无状态的应用层协议,所谓无状态,就是说我第一次请求A数据和我第二次请求A数据,两者之间是相互独立的,并没有什么关系,协议本身是不会保存之前一切的请求和响应报文的信息,这个特性使得HTTP能够更简单的实现,同时能够更快的处理事务。
但是随着网络的发展,我们的网页常常需要对用户的状态做一些处理,例如用户登录某个电商网站,那么在一定时间内,用户使用电商网站的时候就不该再次重新登录,而是网站能够记录用户的登录状态。所以再HTTP 1.1中引入了cookie技术用来最用户的状态做存储。
HTTP消息的简要组成
HTTP消息简单来说由两部分组成,一个是头部(Header),另一部分即体(Body)。
头部大小一般不超过32K,用来存储报文信息的一些属性,请求报文的头部一般包括如下内容:
- 请求行
- 请求首部字段
- 通用首部字段
- 实体首部字段
响应报文头部如下:
- 状态行
- 响应首部字段
- 通用首部字段
- 实体首部字段
另一部分,主体部分则是需要传输的具体信息,例如请求主体中的一些参数,响应主体中的HTML文档等等。
HTTP的建立连接过程
HTTP是应用层协议,它是基于TCP这个传输层协议的,所以在建立连接时也需要经历TCP三次握手:
- 客户端发送一个带有SYN标志的数据包(喂喂喂,服务器,我想和你通信)
- 服务端响应,返回一个SYN/ACK标志的数据包(嗯明白,我收到了你的通信请求了)
- 客户端返回一个ACK标志的数据包,握手结束(嗯,明白了)。
那么我们平时的HTTP数据具体是怎么传输的呢,这里就要说到一点网络分层的知识了,网络一般分为五层,自上而下如下:
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
而HTTP报文发送就是从应用层开始,图如下:
发送端在层与层之间传输信息时,每经过一层就会打上一层的首部,反之,接收端就会逐层解包,最后拿到自己想要的信息。
HTTP常见状态码解释
1XX 消息
以1开头的状态码一般用来表示一些消息,代表请求已接收,需要继续处理,由于在HTTP 1.0 协议中没有定义任何1xx状态码,所以除非在某些实验条件下,一般服务器禁止向此类客户端发送1xx响应。
- 100
客户端应该继续发送请求,这个状态码表示服务器已经受到了客户端的部分请求,请求没有被拒绝,客户端应该继续发送请求的剩余部分,如果客户端请求已经完成,那就忽略该响应,等待服务器的最终响应。
2xx 成功
这一类状态码一般表示服务器已经成功接收、理解并接受了客户端请求。
-
200 OK
表示从客户端发送来的请求已经被服务端正确处理了。
-
204 No Content
表示请求处理已经成功,但是并没有资源可以返回,即响应报文没有实体部分,一般在客户端需要向服务端发送消息,但是不需要对客户端发送新的信息时使用。
-
206 Partial Content
表示客户端对请求的内容有范围要求,而服务端返回了符合要求的范围部分的内容。
3xx 重定向
这一类状态码表示服务器需要对请求做一些特殊的跳转处理,以保证能正确的处理请求。
-
301 Moved Permanently
永久重定向,表示客户端请求的内容以及被分配到了一个新的URL,以后应该使用资源现在所致的URI,也就是说,如果以及把资源保存成为了某个书签的话,需要更新书签的引用。
-
302 Found
临时重定向,表示客户端请求的资源暂时被分配到了某个新的URI,希望本次请求能使用新的URI访问,一般像跳转进行手机端页面还是PC端页面的展示时会用到这个状态码。
-
303 See Other
与302类似,但是该状态码明确要求客户端已GET方法重定向到某个新的URI上。
当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使用时大家都会这么做。 -
304 Not Modified
客户端发送了一个带有附送条件的其请求,服务端表示资源能够找到,但是并没有符合条件的资源。
-
307 Temporary Redirect
与302相同,但是会遵守标准,不会把POST请求转成GET请求。
4XX 客户端错误
这一类状态表示响应发送错误,并且这个这个错误是由于客户端发生错误引起的。
-
400 Bad Request
服务端无法理解这个请求,请求是不是错了。
-
401 Unauthorized
请求页面需要认证,此时会弹出一个用于认证的对话框。
-
403 Forbidden
客户端没有权限访问该内容,所以服务端拒绝客户端的访问请求,一般在FTP控制中会用到,在某些后台管理系统中,从未授权的IP源发送的请求也会被拒绝。
-
404 Not Found
这几乎是最常见的客户端错误了,平时在生活中就能碰到,表示请求的资源在服务器中没有,找不到所请求的资源。
5XX 服务器错误
这一类状态码表示遇到了错误,并且错误是由服务器本身的问题所引起的。
-
500 Internal Server Error
服务器内部错误,表示服务器内部程序出错了。
-
503 Service Unavailable
服务器不可用,有两种情况,一种是服务器处于维护中,另一种就是服务器处于超负荷状态,例如抢票、秒杀等活动。
常见的状态码就是上面这些了,了解HTTP状态码的含义,对WEB开发时遇到的问题能够准确的定位,也能加深对WEB的理解,同时,某些时候状态码也会与状况不一致,有时候WEB应用程序内部发生错误,依旧会返回200 OK,这种时候就要具体问题具体分析了。
小结
HTTP的简要说明就到这里了,但是HTTP远不止这点内容,关于HTTP有两个资源推荐大家阅读。
图解HTTP:这本书用配图的方式介绍了HTTP,比较适合学习理解。
HTTP协议:这是HTTP的官方文档,英语不错还有时间的筒子们可以看看,也可以作为查阅地址。