【HTTP指南】杂

说来惭愧,自从上次面试完网易后,就开始萎靡不振了,过去大半个月了没有做什么事情,开启了混日子模式QUQ。本来打算入手下websocket的多人联机这样,但是发现没有什么动力去做。。所以打算看看书,现在正好计网在讲TCP/IP,我对于IP,还有HTTP是怎么保持长连接的不是很懂,并且想多了解了解,所以就这样开始吧。

这篇比较杂,,是最近一直拖着而没有解决的小问题。。近期目标是一周内把HTTP指南看完QUQ,记得挑重点…

1.IP是什么

上计网的时候发现已经把传输层的内容学完了,但是我还不知道IP是什么…然后发现IP是网络层的,刚要开始说……所以我不打算预习=A=。复习下大致了解的。我认为IP第一是用来定址的,目的地址,源地址,用IP进行表示。这样在转发包的时候,每个路由器通过识别目的地址对包进行转发,每个路由器都有对应的表来记录每个地址区间相应的转发方向(转发给后面的哪个路由器)。IP主要有IPV4和IPV6两种协议。4的地址有32位,在11年的时候世界就将地址分配完了。。。所以有了6,6的速度更快,但是还没有完全的推广,它有128位,显然可以用很久很久=V=。对应的4和6的协议不同,可以从头部看出来,6对4,将头部简化了,可以参考:IPV4,IPV6头部对比

2.HTTP怎么实现持久连接的

(⊙v⊙)嗯。。有点跑偏。。HTTP1.0用Connection: Keep-Alive来保持连接,这样在一次TCP连接内可以多次发送数据进而节省每次TCP连接所消耗的时间。HTTP1.1就不用keep-alive了,因为它默认连接是保持的,如果想关闭,就用Connection:Close。一个客户端对任何服务器或者代理都只能最多保持两条持久连接,以防服务器过载。这种保持连接的方式对于PC端比较有效,但是对于移动端,由于访问的时间较为分散,所以keep-alive不是很有效。因此借助轮询,http流,tcp通信,websocket这样来保持通信。

说起来,面对长连接,常常是基于TCP编程通信的。比如websocket,实际上是基于TCP的协议,但是连接的时候,使用了http来进行连接,之后就转到tcp连接了。所以websocket的连接端口是80,运行的时候端口是443。

恩,其实上面这些都不是我要的答案,想知道再底层的是怎么实现的。。。然而。。。找不到。。所以乖乖上计网=v=

3.Nodejs怎么实现数据流

0 0,,应该是个很简单的问题,但是对于node不是很了解,自己又懒了好多次。。之前用res.send一次之后就不能再次发送数据了(显然)。。。因为用res.send()之后,就关闭连接了,所以:

router.get('/test', function(req, res, next){
  for(var i = 1;i <= 10; i++){
  	(function(i){
  		return setTimeout(function(){
  			console.log(i);
  			res.write("console.log("+i+");\n")
  			if(i==10) res.end();
  		},i*1000);
  	})(i);
  }
});
使用res.write()发送数据,再用res.end()关闭连接就好了=v=。

说起来。。。网易面试的时候。。。二面面试官叫我写闭包。。。不知道为什么就懵逼了不会写QUQ。。。我该何去何从QUQ

4.websocket和keep-alive的区别

看了几个长连接有点分不清。。。首先是keep-alive,他是基于一次TCP连接,然后进行多次http连接的方法,所以本质上还是client-server的模式,客户端可以在一次tcp连接内发送多次http请求,然后服务器返回数据。所以这种情况下服务器还是不能主动发送数据。因此有了websocket。

websocket是基于TCP的长连接,连接建立后,可以实现全双工通信(相互通信)。

顺便说说原始的保持连接的方式:

短轮询:设定定时器每隔一段时间发送一次请求,查看是否服务端有消息返回

长轮询:发送一次请求,服务器等有新消息的时候返回,然后客户端接收消息后马上建立新的连接

数据流:不关闭连接,在有需要的时候发送数据,然后客户端通过游标来处理新的数据

5.HTTP1.0,1.1,2的区别

1.0:

1.连接无法复用,每次请求都要经历3次握手,4次挥手。所以有了keep-alive,但是每次请求都要设定,或者使用长连接的解决方案

2.head of line blocking,每次请求要等到上次请求被确认后才能发送,这样浪费时间,请求可能被阻塞

1.1:

1.修复keep-alive,默认使用keep-alive。需要关闭的时候设定connection:close

2.流水线发包,节约时间。但是可能存在一个分组阻塞的情况(这不是必然的么= =)

2:

1.采用二进制传输数据而不是文本

2.完全采用多路复用。

『HTTP/1.x 有个问题叫线端阻塞(head-of-line blocking), 它是指一个连接(connection)一次只提交一个请求的效率比较高, 多了就会变慢。 HTTP/1.1 试过用流水线(pipelining)来解决这个问题, 但是效果并不理想(数据量较大或者速度较慢的响应, 会阻碍排在他后面的请求). 此外, 由于网络媒介(intermediary )和服务器不能很好的支持流水线, 导致部署起来困难重重。
而多路传输(Multiplexing)能很好的解决这些问题, 因为它能同时处理多个消息的请求和响应; 甚至可以在传输过程中将一个消息跟另外一个掺杂在一起。
所以客户端只需要一个连接就能加载一个页面。』

3.压缩报头

4.可以实现主动推送消息至客户端


参考资料:

1.http://if-true.com/2015/04/27/tech-difference-between-http-1.1-2.0.html

2.http://mrpeak.cn/blog/http2/

3.http://www.cnblogs.com/littlewish/archive/2013/01/17/2865218.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值