网络协议底层原理(九):HTTP

一、HTTP协议是什么?
    1. HTTP(Hyper Text Transfer Protocol)译为超文本传输协议,是一种应用层协议,如下图所示,目前有HTTP1.0、HTTP2.0、HTTP3.0三个版本,HTTP3.0也叫HTTP over QUIC
      HTTP协议
  • 2.HTTP的标准由万维网协会(W3C)、互联网工程任务组(IETF)协调制定,最终发布了一系列的RFC(RFC全称是Request For Comments,可以译为:请求意见稿

    1. HTTP的历史如下所示:

    ◼ 1996年,HTTP/1.0发布,HTTP1.0支持POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型(不再局限于文本数据) ,浏览器的每次请求都需要与服务器建立一个TCP连接,请求处理完成后立即断开TCP连接

    ◼ 1997年,HTTP/1.1发布(最经典、使用最广泛的版本) ,支持PUT、DELETE等请求方法,采用持久连接(Connection: keep-alive)多个请求可以共用同一个TCP连接

    ◼ 2015年5月,HTTP/2.0标准RFC 7540正式发表,HTTP/2.0 增加了二进制传输、多路复用、头部压缩、服务器推送、优先级等特性

    ◼ 2022年6月6日,IETF QUIC和HTTP工作组成员Robin Mark在推特上宣布,历时5年,HTTP/3终于被标准化为 RFC 9114这是HTTP超文本传输协议的第三个主要版本

二、HTTP协议的报文格式
    1. HTTP的报文格式是采用ABNF来描述的,具体格式如下,无论是请求报文,还是响应报文,都会遵守这个格式,可以去RFC7230查看HTTP全部的Messsage Format
      HTTP的报文格式
    1. 其中,start-line代表是请求行或者响应行header-filed代表请求头或者响应头*代表0个或多个CRLF代表换行messgae-body代表请求体或者响应体,想了解start-line、header-field的具体格式,可以去RFC7230查看
      image.png
    1. 举一个例子,来说明一下HTTP的报文格式,如下所示,第一行是一个start-line,后面是多个header-field,接下来是CRLF,这里没有message-body
      HTTP报文格式
三、HTTP的请求方法和字段
    1. start-line中需要明确HTTP的请求方法,在RFC 7231, section 4: Request methods中描述了8种请求方法,分别是GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE,这些请求方法的含义如下所示:

    ◼ GET:常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的)

    ◼ POST:常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)

    ◼ HEAD:请求得到与GET请求相同的响应,但没有响应体
    使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载。以此可以节约带宽资源

    ◼ DELETE:用于删除指定的资源

    ◼ TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断

    ◼ CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel) ,可以用来访问采用了 SSL (HTTPS) 协议的站点

    1. header-filed头部字段有四种类型,主要就是描述请求/响应的信息,具体每个字段的含义,可以去这里查询HTTP/Headers,我们这里说需要注意的几个字段,如下所示:
      请求头字段.png

      响应头字段.png
    1. HTTP 的 CookieSession
    • (1). 当客户端第一次请求服务器的时候,服务器生成一份session保存在服务端,该session的id就是cookie,服务器会返回Set-Cookie的响应体给客户端,让客户端存储cookie,这样以后客户端只需要在请求头中设置Cookie字段,服务器就可以辨认出客户端的身份啦

    • (2).cookie存储在客户端,session存储在服务器端,使用cookie可以帮助服务器辨别客户端,以便它们之间更好地通信

    1. HTTP 的 Content-Type字段,可以让我们知道请求的内容是什么,进而用对应的方式解析,常见的Content-Type有以下几种:
    • (1). application/x-www-form-urlencoded,HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/"、","、“:" 等会自动进行URL转码。不支持文件,一般用于表单提交,例如html中的form标签,默认就采用application/x-www-form-urlencoded

    • (2). multipart/form-data,与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型,一般用于上传多个文件,首先生成了一个boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容;

      • 多个参数将会有多个boundary块,如果参数是文件会有特别的文件域

      • 最后以------boundary--为结束标识

      • 需要注意的是:上传文件的content-type必须使用multipart/form-data,如下所示:

NSString *boundary = @"PIUSDUFIASDFUPAUskfa";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[networkRequest setValue:contentType forHTTPHeaderField: @"Content-Type"];
multipart/form-data.png
  • (3). application/json,JSON 是一种轻量级的数据格式,以“键-值”对的方式组织的数据,需要注意的是,想用这种类型需要保证参数本身就是json格式的数据(因为参数会被直接放到请求体里,不会进行任何处理)
四、HTTP的缓存机制
  • 1.HTTP有一大堆字段来控制缓存,例如Pragma、Expires、Cache-Control、Last-Modified、ETag、If-None-Match、If-Modified-Since,那么这些字段是如何工作的呢?我们先来了解下这些字段的含义,再来说整个控制流程

    1. 首先是关于缓存控制的字段,优先级:Pragma > Cache-Control > Expires

      ◼Pragma:作用类似于Cache-Control,HTTP/1.0的产物

      ◼Expires:缓存的过期时间(GMT格式时间),HTTP/1.0的产物

      ◼Cache-Control:设置缓存策略,有五个值可供选择,如下所示:

  no-storage:不缓存数据到本地
  public:允许用户、代理服务器缓存数据到本地
  private:只允许用户缓存数据到本地
  max-age:缓存的有效时间(多长时间不过期),单位秒
  no-cache:每次需要发请求给服务器询问缓存是否有变化,再来决定如何使用缓存
    1. 然后是标识资源的字段,优先级:ETag > Last-Modified

    ◼ Last-Modified:资源的最后一次修改时间

    ◼ ETag:资源的唯一标识(根据文件内容计算出来的摘要值)

  • 4.If-None-Match 和 If-Modified-Since字段

If-None-Match,如果上一次的响应头中有ETag,就会将ETag的值作为请求头的值 ;如果服务器发现资源的最新摘要值跟If-None-Match不匹配,就会返回新的资源(200 OK) ;否则,就不会返回资源的具体数据(304 Not Modified)

If-Modified-Since ,如果上一次的响应头中没有ETag,有Last-Modified,就会将Last-Modified的值作为请求头的值 ;如果服务器发现资源的最后一次修改时间晚于If-Modified-Since,就会返回新的资源(200 OK) ;否则,就不会返回资源的具体数据(304 Not Modified)

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

推荐阅读更多精彩内容