Http请求头和响应头

HTTP 请求

  一个 HTTP 请求包含三个部分:
Method-URI-Protocol/Version 方法-地址-版本
Request header 请求头
Entity body 请求实体

  下面是一个 HTTP 请求实例:
POST /servlet/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
Referer:
http://localhost/ch8/SendDetails.htm
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

LastName=Franks&FirstName=Michael

  The Method-URI-Protocol/Version 在这个请求的第一行:
POST /servlet/default.jsp HTTP/1.1

  其中 POST 是请求的类型。每个客户端 HTTP 请求可以是 HTTP 规范中指定的许多请求类型中的一种。HTTP 1.1 支持七种类型的请求,它们是 GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE。其中 GET 与 POST 是 Internet 应用中经常用到的二种请求类型。

  URI 完整地指定了 Internet 资源。一个 URI 通常被解析为相对服务器的根目录。这样,它应该总是以一个 '/' 前缀开始。一个 URL 实际上是 URI 的一种类型。

  Version 指的是该 HTTP 请求所用到的 HTTP 协议版本。

  请求头包含了客户端环境与请求实体的一些有用的信息。例如它包含浏览器设定的语言、实体的长度等等。每条请求头用回车换行符(CRLF)分开。

  一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始。一些 Internet 开发书籍认为这个 CRLF 空行是 HTTP 请求的第四个部分。

 

 

# end_headers(): 发送一个空白行,表示响应中的HTTP头结束。       

     self.end_headers()

 

 

 

 



   在上面的 HTTP 请求中,实体只是简单以下的一行:
LastName=Franks&FirstName=Michael


  在一个典型的 HTTP 请求中,请求实体内容会长得多。

HTTP 响应

  与请求相似,HTTP 响应也由三部分组成:
Protocol-Status code-Description 协议状态 描述代码
Response headers 响应头
Entity body 响应实体

  以下是一个 HTTP 响应的实例:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 1998 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
Content-Length: 112

< html>
< head>
< title>HTTP Response Example</title></head><body>
Welcome to Brainy Software
< /body>
< /html>

  响应头的第一行类似请求头的第一行,告诉你所用的协议是 HTTP 1.1 ,请求成功(200=success),以及没有任何问题。

  响应头类似请求头也包含了一些有用的信息。响应的实体响应本身的 HTML 内容。头与实体之间由回车换行的空行(CRLF)分开。

 

在http 1.0的版本中,浏览器的每次请求(也就是对每一个页面的访问)都要求建立一次单独的连接,在处理完每一次的请求后,就自动释放连接。(这点我们应该都有感觉,比如我们访问一个页面,当该页面在浏览器中显示出来的时候,我们可以拔掉网线,此时该页面上的信息并不会丢失。)而当我们请求的网页文件中有很多图片、音乐、电影等信息时,服务器返回的信息中并不直接包含图片数据,而只是保存该图片的链接,当浏览器进行解释的时候,遇到图片的url时,才向服务器发出对图片的请求信息。可见如果一个网页中包含多个图片数据时,将会频繁的与服务器建立连接,与释放连接,这无疑会造成资源的浪费。


                                                                                        http 1.0 请求模式

      而http 1.1则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

      · HTTP请求消息

      1次完整的http请求消息包括:一个请求行、若干消息头以及实体内容,而消息头和实体内容可以没有,消息头和实体内容间有一个空行。
      我们来看一个例子(为了便于说明,我在每行前加了序号):
            1 Get /mattmarg/ HTTP/1.0
            2 User-Agent: Mozilla/2.0 (Macintosh; I; PPC)
            3 Accept: text/html; */*
            4 Cookie: name = value
            5 Referer: http://www.XXX.com/a.html
      其中,第1行就是请求行:请求方式为Get(除了Get之外,还有Post、Put、Delete方式),请求的文件位于"根目录/mattmarg/"下,当然也可以直接给出需要的页面(如:/mattmarg/index.asp,也可以加上一些其它字段 如:/mattmarg/index.asp?id=1&uid=xxx。当我们通过Get请求时,提交给服务器的请求行长度不能超过1K,而如果利用Post方式,则是把所提交的信息以实体内容形式发送给服务器,所以如果服务器没有限制的话,原则上讲可以传输无限大的内容),HTTP/1.0 表示了http的版本为1.0。其余几行就是消息头了,消息头主要是用来向服务器传达某种信息或指示。如告诉服务器自己的终端(User-Agent)是什么(如果是浏览器则返回相应的浏览 器型号),终端所可以解释的类型(Accept)是什么,是从哪个页面提交的请求(Referer),以及浏览器所能解释的语言(Accept-Language)等等。我们这里拿Accept-Language来举个例子,大家都知道google在中国大陆显示的是简体中文,而在其它的国家则显示对应的语言,这个是怎么做到的呢?其实就是浏览器向服务器递交的请求信息中包含了Accept-Language,而我们的浏览器默认是zh-cn,然后服务器在接受到该信息时返回对应的页面。
      我们可以通过以下方法来验证一下:
      1、打开浏览器->工具->internet选项->常规选项卡
      2、选择"语言",可见默认的语言是中文

      3、选择"添加",选择一种语言,然后调节一下优先顺序

      4、确定之后,我们再访问一下 http://www.google.com/,是不是发现原来的简体中文全都成了繁体字了。

      · HTTP响应消息

      
Http响应消息的格式为:一个状态行、若干消息头和实体内容,其中消息头和实体内容可以没有 ,消息头和实体内容间有一个空行。
      我们依旧先来看一个例子:
            01 HTTP/1.1 200 OK
            02 Server: Microsoft-IIS/5.1
            03 X-Powered-By: ASP.NET
            04 Date: Sun, 06 Jul 2008 11:01:21 GMT
            05 Content-Type: text/html
            06 Accept-Ranges: bytes
            07 Last-Modified: Wed, 02 Jul 2008 01:01:26 GMT
            08 ETag: "0f71527dfdbc81:ade"
            09 Content-Length: 46
            10
            11 <html><head></head><body>adfasfa</body></html>
      其中,01行是状态行,用于显示服务器响应的状态,HTTP/1.1显示了对应的http协议版本,200为状态数字,OK为状态信息用于解释状态数字(这里OK对应200,表示请求正常);02~09是消息头部分,10为空行,11为实体内容(也就是服务器返回的网页内容)。

      好了,相信大家应该已经对这个http请求的流程有了一个大概的了解了吧,那么我们反过来回答下最初留下的问题:当我们在浏览器的地址栏中输入 "http://www.baidu.com/ " ,然后按"回车",这之后发生了什么事?

      首先,浏览器找到该网址所指向的IP,然后与其建立TCP连接,接着向百度服务器提出Get请求,当服务器接收到我们的请求后,向我们传送应答信息--百度的页面,然后断开连接。

      [补充]以上文章中主要是描述HTTP请求的大致流程,至于HTTP之前所建立的一系列连接,只用了"浏览器找到该网址所指向的IP,然后与其建立TCP连接"这句话或类似的话来带过。根据朋友们的回复显得这个说法不是很恰当。所以我在这里再补充些东西。
       1、获取IP。浏览器地址栏中输入"http://www.xxx.edu.cn/"并提交之后,首先它会在DNS本地缓存表中查找,如果有则直接告诉IP地址。如果没有则要求网关DNS进行查找,如此下去,当找到对应的ip后,则返回给浏览器。
       2、建立TCP连接。当获取到IP之后,就开始与所请求的服务器建立TCP连接,你可以在下图中发现syn,ack,这些标识符就是用来同步用的。
       3、连接建立后,就向服务器发出http请求(大家可以从图中看出来)。如果是HTTP1.0的版本则,每一次请求结束后,就释放TCP连接。

 


(上图中,由于是第一次访问网站,无法在本地找到对应IP)


(短时间内,第二次访问同一网站)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值