但凡搞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>[size=small][size=medium][/size]
<CR>
<html><body>hello world</body></html>
同样,我用“<CR>”来表示回车。可以看到,这个消息也是用空行切分成消息头和消息体两部分,消息体的部分正是我们前面写好的HTML代码。
消息头第一行“HTTP/1.1”也是表示所使用的协议,后面的“200 OK”是HTTP返回代码,200就表示操作成功,还有其他常见的如404表示对象未找到,500表示服务器错误,403表示不能浏览目录等等。
第二行表示这个服务器使用的WEB服务器软件,这里是IIS 5.1。第三行是ASP.Net的一个附加提示,没什么实际用处。第四行是处理此请求的时间。第五行就是所返回的消息的content-type,浏览器会根据它来决定如何处理消息体里面的内容,例如这里是text/html,那么浏览器就会启用HTML解析器来处理它,如果是image/jpeg,那么就会使用JPEG的解码器来处理。
消息头最后一行“Content-Length”表示消息体的长度,从空行以后的内容算起,以字节为单位,浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。
[/size]
分享到:
相关推荐
本篇文章将围绕《头歌初识Redis答案》的内容进行展开,详细介绍Redis的基础知识、数据类型及操作、事务与监视机制、持久化策略以及主从同步等方面的内容。 #### 基础概念 - **内存存储**:Redis主要基于内存进行...
综上所述,"头歌初识redis答案"这个资料可能涵盖了这些Redis的基础概念和核心特性,通过学习这些内容,初学者可以对Redis有一个全面的认识,并能进行基本的使用和配置。在实际应用中,还需要结合具体的业务需求和...
### 头歌初识Redis知识点详解 #### 一、Redis基础知识概述 Redis是一种开源的、高性能的键值存储系统,以其快速的数据存取速度而著称。它支持多种数据结构,能够满足不同的应用场景需求。 - **数据库管理**: - ...
初识Bootstrap”是美联英语在线VIP-6%2B课程体系的一部分,旨在帮助学习者掌握Bootstrap的基本概念和应用技巧。 Bootstrap是由Twitter开发并开源的,它提供了一系列预先设计的CSS样式、JavaScript组件和字体图标,...
2. **初识腾讯通**: - RTX的用户界面设计与腾讯QQ或TM相似,对这两款产品熟悉的用户能很快上手。 - 界面中的图标代表不同的在线状态,例如未上线、在线(区分性别)、离开状态和已设置手机号码等。 3. **修改...
### Redis实战知识点解析 #### 一、Redis简介与特点 **1.1 Key-Value存储系统简介** 在探讨Redis之前,我们首先了解下Key-Value...无论是作为缓存、消息队列还是其他用途,Redis都是一个值得深入学习的强大工具。
- **适用场合**: Redis适用于缓存、消息队列、实时分析等多种场景。 #### 三、Redis快速入门指南 **1.4 快速入门** - **安装Redis**: 根据不同的操作系统,可以选择下载源代码编译安装或通过包管理器安装。对于...
#### 三、初识Redis **1.3.1 数据类型** - **String(字符串)**:最基础的数据类型,可以存储任何格式的文本数据。 - **Hash(散列)**:用于存储字段-值对的集合。 - **List(列表)**:按照插入顺序存储元素的...
#### 初识Redis **1.3.1 数据类型** Redis支持多种数据类型,包括字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等。 **1.3.2 持久化** 为了防止意外断电导致数据丢失,...
##### 1.3 初识Redis - **数据类型**:Redis提供了多种数据类型,如字符串、哈希表、列表、集合和有序集合,适用于不同的应用场景。 - **持久化**:支持RDB快照和AOF日志两种持久化机制,确保数据安全。 - **主从...
- **消息队列**:Redis的列表数据结构非常适合构建消息队列系统。 - **实时数据处理**:Redis支持实时数据处理,如实时计数器、排行榜等。 - **会话存储**:Redis可以安全地存储用户的会话信息。 #### 四、Redis...
- **消息队列:** 使用List结构进行消息队列的构建。 - **实时分析:** 利用其高性能特性,进行实时数据分析和展示。 #### 二、初识Redis **1.3 初识Redis** - **数据类型:** Redis支持五种基本的数据类型:...
#### 三、初识Redis ##### 1.3.1 数据类型 Redis提供了五种主要的数据类型:字符串(String)、散列(Hash)、列表(List)、集合(Set)和有序集合(ZSet)。这些数据类型不仅能满足基本的数据存储需求,还能实现复杂的数据...
- **lists类型及操作**:包括`lpush`(将一个或多个值插入到列表头部)、`rpush`(将一个或多个值插入到列表尾部)、`linsert`(在列表的元素前后插入元素)、`lset`(对列表指定位置的元素进行修改)、`lrem`(移除...
#### 三、初识Redis ##### 1.3.1 数据类型 - Redis支持多种数据类型,包括字符串(Strings)、散列(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。 - 每种数据类型都有其特定的应用场景,例如字符串常...
#### 三、初识Redis **1.3.1 数据类型** - **String(字符串)**:最简单的键值存储,可以用来存储任何数据。 - **Hash(哈希)**:用于存储键值对的集合。 - **List(列表)**:有序的数据集合,适合实现队列或栈...