首页 > 其他分享 >HTTP长连接和Websocket的区别

HTTP长连接和Websocket的区别

时间:2023-12-08 12:00:14浏览次数:29  
标签:WebSocket 请求 Websocket TCP HTTP 连接 客户端

一、HTTP 和 WebSocket 都是基于 TCP 协议

TCP建立每个连接都需要三次握手。

二、HTTP 短连接

HTTP 1.0(短链接)就是浏览器和服务器每进行一次HTTP操作,就建立一次TCP连接,数据传输完成后,TCP连接就随之关闭,即:客户端与服务端的连接均必须被切断。

三、HTTP 长连接

HTTP 1.1(长连接)中使用持久连接,服务器在发送响应以后,并不关闭该TCP连接。后续的请求和响应报文仍能在该TCP连接上传输。

如果浏览器支持keep-alive,它会在请求的头字段中添加:

Connection: Keep-Alive

当服务器收到请求,作出回应的时候,它也在响应中添加如下HTTP头:

Connection: Keep-Alive

HTTP 长连接 response 报文:

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache

(body)

HTTP长连接的优势

  • 减少了后续请求的延迟(无需再进行握手)
  • 降低拥塞控制 (TCP连接的数量减少了)
  • 较少的CPU和内存的使用(由于同时打开的连接的减少了)
  • 允许请求和应答的HTTP流水线
  • 无需关闭TCP连接即可报告错误

HTTP长连接的劣势

服务器可以建立的连接数量受到端口数与文件句柄数的限制。如需和客户端保持一个开启时间较长的连接,那么服务器可以同时服务的客户端数量则会减少。

为了应对这一问题,Apache 2.0 httpd的默认连接过期时间仅有15秒,而更新版本的Apache 2.2仅有5秒。
通过设置较短的过期时间,一个客户端能够在最开始时快速的传输多个web页组件,而不会长期占用服务器的进程或端口资源。但是,这样也会使得客户端在需要发起新请求时,原先建立的持久连接可能已经被服务端关闭。这直接削弱了持久连接带来的优势。

四、WebSocket 连接建立过程

WebSocket 建立连接需要先通过一个 http 请求进行和服务端握手。握手通过后连接就建立并保持了。

一个典型的Websocket握手请求如下:
客户端请求:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

服务端返回一个请求:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

Websocket握手阶段是借助于HTTP协议,握手完成以后,仍在刚才的TCP连接上完成后续的传输。
此时这个连接并不会断掉,而浏览器和服务端可以用这个连接相互发消息。
但是这个时候连接就不是 http 连接而是升级成了 WebSocket 连接。浏览器和服务端相互发送的不是 http 请求。

HTTP长连接和Websocket的区别

概念:

  • 单工: 数据传输只允许在一个方向上的传输,只能一方来发送数据,另一方来接收数据并回发。例如:HTTP
  • 半双工:数据传输允许两个方向上的传输,但是同一时间内,只可以有一方发送或接受消息。例如:传呼机
  • 全双工:同时可进行双向传输。例如:websocket

HTTP长连接:单工通信

HTTP长连接还是基于HTTP协议,工作模式依旧是一问一答。
即:客户端发起一次请求,服务器回应最多一次响应。这个本质并没有得到改变,改变的只是在同一个TCP连接上可以进行多次请求和多次响应,不需要每次都进行三次重连握手了。

Websocket:全双工通信

Websocket客户端可以只请求一次服务器,连接建立后,双方可以互发消息。这点是HTTP做不到的,HTTP只能由客户端主动给服务端发消息,而服务端只能被动响应消息。
当然了,为了检查Websocket连接是否还在,前端会使用心跳检测,但这不影响当连接建立之后,服务器可以主动给客户端发送信息的本质。











标签:WebSocket,请求,Websocket,TCP,HTTP,连接,客户端
From: https://www.cnblogs.com/eddyz/p/17884876.html

相关文章

  • SpringBoot+线程池实现高频调用http接口并多线程解析json数据
    场景Springboot+FastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/134872936Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMAN......
  • centos安装xrdp服务,可以使用系统用户mstsc连接
    Centos6安装依赖yuminstall-yautoconfautomakelibtoolpkg-configopenssl-develpam-devellibjpeg-develfuse-develTurboJPEGlibX11-devellibXfixes-devellibXrandr-develnasmbinutilsredhat-lsb-coreCentos7安装依赖yuminstall-yfingercmakepatchgccma......
  • Springboot+FastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool、lombok等所需依赖后。系统需要对接第三方http接口获取返回的数据,并将json数......
  • Idea2023.2连接数据库
    一、Idea实现连接MySQL数据库注意:在Jetbrains全家桶都适用。1.1.在Idea里打开1.2.设置基本信息1.3.测试注意:测试不通过查看问题二、Idea自带可视化工具操作三、问题3.1问题1简介:丢失MySQL驱动注意:Pycharm也是Jetbrains全家桶之一方式二解决下载驱动:https:......
  • https://avoid.overfit.cn/post/548ad625830a4645beba60a37a2b59d6
    本文从数据科学家的角度来研究检索增强生成(retrieve-augmentedGeneration,RAG)管道。讨论潜在的“超参数”,这些参数都可以通过实验来提高RAG管道的性能。与本文还将介绍可以应用的不同策略,这些策略虽然不是超参数,但对性能也会产生很大的影响。本文将介绍以下索引阶段的“超......
  • HTTPS 请求中的证书验证详解(Python版)
    在网络通信中,HTTPS是一种通过SSL/TLS加密的安全HTTP通信协议。证书在HTTPS中扮演着至关重要的角色,用于验证服务器身份并加密数据传输。本文将深入探讨Python中HTTPS请求中的证书相关内容,并提供详细的代码示例。1.证书的基本概念SSL/TLS证书是一种由证书颁发机构签发的......
  • 软件测试/人工智能|HTTPS加密协议,你会多少?
    什么是HTTPS?HTTPS是超文本传输协议(HTTP)的安全版本。它通过使用安全套接层协议(SSL)或传输层安全协议(TLS)来加密通信内容,确保数据在客户端和服务器之间传输时得到保护。这种加密机制防止了黑客或恶意用户窃取、篡改或窥视传输的数据。本文将详细介绍HTTPS的加密过程及其工作原理。HTT......
  • 各种类型数据库的连接字符串
    DataType.MySqlDataSource=127.0.0.1;Port=3306;UserID=root;Password=root;DataBase=cccddd;Charset=utf8;SslMode=none;Minpoolsize=1DataType.PostgreSQLHost=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Minimu......
  • Socks VS HTTP 谁才是最快的代理协议
    前言在网络传输中,代理协议扮演着非常重要的角色。Socks协议和HTTP协议是两种常见的代理协议,在网络上使用非常广泛。这两个协议各有优缺点,但是常有人关心这两个协议的速度究竟如何,哪一个更快。在本文中,我们将对Socks和HTTP两个代理协议进行分析比较,并最终得出哪一个更快的结论。一......
  • java使用ftp连接linux处理文件
    1、Maven依赖<!--FTP使用包--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version></dependency>......