HTTP协议详解

Posted YoLo♪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP协议详解相关的知识,希望对你有一定的参考价值。

目录

1.HTTP 响应详解

1.1认识状态码(status code)

1.2 认识响应报头(header) 

1.3 认识响应正文(body)

2.构造 HTTP 请求

2.1 通过form表单构造请求

2.2 通过ajax构造请求

2.3 使用第三方工具构造请求


开始之前我们先复习一下http协议格式

1.HTTP 响应详解

我们先抓包来看看http响应,此处是抓取登录gitte时的http响应

我们可以看到这个http响应分为四个部分

1.首行:版本号+状态码+状态码描述

2.header(响应头):也是键值对的组织格式,一行是一个键值对,键值用:连接

3.空行:是响应头结束的标记,空行上面是header,下面是body

4.body(正文):正文的格式取决于Content-Type,下文详细讲述

版本号就是当前使用HTTP协议的具体版本,前文也提到过.我们现在来看看状态码和状态码的描述

1.1认识状态码(status code)

状态码:表示访问一个页面的结果(成功或失败,或者其他情况...)

HTTP的响应状态码是非常多的,并且都表示不同的含义,我们先看看具体有哪些:

HTTP状态码列表:

状态码状态码英文名称中文描述
100Continue继续。客户端应继续其请求
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200OK请求成功。一般用于GET与POST请求
201Created已创建。成功请求并创建了新的资源
202Accepted已接受。已经接受请求,但未处理完成
203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206Partial Content部分内容。服务器成功处理了部分GET请求
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。使用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305Use Proxy使用代理。所请求的资源必须通过代理访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
400Bad Request客户端请求的语法错误,服务器无法理解
401Unauthorized请求要求用户的身份认证
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405Method Not Allowed客户端请求中的方法被禁止
406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408Request Time-out服务器等待客户端发送的请求时间过长,超时
409Conflict服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
412Precondition Failed客户端请求信息的先决条件错误
413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
415Unsupported Media Type服务器无法处理请求附带的媒体格式
416Requested range not satisfiable客户端请求的范围无效
417Expectation Failed服务器无法满足Expect的请求头信息
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功能,无法完成请求
502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

最常见的状态码:

200 OK  :访问成功了

404 NotFound:表示访问的资源不存在

 我们看看抓包结果

404后跟着的就是状态描述

403 Forbidden:表示访问被拒绝,也是比较常见的状态.有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆 直接访问, 就容易见到 403

302 Found:表示重定向,类似于呼叫转移.比如我有一个手机号,后来换了个号,此时办理一个呼叫转移业务就不需要告诉他们新号码,直接用旧号码打电话,就会自动转移到新的号码.这里出现这个状态就是转移到另一个新的页面

我们抓取gitte登陆页面登录成功后自动跳转到主页

 并且302这样的响应报文中,会在header里带有Location属性,通过这个属性找到新的要跳转的地址

 302和301本质是相同的,都是重定向.302是临时重定向,资源只是临时被移动.301是永久重定向,请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替

浏览器的重定向和请求转发的区别是什么?

重定向是http协议中提供的机制,为了方便进行网站迁移这样的工作.请求转发则是servlet/spring中提供的机制,看看具体区别

重定向:涉及到两次交互,可以重定向到外部资源,跳转到别的网站

请求转发:只有一次交互,只能在服务器内部的资源之间转发,更加高效,只有一次交互

500  :服务器内部错误,代码抛出异常了,无法完成请求

504 Gateway(网关)Time-out:响应时间太久了,浏览器等不及.就是充当网关或代理的服务器,未及时从远端服务器获取请求,

这么多状态码可分为几大类:

分类分类描述
1XX信息,服务器收到请求,正在处理
2XX成功,操作被成功接收并处理
3XX重定向,需要进一步的操作以完成请求
4XX客户端错误,请求包含语法错误或无法完成请求
5XX服务器错误,服务器在处理请求的过程中发生了错误

这里的状态码是RFC标准中明确规定的,不能由程序员自定义,在HTTP协议中还有不少地方可以自己定义:

1.URL中的路径

2.URL中的query string

3.header 中的键值对

4.header 中的cookie的键值对

5.body

1.2 认识响应报头(header) 

响应报头的基本格式和请求报头的格式基本一致 

类似于 Content-Type , Content-Length 等属性的含义也和请求中的含义一致

Content-Type

响应中的 Content-Type 常见取值有以下几种:

1.text/html : body 数据格式是 HTML

2.text/css : body 数据格式是 CSS

3.application/javascript : body 数据格式是 JavaScript

4.application/json : body 数据格式是 JSON

1.3 认识响应正文(body)

正文的具体格式取决于 Content-Type,我们分别抓取上述几种格式的正文观察,此处抓取的是登录某站后的http响应

1.text/html : body 数据格式是 HTML

2.text/css : body 数据格式是 CSS

3.application/javascript : body 数据格式是 JavaScript

4.application/json : body 数据格式是 JSON

2.构造 HTTP 请求

2.1通过form表单构造请求

form (表单) 是 HTML 中的一个常用标签. 可以用于给服务器发送 GET 或者 POST 请求,注意单词拼写,是form不是from!

form的重要参数

action:构造的HTTP请求的URL是什么

method:构造的HTTP的请求的方法是get 还是post(只支持get和post)

input的重要参数

type:输入框的类型.text表示文本,password表示密码,submit表示提交按钮

name:表示构造的HTTP请求的query string中的key.value为用户输入的内容

value: input 标签的值. 对于 type 为 submit 类型来说, value 就对应了按钮上显示的文本

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 允许用户和服务器之间交换数据,用户提交数据 -->
    <!-- action:提交给哪个服务器? -->
    <!-- method:具体的方法 -->
    <form action="https://www.baidu.com" method="get">
        <!-- 提交的数据,对于form,数据是键值对的结构 -->
        <input type="text" name="studentName">
        <!-- inputsubmit 构造了提交按钮, value描述了按钮中的文本-->
        <!-- 点击按钮就会触发提交form表单的操作 ,也就是狗仔请求发送给服务器-->
        <input type="submit" value="提交">
    </form>
</body>
</html>

通过抓包观察结果

网页地址栏:也显示了querystring

 

和代码进行对比

除了首行之外,其它的都是浏览器自主添加的,不是代码控制的

现在把GET替换成POST

抓包结果

可以看到数据从querystring移动到了body中

注意:form标签只能构造GET和POST,不能构造别的方法的请求

2.2通过ajax构造请求

除了浏览器地址栏额能构造GET请求,form表单能构造GET和POST请求之外,也能用ajax构造请求,功能更强大

ajax 全称 Asynchronous Javascript And XML, 是 2005 年提出的一种 JavaScript 给服务器发送 HTTP 请求的方式,特点是可以不需要 刷新页面/页面跳转 就能进行数据传输

Asynchronous:异步的.简单的理解为:A等待B有两种等待方式.如果A始终关注B,观察B什么时候就绪,就是同步等待;异步是A不时刻关注B的动向,B就绪之后还就通知A,这是异步等待

Ajax就是异步的方式,发送请求之后,不必等待服务器响应,就可以立即往下执行,当服务器响应回来之后,再由浏览器通知到代码中

jquery针对js原生的ajax的api进行封装,简单实用

使用前首先要引入jQuery

搜索jquery cdn然后使用第一个版本的就可以

复制链接到js代码中 

发送GET请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 引入jquery -->
    <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
    <script>
        $.ajax(
            type:'get',
            url:'https://www.baidu.com?studengName=zhangsan',
            //success声明了一个回调函数,会在服务器响应返回到浏览器的时候,触发该回调,体现了  异步
            success:function(data)
                //data是响应的正文部分
                console.log("服务器返回的响应到达浏览器之后,浏览器出发该回调,通知到当前代码中");
            
        );
        console.log("浏览器继续向下执行其它代码");
    </script>
</body>
</html>

在jquery中,$.ajax中的$是一个特殊的全局对象,jquery的api都是以$的方法的形式来引出的,ajax只有一个参数,是一个js对象,使用表示的键值对.

上述代码只是发送了请求,无法获取到正确的响应,因为发送给百度的服务器没有处理我们的请求,如果发送给自己写的服务器,就能正确处理了

抓包结果 .与form相比,ajax功能更强

支持put,delete等方法.

发送的请求可以灵活设置header

发送的请求的body也可灵活设置

 后续使用最多的就是ajax

2.3使用第三方工具构造请求

form和ajax在开发中很关键,但是在测试中也需要构造http请求,有更方便的不用写代码的构造请求方式,使用第三方软件-postman,我这里使用的是网页版,也可以下载使用

步骤

1.创建一个工作空间

2.新建一个标签页

3.构造请求

 发送成功

这些属性都可以设置

 除了构造功能之外,postman能生成构造的代码方便集成,点击右侧code

就可以选择要使用什么语言来构造 

 


之前提到的http协议会存在运营商劫持的行为,那么如何保证安全呢,https应运而生了,下文详述https的原理

http协议详解

这是一篇别人的文章,加上自己实践修改所得。 

理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,使用Fiddler工具非常方便地捕获HTTP Request和HTTP Response。

阅读目录

  1. 什么是HTTP协议
  2. Web服务器,浏览器,代理服务器
  3. URL详解
  4. HTTP协议是无状态的
  5. HTTP消息的结构
  6. Get和Post方法的区别
  7. 状态码
  8. HTTP Request header
  9. HTTP Response header
  10. HTTP协议是无状态的和Connection: keep-alive的区别

  什么是HTTP协议

  协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器.http协议是基于tcp协议的。

  目前我们使用的是HTTP/1.1 版本

  Web服务器,浏览器,代理服务器

  当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?

  实际上我们输入URL后,我们的浏览器给Web服务器发送了一个Request, Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页,过程如下图所示

  技术分享

  我们的Request 有可能是经过了代理服务器,最后才到达Web服务器的。

  过程如下图所示

   技术分享

  代理服务器就是网络信息的中转站,有什么功能呢?

  1. 提高访问速度, 大多数的代理服务器都有缓存功能。

  2. 突破限制, 也就是FQ了

  3. 隐藏身份。

  URL详解

  URL(Uniform Resource Locator) 地址用于描述一个网络上的资源,基本格式如下

   schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]

   scheme     指定低层使用的协议(例如:http, https, ftp)

   host       HTTP服务器的IP地址或者域名

   port#       HTTP服务器的默认端口是80,可以省略。如用了别的端口,须指明,例 http://www.cnblogs.com:8080/

   path       访问资源的路径

   url-params   特殊参数可选项

   query-string 发送给http服务器的数据

   anchor-     锚

  URL 的一个例子

http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff

Schema: http

host: www.mywebsite.com

path: /sj/test

URL params: id=8079

Query String: name=sviergn&x=true

Anchor: stuff

  HTTP协议是无状态的

   http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题,

  Web程序引入了Cookie机制来维护状态.

  HTTP消息的结构

  先看Request消息的结构,Request消息分为3部分,第一部分叫请求行,第二部分叫http header, 第三部分是body. header和body之间有个空行, 结构如下图

  技术分享

  第一行中的Method表示请求方法,比如"POST","GET",  Path-to-resoure表示请求的资源, Http/version-number 表示HTTP协议的版本号

  当使用的是"GET" 方法的时候, body是为空的。数据放在请求行。

  比如我们打开博客园首页的request 如下

GET http://www.cnblogs.com/ HTTP/1.1

Host: www.cnblogs.com

  我们用Fiddler 捕捉一个博客园登录的Request 然后分析下它的结构, 在Inspectors tab下以Raw的方式可以看到完整的Request的消息,   如下图

   技术分享

  我们再看Response消息的结构,和Request消息的结构基本一样。同样也分为三部分,第一部分叫request line, 第二部分叫request header,第三部分是body. header和body之间也有个空行

  结构如下图

  技术分享

  HTTP/version-number表示HTTP协议的版本号,status-code 和message 请看下节[状态代码]的详细解释.

  我们用Fiddler 捕捉一个博客园首页的Response然后分析下它的结构, 在Inspectors tab下以Raw的方式可以看到完整的Response的消息,   如下图

  技术分享

  Get和Post方法的区别

  Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的

  查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

  我们看看GET和POST的区别

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的数据放在HTTP包的Body中.

  2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制)而POST方法提交的数据没有限制.

  3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

  4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

  状态码

  Response 消息中的第一行叫做状态行,由HTTP协议版本号,状态码,状态消息 三部分组成

  状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.

  HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别

  1XX   提示信息 - 表示请求已被成功接收,继续处理

  2XX   成功 -  表示请求已被成功接收,理解,接受

  3XX  重定向     - 要完成请求必须进行更进一步的处理

  4XX  客户端错误  - 请求有语法错误或请求无法实现

  5XX  服务器端错误 - 服务器未能实现合法的请求

  看看一些常见的状态码

  200 OK

  最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端

  如下图, 打开博客园首页

  技术分享

  302 Found

  重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。

  例如在IE中输入http://www.google.com. HTTP服务器会返回304,IE取到Response中Location header的新URL, 又重新发送了一个Request.

   技术分享

  304 Not Modified

  代表上次的文档已经被缓存了,还可以继续使用,

  例如打开博客园首页,发现很多 Response 的status code都是304

  技术分享

  提示: 如果你不想使用本地缓存可以用Ctrl+F5强制刷新页面

  400 Bad Request  客户端请求与语法错误,不能被服务器所理解

  403 Forbidden 服务器收到请求,但是拒绝提供服务

  404 Not Found

  请求资源不存在(输错了URL)

  比如在IE中输入一个错误的URL, http://www.cnblogs.com/tesdf.aspx

   技术分享

  500 Internal Server Error 服务器发生了不可预期的错误

  503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

  HTTP Request header

  使用Fiddler 能很方便的查看Reques header, 点击Inspectors tab -> Request tab -> headers  如下图所示.

  技术分享

  header 有很多,比较难以记忆,我们也按照Fiddler那样把header 进行分类,这样比较清晰也容易记忆。

   Cache 头域

  If-Modified-Since //时间控制机制 一段时间内本地缓存数据有效。

  作用:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

  例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

  实例如下图

  技术分享

  If-None-Match

  作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。当用户再次请求该资源时,将在HTTP Request中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能

  例如: If-None-Match: "03f2b33c0bfcc1:0"

  实例如下图

  技术分享

  Pragma

  作用:防止页面被缓存,在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样

  Pargma只有一个用法,例如:Pragma: no-cache

  注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

  Cache-Control

  作用: 这个是非常重要的规则。这个用来指定Response-Request遵循的缓存机制。各个指令含义如下

  Cache-Control:Public   可以被任何缓存所缓存()

  Cache-Control:Private   内容只缓存到私有缓存中

  Cache-Control:no-cache  所有内容都不会被缓存

  还有其他的一些用法, 我没搞懂其中的意思, 请大家参考其他的资料

Client 头域 (客户端浏览器接受的媒体类型、语言、编码以及os broswer的名称版本)

  Accept

  作用:浏览器端可以接受的媒体类型,

  例如: Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html  也就是我们常说的html文档,

  如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)

  通配符 * 代表任意类型

  例如 Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)

  Accept-Encoding:

  作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);

  例如: Accept-Encoding: gzip, deflate

  Accept-Language

  作用: 浏览器申明自己接收的语言。 

  语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;

  例如: Accept-Language: en-us

  User-Agent

  作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.

  我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

  例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

  Accept-Charset

  作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);

  例如:

Cookie/Login 头域

  Cookie:

  作用:最重要的header, 将cookie的值发送给HTTP服务器

Entity头域

  Content-Length

  作用:发送给HTTP服务器数据的长度。

  例如: Content-Length: 38

  Content-Type

  作用:

  例如:Content-Type: application/x-www-form-urlencoded

Miscellaneous 头域

  Referer:

  作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

  例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

Transport 头域

  Connection

  例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

  例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

  Host(发送请求时,该报头域是必需的)

  作用: 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

  例如: 我们在浏览器中输入:http://www.guet.edu.cn/index.html

  浏览器发送的请求消息中,就会包含Host请求报头域,如下:

  Host:http://www.guet.edu.cn

  此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号

HTTP Response header

  同样使用Fiddler 查看Response header, 点击Inspectors tab ->Response tab-> headers  如下图所示

技术分享

  我们也按照Fiddler那样把header 进行分类,这样比较清晰也容易记忆。

Cache头域

  Date

  作用:  生成消息的具体时间和日期

  例如: Date: Sat, 11 Feb 2012 11:35:14 GMT 

  Expires

  作用: 浏览器会在指定过期时间内使用本地缓存

  例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT

  Vary

  作用:

  例如: Vary: Accept-Encoding

Cookie/Login 头域

  P3P

  作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题

  例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

  Set-Cookie

  作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.

  例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

技术分享

Entity头域

  ETag

  作用:  和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)

  例如: ETag: "03f2b33c0bfcc1:0"

  Last-Modified:

  作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)

  例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

  Content-Type

  作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,

  例如:

  Content-Type: text/html; charset=utf-8

  Content-Type:text/html;charset=GB2312

  Content-Type: image/jpeg

  Content-Length

  指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。

  例如: Content-Length: 19847

  Content-Encoding

  WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。

  例如:Content-Encoding:gzip

  Content-Language

  作用: WEB服务器告诉浏览器自己响应的对象的语言者

  例如: Content-Language:da

Miscellaneous 头域

  Server:

  作用:指明HTTP服务器的软件信息

  例如:Server: Microsoft-IIS/7.5

  X-AspNet-Version:

  作用:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本

  例如: X-AspNet-Version: 4.0.30319

  X-Powered-By:

  作用:表示网站是用什么技术开发的

  例如: X-Powered-By: ASP.NET

Transport头域

  Connection

  例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

  例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

Location头域

  Location

  作用: 用于重定向一个新的位置, 包含新的URL地址

  实例请看304状态实例

  HTTP协议是无状态的和Connection: keep-alive的区别

  无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。

  HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

  从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

  Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

 

上面的东西看了记不住没有总结性,来总结一下。

1.request response格式

HTTP请求格式:
<request-line>         :请求行:请求类型、要访问的资源以、HTTP版本
<headers>               :cache 、client、 cookie/login
<blank line>            :空行
[<request-body>]     :任意数据

 

HTTP响应格式:
<status-line>           :状态行:协议版本号、状态码、状态消息

<headers>               :cache、 cookie/login、 entity
<blank line>            :空行
[<response-body>]   :任意数据

2.cookie,session, cache

cookie:

浏览器(客户端)的存储管理。实现自动登录等。

会话cookie是一种临时的cookie,它记录了用户访问站点时的设置和偏好,关闭浏览器,会话cookie就被删除了;持久cookie存储在硬盘上, 持久cookie有过期时间.

浏览器把cookie通过HTTP Request 中的“Cookie: header”发送给Web服务器,Web服务器通过HTTP Response中的"Set-Cookie: header"把cookie发送给浏览器.

cache:

cache是服务器端的缓存,是所有用户都可以访问和共享的。

session:

信息存于服务端,在交互时传到客户端一个sessionid,客户端请求数据时发送sessionid用于识别存取服务端资源。默认生命周期是20分钟。

session是放在cookie中的。

3.keepalive

Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

以上是关于HTTP协议详解的主要内容,如果未能解决你的问题,请参考以下文章

Https协议详解

[linux] Linux网络编程之HTTP协议详解

[linux] Linux网络编程之HTTP协议详解

计算机网络HTTP协议详解

[C#]网络编程系列专题二:HTTP协议详解

计算机网络HTTP 协议详解