Socket 与 WebSocket 与 http

本贴最后更新于 2109 天前,其中的信息可能已经斗转星移

什么是 Socket?

socket 起源于 Unix,而 Unix/Linux 基本哲学之一就是“一切皆文件”,都可以用“打开 open –> 读写 write/read –> 关闭 close”模式来操作。我的理解就是 Socket 就是该模式的一个实现,socket 即是一种特殊的文件,一些 socket 函数就是对其进行的操作(读/写 IO、打开、关闭)。
socket 中 TCP 的三次握手建立连接详解

我们知道 tcp 建立连接要进行“三次握手”,即交换三个分组。大致流程如下:

  • 客户端向服务器发送一个 SYN J
  • 服务器向客户端响应一个 SYN K,并对 SYN J 进行确认 ACK J+1
  • 客户端再想服务器发一个确认 ACK K+1

只有就完了三次握手,但是这个三次握手发生在 socket 的那几个函数中呢?请看下图:

imagepng
从图中可以看出,当客户端调用 connect 时,触发了连接请求,向服务器发送了 SYN J 包,这时 connect 进入阻塞状态;服务器监听到连接请求,即收到 SYN J 包,调用 accept 函数接收请求向客户端发送 SYN K ,ACK J+1,这时 accept 进入阻塞状态;客户端收到服务器的 SYN K ,ACK J+1 之后,这时 connect 返回,并对 SYN K 进行确认;服务器收到 ACK K+1 时,accept 返回,至此三次握手完毕,连接建立。
socket 中 TCP 的四次握手释放连接详解

上面介绍了 socket 中 TCP 的三次握手建立过程,及其涉及的 socket 函数。现在我们介绍 socket 中的四次握手释放连接的过程,请看下图:

imagepng
图示过程如下:

  • 某个应用进程首先调用 close 主动关闭连接,这时 TCP 发送一个 FIN M;

  • 另一端接收到 FIN M 之后,执行被动关闭,对这个 FIN 进行确认。它的接收也作为文件结束符传递给应用进程,因为 FIN 的接收意味着应用进程在相应的连接上再也接收不到额外数据;

  • 一段时间之后,接收到文件结束符的应用进程调用 close 关闭它的 socket。这导致它的 TCP 也发送一个 FIN N;

  • 接收到这个 FIN 的源发送端 TCP 对它进行确认。

这样每个方向上都有一个 FIN 和 ACK。

WebSocket 介绍与原理

WebSocket protocol 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助 HTTP 请求完成。——百度百科

目的:即时通讯,替代轮询

网站上的即时通讯是很常见的,比如网页的 QQ,聊天系统等。按照以往的技术能力通常是采用轮询、Comet 技术解决。

HTTP 协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。当需要即时通讯时,通过轮询在特定的时间间隔(如 1 秒),由浏览器向服务器发送 Request 请求,然后将最新的数据返回给浏览器。这样的方法最明显的缺点就是需要不断的发送请求,而且通常 HTTP request 的 Header 是非常长的,为了传输一个很小的数据 需要付出巨大的代价,是很不合算的,占用了很多的宽带。

缺点:会导致过多不必要的请求,浪费流量和服务器资源,每一次请求、应答,都浪费了一定流量在相同的头部信息上

然而 WebSocket 的出现可以弥补这一缺点。在 WebSocket 中,只需要服务器和浏览器通过 HTTP 协议进行一个握手的动作,然后单独建立一条 TCP 的通信通道进行数据的传送。

原理

WebSocket 同 HTTP 一样也是应用层的协议,但是它是一种双向通信协议,是建立在 TCP 之上的。

连接过程 —— 握手过程

  • 1. 浏览器、服务器建立 TCP 连接,三次握手。这是通信的基础,传输控制层,若失败后续都不执行。
  • 2. TCP 连接成功后,浏览器通过 HTTP 协议向服务器传送 WebSocket 支持的版本号等信息。(开始前的 HTTP 握手
  • 3. 服务器收到客户端的握手请求后,同样采用 HTTP 协议回馈数据。
  • 4. 当收到了连接成功的消息后,通过 TCP 通道进行传输通信。

WebSocket 与 HTTP 的关系

相同点

  • 1. 都是一样基于 TCP 的,都是可靠性传输协议。
  • 2. 都是应用层协议。

不同点

  • 1. WebSocket 是双向通信协议,模拟 Socket 协议,可以双向发送或接受信息。HTTP 是单向的。
  • 2. WebSocket 是需要握手进行建立连接的。

联系

WebSocket 在建立握手时,数据是通过 HTTP 传输的。但是建立之后,在真正传输时候是不需要 HTTP 协议的。

WebSocket 与 Socket 的关系

Socket 其实并不是一个协议,而是为了方便使用 TCP 或 UDP 而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。

Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。

当两台主机通信时,必须通过 Socket 连接,Socket 则利用 TCP/IP 协议建立 TCP 连接。TCP 连接则更依靠于底层的 IP 协议,IP 协议的连接则依赖于链路层等更低层次。

WebSocket 则是一个典型的应用层协议。

区别

Socket 是传输控制层接口,WebSocket 是应用层协议。

  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 400 关注
  • HTTP
    75 引用 • 127 回帖 • 1 关注
  • 网络
    128 引用 • 177 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • ibut

    不是协议,sorry

  • 其他回帖
  • jackren

    前面说 Socket 其实并不是一个协议。
    后面区别里又说是传输控制层协议。。。到底是不是协议?

    1 回复