HTTP协议
一、初始HTTP协议
1.HTTP协议是什么?
超文本传输协议(HTTP,
HyperText Transfer Protocol)
是
Internet
上的目前使用最广泛的应用层协议,它基于传输层的
TCP
协议进行通信,
HTTP
协议是通用的、无状态的协议。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是
80
端口)的
TCP
连接。
HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如
"HTTP/1.1 200 OK"
,和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
HTTP为什么使用
TCP
?
HTTP使用
TCP
的原因在于(打开)一个网页必须传送很多数据,而
TCP
协议提供传输控制,按顺序组织数据,和错误纠正。
2.HTTP功能
用于在服务器和客户机之间传输超文本文件。
3.OSI七层模型
TCP/IP
协议
开放系统互连参考模型 (Open System Interconnect 简称
OSI
)
OSI采用了分层的结构化技术,共分七层,从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
各层对应的典型设备如下:
应用层 ………………
.
计算机:应用程序,如
FTP
,
SMTP
,
HTTP
表示层 ………………
.
计算机:编码方式,图像编解码、
URL
字段传输编码
会话层 ………………
.
计算机:建立会话,
SESSION
认证、断点续传
传输层 ………………
.
计算机:进程和端口
网络层…………………网络:路由器,防火墙、多层交换机
数据链路层 ………
..
网络:网卡,网桥,交换机
物理层…………………网络:中继器,集线器、网线、
HUB
4.HTTP事务的处理
HTTP定义的事务处理由以下四步组成:
①客户端与服务端建立连接
②客户端向服务器端发送请求
③服务器端向客户端回复响应
④断开连接
HTTP通信机制是在一次完整的
HTTP
通信过程中,
Web
浏览器与
Web
服务器之间将完成下列
7
个步骤:
①建立
TCP
连接
②
Web
浏览器向
Web
服务器发送请求命令
③
Web
浏览器发送请求头信息
④
Web
服务器应答
⑤
Web
服务器发送应答头信息
⑥
Web
服务器向浏览器发送数据
⑦
Web
服务器关闭
TCP
连接
一次完整的HTTP事务是怎样的一个过程?
域名解析 --> 发起
TCP
的
3
次握手
-->
建立
TCP
连接后发起
http
请求
-->
服务器响应
http
请求,浏览器得到
html
代码
-->
浏览器解析
html
代码,并请求
html
代码中的资源(如
js
、
css
、图片等)
-->
浏览器对页面进行渲染呈现给用户。
思考:为什么TCP协议是
3
次握手
4
次挥手?
5.HTTP的消息类型
5.1 HTTP请求
当浏览器向
Web
服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,
HTTP
请求信息由
3
部分组成:
l
请求方法
URI
协议
/
版本
l
请求头
(Request Header)
l
请求正文
下面是一个
HTTP
请求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
(
1
)请求方法
URI
协议
/
版本
请求的第一行是“方法
URL
议
/
版本”:
GET/sample.jsp HTTP/1.1
以上代码中“
GET
”代表请求方法,“
/sample.jsp
”表示
URI
,“
HTTP/1.1
代表协议和协议的版本。
根据
HTTP
标准,
HTTP
请求可以使用多种请求方法。
5.2 HTTP响应
HTTP
应答与
HTTP
请求相似,
HTTP
响应也由
3
个部分构成,分别是:
l
状态行
l
响应头
(Response Header)
l
响应正文
在接收和解释请求消息后,服务器会返回一个
HTTP
响应消息。
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。
格式
: HTTP-Version Status-Code Reason-Phrase CRLF
例如
: HTTP/1.1 200 OK \r\n
5.3 状态代码
状态代码:
状态代码由
3
位数字组成,表示请求是否被理解或被满足。
状态描述:
状态描述给出了关于状态代码的简短的文字描述。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。
第一个数字有五种可能的取值:
- 1xx:
指示信息—表示请求已接收,继续处理。
- 2xx:
成功—表示请求已经被成功接收、理解、接受。
- 3xx:
重定向—要完成请求必须进行更进一步的操作。
- 4xx:
客户端错误—请求有语法错误或请求无法实现。
- 5xx:
服务器端错误—服务器未能实现合法的请求。
状态代码
状态描述
说明
200 OK
客户端请求成功
400 Bad Request
由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthonzed
请求未经授权。这个状态代码必须和
WWW-Authenticate
报头域一起使用
403 Forbidden
服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found
请求的资源不存在,例如,输入了错误的
URL
。
500 Internal Server Error
服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable
服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
5.4 请求方法
最常用的是GET和
POST
方法。
GET与
POST
的区别?
post和get的区别
(1)提交方式不同
(2)传输数据的大小
(3)安全性
HTTP
请求格式
当浏览器向
Web
服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,
HTTP
请求信息由
3
部分组成:
l
请求方法
URI
协议
/
版本
l
请求头
(Request Header)
l
请求正文
下面是一个
HTTP
请求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
(
1
)请求方法
URI
协议
/
版本
请求的第一行是“方法
URL
议
/
版本”:
GET/sample.jsp HTTP/1.1
以上代码中“
GET
”代表请求方法,“
/sample.jsp
”表示
URI
,“
HTTP/1.1
代表协议和协议的版本。
根据
HTTP
标准,
HTTP
请求可以使用多种请求方法。例如:
HTTP1.1
目前支持
7
种请求方法:
GET
、
POST
、
HEAD
、
OPTIONS
、
PUT
、
DELETE
和
TARCE
。
GET
请求获取由
Request-URI
所标识的资源。
POST
在
Request-URI
所标识的资源后附加新的数据。
HEAD
请求获取由
Request-URI
所标识的资源的响应消息报头。
OPTIONS
请求查询服务器的性能,或查询与资源相关的选项和需求。
PUT
请求服务器存储一个资源,并用
Request-URI
作为其标识。
DELETE
请求服务器删除由
Request-URI
所标识的资源。
TRACE
请求服务器回送收到的请求信息,主要用语测试或诊断。
在
Internet
应用中,最常用的方法是
GET
和
POST
。
URI
完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“
/
”开头,最后,协议版本声明了通信过程中使用
HTTP
的版本。
(
2
)请求头
(Request Header)
请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
(
3
)请求正文
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
username=jinqiao&password=1234
在以上的例子的
HTTP
请求中,请求的正文只有一行内容。当然,在实际应用中,
HTTP
请求正文可以包含更多的内容。
HTTP
请求方法我这里只讨论
GET
方法与
POST
方法
l GET
方法
GET
方法是默认的
HTTP
请求方法,我们日常用
GET
方法来提交表单数据,然而用
GET
方法提交的表单数据只经过了简单的编码,同时它将作为
URL
的一部分向
Web
服务器发送,因此,如果使用
GET
方法来提交表单数据就存在着安全隐患上。例如
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
从上面的
URL
请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于
GET
方法提交的数据是作为
URL
请求的一部分所以提交的数据量不能太大
l POST
方法
POST
方法是
GET
方法的一个替代方法,它主要是向
Web
服务器提交表单数据,尤其是大批量的数据。
POST
方法克服了
GET
方法的一些缺点。通过
POST
方法提交表单数据时,数据不是作为
URL
请求的一部分而是作为标准数据传送给
Web
服务器,这就克服了
GET
方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用
POST
方法。
从编程的角度来讲,如果用户通过
GET
方法提交数据,则数据存放在
QUERY
_
STRING
环境变量中,而
POST
方法提交的数据则可以从标准输入流中获取。
http
响应格式
HTTP
应答与
HTTP
请求相似,
HTTP
响应也由
3
个部分构成,分别是:
l
状态行
l
响应头
(Response Header)
l
响应正文
在接收和解释请求消息后,服务器会返回一个
HTTP
响应消息。
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。
格式
: HTTP-Version Status-Code Reason-Phrase CRLF
例如
: HTTP/1.1 200 OK \r\n
状态代码:
状态代码由
3
位数字组成,表示请求是否被理解或被满足。
状态描述:
状态描述给出了关于状态代码的简短的文字描述。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。
第一个数字有五种可能的取值:
- 1xx:
指示信息—表示请求已接收,继续处理。
- 2xx:
成功—表示请求已经被成功接收、理解、接受。
- 3xx:
重定向—要完成请求必须进行更进一步的操作。
- 4xx:
客户端错误—请求有语法错误或请求无法实现。
- 5xx:
服务器端错误—服务器未能实现合法的请求。
状态代码
状态描述
说明
200 OK
客户端请求成功
400 Bad Request
由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthonzed
请求未经授权。这个状态代码必须和
WWW-Authenticate
报头域一起使用
403 Forbidden
服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found
请求的资源不存在,例如,输入了错误的
URL
。
500 Internal Server Error
服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable
服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
响应头
响应头可能包括:
Location
:
Location
响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务
器端可以发回
Location
响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源。当我们在
JSP
中使用重定向语句的时候,服务器
端向客户端发回的响应报头中,就会有
Location
响应报头域。
Server
:
Server
响应报头域包含了服务器用来处理请求的软件信息。它和
User-Agent
请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户
端软件
(
浏览器
)
和操作系统的信息。下面是
Server
响应报头域的一个例子:
Server: Apache-Coyote/1.1
WWW-Authenticate
:
WWW-Authenticate
响应报头域必须被包含在
401(
未授权的
)
响应消息中,这个报头域和前面讲到的
Authorization
请求报头域是
相关的,当客户端收到
401
响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了
Authorization
报头域的请求,下面是
WWW-Authenticate
响应报头域的一个例子:
WWW-Authenticate: Basic realm="Basic Auth Test!"
从这个响应报头域,可以知道服务器端对我们所请求的资源采用的是基本验证机制。
Content-Encoding
:
Content-Encoding
实体报头域被使用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容编码,因而要获得
Content- Type
报头域中所引用的媒体类型,必须采用相应的解码机制。
Content-Encoding
主要用语记录文档的压缩方法,下面是它的一个例子:
Content-Encoding: gzip
。如果一个实体正文采用了编码方式存储,在使用之前就必须进行解码。
Content-Language
:
Content-Language
实体报头域描述了资源所用的自然语言。
Content-Language
允许用户遵照自身的首选语言来识别和区分实体。
如果这个实体内容仅仅打算提供给丹麦的阅读者,那么可以按照如下的方式设置这个实体报头域:
Content-Language: da
。
如果没有指定
Content-Language
报头域,那么实体内容将提供给所以语言的阅读者。
Content-Length
:
Content-Length
实体报头域用于指明正文的长度,以字节方式存储的十进制数字来表示,也就是一个数字字符占一个字节,用其对应的
ASCII
码存储传输。
要注意的是:这个长度仅仅是表示实体正文的长度,没有包括实体报头的长度。
Content-Type
Content-Type
实体报头域用语指明发送给接收者的实体正文的媒体类型。例如:
Content-Type: text/html;charset=ISO-8859-1
Content-Type: text/html;charset=GB2312
Last-Modified
Last-Modified
实体报头域用于指示资源最后的修改日期及时间。
Expires
Expires
实体报头域给出响应过期的日期和时间。通常,代理服务器或浏览器会缓存一些页面。当用户再次访问这些页面时,直接从缓存中加载并显示给用
户,这样缩短了响应的时间,减少服务器的负载。为了让代理服务器或浏览器在一段时间后更新页面,我们可以使用
Expires
实体报头域指定页面过期的时
间。当用户又一次访问页面时,如果
Expires
报头域给出的日期和时间比
Date
普通报头域给出的日期和时间要早
(
或相同
)
,那么代理服务器或浏览器就
不会再使用缓存的页面而是从服务器上请求更新的页面。不过要注意,即使页面过期了,也并不意味着服务器上的原始资源在此时间之前或之后发生了改变。
Expires
实体报头域使用的日期和时间必须是
RFC 1123
中的日期格式,例如:
Expires: Thu, 15 Sep 2005 16:00:00 GMT
HTTP1.1
的客户端和缓存必须将其他非法的日期格式
(
也包括
0)
看作已过期。例如,为了让浏览器不要缓存页面,我们也可以利用
Expires
实体报头
域,设置它的值为
0
,如下
(JSP)
:
response.setDateHeader("Expires",0);
下面是一个
HTTP
响应的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112