【Linux网络】TCP UDP socket HTTP webSocket之间的区别

目录

[一、OSI & TCP/IP模型](#一、OSI & TCP/IP模型)

二、几者之间的关系

三、HTTP

四、Socket

五、WebSocket

[5.1、WebSocket 优点](#5.1、WebSocket 优点)


一、OSI & TCP/IP模型

首先我们要了解OSI七层模型,和预支对应的TCP/IP 四层的模型。

用下面的图可以看出,TCP UDP 工作在传输层,而 HTTP WebSocket 工作在应用层,但socket不属于七层模型中的任何一层,可以理解为socket工作在传输层与应用层中间的隐含层中。

socket 本身不是一种协议,而是对传输层中的 TCP/ UDP 协议进行了封装,对用户隐藏了内部TCP/ UDP 是如何传输的,只提供一套接口(API)给程序员调用(套接字),从而完成 socket 编程。通过 socket 接口,我们才能使用 TCP/UDP 协议。

二、几者之间的关系

HTTP WebSocket 等应用层 协议通过 socket 接口从而调用 TCP/ UDP 等传输层协议,从而达到网络通信。

TCP/ UDP => Socket => HTTP WebSocket

综上所述,我们编程不会直接去调用TCP/ UDP ,而是通过他们封装好的接口 Socket 去通信。可以说,现在几乎网络上所有的通信,底层都是通过 Socket 完成的,一切皆 Socket 。

三、HTTP

HTTP 是基于 TCP 协议的应用的超文本传输协议 ,属于应用层的协议。请求时需建立 TCP 连接,请求结束后断开连接,完成一次请求/响应操作。

HTTP 协议永远都是客户端发起请求,服务器回送响应,这样就限制了使用 HTTP 协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。

HTTP 协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

四、Socket

Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)

Socket连接需要一对套接字,一个运行于客户端,另一个运行于服务端!之间的连接分为三个步骤:服务器监听客户端请求连接确认

(1)服务器监听:服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

(2)客户端请求:由客户端的套接字提出连接请求,要连接的目标是服务端的套接字。所以客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

(3)连接确认:指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

五、WebSocket

WebSocket 也是一种协议,并且也是基于 TCP 协议的。可以理解为 WebSocket 是 HTTP 的优化,但 WebSocket 不仅仅在Web应用程序上得到支持。WebSocket 虽然是 Html5 的产物,但也不仅仅局限于浏览器的应用程序,许多语言都提供了 WebSocket 的支持,比如C,C++,Python等。

为了建立⼀个 WebSocket 连接,客户端浏览器首先要向服务器发起⼀个 HTTP 请求,这个请求和通常的 HTTP 请求不同 ,包含了⼀些附加头信息,通过这个附加头信息完成握⼿过程并升级协议的过程。如下图所示:

5.1、WebSocket 优点

  1. 节约带宽。不停地轮询服务端数据这种方式,使用的是 http 协议,head 信息很大,有效数据占比低, 而使用 WebSocket 方式,头信息很小,有效数据占比高。
  2. 无浪费。 轮询方式有可能轮询10次,才碰到服务端数据更新,那么前9次都白轮询了,因为没有拿到变化的数据。 而 WebSocket 是由服务器主动回发,来的都是新数据。
  3. 实时性,考虑到服务器压力,使用轮询方式不可能很短的时间间隔,否则服务器压力太多,所以轮询时间间隔都比较长,好几秒,设置十几秒。 而 WebSocket 是由服务器主动推送过来,实时性是最高的。

本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

相关推荐
coderklaus4 分钟前
Shell 基础知识
linux·macos·shell
争不过朝夕,又念着往昔30 分钟前
即时通讯项目---网关服务
linux·c++·vscode
时空自由民.41 分钟前
linux下camera 详细驱动流程 OV02K10为例(chatgpt版本)
linux·运维·服务器
码界奇点1 小时前
Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
linux·服务器·python
The_Second_Coming1 小时前
Linux 学习笔记 - 集群管理篇
linux·笔记·学习
ChuHsiang1 小时前
【Linux系统编程】日积月累——进程(2)
linux
云川之下1 小时前
【网络】使用 DNAT 进行负载均衡时,若未配置配套的 SNAT,回包失败
运维·网络·负载均衡
MC皮蛋侠客2 小时前
使用Python实现DLT645-2007智能电表协议
python·网络协议·tcp/ip·能源
2301_801673012 小时前
实验二 Cisco IOS Site-to-Site Pre-share Key
网络·智能路由器
shylyly_2 小时前
Linux->多线程2
java·linux·多线程·线程安全·线程同步·线程互斥·可重入