精华内容
下载资源
问答
  • 轻松篡改WebSocket数据包

    千次阅读 2018-07-15 16:46:50
    在开发测试WebSocket过程中,经常需要模拟WebSocket的一些行为,如:延迟、忽略、修改或构造发送到服务器或客户端的数据包,以及主动断开WebSocket连接等,本文将讲下如何用抓包调试工具whistle实现上述操作。...

    在开发测试WebSocket过程中,经常需要模拟WebSocket的一些行为,如:延迟、忽略、修改或构造发送到服务器或客户端的数据包,以及主动断开WebSocket连接等,本文将讲下如何用抓包调试工具whistle实现上述操作。

    准备工作

    如果你还不知道whistle是什么,可以访问whistle的Github了解及安装:github.com/avwo/whistl…

    如果你已经安装过whistle,需要升级到最新版本(w2 -V >= v1.11.1),具体参见:whistle帮助文档

    基本功能

    安装配置启动好最新版本whistle后,在whistle的抓包界面Network上点击要操作的WebSocket请求,可以在右侧 Frames 看到如下界面:

    Replay

    重发选中的WebSocket数据包。

    Composer

    构造数据包,支持手动输入数据包文本,并通过按钮 Send to clientSend to server 把数据分别发送到客户端(浏览器)或服务器,也支持通过上传本地文件的方式发送(接收)数据。

    Frames上方的 Composer 按钮用于把选择的数据包填充到下方Composer的文本框

    Send

    用于暂停或忽略发送到服务端的数据包,包含3种状态:

    • Send:默认状态,表示对请求不做额外操作
    • Pause:暂停发送数据,所有后续发送的数据会被阻塞住
    • Ignore:忽略发送数据,所有后续发送的数据会被忽略

    Receive

    用于暂停或忽略发送到客户端的数据包,包含3种状态:

    • Send:默认状态,表示对请求不做额外操作
    • Pause:暂停接收数据,所有后续接收的数据会被阻塞住
    • Ignore:忽略接收数据,所有后续接收的数据会被忽略

    如果需要在建立连接的时候就设置Pause或Ignore状态,可以通过 pattern enable://ignoreSend|ignoreReceive|pauseSend|pauseReceive 设置所需的状态,如:ws://echo.websocket.org enable://ignoreSend|pauseReceive

    Abort

    断开连接。

    例子

    延迟发送

    通过在 SendReceive 按钮里面选择 Pause 状态,这时发送到服务器或客户端的数据包会把阻塞住,等待时间到后,再切换到 SendReceive 状态。

    断点调试

    通过 Ignore -> Pause -> Replay -> Send(Receive) 状态的切换实现对指定数据包进行修改。

    Replay 这步操作一般不需要用到,主要是用来解决忽略数据包时把其它不该忽略的数据包也忽略掉的问题

    展开全文
  • 利用Wireshark抓取WebSocket数据包

    万次阅读 2016-12-24 13:43:18
    前序最近刚到新的公司了,熟悉下环境,立马就要开始完成需求coding了。...比较坑的是,我这边看不到websocket服务端代码的,只有客户端,然而客户端代码大部分都是写在JavaScript中的,刚开始还不太熟悉那个,连发

    前序

    最近刚到新的公司了,熟悉下环境,立马就要开始完成需求coding了。。比较坑的是,代码完全不熟悉的情况下,给个需求涉及到十几个模块了,都要改,郁闷。其中刚好有一个模块是web地图的,根据代码查看发现是通过WebSocketflash进行实现的。
    比较坑的是,我这边看不到websocket服务端代码的,只有客户端,然而客户端代码大部分都是写在JavaScript中的,刚开始还不太熟悉那个,连发送请求的数据是什么都不知道,无奈只好想到抓包了。

    过滤

    只要说到抓包,肯定是离开不了Wireshark的,堪称网络工程师的神器啊,基本的使用起来比较简单。当然了要深入实践也不容易,主要是要经常有使用的场景。这也算是我第一次通过这个工具帮助完成工作任务吧。
    好了,废话不多说,去官网安装最新版Wireshark
    过滤条件为websocket
    filter websocket
    这样就可以过滤掉其他大量的干扰数据包,只查看使用websocket协议的数据包。

    查看数据包

    根据上图,第一条就是发送请求的数据包了,第二条是服务端响应的数据。

    请求数据

    继续查看下面数据包的详细信息:
    websocket_req
    最下面那行就是我们发送请求的数据了,可以看到就是一串JSON数据,如果是二进制的话就没办法查看了。

    响应数据

    再看一下服务器端响应的数据:
    websocket_resp
    这里我们就知道了,大部分逻辑都是在websocket服务器端进行处理的,因此要完成这个功能需求就必须要修改websocket服务器端代码了。因为这个模块是一个比较关键的地方,而我才刚到这边来,老大也不会放心直接让我动那块的,因此只好跟他说一下这个情况就好了,让之前写这个模块的人员帮我添加这个功能吧。

    总结

    虽然最后我也没有解决什么需求问题,不过比抓包之前要清晰明了多了。在这之前,我根本就不清楚这个地图是怎么进行数据通信交互的,现在算了比较了解了。也是我第一次见到有Websocket技术的实践吧。

    展开全文
  • 使用Netty搭建WebSocket服务器,该资源示范如何修改单包大小限制,解决不能发送大数据包的问题。
  • responseBuilder.Append("Sec-WebSocket-Protocol: " + "chat, superchat" + Environment.NewLine + Environment.NewLine); return Encoding.UTF8.GetBytes(responseBuilder.ToString()); } /// //...

    using
    System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; namespace LaiHuaRendSpeederServer { public static class WebSocketSeverHelper { /// <summary> /// 打包服务器握手数据 /// </summary> public static byte[] PackageHandShakeData(string handShakeText) { //string handShakeText = Encoding.UTF8.GetString(handShakeBytes, 0, length); string key = string.Empty; Regex reg = new Regex(@"Sec\-WebSocket\-Key:(.*?)\r\n"); Match m = reg.Match(handShakeText); if (m.Value != "") { key = Regex.Replace(m.Value, @"Sec\-WebSocket\-Key:(.*?)\r\n", "$1").Trim(); } byte[] secKeyBytes = SHA1.Create().ComputeHash( Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); string secKey = Convert.ToBase64String(secKeyBytes); var responseBuilder = new StringBuilder(); responseBuilder.Append("HTTP/1.1 101 Switching Protocols" + Environment.NewLine); responseBuilder.Append("Upgrade: websocket" + Environment.NewLine); responseBuilder.Append("Connection: Upgrade" + Environment.NewLine); responseBuilder.Append("Sec-WebSocket-Accept: " + secKey + Environment.NewLine + Environment.NewLine); //responseBuilder.Append("Sec-WebSocket-Protocol: " + "chat, superchat" + Environment.NewLine + Environment.NewLine); return Encoding.UTF8.GetBytes(responseBuilder.ToString()); } /// <summary> /// 解析客户端发送来的数据 /// </summary> public static string DecodeClientData(byte[] recBytes, int length) { if (length < 2) { return string.Empty; } bool fin = (recBytes[0] & 0x80) == 0x80; //0x80 = 1000,0000 第1bit = 1表示最后一帧 if (!fin) { if (recBytes[1] == 0xff) { } else return string.Empty; } bool mask_flag = (recBytes[1] & 0x80) == 0x80; // 是否包含掩码 if (!mask_flag) { return string.Empty;// 不包含掩码的暂不处理 } int payload_len = recBytes[1] & 0x7F; // 数据长度 byte[] masks = new byte[4]; byte[] payload_data; if (payload_len == 126) { Array.Copy(recBytes, 4, masks, 0, 4); payload_len = (UInt16)(recBytes[2] << 8 | recBytes[3]); payload_data = new byte[payload_len]; Array.Copy(recBytes, 8, payload_data, 0, payload_len); } else if (payload_len == 127) { Array.Copy(recBytes, 10, masks, 0, 4); byte[] uInt64Bytes = new byte[8]; for (int i = 0; i < 8; i++) { uInt64Bytes[i] = recBytes[9 - i]; } UInt64 len = BitConverter.ToUInt64(uInt64Bytes, 0); payload_data = new byte[len]; for (UInt64 i = 0; i < len; i++) { payload_data[i] = recBytes[i + 14]; } } else { Array.Copy(recBytes, 2, masks, 0, 4); payload_data = new byte[payload_len]; Array.Copy(recBytes, 6, payload_data, 0, payload_len); } for (var i = 0; i < payload_len; i++) { payload_data[i] = (byte)(payload_data[i] ^ masks[i % 4]); } //var uuu = new byte[payload_data.Length * 3 / 4]; //for (int i = 0; i < uuu.Length; i++) //{ // uuu[i] = payload_data[i]; //} //Console.WriteLine("UUUUUU:" + Encoding.UTF8.GetString(uuu)); return Encoding.UTF8.GetString(payload_data); } public static byte[] DecodeClientByteData(byte[] recBytes, int length) { if (length < 2) { return null; } bool fin = (recBytes[0] & 0x80) == 0x80; //0x80 = 1000,0000 第1bit = 1表示最后一帧 //if (!fin) //{ // if (recBytes[1] == 0xff) // { // if (recBytes[0] == 0x01) // { // recBytes[0] += 0x80; // } // else // return null; // } // else // return null; //} bool mask_flag = (recBytes[1] & 0x80) == 0x80; // 是否包含掩码 if (!mask_flag) { return null;// 不包含掩码的暂不处理 } int payload_len = recBytes[1] & 0x7F; // 数据长度 byte[] masks = new byte[4]; byte[] payload_data; if (payload_len == 126) { Array.Copy(recBytes, 4, masks, 0, 4); payload_len = (UInt16)(recBytes[2] << 8 | recBytes[3]); payload_data = new byte[payload_len]; Array.Copy(recBytes, 8, payload_data, 0, payload_len); } else if (payload_len == 127) { Array.Copy(recBytes, 10, masks, 0, 4); byte[] uInt64Bytes = new byte[8]; for (int i = 0; i < 8; i++) { uInt64Bytes[i] = recBytes[9 - i]; } UInt64 len = BitConverter.ToUInt64(uInt64Bytes, 0); payload_data = new byte[len]; for (UInt64 i = 0; i < len; i++) { payload_data[i] = recBytes[i + 14]; } } else { Array.Copy(recBytes, 2, masks, 0, 4); payload_data = new byte[payload_len]; Array.Copy(recBytes, 6, payload_data, 0, payload_len); } for (var i = 0; i < payload_data.Length; i++) { payload_data[i] = (byte)(payload_data[i] ^ masks[i % 4]); } return payload_data; } /// <summary> /// 把客户端消息打包处理 /// </summary> public static byte[] EncodeServerData(string msg) { byte[] content = null; byte[] temp = Encoding.UTF8.GetBytes(msg); if (temp.Length < 126) { content = new byte[temp.Length + 2]; content[0] = 0x81; content[1] = (byte)temp.Length; Array.Copy(temp, 0, content, 2, temp.Length); } else if (temp.Length < 0xFFFF) { content = new byte[temp.Length + 4]; content[0] = 0x81; content[1] = 126; content[2] = (byte)(temp.Length & 0xFF); content[3] = (byte)(temp.Length >> 8 & 0xFF); Array.Copy(temp, 0, content, 4, temp.Length); } else { // 暂不处理超长内容 } return content; } } }
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Sockets;
    using System.Text;
    
    namespace LaiHuaRendSpeederServer
    {
        public static class WebSocketExt
        {
            public static int SendProtocol(this Socket s, Protocol p)
            {
                var msg = JsonConvert.SerializeObject(p);
                Console.WriteLine("SendProtocol : " + msg);
                return s.Send(WebSocketSeverHelper.EncodeServerData(msg));
            }
            public static int ReceiveProtocol(this Socket s, ref Protocol p)
            {
                byte[] buffer = new byte[502400];
                int reccount = 0;
                List<ArraySegment<byte>> segList = new List<ArraySegment<byte>>();
                if (s.Connected)
                {
                    reccount = s.Receive(buffer);
                    if(reccount == 0)
                    {
                        s.Shutdown(SocketShutdown.Send);
                        p = null;
                        return 0;
                    }
                }
                byte[] r = new byte[reccount];
                Array.Copy(buffer, r, reccount);
                buffer = null;
                string mgs = string.Empty;
                if ((r[0] & 0x80) == 0)
                {
                    segList.Add(new ArraySegment<byte>(r, 0, reccount));
                    byte[] r2 = new byte[8];
                    while ((r2[0] & 0x80) == 0)
                    {
                        r2 = new byte[502400];
                        int cout = s.Receive(r2);
                        segList.Add(new ArraySegment<byte>(r2, 0, cout));
                    }
                    byte[] all = null;
                    for (int i = 0; i < segList.Count; i++)
                    {
                        if (all == null)
                        {
                            all = WebSocketSeverHelper.DecodeClientByteData(segList[i].Array, segList[i].Count);
                        }
                        else
                        {
                            var pit = WebSocketSeverHelper.DecodeClientByteData(segList[i].Array, segList[i].Count);
                            all = all.Concat(pit).ToArray();
                        }
                    }
                    mgs = Encoding.UTF8.GetString(all);
                }
                else
                {
                    mgs = WebSocketSeverHelper.DecodeClientData(r, r.Length);
                }
    
                if (mgs.Length < 150)
                {
                    Console.WriteLine("ReceiveProtocol : " + mgs);
                }
                else
                {
                    Console.WriteLine("ReceiveProtocol : " + mgs.Substring(0, 150));
                }
                try
                {
                    var f = mgs.Substring(1, mgs.Length - 2);
                    var menbs = f.Split(new string[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries);
                    if (menbs.Length != 4)
                    {
                        p = null;
                        return reccount;
                    }
                    p = new Protocol();
                    foreach (var item in menbs)
                    {
                        var pare = item.Split(new string[] { "\":\"" }, StringSplitOptions.None);
                        if (pare.Length != 2)
                        {
                            p = null;
                            return reccount;
                        }
                        switch (pare[0].Replace("\"", ""))
                        {
                            case "Head":
                                p.Head = pare[1].Replace("\"", "");
                                break;
                            case "Func":
                                p.Func = pare[1].Replace("\"", "");
                                break;
                            case "Name":
                                p.Name = pare[1].Replace("\"", "");
                                break;
                            case "Data":
                                p.Data = pare[1].Replace("\"", "");
                                break;
                            default:
                                p = null;
                                return reccount;
                                break;
                        }
                    }
                    //p = JsonConvert.DeserializeObject<Protocol>(mgs);
                }
                catch (Exception ex)
                {
                    var errormsg = JsonConvert.SerializeObject(
                        new Protocol() { Func = FUNC.ERROR, Data = ex.ToString() });
                    if (s.Connected)
                    {
                        s.Send(WebSocketSeverHelper.EncodeServerData(errormsg));
                    }
                    Console.WriteLine("ERROR : " + errormsg);
                    s.Close();
                }
                return reccount;
            }
        }
    }

     

    转载于:https://www.cnblogs.com/gaobw/p/8087384.html

    展开全文
  • websocket前后台出现问题解决方法:一开始通过限制后台返回数据帧以125字节分隔分段数据返回给前台,但调试时发现只要加上其他的一些信息返回json string很容易就会超过了125字节,于是在后台修改了这个限制大小为...

    websocket前后台出现问题解决方法:

    一开始通过限制后台返回数据帧以125字节分隔分段数据返回给前台,但调试时发现只要加上其他的一些信息返回json string很容易就会超过了125字节,于是在后台修改了这个限制大小为2048,但是这时候前端就出现了无法接收的问题。

    抛出错误为:WebSocket connection to 'ws://xxx.xx.xxx.xx:xx/' failed: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 1

    粗略在网上找了一下原因,是因为字符超出125而后台对数据处理没有采取策略造成的

    于是乎在后台限制数据帧返回最大为125字节,这就导致了接收的frame是这样的:


    (上面返回的四条数据帧都是同一条信息)

    用前端处理方法:

    这里我一开始采用的是直接在前台JSON.parse函数来处理onmessage接收的数据

    当数据过大后JSON.parse就会报错

    于是乎我就采用了一个折中的方法:



    ------------------------------------------------------------------


    思想:在监听函数一开始时先给message设置为空,设置flag为true

    onmessage接收到信息后尝试去解析成json,如果失败就捕获到异常

    在异常处理中,给message字符串拼接,拼接完成后再尝试去解析成json,如果解析成功则修改flag为true且将message置为空


    用后台处理方法:(前端不用再分段数据帧接收一条信息)

    在对返回的数据帧处理的方法中:


    因为返回的数据帧必须遵守socket协议,socket协议规定返回数据帧头部必须为数据大小的ascii码,所以上面的代码就不难理解了

    展开全文
  • 一、WebSocket协议 WebSocket是HTML5下一种新的协议。 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。 它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP...
  • 类似的,如果要监听tcp或者是udp协议,只需要修改上例的icmp就可以了。ping下监听的机器,输出如下: linux使用tcpdump抓包示例 每一行的各个数据表示的含义: 抓到包的时间 IP 发包的主机和...
  • WebSocket

    2021-04-20 09:56:51
    一、什么是WebSocket 1、介绍 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 在 ...
  • golang websocket编程

    千次阅读 2019-08-15 07:30:03
    本篇文章来了解一下另外一个概念——WebSocket。但从命名上来看WebSocket和Socket很类似,但是其实两者并没有直接的联系。Websocket跟HTTP对应,基是于TCP 协议之上的长连接应用层协议。Socket是操作系统抽象出来,...
  • 1. C++实现WebSocket功能的一些参考和建议 1.1 背景 项目中会遇到让已有的C++服务端程序增加WebSocket协议支持,与前端进行通讯。Github上有不少开源的C++代码可以参考,比较知名的如websocketcpp,beast, ...
  • laravel8 swoole websocket

    2021-05-20 15:13:41
    这几天写了个socket的通知消息,记录一下使用心得,网络上有很多资料,但...websocket要设置task_enable_coroutine属性true,同时打开websocket的使用。 不开task_enable_coroutine会报错的,注意 swoole_websocket.p
  • WebSocket现在很常用,想要测试tomcat的最大连接数,今天试了一个可行的办法和配置(之前是用全公司的设备一起来测试的,真机环境的测试收到网络的影响很大,其实真实环境应用中,网络才是websocket的最大瓶颈) ...
  • 全双工通信的 WebSocket

    千次阅读 2018-05-23 09:36:44
    WebSocket 是什么?WebSocket 是一种网络通信协议。在 2009 年诞生,于 2011 年被 IETF 定为标准 RFC 6455 通信标准。并由 RFC7936 补充规范。WebSocket API 也被 W3C 定为标准。WebSocket 是 HTML5 开始提供的一种...
  • Netty之Http与Websocket

    2020-12-15 18:49:25
    # 标识加密相关信息 HTTP/1.1 101 Upgrade: websocket Connection: Upgrade 响应码 101 代表本次协议需要更改websocket,连接建立后,支持文本信息及二进制信息 Websocket实现的原理: http的缺陷:通信只能由...
  • WebSocket总结

    2019-08-18 14:58:17
    了解websocket吗?它的优势是什么?同样的问题我遇到过几次了,足以说明这个方法的重要性啊,每次都回答不全,说到底还是对这个方法不太了解啊,今天一定要彻底搞懂websocket,下面就来总结,首先定义请戳 WebSocket...
  • Sec-WebSocket-Extensions:permessage-deflate Sec-WebSocket-Accept:q9g5u1WfIWaAjNgMmjlTQTqkS/k= 将Sec-WebSocket-Key的值进行一定的运算和该值进行比较来判断是否是目标服务器响应了WebSocket请求。...
  • WebSocket协议介绍

    2021-09-01 21:24:37
    二、WebSocket出现之前的实时技术三、WebSocket应用场景四、WebSocket协议栈五、WebSocket与HTTP的区别六、WebSocket握手过程七、WebSocket帧格式八、WebSocket分片传输九、WebSocket相关扩展 前言 WebSocket是一...
  • 为什么需要 WebSocket? 需求是:用户停留页面 15 分钟,且没有任何操作,则弹出登陆窗口,让用户重新登陆。 一般这样的需求实现多为长连接轮询,会有浏览器的卡顿、服务端消耗及不容易维护等问题。 后来发现 ...
  • websocket

    2016-09-29 15:59:54
    1111111111111,meteor是一个...使用websocket协议来做数据传输协议,来同步前后端的数据,实现真正的实时同步。 22222222222222,websocket是什么东西,底层是不是轮训。和http的长连接有什么不同。 (很多网站为了实
  • python 实现 websocket

    2019-09-22 02:14:26
    一、websocket概要:  websocket是基于TCP传输层协议实现的一种标准协议(关于网络协议,可以看看文末的图片),用于在客户端和服务端双向传输数据  传统的客户端想要知道服务端处理进度有两个途径:  1)通过...
  • 感觉比较靠谱但是解决办法 解决办法: 1、设置tomcat最大连接数,最大等待数,最大线程数 2、服务端开启线程每20秒群发消息 3、Tomcat Session过期时间 前两个都是修改tomcat的配置文件conf 在server.xml中定义...
  • 面试:Websocket

    2021-03-08 15:28:36
    面试:Websocket 简介 WebSocket 是一种与 HTTP 不同的协议。...为了实现兼容性, WebSocket 握手使用 HTTP Upgrade 头从 HTTP 协议更改WebSocket 协议。 与HTTP不同,WebSocket 提供全双工通信。此外,.
  • websocket简介: WebSocket协议是HTML5 开始提供的一种基于TCP的一种新的全双工通讯的网络通讯协议。它允许服务器主动发送信息给客户端。 和http协议的不同?? HTTP 协议是一种无状态的、无连接的、单向的...
  • 例如,本机的MAC地址为: ‎00-1C-47-CE-FE-02,在发送数据包的时候,如何将其修改为‎00-11-42-DF-EE-01 1.不能采用修改网卡的MAC地址的方式,因为修改后的地址是随机动态的,要像方法中的一个参数一样,随时修改,...
  • WebSocket的调研分析

    2020-12-16 00:07:42
    简介 ... WebSocket & Tcp Socket ...WebSocket在建立握手时,数据是通过HTTP/1.1(注HTTP1.1相比HTTP增加了KeepAlive)传输的,准确的将是使用了HTTP Upgrade来将协议更改websocket,但是建立之.
  • JavaScript中WebSocket介绍与运用

    千次阅读 2017-06-25 20:48:01
    js中websocket的运用
  • 通常,我们使用Nginx为后端WEB服务做反向代理或负载均衡,但如果我们的后端服务,并不是HTTP/HTTPS协议,而是TCP协议或WebSocket协议呢 最近遇到一个需求,我们的HTTPS以及MQTT服务端在海外云主机上,从大陆直连延时...
  • 目录1 什么是WebSocket2 并发通信的实现2.1 WebSockets库2.2 协程(Asyncio)2.3 功能描述2.4 具体实现2.4.1 客户端2.4.2 服务端2.5 效果 1 什么是WebSocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,470
精华内容 1,388
关键字:

websocket数据包修改