http/1.1通用首部字段详解

       前言

                通用首部字段是什么?不是我们看到的

以上图片是url地址,客户端(当作是我们自己的电脑)比如在百度这个网页上有个新闻,我想点开这时候就向着服务器get请求一个url地址,会发送的一些信息,由 请求行,首部字段和其他内容,内容主体三部分组成,我挂代理截个包给大家看看。

👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆

以上是截包的数据内容

第一行 1 GET /link?url=......eqid=96ca... HTTP/1.1 就是请求行;

第二行 2 Host:www.baidu.com (请求的主机名是从百度新闻的页面请求的,而不是你自己的主机电脑ip地址的名字)

第三行

第...行

以上的从 第二行开始到第...行都是首部字段

空格

报文主体

HTTP首部字段结构

        HTTP首部字段结构

        

四种首部字段

        通用首部字段

           请求报文和响应报文两方都会使用的首部。

        请求首部字段

           客户端向服务器发送消息的时候使用的首部字段,补充了请求的附加内容,客户端信息,响应内容相关的信息。

        响应首部字段

           服务器向客户端发送内容使用的首部信息。

        实体首部字段

           针对请求报文和响应报文的实体部分使用的首部字段。补充了资源内容的更新时间等与实体有关的信息。

题外话

        我们这里讲到的首部字段一般都是http/1.1的首部字段,这些http/1.1的首部字段等等这些通信协议都在RFC2616文件中有详细说明,当然也不止RFC2616,其他的RFC编号的文件代表了就不是http/1.1协议的内容代表了其他网络协议里面的内容,我们抓包的时候抓的内容也不全部http/1.1的内容也有其他RFC编号的网络协议 比如说cookie ,set cookie, Content-Disposition也用的很多(http/1.1就是RFC2616文档里面所规定的内容,以下内容感兴趣可自行下载):Network Working Group(网络工作组) R (blogjava.net)icon-default.png?t=O83Ahttp://files.blogjava.net/sunchaojin/http1.3.pdf        什么是RFC?

基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多在标准内的论题,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中

        RFC(Request For Comments)意即“请求评论”,包含了关于Internet的几乎所有重要的文字资料。如果你想成为网络方面的专家,那么RFC无疑是最重要也是最经常需要用到的资料之一,所以RFC享有网络知识圣经之美誉

http/1.1的通用首部字段

    Cache-Control(强缓存)

              Cache-Control: no-cache (不缓存旧资源)

              意思是:不向代理服务器请求缓存资源,而是告诉代理服务器我要直接向源服务器请求最新的资源;但是源服务器会告诉代理服务器,说原来如此 那就在每次接受到no-cache的时候记得向我确认一下;

·································································································································

               Cache-Control: no-store (不存储任何资源缓存)

              意思是:此信息包含机密信息,不进行存储在代理服务器内,每次源服务器发出响应,经过代理服务器的时候,不会将资源缓存在代理服务器内,常见的比如说银行卡密码账户信息。

·································································································································

               Cache-Control: max-age (最大缓存有效时间)

              意思是:客户端向源服务器发送请求,源服务器给资源给客户端之后,会把一部分数据缓存在代理服务器身上;比如说max-age = 2592000 单位是s/秒 ,也就是说在这2592000秒内即使源服务器更新了资源也不会将最新的资源给到客户端,客户端只用这2592000秒内的缓存资源。

·································································································································

        Cache-Control: must-revalidate

              意思是:客户端向源服务器给请求,经过代理服务器,代理服务器获得源服务器的资源后(或者直接用代理服务器的缓存资源),并不会直接返回客户端而是重新向源服务器进行确认资源是否是最新的,然后在返回给客户端(这指令会忽略max-stale也就是即便在max-stale的秒数内也会向源服务器进行更新)

·································································································································

        Cache-Control: public 

              意思是:大众,其他用户也可以利用缓存。

·································································································································

        Cache-Control: private

              意思是:只给某个特定的用户提供利用缓存。

·································································································································

        Cache-Control: max-age

              意思是:客户端向源服务器发送请求之后,源服务器向代理服务器发送一个缓存,假如max-age等于6000秒,则在这6000秒之内,哪怕源服务器有资源更新也不向源服务器进行请求。如果max-age等于0,则每次都向源服务器进行请求。

·································································································································

        Cache-Control:min-fresh

                意思是:最小的缓存资源时间,客户端说 我只要从现在开始min-fresh=60s 刚刚60秒以内的缓存在缓存服务器上的资源,超过60s的不会响应。

·································································································································

        Cache-Control:max-stale

                意思是:stale翻译过来就是不新鲜的意思;如果max-stale=3600秒,如果缓存即使过期只要处于max-stale的时间范围之内,仍然会被客户端接收。比如max-age=60秒,加上max-stale=60秒,现在的缓存时长就是120秒。

·································································································································

        Cache-Control:only-if-cached

                意思是:客户端不联网只在代理服务器的现有缓存中获取资源(不会确认资源的有效性),如果获取不到资源也不会联网,会返回一个504 gateway timeout 网关超时的状态码。

·································································································································

        cache-control:proxy-revalidate

                意思是:在返回给客户端响应时,代理服务器必须再次验证缓存的有效性。

·································································································································

        cache-control:no-transform

                意思是:代理服务器上的缓存不会被更改实体主体的媒体类型。这样做可以防止缓存或代理压缩图片等类似的操作。

·································································································································

       cache-control扩展

        Connection

                Connection通用首部字段有两个作用(与源服务器之间的连接):

          1.控制不再转发给代理的首部字段;

            1.第一种是什么意思?

              比如说客户端发送请求:

GET / http/1.1
Upgrade: HTTP/1.1
Connection: Upgrade

        这是在告诉代理服务器 把Upgrade删除之后在转发给源服务器;然后代理服务器会给源服务器转发如下内容:

GET / http/1.1

           

       2.持久!连接;

        2.第二种是什么意思?

        目前互联网并不是完全的http1.1的内容,还有其他落后的版本的内容,所以要兼顾其他落后的版本;比如说客户端发送如下一段请求给源服务器:

GET / HTTP/1.1
Connection: Keep-Alive

        这是在告诉源服务器请保持时刻都在连接。然后源服务器接受到信息后会返回如下指令:

HTTP/1.1 200 OK
...
Keep-Ailve:timeout=10, max=500
Connection:Keep-Ailve
...

Date(创建http报文的时间)

        

        

pragma(和cache-control:no-cache一样)

        pragma相当于落后版本的cache-control,也只是为了兼容其他版本的http协议罢了;客户端告诉代理中间服务器说:“我不要缓存的内容,请给我最新的资源。”

        虽然客户端嘴上告诉中间代理服务器说一定不要缓存;但是中间代理服务器会告诉源服务器 哎哎哎 给我确认一下这个 东西 是不是最新的,然后源服务器检查说:不是最新的噢(也可能说ok),并把最新的资源缓存给中间服务器,并且告诉他:别告诉客户端是我给你缓存,如果以后客户端想要什么资源,一定要找我确定一下是不是最新资源噢~

Trailer(挂车,拖车)

        顾名思义:挂车肯定挂着几个东西,这几个东西就是某些首部字段。挂车会将这几个东西送到报文主体里面显示出来;

        比如说 Trailer: Expires

        . . . (报文主体) . . .

        Expires: Tue , 28 Sep 2004 23:59:59 GMT

Transfer-Encoding(转换编码)

        指的是传输报文主体的内容的编码方式:要传输报文主体内容,比如transfer-encoding:chunked;就是将报文主体分割成:cf0 也就是16进制(比如说共3312字节分块数据);392 也就是16进制(比如说914字节数据)

Upgrade(更新使用其他协议)

        客户端发送一段代码:Upgrade TLS/1.0告诉服务器我可以使用TLS/1.0协议吗?

GET /index.htm HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade

        服务器:ok,我给你更新一下;Upgrade:TLS/1.0, HTTP/1.1 你可以使用两个协议;并且加上Connection:upgrade,不要发connection:upgrade首部字段了;

   via(记录代理服务器或者网关的信息)

        当客户端在转发请求的时候,会经过代理服务器或者网关,这个时候在发送给源服务器的同时会将代理服务器的信息加在 GET /HTTP/1.1 的后面,via:1.0 gw.hackr.cn(Squid/3.1);1.0代表http的协议版本,如果有很多的代理服务器,则会一直在via:下面加上其他代理服务器的信息。

   warning(警告码)

http/1.1 常见的请求首部字段

 Accept:text/plain;q=0.3,text/html;

q是权重,最大权重1.0;如果没有写权重则默认为1.0,这里客户端请求服务器优先发送text/html格式的内容;这里的text/plain 是type/subtype 的模式,类别/子类别。

        常见的媒体类型有哪些?

        图片文件:image/jpeg image/gif image/png

        视频文件:video/mpeg video/quicktime

        应用程序的二进制文件:application/octet-stream,application/zip......

        Accept:charset(设置字符集)

        accept-charset:iso-8859-6,unicode-1-1;q=0.8

        告诉服务器我要设置iso-8859-6的字符集,权重为0.8;

        Accept-Encoding(接受的编码方式)

      GZIP DEFLATE

       Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3

        告诉服务器我能接受的资源支持语言

EXPECT

        期望请求,客户端首先会发送一个EXPECT,来向服务器确认,我这个期望能不能得到满足?如果得到满足则POST给服务器,得不到满足,也就不用上传资源了,这样也就节省了好多时间和流量。

        Expect的格式语法目前只规定了一个:

Expect: 100-continue

举个例子:

PUT /somewhere/fun HTTP/1.1
Host: origin.example.com
Content-Type: video/h264
Content-Length: 1234567890987
Expect: 100-continue

这个时候服务器看这个期望的请求ok不ok,如果ok则返回一个100,来让client上传想上传的东西。也可能返回一个407 或者4xx 来告诉对方,你的愿望得不到满足。

FROM

留下的是服务器代理人的信息,又可能是一封邮件

Host

主机名,或者代理服务端的名字,比如用的是火狐浏览器,那就是火狐。

If-Match

如果能匹配到则返回资源,举个例子,客户端发送GET http/1.1 index/html  If-match:1 2 3 4 5

发送给源服务器,源服务器搜index/html的文件,并将文件的Etag与 If-match相比较如果匹配上则返回资源,否则匹配失败。

 if-none-match

如果不能匹配到资源就完成客户端的命令。

if-Range

        这里是客户端向服务器请求资源的一部分,因为是请求资源的一部分if-Range 的字段值要和服务器端的资源的ETAg值或者更新的日期时间匹配一致。匹配一致则返回所对应范围的资源,否则返回全部的资源。

If-modified-since

        (如果在xxxx年xx月xx日之后的这个文件资源有更新则返回资源),如果没有则返回304 Not Modified 找到了总类资源,没有找到符合具体条件的资源。

If-unmodified-since

        (如果xxxx年xx月xx日之后的这个文件资源没有更新则返回资源)

Max-Forwards(最大向前数量)

        Max-Forwards:10 客户端转发给代理只能转发10次,转一次减去一次,直到0,就返回给客户端。

User-Agent(目前的用户代理名称)

     http/1.1常见的响应首部字段   

这里的响应首部是服务器向着客户端发送一定的响应       

Accept-Ranges

        服务器告诉客户端 ,你这个范围的请求,我能不能接受,如果不能接受则返回给客户端none,能接受你这个请求则返回客户端给bytes。

告诉客户端,你发送的请求资源的范围,我能接受。

Accept-Ranges:bytes

  告诉客户端,你发送的请求资源的范围,我不能接受。

Accept-Ranges:none

Age

        客户端发送请求,如果是缓存服务器进行响应,那缓存服务器发送Age来告诉客户端,这个自从缓存的时间开始的实体内容距离现在已经过去多久时间了。Age的单位是秒/S。如果是源服务器则一样,也是告诉客户端这个资源距离现在过去多久时间了。

Etag

        用来告知客户端的实体标识,服务器会为每份资源提供唯一的标识符;比如说虽然是同一个网页,但是中文版和英文版的Etag值都不一样。Etag又分强与弱;

强Etag:当资源哪怕经过一点点的修改也会返回一个新的Etag值;

弱Etag:当资源发生根本性的改变的时候,才会改变Etag的值,这时会在字段值最开始出附加W/。

       弱Etag:

Etag:W/"usagi-1234"

Location

        就是网址的意思嘛,什么时候服务器会向客户端发送带有Location的首部呢?当客户端发送的请求想要获取的资源在原处找不到的时候,服务器会返回3XX的报错,301资源永久性发生转移地址,302表示资源已经重新分配了一个新的URL希望客户端不要访问旧的,请访问新的吧~ 303 找到另外新的资源地址,请访问新的地址吧;303和302的区别还是有的,虽然都是访问新的地址,但是303是要客户端用GET请求访问资源。

        这个时候客户端会重新get或者post这个新的Location地址,然后返回资源。

Retry-After(请在之后尝试)

        如下代码的意思是:请120秒之后来进行访问;会配合使用503来进行响应

Retry-After:120

 server(服务器)

        告诉客户端服务器的所有信息;

server:Apache/2.2.17(UNIX) PHP/5.2.5

vary

        客户端发送:

GET /smp.html
Accept-Language: en-us 

        经过代理服务器,并转发给源服务器:

GET /smp.html
Accept-Language: en-us 

        源服务器收到之后,转发给代理服务器如下:

Vary:Accept-Language

        这是在告诉代理服务器:如果和我本身常常使用的资源的语言相同,则用代理服务器直接返回就ok了,如果不是一个语言,则还是交给我(源服务器)吧

http/1.1实体首部字段

        这里的实体首部字段是,客户端和服务器端的实体内容

Allow

        所允许的方式 Allow:get post

        这是指的是 我这里只接受get请求和post请求。

Content-Encoding

        对实体主体所采用的编码方式;

       如下是编码方式是gzip,如果是服务器发过来的资源,则是gzip编码资源,需要客户端对gzip的资源进行解码操作。

Content-Encoding:gzip

Content-Language

        实体资源所呈现出来的语言,比如如下,呈现出来的资源就是中文;

Content-Language:zn

Content-Length

        资源的字节长度,有150000字节;

Content-Length:150000

Content-Location

        资源的地址也就是URL

Content-MD5

                MD5加密信息

Content-type

        返回实体主体的种类,如下:

    Content-type:text/html; charset=UTF-8

 Expires

        资源内容失效时间;

Expires:wed, 04 Jul 2024 04:23:03 GMT

Last-Modified

        资源最后修改时间

Last-Modified:wed, 23 May 2024 04:23:03 GMT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值