转载自:http://blog.youkuaiyun.com/ns_code/article/details/17066361
http://blog.youkuaiyun.com/huaishu/article/details/52576063
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了常说的HTTPS。HTTP默认的端口号为80,HTTPS的端口号为443。
客户端通过发送HTTP请求向服务器请求对资源的访问。它向服务器传递了一个数据块,也就是请求信息,HTTP 请求由三部分组成:请求行、请求头和请求正文。
下面是一个HTTP请求的数据:
根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。Get方式在通过URL提交数据,数据在URL中可以看到,POST方式,数据放在HTTP包的body中。并且GET方式提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST则没有此限制。
URL完整地指定了要访问的网络资源,协议版本声明了通信过程中使用HTTP的版本。
HTTP最常见的请求头如下:
Host:发送请求时,该报头域是必需的。Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。例如请求http://localhost/index.html,浏览器发送的请求消息中,就会包含Host请求报头域,如下:Host:localhost,此处使用缺省端口号80,若指定了端口号8080,则变成:Host:localhost:8080。
Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码)。例如:Accept-Encoding: gzip, deflate。Server能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 许多情形下这可以减少5到10倍的下载时间,也节省带宽。
Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。例如:Accept-Language:zh-cn。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。
Accept-Charset:浏览器申明自己接收的字符集,如gb2312,utf-8。例如:Accept-Charset:iso-8859-1,gb2312。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Content-Type:内容类型,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。例如:Content-Type: text/html;charset:utf-8;
状态代码由 3 位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 5 种取值,如下所示:
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——客户端请求有错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求。
Expires:浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。
Vary:解释见http://blog.youkuaiyun.com/tenfyguo/article/details/5939000
Set-Cookie:非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.
Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如: Content-Type: text/html; charset=utf-8。
Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一次性地发给客户端。
Content-Encoding:文档的编码(Encode)方法。一般是压缩方式。WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。例如:Content-Encoding:gzip。
Content-Language:WEB服务器告诉浏览器自己响应的对象的语言者。
X-Powered-By:表示网站是用什么技术开发的,例如:X-Powered-By: PHP/5.2.5。
补充:
在浏览器地址栏键入URL,按下回车之后发生的几个事件:
1)浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址;
2)解析出IP地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;
3)浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器;
4)服务器给出相应,把对应的html文本发送给浏览器;
5)释放TCP连接;
6)浏览器将该文本显示出来。
http://blog.youkuaiyun.com/huaishu/article/details/52576063
一、概念
HTTP协议,即超文本传输协议(Hypertext transfer protocol),规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。HTTP协议是用于从WWW服务器传输超文本到本地浏览器,它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等。HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了常说的HTTPS。HTTP默认的端口号为80,HTTPS的端口号为443。
二、HTTP请求格式
HTTP协议传输的消息规定,每一个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。每当打开一个网页,选择“查看源文件”,看到的HTML代码就是HTTP的消息体,那么消息头可以通过浏览器的开发工具或者插件可以看到。客户端通过发送HTTP请求向服务器请求对资源的访问。它向服务器传递了一个数据块,也就是请求信息,HTTP 请求由三部分组成:请求行、请求头和请求正文。
下面是一个HTTP请求的数据:
POST /index.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
username=aa&password=1234
1、请求行
请求的第一行是“方法 URL 协议/版本”,以空格分隔。例如:POST /index.php HTTP/1.1。“POST”代表请求方法,“/index.php”表示URI,“HTTP/1.1代表协议和协议的版本。根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。Get方式在通过URL提交数据,数据在URL中可以看到,POST方式,数据放在HTTP包的body中。并且GET方式提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST则没有此限制。
URL完整地指定了要访问的网络资源,协议版本声明了通信过程中使用HTTP的版本。
2、请求头
每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。HTTP最常见的请求头如下:
Transport 头域
Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点(当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接)。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。Host:发送请求时,该报头域是必需的。Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。例如请求http://localhost/index.html,浏览器发送的请求消息中,就会包含Host请求报头域,如下:Host:localhost,此处使用缺省端口号80,若指定了端口号8080,则变成:Host:localhost:8080。
Client 头域
Accept:浏览器可以接受的媒体类型(MIME类型)。例如:Accept: text/html,代表浏览器可以接受服务器回发的类型为text/html,也就是html文档, 如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 * 代表任意类型。例如:Accept: */*,代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码)。例如:Accept-Encoding: gzip, deflate。Server能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 许多情形下这可以减少5到10倍的下载时间,也节省带宽。
Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。例如:Accept-Language:zh-cn。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。
Accept-Charset:浏览器申明自己接收的字符集,如gb2312,utf-8。例如:Accept-Charset:iso-8859-1,gb2312。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Cookie/Login头域
Cookie:最重要的header, 将cookie的值发送给HTTP 服务器。Entity头域
Content-Length:发送给HTTP服务器数据的长度,即请求消息正文的长度。Content-Type:内容类型,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。例如:Content-Type: text/html;charset:utf-8;
Miscellaneous头域
Referer:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT。3、请求正文
username=aa&password=1234 即该次POST请求的正文信息三、HTTP响应格式
在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息。与 HTTP 请求类似,HTTP 响应也是由三个部分组成,分别是:状态行、消息报头和响应正文。例如:HTTP/1.1 200 OK
Date: Sun, 17 Mar 2013 08:12:54 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
<html>
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
1、状态行
状态行由协议版本、数字形式的状态代码,及相应状态的文本描述组成,各元素之间以空格分隔,结尾时回车换行符。例如:HTTP/1.1 200 OK (CRLF)。状态代码由 3 位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 5 种取值,如下所示:
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——客户端请求有错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求。
2、响应头信息
HTTP最常见的响应头如下所示:Cache头域
Date:生成消息的具体时间和日期,即当前的GMT时间。Expires:浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。
Vary:解释见http://blog.youkuaiyun.com/tenfyguo/article/details/5939000
Cookie/Login头域
P3P: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题。Set-Cookie:非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.
Entity实体头域:
实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如: Content-Type: text/html; charset=utf-8。
Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一次性地发给客户端。
Content-Encoding:文档的编码(Encode)方法。一般是压缩方式。WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。例如:Content-Encoding:gzip。
Content-Language:WEB服务器告诉浏览器自己响应的对象的语言者。
Miscellaneous 头域
Server:指明HTTP服务器的软件信息。例如:Apache/2.2.8 (Win32) PHP/5.2.5。X-Powered-By:表示网站是用什么技术开发的,例如:X-Powered-By: PHP/5.2.5。
Transport头域
Connection:keep-alive表示当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接;close表示一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。Location头域
Location:用于重定向一个新的位置, 包含新的URL地址。3、响应正文
响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔。上面html代码就是正文。补充:
在浏览器地址栏键入URL,按下回车之后发生的几个事件:
1)浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址;
2)解析出IP地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;
3)浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器;
4)服务器给出相应,把对应的html文本发送给浏览器;
5)释放TCP连接;
6)浏览器将该文本显示出来。