关于HTTP协议全面总结

HTTP的介绍

  • HTTP是超文本传输协议的缩写,是用于从www服务器传输出超文本到本地浏览器的传送协议。
  • HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。是一个无状态的协议
  • 无状态协议:HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。

HTTP的工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步:

  1. 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

  2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

  3. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

  4. 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

HTTP报文

三部分:

1. 起始行:在报文中说明做什么,出了什么情况
2. 首部字段:(通用首部,请求首部,响应首部,实体首部,拓展首部)

  • 【general】:通用首部(请求和响应两个阶段都存在的首部)
    包括:

    1. 请求地址
    2. 请求方式
    3. 响应状态
    4. 服务区IP及端口
  • 【Response Header】:响应头信息

    1. location:http://www.baidu.org/index.jsp
    2. server:apache tomcat [告诉浏览器我是tomcat]
    3. Content-Encoding:gzip[告诉浏览器我使用了gzip]
    4. Content-Lenght:80 [告诉浏览器回送的数据大小]
    5. Content-Language:zh-cn[支持中文]
    6. Content-Type:text/html;charset=gb2312[内容格式和编码]
    7. Last-Modified:Tue,11 Juj,2000 18 18:29:20[告诉浏览器该资源上次更新时间是多少]
    8. Refresh:1;url=http://www.baidu.com[过多久刷新到哪里去]
    9. Content-Disposition;attachment;filename=aaa.zip[告诉浏览器有文件下载]
    10. Transfer-Encoding:chunked[传输编码]
    11. Set-Cookie:
    12. Expires:-1[告诉浏览器如何缓存页面]
    13. cache-Control:[告诉浏览器如何缓存页面(因为浏览器的兼容性最好设置两个)]
    14. pragma:no-cache
    15. Connection:close/Keep-Alive
    16. Date:Tue,11 Jul 2000 18:23:51
  • 【Request Header】:请求头信息

    1. Accept:text/html,image/*(告诉服务器,浏览器可以接受文本,网页图片)
    2. Accept-Charaset:ISO-8859-1 [接受字符编码:iso-8859-1]
    3. Accept-Encoding:gzip,compress[可以接受 gzip,compress压缩后数据]
    4. Accept-Language:zh-cn[浏览器支持的语言]
    5. Host:localhost:8080[浏览器要找的主机]
    6. IF-MODIFIED-Since:Tue,11Jul 2000 18:23:51[告诉服务器我这缓存中有这个文件,该文件的时间是...
    7. Referer:http://localhost:8080/test/abc.html[告诉服务器我来自哪里,常用于防止下载,盗链]
    8. User-Agent:Nozilla/4.0(Com...)[告诉服务器我的浏览器内核]
    9. Cookie:
    10. Connection:close/Keep-Alive [保持链接,发完数据后,我不关闭链接]
    11. Date:[浏览器发送数据的请求时间]

3. 主体:请求主体包括了高发给web服务器的数据,相应主体中装载了要返回给客户端的数据

首部.png

HTTP的请求方法

  1. get:传给服务器一些参数来获取服务器上指定资源
  2. post:将客户端数据发送到一个网管程序
  3. delete:从服务器删除命名资源
  4. head:仅发送命名资源的首部
  5. put:将来自客户端的数据存储在一个服务器资源上去
  6. trace:对报文进行追踪
  7. options:决定可以从服务器上执行哪些方法
  • post和get的区别
  1. get有url长度限制(因为参数拼接的问题):chrome:8k ,firefox:7k,ie:2k,所以资源大小限制:get限制大小,post不限制大小
  2. 安全:get可以看到(因为参数拼接的问题)发送给服务器的数据,post把数据放到主体中,不会被看到
  3. 缓存:get请求成功后,get可能存在一个缓存纪录,请求的数据很可能是请求的上一次缓存的数据,post不存在缓存情况
    ps:get请求url后面加随机数可以解决缓存问题

HTTP的状态响应码Status Code

  • 200 请求成功
  • 301 永久重定向
  • 302 临时重定向
  • 303将客户端重定向一个负载不大的服务器上,用于负载均衡
  • 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
  • 404 无法找到这个资源
  • 500服务器错误

缓存

  • 让浏览器做缓存需要给浏览器发送指定的HTTP头,告诉浏览器缓存多长时间,或者坚决不要缓存。

    1. Expires(过期时间)
      HTTP头信息Expires(过期时间) 属性是HTTP控制缓存的基本手段,这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修 改。几乎所有的缓存服务器都支持Expires(过期时间)属性;
    2. Cache-Control(缓存控制)
      有用的 Cache-Control响应头信息包括:
      max-age=[...秒] 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间 开始到过期时间之间的秒数。
    3. Last-Modified/If-Modified-Since:
      在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据没有改变”。
      当服务器发送状态编码 304 时,不再重新发送数据。您仅仅获得了这个状态代码。所以当数据没有更新时,你不需要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。
  • Expires/Cache-Control Header是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只是Cache-Control比Expires可以控制的多一些, 而且Cache-Control会重写Expires的规则。

  • Last-Modified/If-Modified-Since是浏览器发送请求到服务器后判断文件是否 已经修改过,如果没有修改过就只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器。

HTTP2.0

大幅度的提升了 web 性能,在与 HTTP/1.1 完全语义兼容的基础上,进一步减少了网络延迟。

  • 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。某个请求任务耗时严重,不会影响到其它连接的正常执行;一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

    多路复用.jpg

    HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。

  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

  • 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。
    普通的客户端请求过程:

    普通客户端请求.jpg

    服务端推送的过程:
    服务端推送.jpg

    http2.0 请参考 http://www.sohu.com/a/161201715_714863

7层网络协议

七层协议.png

TCP建立连接三次握手

  • 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

  • 握 手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连 接之前,TCP 连接都将被一直保持下去。

// 第一次握手: 客户端发送SYN码数据包发送给服务器,客户端要求和服务器建立联机;
// 第二次握手:服务端接收联机请求,会发送ACK码到客服端,是要建立联机吗;
// 第三次握手:客服端接收到服务端的ack码,验证是否正确,如果正确,则再次发送ack ,建立连接;
// 三次握手之后,客户端和服务端联机成功,可以发送数据;
 // 客户端和服务端发送数据是双向的;客户端给服务端传递的是路径,参数,随机数;服务端给客户端传输自己的资源,文件,数据;

TCP断开连接四次挥手

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

推荐阅读更多精彩内容

  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,339评论 6 152
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 5,216评论 3 82
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1.OkHttp源码解析(一):OKHttp初阶2 OkHttp源码解析(二):OkHttp连接的"前戏"——HT...
    隔壁老李头阅读 20,835评论 24 176
  • 发展迅速的今天,有一部分人的大脑,却未曾跟上发展的进程。 这批人,不论做什么,都不清楚事实,但还喜欢抛出观点,想借...
    6521d5bb6dd6阅读 757评论 0 1