Tcpip Socket Http Websocket Http2

理解 tcp/ip, socket, http, websocket, http2

首先,有 socket ,就是两台电脑间的连接。

但是,连光都是有速度的,所以,这个世界本质上是不存在连接的,连接只是一种抽象概念,所以,我们需要 tcp/ip。

tcp/ip 给网络里的每台电脑分配一个名字 ip,然后两台要聊天的电脑都记着对方的名字,这样就能够持续性的与对方聊天,这就是连接。于是 socket 就创建出来了。因为本质上没有连接,有的只是记忆和提前分配好的唯一的名字,所以为了保持 连接 这样一种抽象概念,我们有了 心跳,超时,重连 这些概念。

至于局域网,路由器这些东西,那仅仅只是另一个网络,另一个连接而已。又因为连接仅仅只是一种抽象概念,所以两个互相连接的连接完全可以被抽象为一个连接。

socket 仅仅只需要 tcp/ip 中的 ip,不需要管 tcp,事实上 udp 也是有 socket 的。

有了 tcp/ip 之后,我们就有了 socket,可以在两台电脑间通讯了。

可是,我们要通讯些什么呢?我们同 DNS 服务器建立一个 socket ,发送自己要请求的域名,得到该域名的 ip。然后我们同有该 ip 的电脑建立 socket,,,,,,,,,之后呢?我们要发送些什么?

我们已经有了强大无比的通讯手段(全双工的 socket),我们还需要定义一种使用起来简单方便的通讯形式。这种通讯形式不一定需要用到 socket 这种手段能提供的所有功能,它只需要满足我们的需求就是了。而我们的需求仅仅只是基于域名的“一问一答”类型,并且要有“大量的控制标志”,可以达到一些缓存,断点下载之类的功能,于是我们有了 http,一种受限的半双工通讯协议。

全双工:通讯双方能同时向对方发送信息。半双工:通讯双方在某一个时间点只能从一方向另一方发送信息。我称呼 http 是受限的半双工,是因为它是半双工协议,而且是服务端不能向客户端发起请求,仅仅只能发送响应的协议。

上面说到了 socket,即连接,是一种“通讯手段”,而 http 则是一种“通讯形式”。全文中的“通讯形式”,“通讯协议”,“通讯标准”,其实是一回事。

随着互联网的发展,http 仅能一问一答的缺点已经不能满足我们的需求了。我们需要一种连接双方能互相发起请求的通讯形式,我们称呼这种形式为 websocket。这种通讯形式仍然需要使用 socket 这种通讯手段来创建。

http 仅能一问一答的缺点:一个事物是缺点还是优点是相对的,一问一答这种通讯形式使用简单,这是优点,但是它功能有缺陷,这是缺点。

另外,我们还遇到了 http 的其他的几个缺点,例如,每次请求都是一个新的 socket,还有假如服务端一次性发送多个文件给客户端,客户端将不能理解。于是我们定制了 http2 这种通讯标准,它会让客户端复用之前的对同一个服务器的 socket 连接,它也要求客户端能够理解服务端一次传送过来的多个文件,这样,如果客户端有实现自己的缓存机制的话,那服务器可以预测客户端之后会请求什么文件,于是就一次性把预测要请求的文件也发给客户端,然后客户端在真的要请求那个文件的时候,发现自己的缓存里已经有了该文件,响应就更快了。http2 相比 http 当然还有其他的优点,这里就不一一细说。

有一点需要说明的是,websocket 与 http2 是解决两种不同的需求而定义的通讯标准,大家在了解 http2 的时候可能看到了推送相关的的字眼,于是认为 http2 能够代替 websocket,其实两者根本不是一回事。 http2 所谓的推送仅仅只是把文件提前发送到浏览器的缓存层,并不能触发什么事件,让 js 知道某些消息。

[top]

comments powered byDisqus