北京 切换校区

全国24小时免费热线

400-009-1906

节约标兵IE的自述

时间:2019-01-07   来源:尚学堂   阅读:160
首页> 节约标兵IE的自述

  最近计算机系统党委发起一场杜绝浪费,厉行节约的整风运动,要求每个人都要切实落实领导指示,坚决自查,互查,找出浪费,提出解决方案。

  在这场轰轰烈烈的运动中,我不等不靠,主动参与其中,在领导的教导下,同事的帮助下,做了很多优化和改进,并评为节约标兵,现在给大家分享下我的经验,共同进步。

  忘了自我介绍了,我是IE,作为人类的代理(UserAgent),我是为人类访问互联网而生。

  人类每次想访问互联网了,就会告诉我一个网址,比如www.jd.com,我就会让TCP这个小伙子帮我和这个网址的服务器建立一个连接,然后通过这个连接通道给服务器发消息,消息格式是我和服务器约定好的。

  这个服务器也会按照约定,给我发回整个页面的数据(俗称HTML文档),当然也是通过同一个连接通道。

  然后,这个连接通道就被服务器关闭,人类把这种方式叫做“请求<-->响应”。

  我和各个服务器的这种约定,就是HTTP协议

  重复的利用每个连接通道

  我做的第一项改进就是重复利用连接通道。

  我和服务器商量这个HTTP协议的时候,网站还很少,网页当然很少,内容基本上是纯文本,这种建立一个连接通道,发出请求,然后等待整个页面返回的方式完全没有问题。

  随着网速的迅猛增长,网页开始变得复杂,开始出现图片,css等在我看来乱七八糟的东西,为了把这些东西快速的从网站上取下来,然后呈现给焦急等待的人类,我通常得让TCP小哥给我建立很多连接通道,有的下载图片,有的下载CSS,有的折腾javascript。

  开的连接多了,我就琢磨着能不能改进一下,因为我听说TCP小哥整个连接挺麻烦的,好像是3次握手建立连接,4次握手断开连接。

  而我这里用一次就关闭连接,用一次就关闭连接,是很大的浪费啊。

  (注:三次握手具体过程参见码农翻身的另外一篇文章《TCP/IP之大明王朝邮差》)

  我问TCP小哥:“这种用一次就关掉的行为很不爽,你能不能保持一个连接通道,让我多收发一些数据呢?”

  “那你和服务器之间的事情了,我管不了啊”

  他确实管不了,这是我们应用层的事情,确切的说是我和服务器之间的事情。

  我和服务器彻夜协商,搞一个keep-alive的机制,默认情况下,我们会让TCP小哥一直保持住打开的连接通道,可以持续的在这个连接通道上发送消息。

  如果我长时间不发消息过去,导致超过了服务器设定的时间,或者某一方明确的要关掉它,这才会把连接通道给断开。

  这么一个小改进,连接通道可以复用了,效率确实提高了不少。

  只用纯数据,不用格式化文档

  这是我与时俱进,做的第二项改进。

  随着页面变得越来越大,人类对响应速度的要求也越来越高,大家都希望在页面上操作以后,迅速的看到效果。

  可是无论是普通模式,还是keep-alive模式,我每次给服务器发出请求的消息以后,服务器都会把整个HTML文档给我,这直接导致我需要刷新整个页面。

  TCP小哥说:“看看你,这几次从服务器收到的数据基本上都一样,只有那么一点点变化的内容,你就不能只去问服务器要那一点点变化的东西,然后进行局部的更新吗?”

  他的眼光很毒辣啊,我早就意识到这个问题了,其实我装载了一个HTML文档以后,后续的操作,大部分情况下我只想和服务器通过纯粹的数据(例如XML,JSON)进行交流,不想使用庞大的HTML文档了,这样会节省很多的流量,大大加快访问速度。

  我赶紧找来Javascript同学来帮忙,因为在我这里,这有他才能运行程序,在背后偷偷搞一点点小东西。

  又是一个彻夜讨论,最后决定采用局部更新的办法:用户在页面操作以后,整个页面不会刷新(浏览器中地址不会变),Javascript会在背后请TCP建立一个连接通道,和服务器通信,获得更新的数据,然后局部更新。

  看起来很美好,是不是?但是解决了一个老问题,马上出现一个新问题:Javascript在发出HTTP请求,需要等待服务器把数据返回,在这段时间内,我也得陪着他等,啥事也干不了。

  在用户看来,好像是IE“假死”了一样,感觉非常不好。

  解决方法只有一个,那就是异步:Javascript在发出HTTP请求以后,不等待服务器把数据返回,立刻干别的事情去了,这样就不会导致我“假死”,等到服务器的数据回来了,我来通知他处理。

  对了,人类把这种方式成为AJAX。

  抛弃HTTP

  完全抛弃HTTP当然是不可能的,不过在一些场景下有更好的解决办法。

  人类的欲望是无止境的,我改进了这么多还是不能满足他们的要求。

  这些家伙们试图把桌面应用全部迁移到到我这里来。比如说有人想写Web版本的在线协作软件,多人可以同时在一个页面上操作,他们竟然想把每个人的鼠标运动的位置都广播给所有人!让大家能互相知道别人在哪里操作。

  我很痛苦,因为向服务器发送数据很频繁,但是每次发送信息非常少,就是类似于x=100&y=200,x=20&y=70这样的东西。

  即使是这点数据,我也不得不遵循HTTP协议,老老实实的构建一个HTTP请求,其实里边大部分都是无用的东西:

  POST/HTTP/1.1

  Host:localhost

  User-Agent:....略...

  Accept:text/html....略...

  Accept-Language:en-us,en;q=0.5

  Accept-Encoding:gzip,deflate

  Keep-Alive:300

  Connection:keep-alive

  Referer:http://localhost/test.php

  Content-Type:application/x-www-form-urlencoded

  Content-Length:9

  x=20&y=70

  看看这"无用"的HTTP头,占据了90%的数据量,有效的数据只有那么9个字符,是不是浪费?

  还有人一直嚷嚷着让服务器主动给浏览器发数据。原来都是浏览器发出请求,服务器被动响应,现在服务器想主动请求,怎么可能?完全违背了HTTP协议设计的初衷,这不胡闹吗?

  但是领导的谆谆教导点醒了我:“人类现在已经进入的移动互联网时代,大数据时代,对实时性要求更高,比如说像什么股票信息了,朋友圈有什么最新更新了,你用HTTP协议是不是的经常性的去轮询服务器,问问有没有新数据产生啊?大部分时候这种轮询是不是在做无用功,白白的浪费了网络的流量!不要老是局限于HTTP,想想别的办法!”

  是的,浪费确实不少,我大致总结了一下:1.我不想要那些HTTP的头了,2.浏览器和服务器之间要能互相发送数据。

  TCP小哥说:“呵呵,这不就是我的socket吗?,你看两个电脑建立一个socket连接以后,想发什么数据就发什么数据,数据格式完全由你定义,灵活的很呐!此外服务器给客户端发送数据也毫无障碍啊”

  是啊,既然Socket这么好,那我在应用层也搞一个,把HTTP抛弃掉,新协议就叫WebSocket!

  但是慢着,HTTP被用的太广泛了,网络中处理HTTP的海量基础设施(防火墙,缓存,代理...),为了让大家都能迅速的支持Websocket,而不是重起炉灶,还是要和HTTP保持一定的兼容性,在建立Websocket连接通道的时候,我们用HTTP来完成:

  GET/chatHTTP/1.1

  Host:server.example.com

  Upgrade:websocket

  Connection:Upgrade

  Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==

  Origin:http://example.com

  Sec-WebSocket-Version:13

  这段话的意思是说:服务器,咱们把HTTP升级为Websocket吧?

  HTTP/1.1101SwitchingProtocols

  Upgrade:websocket

  Connection:Upgrade

  Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

  服务器的回复说:我同意,以后我们就切换到Websocket协议开始通信了啊。

  于是连接就建起来了,接下来我和服务器就可以双向通信了。

  我要是想发送数据,就直接发送x=20&y=70,根本没有浪费流量的HTTPheader,服务器有啥数据想给我,也直接推送,不用我去查询了。

  当然Websocket还离不开TCP小哥的帮忙,其实就是建立在原来的TCP连接通道之上。

  好吧,今天就给大家汇报这么多,最后祝大家国庆节快乐。

  (完)

相关资讯

  • 北京校区
  • 山西校区
  • 郑州校区
  • 武汉校区
  • 四川校区
  • 长沙校区
  • 深圳校区
  • 上海校区
  • 广州校区
  • 保定招生办

北京海淀区校区(总部):北京市海淀区西三旗街道建材城西路中腾建华商务大厦东侧二层尚学堂
北京京南校区:北京亦庄经济开发区科创十四街6号院1号楼 赛蒂国际工业园
咨询电话:400-009-1906 / 010-56233821
面授课程: JavaEE+微服务+大数据     大数据+机器学习+平台架构     Python+数据分析+机器学习  人工智能+模式识别+强化学习   WEB前端+移动端+服务端渲染

 

山西学区地址:山西省晋中市榆次区大学城大学生活广场万科商业A1座702

郑州学区地址:河南电子商务产业园6号楼4层407
咨询电话:0371-55177956

武汉学区地址:武汉市东湖高新区光谷金融港B22栋11楼
咨询电话:027-87989193

四川学区地址:成都市高新区锦晖西一街99号布鲁明顿大厦2栋1003室
咨询电话:028-65176856 / 13880900114

网址:http://www.cssxt.com/
咨询电话:0731-83072091

深圳校区地址:深圳市宝安区航城街道航城大道航城创新创业园A4栋210(固戍地铁站C出口)
咨询电话:0755-23061965 / 18898413781

上海尚学堂松江校区地址:上海市松江区荣乐东路2369弄45号绿地伯顿大厦2层
咨询电话:021-67690939

广州校区地址:广州市天河区元岗横路31号慧通产业广场B区B1栋6楼尚学堂(地铁3号线或6号线到“天河客运站”D出口,右拐直走约800米)
咨询电话:020-2989 6995

保定招生办公室

地址:河北省保定市竞秀区朝阳南大街777号鸿悦国际1101室

电话:15132423123

Copyright 2006-2019 北京尚学堂科技有限公司  京ICP备13018289号-19  京公网安备11010802015183  
媒体联系:18610174079 闫老师  

Java基础班,免费试学三周