江边闲话集

深入浅出:HTTP/2

上篇文章深入浅出:5G和HTTP里给自己挖了一根深坑,说是要写一篇关于HTTP/2的文章,今天来还账了。 本文分为以下几个部分: HTTP/2的背景 HTTP/2的特点 HTTP/2的协议分析 HTTP/2的支持 HTTP/2简介 HTTP/2主要是为了解决现HTTP 1.1性能不好的问题才出现的。当初Google为了提高HTTP性能,做出了SPDY,它就是HTTP/2的前身,后来也发展成为HTTP/2的标准。 HTTP/2兼容HTTP 1.1,例如HTTP Method,Status code,URI以及大部分Header Fields。 HTTP/2通过以下方法减少latency,用来改进页面加载的速度, HTTP Header的压缩,采用的是HPack算法。 HTTP/2的Server Push,非常重要的一个特性。 请求的pipeline。 修复在HTTP 1.x的队头阻塞问题。 在单个TCP连接里多工复用请求。 HTTP/2支持HTTP 1.1里的大部分use case,例如桌面浏览器、移动浏览器、Web API、Web Server、代理服务器、反向代理服务器、防火墙和CDN等。 HTTP/2 头部压缩(HPack) HPack是HTTP/2 里HTTP头压缩的算法,具体可以参看https://tools.ietf.org/html/rfc7541。下面简单介绍一下HPack是如何工作的。 见下图,该图来自Google 的性能专家 Ilya Grigorik 的文章HTTP/2 is here, let’s optimize!,它非常直观地描述了 HTTP/2 中头部压缩的原理: 简单说,HTTP头压缩需要在HTTP/2 Client和服务端之间: 维护一份相同的静态表(Static Table),包含常见的头部名称,以及特别常见的头部名称与值的组合; 维护一份相同的动态表(Dynamic Table),可以动态地添加内容; 基于静态哈夫曼码表的哈夫曼编码(Huffman Coding); 在HTTP头里,有些key:value是固定,例如: :method: GET :scheme: […]

继续阅读...

深入浅出:5G和HTTP

本文将会讲到5G和HTTP。曾经在深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 – Part 3 提到为什么有些RPC框架不选用HTTP,而5G会采用HTTP。 您可以从本文里获取到一些概念:5G用HTTP作为reference point interface的实现,HTTP/2,RESTful API/HATEOAS/OpenAPI等最佳实践和标准,这些都是一些常见但是又容易忽略的知识点。 本文参考了一些文章,见文章末尾的链接列表。 HTTP的优点和缺点 我们大家知道HTTP协议包含的信息太多,太繁重,导致消息体会很大,但是其中有一些消息根本用不上,这也是为什么HTTP/1.1消息效率不高的原因,所以一些RPC框架舍弃它,例如dubbo定义自己的协议等,如果大家定义过协议,例如类似TCP协议,就能明白协议定义的重要性。如果要效率高,消息短,那就会太底层,如TCP,如果要想易于理解,例如HTTP,那就得长一些。 5G和HTTP 5G明年试商用,在5G里采用HTTP协议,确实有意思。可以参看TS 29.501协议 5G System;Principles and Guidelines for Services Definition,Stage 3。先看看下图: 在通信领域,由原来的Diameter,AAA等转变为HTTP,的确是一个大变化,但是开发的效率将会大大提高。 那么5G将会应用到什么HTTP相关技术呢? HTTP/2/0 (协议下载https://http2.github.io/http2-spec/) JSON HATEOAS RESTful OpenAPI HTTP/2.0 还是先看看HTTP/2吧。谈到HTTP/2,最先想到Google的SPDY,它是HTTP/2的前身。为什么Google要做SPDY呢?原因很简单,HTTP的效率不高。自从有了SPDY后,加载时间减少64%(http://dev.chromium.org/spdy/spdy-whitepaper),原话这么说的, In lab tests, we have compared the performance of these applications over HTTP and SPDY, and have observed up to 64% reductions in page […]

继续阅读...

深入浅出:远离法律风险,必须了解开源项目许可证

本文讲开源项目的许可证(License)。 现在FOSS(Free Open Souce Software)的项目逐步增多,而且项目引进FOSS项目也越来越多,以提高我们开发的效率,避免重复造轮子。那么在我们开心享用这些FOSS项目时,感叹世界真美好,但我们有没有认真去研读过它们的许可证呢? 引进FOSS项目需要注意什么? 那么在引进FOSS的项目时,我们需要注意什么呢?对此不同的人有不同的答案。对此,我的看法是: 需要了解FOSS项目许可。 FOSS项目是否符合自己的需求。 FOSS项目是否有人维护。 FOSS项目的成熟度,社区的热度。 FOSS项目的质量。 FOSS项目的继承难度系数,以及是否能提高开发效率。 本文只关注这里的第一步:FOSS项目许可证。为什么把许可证放在第一条呢?因为我觉得如果许可证都不合适,下面其他要素不用考虑了。 License的重要性 无论作为个体还是公司,我们引进FOSS项目时,首先必须要考虑License的问题,如果不注意License的问题,自己的项目有可能会侵权,可能会把自己或者公司陷入法律风险的境地,如果真的这种事情发生,解决起来很麻烦。 一般怎么处理呢?首先如果是个体,我们必须把常见的License类型了解清楚,如果是公司,需要有法务部门来审核,但是一般公司可能没有法务部门,那需要开发人员自己去把握。我清楚的记得,在前东家里,我配合公司的法务部门核查每个项目使用FOSS项目的情况,就是为了让项目和公司不处于被动地位。(其实我也亲身碰到过专利侵权问题,不过不在本文之内)。 所以,我们在引进FOSS项目时,一定要仔细项目的许可证,我们自己得有法律意识,这根弦必须得绷住。 License类型 现在开源项目的类型实在太多了,参看这里http://www.gnu.org/licenses/license-list.html, 估计有百种左右。但是,我们常见的许可证类型有以下几种 GPL BSD MIT Mozilla Apache LGPL 我们常见的软件是什么类型呢?我们看看: Apache HTTPd ,许可证是Apache. Apache Tomcat, 也是Apache,似乎Apache Foundation都采用Apache许可。Dubbo也是,可以参看https://github.com/apache/incubator-dubbo/blob/master/LICENSE 。 Spring Boot,也是Apache,https://github.com/spring-projects/spring-boot/blob/master/LICENSE.txt React,用的是MIT,https://github.com/facebook/react/blob/master/LICENSE Linux常用命令wget,用的是GPL,https://www.gnu.org/software/wget/ Linux操作系统, 用的也是GPL,https://www.kernel.org/category/faq.html QT,不同用途有不同的许可,包括LGPL,参看http://doc.qt.io/qt-5/licensing.html VI,用的就是BSD,https://www.freebsd.org/cgi/man.cgi?query=vi&sektion=1 License介绍 光去阅读许可证的描述太抽象了,我借用阮一峰老师的文章:http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html,以图胜千言。

继续阅读...

从浏览器中输入URL到页面加载发生了什么 – Part 3

HTTP/HTTPS请求和响应 前面TCP连接已经建立好了,意味着桥已经搭好了,下一步就该传输HTTP消息了。因为HTTP我们都很熟悉,很常见,也不是那么底层,理解起来轻松不少。 还是抓包来分析,不过这次不用Wireshark来抓,因为不太直观,这次直接用Chrome自带的Developer Tools。 HTTP 请求 下图展示了HTTP请求Header Request URL:就是请求的URL Request Method: GET, POST, PUT,DELETE, OPTIONS, HEAD 接下来就是其他报文头,常见的请求报头有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。 HTTP 响应 下图展示了HTTP响应Header 最常见的就是Status Code( 200, 302, 307, 404, 500),server等。 HTTP 10问 HTTP问题简单,那就直接列举几个问题,有些问题我给出详细答案。 1. HTTP METHOD有哪几种,分别是什么? 常见问题,不多解释。 2. HTTP的PUT/DELETE/等使用时需要注意什么? 有一点需要特别注意,有的浏览器是不支持的,所以在使用和实现时需要仔细评估好自己客户端的能力。 3. HTTP的OPTIONS用来做什么? OPTIONS一般用来获取目标资源的通信选项,例如确认允许的HTTP Method.下面的这个例子来在Mozilla官网https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS。 请求: curl -X OPTIONS http://example.org -i 响应: HTTP/1.1 200 […]

继续阅读...

从浏览器中输入URL到页面加载发生了什么 – Part 2

TCP连接 DNS解析返回域名的IP之后,接下来就是浏览器要和该IP建立TCP连接了。为什么是TCP而不是UDP?那是因为HTTP是基于TCP上的。这里涉及到另外一个话题:TCP/IP 模型。这个已经在大学的课本上学过了,我们再复习一下。 TCP/IP模型 TCP/IP模型一般分为4层,下面是我用PPT画的。 在这里不得不说OSI七层参考模型,它和TCP/IP模型的区别和联系,继续用PPT画,见下图: 不多解释,OSI的7/6/5层和TCP/TP的应用层对应,2/1层和链路层对应。在实际的应用中,主要还是TCP/IP概念模型,后面的内容主要讲它。 这些都是课本上的,也许忘了(毕竟不是天天用到这些嘛),没关系,我们以最简单的方式来讲解。为了便于理解每层的含义和作用,先看每层有哪些协议,看看有没有自己熟悉的协议。有熟悉的协议,先体会一下。 应用层 我们可以看到,有常用的HTTP/HTTPS/IMAP/SSH/Telnet等都在应用层上(题外话,这一层你用的协议越多,说明你知识越开阔)。相信每个人都用过HTTP/HTTPS,所以我上面说HTTP/HTTP是基于TCP上的。 Wikipedia 这么解释: The application layer is the scope within which applications create user data and communicate this data to other applications on another or the same host. The applications, or processes, make use of the services provided by the underlying, lower layers, especially the Transport Layer which […]

继续阅读...