1、Socket

在端到端的一个连接中,这两个端叫做Socket。

(1)Unix中的Socket

操作系统中也有使用到Socket这个概念用来进行进程间通信
代表了在操作系统中传输数据的两方,只是它不再基于网络协议,而是操作系统本身的文件系统

  • Socket起源于UNIX,在Unix一切皆文件哲学的思想下,
  • Socket是一种"打开—读/写—关闭"模式的实现,
  • 服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

(2)网络中的Socket【这才是我们常说的用于通信的Socket】

即Socket API,是指操作系统中(也可能不是操作系统)提供的对于传输层(TCP/UDP)抽象的接口。

  • Socket=(IP地址:端口号)
  • 通过互联网通信,至少需要一对Socket,Client Socket和Server Socket
  • Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
  • Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口
  • Socket连接可以基于TCP/UDP。TCP协议是可靠的,UDP协议是不可靠的,
    • 那么基于TCP协议的Socket连接同样是可靠的;
    • 基于UDP协议的Socket连接是不可靠的,大多数的即时通讯工具都是基于后者实现的。

常见的3种Socket类型

(1)流式socket(SOCK_STREAM )
流式套接字提供可靠的、面向连接的通信流;它使用TCP 协议,从而保证了数据传输的正确性和顺序性。
(2)数据报socket(SOCK_DGRAM )
数据报套接字定义了一种无连接的服 ,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。
(3)原始socket(SOCK_RAW)
原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。

适用

如果你要使用HTTP来构建服务,那么就不需要关心Socket,因为HTTP底层是基于Socket的!!!【?】
如果你想基于TCP/IP来构建服务,那么Socket可能就是你会接触到的API。

2、WebSocket

https://blog.csdn.net/qq_39969226/article/details/103713335

(1)WebSocket vs Socket

Socket 应用层与传输层之间的一个抽象层,是一套接口

  • 用户可以通过 Socket 来操作底层 TCP/IP 协议族通信。
  • Socket 更灵活,更底层

WebSocket 是一个完整应用层协议

  • WebSocket 是HTML5开始提供的一种,在单个 TCP 连接上进行全双工通讯的协议。
  • WebSocket 允许服务端主动向客户端推送数据,可以实现即时通信。
  • 在 WebSocket API 中,浏览器和服务器只需要完成一次 HTTP 握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

接口和协议的区别

(2)为什么出现WebSocket,HTTP不好吗?实时更新要求

场景:有很多情况下,我们需要去保证数据的实时性,比如股票价格,微博刷新,以及交通状况等。仅仅寄希望于用户的钛合金F5肯定是不负责任的,我们需要去考虑如何在我们的站点中也能提供实时的数据。

需求:服务器数据更新时就实时推送给客户端。不更新时就不请求,因为没必要,浪费网络带宽。

//AJAX实现不了实时更新,只是局部刷新数据,但是触发条件还是客户端提供的,点击、悬浮、滚动啥的。
现有 AJAX 技术的发展并不能解决在一个多用户的 Web 应用中,将更新的信息实时传送给客户端,
从而用户可能在“过时”的信息下进行操作。而 AJAX 的应用又使后台数据更新更加频繁成为可能。

方法一:基于HTTP的实现:轮询(基于Socket)

现在网站中大部分实时数据的实现,还是依赖于轮询,这实在是浪费网络,因为服务器数据不更新的时候,是没必要查的。而且,轮询请求刷新间隔也需要综合考量用户实时要求和带宽。长连接关闭时又要重连,很是麻烦。

Comet推送

  • Comet实现了一种从服务端异步推送数据到客户端的机制,虽然它是基于HTTP长连接的一种实现,但是HTTP规范本身并不提倡这种工作模式。
  • 主要有两种Comet的具体实践:长轮询(long-polling),基于Iframe的方式。
  • 长连接只会在通信出现错误的时候关闭连接(一些防火墙经常会丢弃过长的连接),所以我们还需要有一个超时和出错重连的机制。

Polling vs Long Polling
方便理解:

这里,我打个比方,传统的Polling一般是由C向S询问:“有我的信件吗?”。S接到询问之后,会立即查询,并且把查询结果告诉C,不管有没有C的信件,要么回复:“嗯,你有X封信。”,要么回复:“没,没有你的信”。
而Long Polling更像是这样,C向S发出询问:“有我的信件吗?”,S开始查询,如果有则回复C:“嗯,有你x封信”。如果没有,则不作任何回复,而是让C等着,自己一遍一遍地查询是否有订阅者的信。
换句话说:当S收到C的查询请求之后,Polling则只查询一次,并且把查询结果告诉C;而Long Polling收到请求之后,则会一遍一遍地查询,直到有消息才会响应C,不然一直hold Client。

轮询Polling:一直查,查一次回复一次。

  • 双向浪费带宽。
  • 需要折中考虑查询频率,考量用户实时要求和带宽。

这种方式就是通过Browser/UA定时的向Web服务器发送http的Get请求,服务器收到请求后,就把最新的数据发回给客户端(Browser/UA),Browser/UA得到数据后,就将其显示出来,然后再定期的重复这一过程。虽然这样可以满足需求,但是也仍然存在一些问题,例如在某段时间内Web服务器端没有更新的数据,但是Browser/UA仍然需要定时的发送Get请求过来询问,那么Web服务器就把以前的老数据再传送过来,Browser/UA把这些没有变化的数据再显示出来,这样显然既浪费了网络带宽,又浪费了CPU的利用率。如果说把Browser发送Get请求的周期调大一些,就可以缓解这一问题,但是如果在Web服务器端的数据更新很快时,这样又不能保证Web应用程序获取数据的实时性。

长轮询Long Polling:一直查,变化才回复。

  • 基于"长连接"【?】
    • Socket通常意义上是指的TCP的socket。也是客户端和服务端,只不过客户端和服务端上来2方就建立一个长连接通道,在这个长连接通道上客户端可以主动向服务端发送消息。服务端也可以向客户端发起响应,也可以不响应。之间比较随意。
      +好处:服务端可以主动推送消息,客户端也能主动发送消息。
  • 单向浪费带宽。
  • 服务器更新快时,Browser显示实时数据最快的时间为2×RTT,网络拥塞的情况下,这个应该是不能让用户接受的。

Long Polling:这种方式虽然在某种程度上减小了网络带宽和CPU利用率等问题,但是仍然存在缺陷,例如假设服务器端的数据更新速率较快,服务器在传送一个数据包给Browser后必须等待Browser的下一个Get请求到来,才能传递第二个更新的数据包给Browser,那么这样的话,Browser显示实时数据最快的时间为2×RTT(往返时间),另外在网络拥塞的情况下,这个应该是不能让用户接受的。另外,由于http数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费。

总结问题:
HTTP只能客户端发送请求,而不能实现服务器变化了主动推送给客户端。这是根本问题。轮询又要考虑时间和网速

结论
通过上面的分析可知,要是在Browser能有一种新的网络协议,能支持客户端和服务器端的双向通信,而且协议的头部又不那么庞大就好了。WebSocket就是肩负这样一个使命登上舞台的。

方法二:WebSocket协议

【这个具体怎么实现,再说吧】

方法三:其他

其实我们还有一个选择就是通过使用Flash的XMLSocket来实现实时的数据交互。
但是问题很明显:客户端必须安装flash;XMLSocket没有HTTP隧道功能,无法自动穿过防火墙;因为是使用套接口,需要设置一个通信端口,防火墙、代理服务器也可能对非 HTTP 通道端口进行限制。

Java Applet也是一个实现方式,但是有诸多的限制,有兴趣的同学可以自行了解一下。

3、HTTP vs WebSocket

最大区别:HTTP 是拉模式,WebSocket是推模式。

  • 我们知道二者都是协议,才有可比性。而Socket和WebSocket都不是一种东西,没啥好比的。

————————下面待整理

2、区分HTTP、Socket、TCP/UDP

HTTP是应用层的协议,也是开发中最常用的一个网络协议;
TCP是传输层的协议,大学学过计算机网络的都知道,该层还有一个UDP协议;
而Socket是从传输层上抽象出来的,采用IP地址加端口号的形式来标识,并不是传统意义上的网络协议。

HTTP、Socket、TCP/UDP,三者在TCP/IP协议族中的位置关系:

3、HTTP vs Socket【都不是一种东西,没啥好比的】

http只是个超文本协议,socket只是读写io,
客户端请求服务端遵循http超文本协议,实际上这个请求实现方式是用socket通信完成的。
协议就好比接口对接时,我要什么token,做什么加密,数据结构要怎样,别混了!

用HTTP Or Socket?
用HTTP:双方不需要时刻保持连接在线,比如客户端资源的获取(通过get/post请求获取网页、图片、JSON或者XML数据)、文件上传、小文件下载等。
用Socket:大部分即时通讯应用(QQ、微信)、聊天室(基于UDP+消息广播的方式)、苹果APNs、大文件传输等。

  • (知乎上说QQ有部分功能是基于TCP,因为TCP每次都需要三次握手,虽然可靠但是网络不好的时候就惨了)

参考:
https://www.jianshu.com/p/a5410f895d6b
https://blog.csdn.net/min996358312/article/details/68969519
https://blog.csdn.net/qq_37003559/article/details/103677284
https://www.jianshu.com/p/59b5594ffbb0
https://www.cnblogs.com/luxiaoxun/archive/2012/10/16/2725760.html
https://blog.csdn.net/yl02520/article/details/7298309
https://blog.csdn.net/mengxianhua/article/details/44495527
https://blog.csdn.net/qq_39969226/article/details/102691078
https://blog.csdn.net/qq_37003559/article/details/103677284
https://blog.csdn.net/qq_39969226/article/details/103713335
https://websockets.spec.whatwg.org//【WebSocket协议标准,英文】
https://blog.csdn.net/MissWwg/article/details/52131376【实时的Web的其他实现方式,详细】

posted on 2022-02-16 18:07  西伯尔  阅读(397)  评论(0)    收藏  举报