8.HTTP

原文链接:https://github.com/helloyoucan/knowledge

HTTP相关

1、特点
  • 简单快速(资源URL固定)
  • 灵活(可传输不同类型的数据)
  • 无连接(通讯结束则断开)
  • 无状态(传输完成会断开,服务端无法区分)
2、报文组成
请求报文
  • 请求头(http方法、当前地址、http协议、版本)
  • 请求行(告知服务端需要的内容、内容类型)
  • 空行(服务端把空行后的内容解析为请求体)
  • 请求体
响应报文
  • 状态行
  • 响应头
  • 空行
  • 响应体
5、方法
  • GET
  • POST
  • PUT
  • DELETE
  • HEAD(获取报头,与相比响应报文中少了响应体的内容)
GET
浏览器后退 无害 再次发送请求
URL地址 可被收藏 不可
参数 通过URL传递 存放在Request body中
参数限制 无(浏览器地址栏有限制)
缓存 浏览器主动 需要手动设置
编码 只支持URL编码 支持多种
请求参数 浏览器保存在历史记录 不会保留
数据类型 ASCII字符 没有限制
安全性 参数暴露在URL
状态码
原因结语
1XX 信息性状态码 接收的请求正在处理
2XX 成功 请求正常处理完毕
3XX 重定向 需要进行附加操作以完成请求
4XX 客户端错误 服务器无法处理请求
5XX 服务器错误 服务器处理请求出错

常用的状态码

  • 200 #请求成功
  • 204 #请求成功处理,单响应报文中不含实体的主体部分(用于只需要从客户端发生信息,服务端不需要发送新的信息内容)
  • 206 #客户端进行了范围请求,服务端成功执行了这部分get请求(例如视频分段加载,拖动视频进度条)
  • 301 #永久性重定向(请求的资源已被分配了新的URL,以后应使用资源现在所指的URL)

  • 302 #临时性重定向

  • 303 #请求资源存在着另外一个URL,应使用GET方法定向获取请求的资源

  • 304 #客户端发生附带条件的请求时,服务端允许请求访问资源,但未满足条件。

  • 307 #临时性重定向。(重定向时,不会从POST请求变成GET)

    301,302,303响应状态码返回时,几乎所有浏览器都会吧POST改成GET,删除请求报文主体,再次自动发送请求。但307不会

  • 400 #请求报文存在错误
  • 401 #发送的请求需要有同感HTTP认证(BASIC认证、DIGEST认证)的认证信息,若之前已进行1次请求,则表示认证失败
  • 403 #请求的资源被服务器拒绝(未获得文件系统的访问权限,访问权限出现问题,从为授权的发送源IP地址视图访问等)
  • 404 #无法找到资源(也可在服务器拒绝请求且不想说明理由时使用)
  • 500 #服务端执行请求时发生错误
  • 501#服务器不具备完成请求的功能
  • 502 #网关错误,服务器无法重上游服务器收到无限响应
  • 503 #服务端处于超负荷或在停机维护,无法处理请求
  • 504 #网关超时
  • 505 # http版本不支持
6、持久连接
  • HTTP协议采用“请求-应答”模式,每次请求都要新建连接,完成后断开
  • 使用K持久连接时,客户的到服务端的连接持续有效,后继请求时,不需重新建立连接

http1.0

  • keep-alive补充协议,客户端与服务器之间完成了持久连接
  • 使用HTTP/1.0的客户端在首部中加上”Connection:Keep-Alive”,请求服务端将一条连接保持在打开状态。服务端如果愿意将这条连接保持在打开状态,就会在响应中包含同样的首部。如果响应中没有包含”Connection:Keep-Alive”首部,则客户端会认为服务端不支持keep-alive,会在发送完响应报文之后关闭掉当前连接。
  • http1.1废弃

http1.1

  • 采取持久连接的方式替代了Keep-Alive
  • 默认持久连接(Connection: keep-alive),需要关闭则在报文上加上Connection:Close首部,在HTTP/1.1中,所有的连接都进行了复用
  • 如同Keep-Alive一样,空闲的持久连接也可以随时被客户端与服务端关闭。不发送Connection:Close不意味着服务器承诺连接永远保持打开
7、管线化(http1.1)
  • 持久化连接的情况,某个连接上的消息类似

    请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3

  • 管线化(通道持久建立,把全部请求打包一次性请求,把响应也全部打包一次性传输回去)

    请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3

    • 管线化通过持久连接完成,仅http/1.1支持
    • GET和HEAD可以,POST有所限制
    • 不会应响应到来的顺序
    • 要求服务器对管线化请求不失败
    • 不能大幅度带来性能提升,服务端支持有限,浏览器默认不开启
    • 现代浏览器Chrome和Firefox默认并未开启管线化支持
    • 很多服务器端和代理程序对管线化的支持并不好
8、http协商缓存vs强缓存
强缓存(200)

浏览器在请求某一资源使,先获取该资源缓存的header信息,判断是否命中强缓存(expires和cache-control信息),命中则直接从缓存中获取资源信息,包括缓存header信息,该次请求不与服务器通讯。

  • expires #http1.0的规范,值为一个绝对时间的GMT格式的时间字符串(如Mon, 10 Jun 2015 21:31:12 GMT);在该时间前的请求,本地缓存始终有效,不会发送请求到服务器。

  • cache-control:max-age=number(秒) #http1.1出现大的header信息,利用max-age的值进行判断,是一个相对值。资源初次请求时间和Cache-Control设定有效期,计算资源过期时间,发送请求时将这个过期时间和请求时间对比。

    cache-control 还有几个常用的值:

    • no-cache # 不使用本地缓存。可使用协商缓存。
    • no-store # 禁止浏览器缓存数据
    • public #可被所有用户缓存,包括终端用户、CDN等中间代理服务器
    • private # 只允许终端用户的浏览器缓存。
  • 若同时存在,则优先级:cache-control > expires

协商缓存(304)

客户端与服务端通过某种标识进行通讯,让服务器判断请求资源是否可以缓存访问。不命中强缓存时,浏览器发送的请求到服务器,该请求携带第一次请求返回的有关缓存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match)。服务器感觉相关的header信息对比协商缓存是否命中,命中则服务器返回新的header信息更新缓存中的对应header信息,但不返回资源内容,告知浏览器从缓存中获取,否则返回最新资源内容。

  1. 通过标识通讯
  2. 非初次请求携带缓存字段(Last-Modified/If-Modified-Since和Etag/If-None-Match)
  3. 返回304状态码,不返回资源
  • Last-Modified/If-Modified-Since # 值的格式是GMT格式的时间

    • 初次请求,返回资源时,response的header上加上Last-Modified,表示资源在服务端的最后修改时间。
    • 再次请求,request的header加上If-Modified-Since(初次请求时返回Last-Modified的值)。
    • 服务端根据If-Modified-Since和资源在服务器上的最后修改时间对比,没变化则返回304 Not Modified,不返回资源内容。变化了则返回资源和Last-Modified。
  • Etag/If-None-Match # 服务器生成的唯一标识字符串

    • 与Last-Modified/If-Modified-Since类似。
    • 不一样的地方:返回304时,Etag重新生成,并在response header返回,即使该Etag与之前没有变化。
  • Last-Modified与Etag 对比

    • 周期性修改的文件,内容不变而修改时间改变,使用Etag更好
    • 频繁修改的文件(1s内修改几次),If-Modified-Since只能检查到秒级以上的,使用Etag更好
    • 某些服务器不能精确文件的最后修改时间,使用Etag更好
    • Etag更准确,可一起使用,Etag优先级高,先对比Etag,一致后再对比Last-Modified,再返回304
用户行为对缓存影响
用户操作 Expires/Cache-Control Last-Modified/Etag
地址栏打开 yes yes
页面链接跳转 yes yes
新开窗口 yes yes
前进后退 yes yes
F5刷新 no yes
Ctrl+F5强制刷新 no no
9、http2.0新特性
  • 二进制格式 #HTTP1.x 的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。
  • 多路复用
    • 同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接而带来的延时和内存消耗。
    • 单个连接上可以并行交错的请求和响应,之间互不干扰
    • keep-alive虽然可以用多次,但是同一时刻只能有一个HTTP请求
  • header压缩 #HTTP2.0 使用 encoder 来减少需要传输的 header 大小,通讯双方各自 cache 一份 header fields 表,既避免了重复 header 的传输,又减小了需要传输的大小。
  • 服务端推送 # 允许服务器在请求之前先推送响应信息到客户端
10、TCP三次握手
  • 客户端 服务端(你好,我是A) #客户端给服务器发送一个 SYN 报文
  • 服务端 客户端 (收到,我是B) #服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。
  • 客户端 服务端(那我们连接了) #客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。
11、TCP四次挥手
  • 客户端 服务端(你好,我要关闭了)
  • 服务端 客户端(稍等,还有最后一个包)
  • 服务端 客户端(我已经好了,随时关闭)
  • 客户端 服务端(你关闭吧,不用回复,A等待2MSL无回复,关闭)
12、https(安全超文本传输协议)

是什么?

  • 基于HTTP开发,用于客户计算机与服务器之间交互信息
  • 使用安全套接字层(SSL)进行通讯交换

与HTTP区别

  • https协议需要到ca申请证书,一般免费证书很少,需要交费;

  • http 信息的明文传输,https则是具有安全性的ssl加密传输协议;

  • 端口不一样,http是80,https是443;

  • HTTPS协议是由SSL + HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

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

推荐阅读更多精彩内容

  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,855评论 0 3
  • 本文是《图解HTTP》读书笔记的第二篇,主要包括此书的第六章内容,因为第六章的内容较多,而且比较重要,所以单独写为...
    lijiankun24阅读 1,356评论 0 6
  • Web 页面的实现 Web 基于 HTTP 协议通信 客户端(Client)的 Web 浏览器从 Web 服务器端...
    毛圈阅读 1,072评论 0 2
  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,517评论 0 6
  • 成为父亲后,继承了父亲家教的衣钵。对于孩子,只做不说。换句话说:闭上嘴,抬起腿,走自己的人生路,演示给孩子看。作为...
    楚人鑫驰阅读 840评论 0 0