http://www.cnblogs.com/CareySon/archive/2012/04/27/HTTP-Protocol.html
HTTP的网络层次
在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP在网络中的层次如图1所示。
图1.HTTP在TCP/IP中的层次
可以看出,HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。概念如图2所示。
图2.TCP连接的三次握手
在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。一个重要的概念是面向连接,既HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。
HTTP请求(HTTP Request)
所谓的HTTP请求,也就是Web客户端向Web服务器发送信息,这个信息由如下三部分组成:
1.请求行
2.HTTP头
3.内容
一个典型的请求行比如:
GET www.cnblogs.com HTTP/1.1
请求行写法是固定的,由三部分组成,第一部分是请求方法,第二部分是请求网址,第三部分是HTTP版本。
第二部分HTTP头在HTTP请求可以是3种HTTP头:1.请求头(request header) 2.普通头(general header) 3.实体头(entity header)
通常来说,由于Get请求往往不包含内容实体,因此也不会有实体头。
第三部分内容只在POST请求中存在,因为GET请求并不包含任何实体。
我们截取一个具体的Post请求来看这三部分,我在一个普通的aspx页面放一个BUTTON,当提交后会产生一个Post请求,如图4所示。
图4.HTTP请求由三部分组成
HTTP响应(HTTP Response)
当Web服务器收到HTTP请求后,会根据请求的信息做某些处理(这些处理可能仅仅是静态的返回页,或是包含Asp.net,PHP,Jsp等语言进行处理后返回),相应的返回一个HTTP响应。HTTP响应在结构上很类似于HTTP请求,也是由三部分组成,分别为:
1.状态行
2.HTTP头
3.返回内容
首先来看状态行,一个典型的HTTP状态如下:
HTTP/1.1 200 OK
第一部分是HTTP版本,第二部分是响应状态码,第三部分是状态码的描述,因此也可以把第二和第三部分看成一个部分。
对于HTTP版本没有什么好说的,而状态码值得说一下,网上对于每个具体的HTTP状态码所代表的含义都有解释,这里我说一下分类。
-
信息类 (100-199)
-
响应成功 (200-299)
-
重定向类 (300-399)
-
客户端错误类 (400-499)
-
服务端错误类 (500-599)
HTTP响应中包含的头包括1.响应头(response header) 2.普通头(general header) 3.实体头(entity header)。
第三部分HTTP响应内容就是HTTP请求所请求的信息。这个信息可以是一个HTML,也可以是一个图片。
状态码
|
状态码英文名称
|
中文描述
|
---|---|---|
100
|
Continue
|
继续。客户端应继续其请求
|
101
|
Switching Protocols
|
切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
|
200
|
OK
|
请求成功。一般用于GET与POST请求
|
201
|
Created
|
已创建。成功请求并创建了新的资源
|
202
|
Accepted
|
已接受。已经接受请求,但未处理完成
|
203
|
Non-Authoritative Information
|
非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
|
204
|
No Content
|
无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
|
205
|
Reset Content
|
重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
|
206
|
Partial Content
|
部分内容。服务器成功处理了部分GET请求
|
300
|
Multiple Choices
|
多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
|
301
|
Moved Permanently
|
永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
|
302
|
Found
|
临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
|
303
|
See Other
|
查看其它地址。与301类似。使用GET和POST请求查看
|
304
|
Not Modified
|
未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
|
305
|
Use Proxy
|
使用代理。所请求的资源必须通过代理访问
|
306
|
Unused
|
已经被废弃的HTTP状态码
|
307
|
Temporary Redirect
|
临时重定向。与302类似。使用GET请求重定向
|
400
|
Bad Request
|
客户端请求的语法错误,服务器无法理解
|
401
|
Unauthorized
|
请求要求用户的身份认证
|
402
|
Payment Required
|
保留,将来使用
|
403
|
Forbidden
|
服务器理解请求客户端的请求,但是拒绝执行此请求
|
404
|
Not Found
|
服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
|
405
|
Method Not Allowed
|
客户端请求中的方法被禁止
|
406
|
Not Acceptable
|
服务器无法根据客户端请求的内容特性完成请求
|
407
|
Proxy Authentication Required
|
请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
|
408
|
Request Time-out
|
服务器等待客户端发送的请求时间过长,超时
|
409
|
Conflict
|
服务器完成客户端的PUT请求时可能返回此代码,服务器处理请求时发生了冲突
|
410
|
Gone
|
客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
|
411
|
Length Required
|
服务器无法处理客户端发送的不带Content-Length的请求信息
|
412
|
Precondition Failed
|
客户端请求信息的先决条件错误
|
413
|
Request Entity Too Large
|
由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
|
414
|
Request-URI Too Large
|
请求的URI过长(URI通常为网址),服务器无法处理
|
415
|
Unsupported Media Type
|
服务器无法处理请求附带的媒体格式
|
416
|
Requested range not satisfiable
|
客户端请求的范围无效
|
417
|
Expectation Failed
|
服务器无法满足Expect的请求头信息
|
500
|
Internal Server Error
|
服务器内部错误,无法完成请求
|
501
|
Not Implemented
|
服务器不支持请求的功能,无法完成请求
|
502
|
Bad Gateway
|
充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
|
503
|
Service Unavailable
|
由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
|
504
|
Gateway Time-out
|
充当网关或代理的服务器,未及时从远端服务器获取请求
|
505
|
HTTP Version not supported
|
服务器不支持请求的HTTP协议的版本,无法完成处理
|