概览
- TCP是传输层协议;零件和工具
- Socket是会话层API,封装了TCP;基于TCP组装完的发动机,可以自己实现卡车或者飞机,更加灵活
- Http是应用层协议,短连接,单向;基于TCP组装完的完整轿车
- WebSocket是应用层协议,长连接,双向;基于TCP组装完的完整改装轿车,最开始依赖Http协议进行一次握手,后续就都是TCP,与Http无关
- WebSocket API是HEML5标准的一部分,但这并不代表 WebSocket 只能在基于浏览器的应用程序中使用。
详细描述
OSI模型
-
应用层:各种应用层协议
Http、WebSocket、FTP、SMTP
表示层:信息的语法语义以及他们的关联,如加密解密、转换翻译、压缩解压缩
-
会话层:不同机器上的用户之间建立及管理会话
Socket
-
传输层:接受上一层的数据,在必要的时候把数据进行分割,并将这些数据提交给网络层
TCP、UDP
-
网络层:控制子网的运行,如逻辑编址、分组传输、路由选择
IP
数据链路层:物理寻址,同时将原始比特流转变为逻辑传输线路。
物理层:机械、电子、定时接口通信信道上的原始比特流传输。
TCP/IP协议是什么
TCP/IP协议被组织成四个概念层,TCP/IP 协议可以看做是对 OSI 模型的一种简化
ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作
- 应用层:对应于OSI七层参考模型的应用层和表达层
HTTP、FTP、SMTP等
-
传输层: 对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务
TCP、UDP
网间层:对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议,负责数据的包装、寻址和路由。同时还包含ICMP用来提供网络诊断信息
IP、ICMP
-
网络接口: 包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口
ARP、RARP等
Socket是什么
Socket是API调用接口,Socket 并不是一个协议,Socket实际上是对TCP/IP协议的封装, 从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write
主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket连接必须需要底层TCP/IP协议来建立TCP连接。建立TCP连接需要底层IP协议来寻找网络中的主机。我们知道网络层使用IP协议可以帮助我们根据IP地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过TCP或UDP的地址也就是端口号来指定。这样就可以通过一个Socket实例唯一代表一个主机上的一个应用程序的通信链路了
Http是什么
Http是应用层协议, 短连接,单向,超文本传输协议, web上一问一答的两台计算机之间遵循的通信规则
- 请求组成:请求行、请求头、请求空行、请求主体
- 响应组成:响应状态行、响应头、响应空行、响应正文
WebSocket是什么
WebSocket是应用层协议,长连接,双向,是基于Http协议的扩展,用于建立客户端和服务器的双向通道
引入原因: http协议是一种单向的网络协议,在建立连接后,它只允许客户端向服务端发出请求资源后,服务端才能返回相应的数据;而服务端不能主动推送数据给客户端。这样设计的原因当初是为了防止客户端受到广告商强行塞加服务给客户端
传统的轮询方式,即采用http协议不断发送请求,有很多缺点:浪费流量(http请求头比较大)、浪费资源(没有更新也要请求)、消耗服务器、CPU占用(没有信息也要接收请求)
WebSocket是保证只要在服务端和客户端建立连接后任何一端发起消息,相互推送消息,效率也是极大的提高了,并且服务端和客户端之间的标头信息很小,可以降低服务端的资源浪费
WebSocket必须依赖Http协议进行一次握手,握手成功后,数据就直接从TCP通道传输,与Http无关了
WebSocket与Web关系
WebSocket API是HEML5标准的一部分,但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。
实际上,许多语言、框架和服务器都提供了 WebSocket 支持,例如:
- 基于 C 的 libwebsocket.org
- 基于 Node.js 的 Socket.io
- 基于 Python 的 ws4py
- 基于 C++ 的 WebSocket++
- Apache 对 WebSocket 的支持: Apache Module mod_proxy_wstunnel
- Nginx 对 WebSockets 的支持: NGINX as a WebSockets Proxy 、 NGINX Announces Support for WebSocket Protocol 、WebSocket proxying
- lighttpd 对 WebSocket 的支持:mod_websocket
文档参考
网络协议——Http、Socket、WebSocket - 简书 (jianshu.com)
Socket 与 WebSocket | ZRONG's BLOG (zengrong.net)