专栏首页普通程序员IM系统如何调试TCP协议

IM系统如何调试TCP协议

最近负责瓜子IM系统开发。客户端选用了微信开源的Mars库。定义通讯协议如下图。

20字节的header,包括headLength包头长度,clientVersion客户端版本,cmdId命令Id号,seq消息序列号,bodyLength消息体长度;消息内容body长度由header中的bodyLength标识。

服务器(取名pigeon-gate)和客户端(Mars)程序雏形开发好之后,需要进行协议联调,怎么确定Mars收发消息的行为是否符合预期呢(预期是阅读Mars源代码分析出来的)?抓取TCP消息包!

工具wireshark,安装在IM服务器pigeon-gate 所在的机器,安装方式自己百度。

打开wireshark工具,在过滤器中输入"tcp and ip.addr == 192.168.13.1" (该IP是手机IP地址 ),表示只显示来自192.168.13.1 IP地址的TCP数据。

IM客户端,发送一条消息,工具抓取到若干TCP数据包,其中红框标记的数据是客户端发到服务器的消息数据(多试几次就知道有效的数据是哪一条了)。

点击数据看到该条TCP消息包内容如下图。

蓝色背景(光标)的内容是客户端发到服务器端的内容(含header,body)。

非蓝色背景的内容可以简单理解为TCP协议的消息头(我们自定义的数据可以算作TCP协议的消息体)。

比如红色方框6个字节表示目的地(IM服务器)物理地址,测试服务器物理地址为 68-07-15-29-FE-3B;紫色方框表示消息来源(手机 )物理地址,其他内容可以查看TCP协议细节。

重点分析蓝色背景区域,消息前4个字节是消息头长度 headLength

headLength,4字节,TCP包内容为"00 00 00 14",将16进制转换为10进制为20。按照此方法得到

headLength = 20

clientVersion = 200

cmdId = 3

seq = 2

bodyLength = 36

根据收到的消息头判断Mars响应的这条消息符合预期。客户端向服务器端发送消息的协议正确,服务器进行相关处理。客户端向服务器端发送消息的协议联调通过。

消息体是明文展示的,可以看到chupengyu几个拼音字母。感谢客户端褚鹏宇同学在联调中作出的努力。

本文分享自微信公众号 - 普通程序员(farmerbrag),作者:封宇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 低成本确保消息时序的方法

    IM类系统中,都需要考虑消息时序问题,如果后发送的消息先显示,可能严重扰乱聊天消息所要表达的意义。

    普通程序员
  • Redis SortedSet结构score字段丢失精度问题解决办法

    项目中采用Redis SortedSet存储用户的离线消息,score值存储的msgid(消息ID)。msgid采用snowflake算法生成,按照时间有序。(...

    普通程序员
  • IM移动端怎么搜索本地聊天记录

    比如要找内容包含某一个字符串的聊天记录,就是一条聊天记录一条聊天记录的看,对于每一条聊天记录,从头看到尾,如果聊天记录包含此字符串,则聊天记录为要找的条目,接着...

    普通程序员
  • 总理,马上见

    ? 今年两会,李克强总理答记者问首次使用小程序进行直播。 现在,微信搜一搜“两会”或“国务院客户端”,或扫描下面的小程序码,或点击进入国务院客户端小程序,马上...

    鹅老师
  • 【转】JAVA之网络编程

    网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习。

    shirayner
  • 【通信】WebSocket

    通常,当客户端访问一个网页时,会向Web服务器发送一个HTTP请求,Web服务器接收该请求,并返回响应,客户端在接收到响应后再将信息呈现出来。

    Html5知典
  • Redis分布式锁的正确实现方式

    数据库乐观锁 基于Redis的分布式锁 基于Zookeeper的分布式锁 本文介绍的是基于Redis的分布式锁;

    stys35
  • Python中字符串的操作

    注意事项:字符串中的所有更改操作都只能通过重新赋值才可使用,并不会直接在内存中修改

    py3study
  • 图解从 URL 到网页通信原理

    互联网的原始目的,就是为了传输文本(文本对话)。那我们使用浏览器发送请求后页面是如何呈现在我们面前的呢? 接下来由图片介绍下URL到呈现页面的过程。

    芋道源码
  • python IO多路复用之select

        说起IO操作我们最先想到的就是读写文件。其实python中对有三种IO操作,打开文件,使用socket进行网络连接和系统的标准输入输出sys.stdin...

    py3study

扫码关注云+社区

领取腾讯云代金券