题目: HTTP 你到底是谁 第一篇
前言: 作为一个做了2年Android 开发的 IT人, 对http 既熟悉又陌生; 天天都在用,但是当别人问的时候却是"懵逼"状态, 根本没办法装逼, 所以为了装逼成功, 我发出了内心的疑问 "HTTP 你到底是谁";
当然第一件事是百度一下(不要鄙视我没用google);
1. 超文本传输协议(HTTP HyperText Transfer Protocol)--> 网络协议;所有的www文件都必须遵守这个标准;(哦哟,略屌);1960年这家伙就有雏形了,比我爹还大两岁(前辈受我一拜);
2. 来,看下技术架构:
HTTP 是一个 客户端 和 服务器端 请求和应答得标准(TCP);
啥意思? 来, 客户端 = 手机 , 服务器端 = 服务器 ; 服务器存着资源, 客户端去请求获得;(言简意赅, 优秀)
所以你可能以为模型是这样:
客户端 ----------------------------> 服务器
客户端 <---------------------------- 服务器
呵呵, to young to simple
实际情况是这样
客户端 --------代理-----网关----隧道-------> 服务器
客户端 <------代理-----网关----隧道-------- 服务器
代理干嘛使的?
来来来, 介绍两个软件 Charles 和 Fidder 设个代理抓包一下;
3. 上一遍流程:
_________________________________________________________________________________
(响应状态行,如:HTTP/1.1 200 OK) |
| 客户端------- (请求) ------------------------------------------------ (响应)-------服务端 |
| | |(80端口默认) |
| HTTP------------------------------- ------------------------------------------HTTP |
| TCP ------------------------------------------------TCP |
___________________________________________________________________________
可以看出, HTTP 的下层协议是TCP, TCP属于传输层, HTTP 便是应用层了!
难道, HTTP 下层只能是TCP协议吗, 当然不是, 理论上任何一种稳定传输协议都可以, 但是TCP的稳定,可控,纠错能力能, 更加适合!
4.HTTP的注意事项:
HTTP 无连接: 限制每次链接只处理一个请求, 完成则断开.节省时间嘛, 也节约资源
HTTP 无状态: 无状态协议,对于事物的处理,转身就忘. 如果下一个链接需要上一个连接的信息, 嘿嘿, 对不起我忘了,在传输一次吧!
5.HTTP 的消息结构
HTTP 是 客户端 和 服务器端的 通信协议, 所以 HTTP的消息中既包涵 请求信息 也带有 响应信息
5.1 请求信息(Request):
我们先用Charles 抓一个 真正得 Request, 长这样的;
5.1.1Get方法请求的 Request:
1 | GET /v2/book/search?start=0&count=20&key=fcc736b44a9f3ed587971eb62276ff0b HTTP/1.1 | |
2 | Host | api.douban.com |
3 | Connection | Keep-Alive |
4 | Accept-Encoding | gzip |
5 | User-Agent | okhttp/3.8.0 |
6 |
来, 瞅一瞅, 看一看,看不懂不收钱, 看懂了留个言:
第1行: 请求行 (说明请求的方法(GET), 请求的资源地址(url), HTTP得版本 )
第2-5行: 请求头(说明服务器要使用的附加信息)
各个字段后面解释
第6行: 空行 (必须的,格式就是这样)
5.1.2 Post 方法请求的 Request:
1 | POST / HTTP1.1 | |
2 | Host | note.youdao.com |
3 | User-Agent | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) |
4 | Content-Type | application/x-www-form-urlencoded |
5 | Connection | Keep-Alive |
6 | ||
7 | userName=Wlsimely |
第7行: 请求数据
其实也就是请求体, 一般Post方式才会有;因为Get方式的参数内容,都拼接在了Url后面
5.2 响应信息
还是一样的,抓一个真实的 Response
1 | HTTP/1.1 200 OK | |
2 | Date | Thu, 11 Oct 2018 09:15:43 GMT |
3 | Content-Type | application/json |
4 | Access-Control-Allow-Origin | http://wsq.discuz.qq.com |
5 | Access-Control-Allow-Methods | GET, POST, OPTIONS |
6 | Content-Encoding | gzip |
7 | ||
8 | {"Version":"5","Charset":"UTF-8","Variables":{"cookiepre":"dazE_2132_","auth":null,"saltkey":"V1y6Y3OF","formhash":"55117a8c","ismoderator":null,"readaccess":"10","notice":{"newpush":"0","newpm":"0","newprompt":"3","newmypost":"0"}}} |
让我们look, look:
第1行: 状态行(HTTP 版本, 响应码 , 响应状态)
第2-6行: 响应头(说明客户端需要使用的附加信息)
第7行: 空行 (没有原因)
第8行: 响应体 (返回的消息主体)
就是这么愉快 + 轻松,来我们小结一下;
小结: HTTP 携带请求消息 和 响应消息:
请求消息(Request)由: 请求行 请求头 空行 请求体 组成
响应消息(Response)由: 状态行 响应头 空行 响应体 组成
6. 揭下请求头和响应头的参数们的面纱 (来,别害羞)
下面用网络转载的一个表格来展现,
以下表格内容来自:https://blog.csdn.net/echizao1839/article/details/81028448
标准请求字段
名称 | 描述 | 例子 | 状态 |
---|---|---|---|
TE | 用户代理愿意接受的传输编码:可以使用与响应头字段Transfer-Encoding相同的值,加上“trailers”值(与“ chunked ”传输方法相关)以通知它期望的服务器在最后一个零大小的块后面的预告片中接收其他字段。 | TE: trailers,�0�2deflate | 常驻 |
Host | 服务器的域名(用于虚拟主机),以及服务器正在侦听的TCP端口号。的端口,如果端口是用于请求服务的标准端口号可被省略。 自HTTP / 1.1以来必须提供。如果请求是直接在HTTP / 2中生成的,则不应使用它。 | Host: en.wikipedia.org:8080
| 常驻 |
From | 发出请求的用户的电子邮件地址。 | From: user@example.com | 常驻 |
Proxy-Authorization | 用于连接代理的授权凭据。 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | 常驻 |
Content-MD5 | 一个Base64编码过的二进制MD5请求主体的内容的总和。 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== | 已淘汰 |
Content-Type | 请求正文的媒体类型(与POST和PUT请求一起使用)。 | Content-Type: application/x-www-form-urlencoded | 常驻 |
Content-Length | 请求体的长度,以八位字节为单位(8位字节)。 | Content-Length: 348 | 常驻 |
Upgrade | 要求服务器升级到其他协议。不得在HTTP / 2中使用。 | Upgrade: h2c, HTTPS/1.3, IRC/6.9, RTA/x11, websocket | 常驻 |
If-None-Match | 如果内容未更改,则允许返回304 Not Modified,请参阅HTTP ETag。 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" | 常驻 |
If-Modified-Since | 如果内容未更改,则允许返回304 Not Modified。 | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT | 常驻 |
If-Match | 在客户端提供的实体与服务器上的同一实体匹配时才执行操作。这主要是针对像PUT这样的方法,如果资源自用户上次更新后未被修改,则仅更新资源。 | If-Match: "737060cd8c284d8af7ad3082f209582d" | 常驻 |
If-Unmodified-Since | 如果实体自特定时间以来未被修改,则仅发送响应。 | If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT | 常驻 |
If-Range | 如果实体没有变化,请将我遗漏的部分寄给我; 否则,请将整个新实体发送给我。 | If-Range: "737060cd8c284d8af7ad3082f209582d" | 常驻 |
Authorization | 身份验证凭据的HTTP认证。 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | 常驻 |
Accept | (/)可以接受响应的媒体类型。请参阅内容协商。 | Accept: text/plain | 常驻 |
Accept-Datetime | 可接受的版本及时。 | Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT | 临时 |
Accept-Encoding | 可接受的编码清单。请参阅HTTP压缩。 | Accept-Encoding: gzip, deflate | 常驻 |
Accept-Language | 可接受的人类语言清单。请参阅内容协商。 | Accept-Language: en-US | 常驻 |
Accept-Charset | 可以接受的字符集。 | Accept-Charset: utf-8 | 常驻 |
Referer | 这是上一个网页的地址,从该网页跟踪了当前请求页面的链接。 (“引用者”一词在RFC以及大多数实现中拼写错误,以至于它已成为标准用法并被认为是正确的术语) | Referer: http://en.wikipedia.org/wiki/Main_Page | 常驻 |
Date | 邮件发起的日期和时间(以RFC 7231日期/时间格式定义的“HTTP日期” 格式)。 | Date: Tue, 15 Nov 1994 08:12:31 GMT | 常驻 |
Cookie | 先前由服务器使用Set-Cookie发送的HTTP cookie(如下所示)。 | Cookie: $Version=1; Skin=new; | 永久:标准 |
Expect | 表示客户端需要特定的服务器行为。 | Expect: 100-continue | 常驻 |
User-Agent | 用户代理的用户代理字符串。 | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0 | 常驻 |
A-IM | 请求的可接受实例操作。 | A-IM: feed | 常驻 |
Cache-Control | 用于指定请求 - 响应链中所有缓存机制必须遵守的指令。 | Cache-Control: no-cache | 常驻 |
Range | 仅请求实体的一部分。字节从0开始编号。请参阅字节服务。 | Range: bytes=500-999 | 常驻 |
Warning | 关于实体主体可能出现问题的一般警告。 | Warning: 199 Miscellaneous warning | 常驻 |
Access-Control-Request-Method, Access-Control-Request-Headers | 使用Origin(下面)发起跨源资源共享请求。 | Access-Control-Request-Method: GET | 永久:标准 |
Origin | 发起跨源资源共享请求(向服务器请求Access-Control- *响应字段)。 | Origin: http://www.example-social-network.com | 永久:标准 |
Forwarded | 公开通过HTTP代理连接到Web服务器的客户端的原始信息。 | Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43 Forwarded: for=192.0.2.43, for=198.51.100.17 | 常驻 |
Connection | 控制当前连接的选项和逐跳请求字段列表。 | Connection: keep-alive | 常驻 |
Via | 通知服务器发送请求的代理。 | Via: 1.0 fred, 1.1 example.com (Apache/1.1) | 常驻 |
Pragma | 特定于实现的字段,可能在请求 - 响应链中的任何位置具有各种影响。 | Pragma: no-cache | 常驻 |
Max-Forwards | 限制通过代理或网关转发邮件的次数。 | Max-Forwards: 10 | 常驻 |
非标准请求字段
名称 | 描述 | 例子 |
---|---|---|
DNT | 请求Web应用程序禁用其对用户的跟踪。这是Mozilla的X-Do-Not-Track标题字段版本(自Firefox 4.0 Beta 11开始)。Safari和IE9也支持这一领域。2011年3月7日,向IETF提交了一份提案草案。[18]所述的W3C跟踪保护工作组正在生产的规范。 | DNT: 1 (Do Not Track Enabled)
|
Front-End-Https | Microsoft应用程序和负载平衡器使用的非标准标头字段 | Front-End-Https: on |
Proxy-Connection |
实现为对HTTP规范的误解。通常是因为早期HTTP版本的实现中的错误。与标准连接字段具有完全相同的功能。 不得与HTTP / 2一起使用。
| Proxy-Connection: keep-alive |
Save-Data | Chrome,Opera和Yandex浏览器中提供的Save-Data客户端提示请求标头允许开发人员为在浏览器中选择加入数据保存模式的用户提供更轻,更快的应用程序。 | Save-Data: on |
Upgrade-Insecure-Requests |
告诉服务器(可能是在HTTP - > HTTPS迁移的中间)托管混合内容,客户端更喜欢重定向到HTTPS并且可以处理 Content-Security-Policy: upgrade-insecure-requests 不得与HTTP / 2一起使用
| Upgrade-Insecure-Requests: 1 |
X-ATT-DeviceId | 允许更轻松地解析通常在AT&T设备的用户代理字符串中找到的MakeModel / Firmware | X-Att-Deviceid: GT-P7320/P7320XXLPG |
X-Csrf-Token | 用于防止跨站点请求伪造。备选标题名称为:X-CSRFToken和X-XSRF-TOKEN | X-Csrf-Token: i8XNjC4b8KVok4uw5RftR38Wgp2BFwql |
X-Forwarded-For | 事实上的标准,用于通过HTTP代理或负载平衡器识别连接到web服务器的客户端的发起IP地址。被Forwarded标头取代。 | X-Forwarded-For: client1, proxy1, proxy2
|
X-Forwarded-Host | 事实上的标准,用于识别由在客户端请求的原始主机HostHTTP请求报头中,由于主机名和/或反向代理(负载平衡器)的端口可以从原始服务器处理请求不同。被Forwarded标头取代。 | X-Forwarded-Host: en.wikipedia.org:8080
|
X-Forwarded-Proto | 事实上的标准,用于识别一个HTTP请求的始发协议,因为反向代理(或负载平衡器)可以使用HTTP,即使该请求到反向代理是HTTPS web服务器进行通信。Google客户端与Google服务器通信时使用另一种标头形式(X-ProxyUser-Ip)。被Forwarded标头取代。 | X-Forwarded-Proto: https |
X-Http-Method-Override | 请求Web应用程序使用头字段中给出的方法(通常为PUT或DELETE)覆盖请求中指定的方法(通常为POST)。这可以在用户代理或防火墙阻止直接发送PUT或DELETE方法时使用(请注意,这可能是软件组件中的错误,应该修复,或者是故意配置,在这种情况下绕过它可能是这是错误的事情)。 | X-HTTP-Method-Override: DELETE |
X-Request-ID, X-Correlation-ID | 关联客户端和服务器之间的HTTP请求。 | X-Request-ID: f058ebd6-02f7-4d3f-942e-904344e8cde5 |
X-Requested-With | 主要用于识别Ajax请求。大多数JavaScript框架都会发送此字段的值为XMLHttpRequest | X-Requested-With: XMLHttpRequest |
X-UIDH | 服务器端深度数据包插入唯一ID,用于识别Verizon Wireless的客户; 也被称为“perma-cookie”或“supercookie” | X-UIDH: ... |
X-Wap-Profile | 链接到Internet上的XML文件,其中包含有关当前连接设备的完整说明和详细信息。在右边的示例中是AT&T三星Galaxy S2的XML文件。 | x-wap-profile:http://wap.samsungmobile.com/uaprof/SGH-I777.xml |
标准响应字段
名称 | 描述 | 例子 | 状态 |
---|---|---|---|
Accept-Patch | 指定此服务器支持的修补程序文档格式 | Accept-Patch: text/example;charset=utf-8 | 常驻 |
Accept-Ranges | What partial content range types this server supports via�0�2byte serving | Accept-Ranges: bytes | 常驻 |
Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Allow-Methods, Access-Control-Allow-Headers | 指定哪些网站可以参与跨域资源共享 | Access-Control-Allow-Origin: * | 永久:标准 |
Age | 对象在几秒钟内处于代理缓存中的时间 | Age: 12 | 常驻 |
Allow | 指定资源的有效方法。用于不允许的405方法 | Allow: GET, HEAD | 常驻 |
Alt-Svc |
服务器使用“Alt-Svc”标头(意味着替代服务)来指示其资源也可以在不同的网络位置(主机或端口)或使用不同的协议进行访问 使用HTTP / 2时,服务器应该发送ALTSVC帧。
| Alt-Svc: http/1.1="http2.example.com:8001"; ma=7200 | 常驻 |
Cache-Control | 告诉从服务器到客户端的所有缓存机制是否可以缓存此对象。它以秒为单位测量 | Cache-Control: max-age=3600 | 常驻 |
Connection |
控制当前连接的选项和逐跳响应字段列表。 不得与HTTP / 2一起使用。
| Connection: close | 常驻 |
Content-Disposition | 有机会为二进制格式的已知MIME类型提出“文件下载”对话框,或建议动态内容的文件名。特殊字符需要引号。 | Content-Disposition: attachment; filename="fname.ext" | 常驻 |
Content-Encoding | 数据上使用的编码类型。请参阅HTTP压缩。 | Content-Encoding: gzip | 常驻 |
Content-Language | 所附内容的目标受众的自然语言 | Content-Language: da | 常驻 |
Content-Location | 返回数据的备用位置 | Content-Location: /index.htm | 常驻 |
Content-MD5 | 一个的Base64 -encoded二进制MD5的响应的内容的总和 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== | 常驻 |
Content-Range | 此部分消息属于全身消息的位置 | Content-Range: bytes 21010-47021/47022 | 常驻 |
Content-Type | 此内容的MIME类型 | Content-Type: text/html; charset=utf-8 | 常驻 |
Date | 邮件发送的日期和时间(以RFC 7231定义的“HTTP日期”格式) | Date: Tue, 15 Nov 1994 08:12:31 GMT | 常驻 |
Delta-Base | 指定响应的delta编码实体标记。 | Delta-Base: "abc" | 常驻 |
ETag | 特定版本资源的标识符,通常是消息摘要 | ETag: "737060cd8c284d8af7ad3082f209582d" | 常驻 |
Expires | 给出响应被认为是陈旧的日期/时间(以RFC 7231定义的“HTTP日期”格式) | Expires: Thu, 01 Dec 1994 16:00:00 GMT | Permanent: standard |
IM | 实例操作应用于响应。 | IM: feed | 常驻 |
Last-Modified | 请求对象的最后修改日期(采用RFC 7231定义的“HTTP-date”格式) | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT | 常驻 |
Link | 用于表示与其他资源的类型关系,其中关系类型由RFC 5988定义 | Link: </feed>; rel="alternate" [44] | 常驻 |
Location | 用于重定向,或者在创建新资源时使用。 |
| 常驻 |
P3P | 该字段应该以形式设置P3P策略P3P:CP="your_compact_policy"。然而,P3P没有起飞,大多数浏览器从未完全实现过它,很多网站都使用虚假的策略文本设置这个字段,这足以欺骗浏览器存在P3P策略并授予第三方cookie权限。 | P3P: CP="This is not a P3P policy! See https://en.wikipedia.org/wiki/Special:CentralAutoLogin/P3P for more info." | 常驻 |
Pragma | 特定于实现的字段,可能在请求 - 响应链中的任何位置具有各种影响。 | Pragma: no-cache | 常驻 |
Proxy-Authenticate | 请求身份验证以访问代理。 | Proxy-Authenticate: Basic | 常驻 |
Public-Key-Pins[46] | HTTP公钥固定,宣布网站的真实TLS证书的哈希值 | Public-Key-Pins: max-age=2592000; pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g="; | 常驻 |
Retry-After | 如果实体暂时不可用,则会指示客户稍后再试。值可以是指定的时间段(以秒为单位)或HTTP日期。 |
| 常驻 |
Server | 服务器的名称 | Server: Apache/2.4.1 (Unix) | 常驻 |
Set-Cookie | 一个HTTP cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 | 永久:标准 |
Strict-Transport-Security | HSTS策略通知HTTP客户端缓存仅HTTPS策略的时间长度以及这是否适用于子域。 | Strict-Transport-Security: max-age=16070400; includeSubDomains | 永久:标准 |
Tk | 跟踪状态标头,建议发送的值以响应DNT(不跟踪),可能的值: “!” - 正在建设中 “?” - 动态 “G” - 多方 “N”的网关- 不跟踪 “T” - 跟踪 “C” - 跟踪同意 “P” - 仅在同意 “D”时跟踪- 忽略DNT “U” - 更新 | Tk:�0�2? | 常驻 |
Trailer | 预告片一般字段值指示给定的标题字段集存在于用分块传输编码编码的消息的尾部中。 | Trailer: Max-Forwards | 常驻 |
Transfer-Encoding |
用于将实体安全地传输给用户的编码形式。目前定义的方法是:chunked,compress,deflate,gzip,identity。 不得与HTTP / 2一起使用。
| Transfer-Encoding: chunked | 常驻 |
Upgrade |
要求客户端升级到其他协议。 不得在HTTP / 2中使用
| Upgrade: h2c, HTTPS/1.3, IRC/6.9, RTA/x11, websocket | 常驻 |
�0�2 |
非标准响应字段
名称 | 描述 | 例子 |
---|---|---|
Content-Security-Policy, X-Content-Security-Policy, X-WebKit-CSP | 内容安全策略定义。 | X-WebKit-CSP: default-src 'self' |
Refresh | 用于重定向,或者在创建新资源时使用。此刷新在5秒后重定向。由Netscape引入并由大多数Web浏览器支持的标头扩展。 | Refresh: 5; url=http://www.w3.org/pub/WWW/People.html |
Status | CGI标头字段,指定HTTP响应的状态。正常的HTTP响应使用单独的“状态行”,而不是由RFC 7230定义。 | Status: 200 OK |
Timing-Allow-Origin | 这个Timing-Allow-Origin响应报头指定了被允许看到经由的特征检索的属性的值的起源资源时序API,否则会报告为零由于跨来源的限制。 | Timing-Allow-Origin: *
|
X-Content-Duration | 以秒为单位提供音频或视频的持续时间; 仅支持Gecko浏览器 | X-Content-Duration: 42.666 |
X-Content-Type-Options | 唯一定义的值“nosniff”阻止Internet Explorer从声明的内容类型中嗅探响应。这也适用于Google Chrome,下载扩展程序时。 | X-Content-Type-Options: nosniff [56] |
X-Powered-By | 指定技术(如ASP.NET,PHP,JBoss的)支持Web应用程序(版本的详细信息往往是X-Runtime,X-Version或X-AspNet-Version) | X-Powered-By: PHP/5.4.0 |
X-Request-ID, X-Correlation-ID | 关联客户端和服务器之间的HTTP请求。 | X-Request-ID: f058ebd6-02f7-4d3f-942e-904344e8cde5 |
X-UA-Compatible | 建议使用首选渲染引擎(通常是向后兼容模式)来显示内容。还用于在Internet Explorer中激活Chrome Frame。 | X-UA-Compatible: IE=EmulateIE7 X-UA-Compatible: IE=edge X-UA-Compatible: Chrome=1 |
X-XSS-Protection | 跨站点脚本(XSS)过滤器 | X-XSS-Protection: 1; mode=block |
好了,到此http的分享就完成了,本次主要还是在使用的层面进行分析,并未深入到协议原理等!转载请注明出处。