http协议通信过程和请求格式
HTTP通信机制是在⼀次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
(1)建⽴TCP连接
在HTTP⼯作开始之前,Web浏览器⾸先要通过⽹络与Web服务器建⽴连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet ⼜被称作是TCP/IP⽹络。HTTP是⽐TCP更⾼层次的应⽤层协议,根据规则,只有低层协议建⽴之后才能,才能进⾏更层协议的连接,因此,⾸先要建⽴TCP连接,⼀般TCP连接的端⼝号是80
(2)Web浏览器向Web服务器发送请求命令<request-line>
⼀旦建⽴了TCP连接,Web浏览器就会向Web服务器发送请求命令
例如:GET/sample/hello.jsp HTTP/1.1
(3)Web浏览器发送请求头信息<headers>
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送⼀些别的信息,之后浏览器发送了⼀空⽩⾏<blank line>来通知服务器,它已经结束了该头信息的发送
(4)Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答,HTTP/1.1 200 OK,应答的第⼀部分是协议的版本号和应答状态码
(5)Web服务器发送应答头信息
正如客户端会随同请求发送关于⾃⾝的信息⼀样,服务器也会随同应答向⽤户发送关于它⾃⼰的数据及被请求的⽂档。
(6)Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送⼀个空⽩⾏来表⽰头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送⽤户所请求的实际数据
(7)Web服务器关闭TCP连接
⼀般情况下,⼀旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加⼊了这⾏代码Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建⽴新连接所需的时间,还节约了⽹络带宽。
HTTP请求
HTTP请求的格式如下所⽰:
<request-line>
<headers>
<blank line>
[<request-body>]
在HTTP请求中,第⼀⾏必须是⼀个请求⾏(request line),⽤来说明请求类型
(GET/POST)、要访问的资源,使⽤的HTTP版本(HTTP1.1等)。紧接着是⼀个⾸部(header)⼩节,⽤来说明服务器要使⽤的附加信息。在⾸部之后是⼀个空⾏,再此之后可以添加任意的其他数据[称之为主体(body)]。
HTTPGET请求:
在HTTP中,定义了多种请求类型,通常我们关⼼的只有GET请求和POST请求。只要在Web浏览器上输⼊⼀个URL,浏览器就将基于该URL向服务器发送⼀个GET请求,以告诉服务器获取并返回什么资源。对于www.baidu的GET请求如下所⽰:
GET / HTTP/1.1
Host: www.baidu
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
请求⾏的第⼀部分说明了该请求是GET请求。该⾏的第⼆部分是⼀个斜杠(/),⽤来说明请求的是该域名的根⽬录。该⾏的最后⼀部分说明使⽤的是HTTP 1.1版本(另⼀个可选项是1.0)。那么请求发到哪⾥去呢?这就是第⼆⾏的内容。
第2⾏是请求的第⼀个⾸部,HOST。⾸部HOST将指出请求的⽬的地。结合HOST和上⼀⾏中的斜杠(/),可以通知服务器请求的是www.baidu/(HTTP 1.1才需要使⽤⾸部HOST,⽽原来的1.0版本则不需要使⽤)。第三⾏中包含的是⾸部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。 该信息由你使⽤的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将⾃动发送。最后⼀⾏是⾸部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值)。注意,在最后⼀个⾸部之后有⼀个空⾏。即使不存在请求主体,这个空⾏也是必需的
要发送GET请求的参数,则必须将这些额外的信息附在URL本⾝的后⾯。其格式类似于
URL ? name1=value1&name2=value2&..&nameN=valueN
该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求⾏中,如下所⽰:
GET /books/?name=Professional%20Ajax HTTP/1.1
Host: www.baidu
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
HTTPPOST请求:
另⼀⽅⾯,POST请求在请求主体中为服务器提供了⼀些附加的信息。通常,当填写⼀个在线表单并提交它时,这些填⼊的数据将以POST 请求的⽅式发送给服务器。
以下就是⼀个典型的POST请求:
POST / HTTP/1.1
Host: www.baidu
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
从上⾯可以发现, POST请求和GET请求之间有⼀些区别。
⾸先,请求⾏开始处的GET改为了POST,以表⽰不同的请求类型。你会发现⾸部Host和User-Agent仍然存在,在后⾯有两个新⾏。其中⾸部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。⾸部Content-Length说明了请求主体的字节数。在⾸部Connection后是⼀个空⾏,再后⾯就是请求主体。与⼤多数浏览器的POST请求⼀样,这是以简单的“名称—值”对的形式给出的,其中name是Professional
Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。
HTTP响应
如下所⽰,HTTP响应的格式与请求的格式⼗分类似:
<status-line>
<headers>
<blank line>
[<response-body>
正如你所见, 在响应中唯⼀真正的区别在于第⼀⾏中⽤状态信息代替了请求信息。状态⾏(status line)通过提供⼀个状态码来说明所请求的资源情况。以下就是⼀个HTTP响应的例⼦:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
web浏览器在哪里打开</head>
<body>
<!-- body goes here -->
</body>
</html>
在本例中,状态⾏给出的HTTP状态代码是200,以及消息OK。状态⾏始终包含的是状态码和相应的简短消息,以避免混乱。最常⽤的状态码有:
◆200 (OK): 到了该资源,并且⼀切正常。
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常⽤于浏览器的缓存机制。
◆401 (UNAUTHORIZED): 客户端⽆权访问该资源。这通常会使得浏览器要求⽤户输⼊⽤户名和密码,以登录到服务器。
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输⼊了不正确的⽤户名或密码。
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。
在状态⾏之后是⼀些⾸部。通常,服务器会返回⼀个名为Data的⾸部,⽤来说明响应⽣成的⽇期和时间(服务器通常还会返回⼀些关于其⾃⾝的信息,尽管并⾮是必需的)。接下来的两个⾸部⼤家应该熟悉,就是与POST请求中⼀样的Content-Type和Content-Length。在本例中,⾸部Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源⽂件(尽管还可能包含纯⽂本或其他资源类型的⼆进制数据)。浏览器将把这些数据显⽰给⽤户。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。