网络请求基础知识(一)HTTP 基础篇

1.报文格式

1.1 请求报文

以下是发起一个 HTTP 请求需要的主要信息,在发起网络请求时我们一般只提供 URL 和请求实体,剩下的交给框架(Okhttp3或者 Retrofit等)完成。

  • 请求行:请求方法+路径+版本号

  • 请求头:

    • Host: 请求的主机名

    • Connection:是否保持连接

    • User-Agent:用户信息

    • Accept:客户端接受的数据类型

    • Accept-Encoding:客户端识别的数据编码格式

    • Cookie:cookie 信息

  • 请求体:内容

Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 7.0; m3 note) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
ip=172.56.168.66&imei=86521684611</pre>
1.2 响应报文

准备好http 请求信息后,接下来就可以发起网络请求了,请求一般使用socket ,具体实现可以通过 TCP/UDP 来传输。

  • 状态行:版本号+状态码+状态信息

  • 响应头:Content-Type,Content-Length等

  • 响应体:返回内容

Server: nginx/1.8.1
Date: Thu, 03 Jan 2019 07:31:02 GMT
Content-Type: text/plain;charset=UTF-8
Content-Length: 93
Connection: keep-alive
Accept-Charset: big5, big5-hkscs, euc-jp, euc-kr, gb18030, gb2312, gbk, ibm-thai, ibm00858, ibm01140, ibm01141
​
{"adlist":{"kaiping":{"ad":{}},"yunying":{"ad":{}}},"showadtime":"10","getadlisttime":"1200"}</pre>
1.2.1 状态吗
2xx:成功,报文已成功收到并被正确处理
3xx:重定向,资源位置发生变动,需要客户端重新发送请求
4xx:客户端错误,请求报文有误,服务器无法处理
5xx:服务器错误,服务器在处理请求时内部发生了错误</pre>```
  • 200 请求成功

  • 304 缓存可以继续用

  • 404 地址有问题

  • 500 服务器内部错误

  • 301:请求的资源永久迁移到新的位置

  • 302:请求的资源暂时需要从另一个地址响应,后续的请求中应该继续使用原地址

  • 305:使用代理,请求的资源需要通过指定的代理访问

  • 307:请求资源临时需要从新地址响应(与 302 不同的是它是 HTTP1.1 出现的;此外,如果重定向 307 的原请求不是 GET 或者 HEAD 方法,浏览器一定不能自动的进行重定向)

  • 400:客户端请求语法错误

  • 403:禁止访问,服务器理解请求,但由于没有授权服务器拒绝提供资源

  • 404:找不到,请求的位置无法找到任何资源

  • 406:无法访问,请求资源的类型和想要的不一样

1.2.2 响应头
  • Cache-Control:缓存策略,private(中间节点不能缓存数据,个性信息)/public(中间节点能缓存数据,公有信息)

  • Pramga:用于在旧版本兼容Cache-Control`

  • Connection:连接是否要保持,在 HTTP1.1 开始允许保持连接

  • Cotent-Encoding:服务器使用了什么压缩方法,客户端需要进行相应的处理

  • Content-Type:返回的数据类型

  • Content-Length:服务器告知相应对象的长度

  • Content-Range:服务器告知该想要属于哪个部分,一般用于断点续传

  • Range:客户端告知服务器自己想取对象的哪部分,一般用于断点续传

  • Set-Cookie:服务端告知当前 Cookie 的使用限制,包括:过期日期、路径、域、端口、版本等

  • ETag:对当前相应的一个标识,用于判断请求资源是否修改

  • Expired:服务器表明该相应将在什么时候过期(过期了的对象,只有在跟服务器验证其有效性后,才能用来响应客户请求)

  • Location:指定重定向的url地址,请求http://www.baidu.com重定向到https://www.baidu.com

   Location: https://www.baidu.com/
   Non-Authoritative-Reason: HSTS</pre>
  • Proxy-Authenticate: 代理服务器处理的请求,要求客户端提供代理身份验证信息

  • Referer:客户端告知服务器自己是从哪个 URL 点击当前请求中的 URL

  • Transfer-Encoding:服务器表明自己对本响应体作了怎样的编码,比如是否分块(chunked)

  • Last-Modified:服务器返回一个过期时间

  • User-Agent:用户代理,实际发送请求,接受响应的浏览器和手机。(返回手机页面还是pc页面)

  • Cache-Control:no-cache(下次使用时,询问一下),no-store(不要缓存),max-age(未过期直接使用)

1.2.3 使用缓存过程如下图:
image

2.HTTP 的特点:

  • 灵活可扩展

    • HTTP 协议是一个“灵活可扩展”的传输协议

      • 只规定了报文的基本格式,各个组成部分并没有严格的语法语义限制,开发者可自由定制

      • 能够传输图片,音频,视频等任意数据

  • 可靠传输

    • HTTP 协议是一个“可靠”的传输协议

      • 基于 TCP/IP 的,而 TCP 本身是一个“可靠”的传输协议

      • HTTP 并不能 100% 保证数据一定能够发送到另一端,在网络繁忙、连接质量差等恶劣的环境下,也有可能收发失败.

  • 应用层协议

    • HTTP 协议是一个应用层的协议

      • 对比其他应用层协议,HTTP 协议称得上是一个万能的协议,只要性能不太苛刻,几乎可以传输一切东西
  • 请求 - 应答

    • HTTP 协议使用的是请求 - 应答通信模式
  • 无状态

    • HTTP 协议是无状态的

      • TCP 协议:有状态,一开始处于 CLOSED 状态,连接成功后是ESTABLISHED 状态,断开连接后是 FIN-WAIT 状态,最后又是 CLOSED 状态。

      • HTTP 协议:客户端和服务器永远是处在一种“无知”的状态,建立连接前两者互不知情,每次收发的报文也都是互相独立的,没有任何的联系。收发报文也不会对客户端或服务器产生任何影响,连接后也不会要求保存任何信息。

      • UDP 协议:它是无连接也无状态的,顺序发包乱序收包,数据包发出去后就不管了,收到后也不会顺序整理。而 HTTP 是有连接无状态顺序发包顺序收包,按照收发的顺序管理报文.

3. HTTP 的优点和缺点

3.1 优点
  • 1.简单、灵活、易于扩展

  • 2.应用广泛、环境成熟

3.2 双刃剑
  • 无状态

    • 优点:

      • 节省资源,实现简单

      • 容易组成集群(服务器都是相同的,无状态差异)

    • 缺点:无法支持需要多个步骤的"事务操作",如电商购物,用户首先需要登陆,然后添加购物车,再下单,结算,支付,而这一系列过程都需要知道用户的身份信息才可以,又因为 http 的无状态,每一次都需要问一遍身份信息,不仅麻烦,还浪费资源.

  • 明文

    协议里的报文(准确地说是 header 部分)不使用二进制数据,而是用简单可阅读的文本形式。

    • 优点:不需要借助任何外部工具,容易查看或修改,方便调试

    • 缺点:报文所有信息都暴露在传输链路里

3.3 缺点:
  • 不安全

    安全有很多的方面,明文只是“机密”方面的一个缺点,在“身份认证”和“完整性校验”这两方面 HTTP 也是欠缺的。

    • 身份认证:HTTP 无法提供有效的手段来确认通信双方的真实身份,很可能会连到一个一模一样的假冒 站

    • 不支持完整性校验,数据在传输过程中容易被篡改而无法辨别真伪.

  • 虽然银行可以用 MD5、SHA1 等算法给报文加上数字摘要,但还是因为“明文”这个致命缺点,黑客可以连同摘要一同修改,最终还是判断不出报文是否被窜改

如何解决:HTTPS

  • 性能

概括:不算好,不够好

  • 基于 TCP ,TCP的性能是不差的,但现在的互联网特点是移动和高并发,不能保证稳定的连接质量,所以在 TCP 层面上 HTTP 协议有时候就会表现的不够好

  • 请求 - 应答”模式则加剧了 HTTP 的性能问题,即队头阻塞”(Head-of-line blocking),当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据

如何解决:Web 性能优化,缓存等

终极解决方案:HTTP/2 和 HTTP/3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容