开发者社区> hopegrace> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

http消息头

简介: http消息头 但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。 做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。
+关注继续查看

http消息头

但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。

做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,后者是可选的,而前者是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件,这时看到的HTML代码就是HTTP的消息体,那么消息头又在哪呢?IE浏览器不让我们看到这部分,但我们可以通过截取数据包等方法看到它。

下面就来看一个简单的例子:

首先制作一个非常简单的网页,它的内容只有一行:

<html><body>hello world</body></html>

把它放到WEB服务器上,比如IIS,然后用IE浏览器请求这个页面(http://localhost:8080/simple.htm),当我们请求这个页面时,浏览器实际做了以下四项工作:

1 解析我们输入的地址,从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:

协议名:http

主机名:localhost

端口:8080

对象路径:/simple.htm

2 把以上部分结合本机自己的信息,封装成一个HTTP请求数据包

3 使用TCP协议连接到主机的指定端口(localhost, 8080),并发送已封装好的数据包

4 等待服务器返回数据,并解析返回数据,最后显示出来

由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下:

GET /simple.htm HTTP/1.1<CR>

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*<CR>

Accept-Language: zh-cn<CR>

Accept-Encoding: gzip, deflate<CR>

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<CR>

Host: localhost:8080<CR>

Connection: Keep-Alive<CR>

<CR>

为了显示清楚我把所有的回车的地方都加上了“<CR>注意最后还有一个空行加一个回车,这个空行正是HTTP规定的消息头和消息体的分界线,第一个空行以下的内容就是消息体,这个请求数据包是没有消息体的。

消息的第一行“GET表示我们所使用的HTTP动作,其他可能的还有“POST等,GET的消息没有消息体,而POST消息是有消息体的,消息体的内容就是要POST的数据。后面/simple.htm就是我们要请求的对象,之后HTTP1.1表示使用的是HTTP1.1协议。

第二行表示我们所用的浏览器能接受的Content-type,三四两行则是语言和编码信息,第五行显示出本机的相关系信息,包括浏览器类型、操作系统信息等,很多网站可以显示出你所使用的浏览器和操作系统版本,就是因为可以从这里获取到这些信息。

第六行表示我们所请求的主机和端口,第七行表示使用Keep-Alive方式,即数据传递完并不立即关闭连接。

服务器接收到这样的数据包以后会根据其内容做相应的处理,例如查找有没有“/simple.htm这个对象,如果有,根据服务器的设置来决定如何处理,如果是HTM,则不需要什么复杂的处理,直接返回其内容即可。但在直接返回之前,还需要加上HTTP消息头。

服务器发回的完整HTTP消息如下:

HTTP/1.1 200 OK<CR>

Server: Microsoft-IIS/5.1<CR>

X-Powered-By: ASP.NET<CR>

Date: Fri, 03 Mar 2006 06:34:03 GMT<CR>

Content-Type: text/html<CR>

Accept-Ranges: bytes<CR>

Last-Modified: Fri, 03 Mar 2006 06:33:18 GMT<CR>

ETag: "5ca4f75b8c3ec61:9ee"<CR>

Content-Length: 37<CR>

<CR>

<html><body>hello world</body></html>

同样,我用“<CR>来表示回车。可以看到,这个消息也是用空行切分成消息头和消息体两部分,消息体的部分正是我们前面写好的HTML代码。

消息头第一行“HTTP/1.1也是表示所使用的协议,后面的200 OKHTTP返回代码,200就表示操作成功,还有其他常见的如404表示对象未找到,500表示服务器错误,403表示不能浏览目录等等。

第二行表示这个服务器使用的WEB服务器软件,这里是IIS 5.1。第三行是ASP.Net的一个附加提示,没什么实际用处。第四行是处理此请求的时间。第五行就是所返回的消息的content-type,浏览器会根据它来决定如何处理消息体里面的内容,例如这里是text/html,那么浏览器就会启用HTML解析器来处理它,如果是image/jpeg,那么就会使用JPEG的解码器来处理。

消息头最后一行“Content-Length表示消息体的长度,从空行以后的内容算起,以字节为单位,浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。

原文:

http://www.cnblogs.com/jiahaohk/archive/2009/08/19/1550248.html

http://hi.baidu.com/karab/item/b7533b57096c4f948d12ed24

http://www.cnblogs.com/li0803/archive/2008/11/04/1324747.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
HTTP头入门到精通(每一个HTTP消息头解释)
===================================================================================================================== 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。
827 0
vue + axios---封装一个http请求
在使用vue开发时,官方推荐使用axios来请求接口 // axios官方地址 https://github.com/axios/axios 但是axios并不像 vue-resource 一样拥有install,即不能直接 Vue.use(axios) 来使用,所以需要我们自己根据axios来写一个具有install方法的Http库。
3005 0
如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误
当我用CL_HTTP_CLIENT往一个外网的url发请求时,遇到错误:ICM_HTTP_SSL_PEER_CERT_UNTRUSTED 错误是从这段ABAP代码里抛出来的: CALL METHOD lo_http_client->get_last_error IMPORTING code = lv_sysubrc message = ev_error_message. "BREAK-POINT. WRITE: / 'error: ' , ev_error_message. 只有这一个错误,或许您觉得很难找到问题根源。
1278 0
关于HTTP请求你需要知道的一切
前言 现在几乎所有的客户端(不管是APP也好,H5页面也好),都需要用到网络请求,而绝大多数公司都会把客户端的网络框架封装好,我们直接拿来用就好了,不用管什么原理,只要请求以后能得到正确的返回就可以了,但如果让你从零开始封装一个请求框架,或者你接到了一个别的项目,当前的网络请求框架不合适或者不好用了,这时候你可能就懵了。
979 0
ASP.NET WebApi服务接口如何防止重复请求实现HTTP幂等性(八)
一、背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi。在我们平时开发项目中可能会出现下面这些情况; 1)、由于用户误操作,多次点击网页表单提交按钮。由于网速等原因造成页面卡顿,用户重复刷新提交页面。
2728 0
使用Python请求http/https时设置失败重试次数
使用Python的requests库时,默认是没有失败时重试请求的,通过下面的方式可以支持重试请求 设置请求时的重试规则 import requests from requests.
1101 0
使用Apache-httpclient发送http请求
pom.xml org.apache.httpcomponents httpclient 4.
1479 0
+关注
698
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载