免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8993 | 回复: 28
打印 上一主题 下一主题

关于如何自己设计一个基于TCP的协议 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-26 23:00 |只看该作者 |倒序浏览
最近在实现一个c/s架构的软件,client 首先会发一个请求给 server,server同意后client再发一个二进制的文件给server,server处理后在把结果(字符串)给client。整个过程还是比较简单的,但是这就涉及了一个简单的协议,包括一些控制内容和数据内容。我必须要保证数据内容不会解析成控制内容,比如那个二进制文件和server返回的字符串,不知道大家都是用什么方法来做的?
我看了tcp/ip详解的第一卷,还没看完,能够参考的是telnet的设计和ftp的设计,telnet是所有传输的都是字符串,对于结束符进行转义,而ftp是数据和控制分开,ftp也有二进制的模式,但是上面没有细讲,我还是比较迷糊
原来听别人讲当传二进制数据的时候,先把数据长度和md5校验用设计的命令传过来,然后就收制定长度的数据,这部分数据不必分析,然后再对剩余传过来的数据做命令解析
再就是用base64编码二进制文件,不过这个冗余比较多

大家都是用什么方法?可否指点一下?
多谢了

论坛徽章:
0
2 [报告]
发表于 2008-08-27 00:43 |只看该作者
是否可以考虑用更简单的方式来完成,比如控制部分用简单的自定义协议+socket,文件传输就直接用ftp:
client:我要上传
serverk
client--ftp
client:收到?
server:收到,我处理一下,结果是:。。。

论坛徽章:
0
3 [报告]
发表于 2008-08-27 08:40 |只看该作者
这样,
请求的报文的第一个字节为0x01第二个字节为报文长度,其余字节为报文内容
二进制报文第一个字节为0x02第二个字节为报文长度,其余字节为报文内容
类似的你自己扩展吧

论坛徽章:
0
4 [报告]
发表于 2008-08-27 08:52 |只看该作者
原帖由 dnglee 于 2008-8-27 00:43 发表
是否可以考虑用更简单的方式来完成,比如控制部分用简单的自定义协议+socket,文件传输就直接用ftp:
client:我要上传
serverk
client--ftp
client:收到?
server:收到,我处理一下,结果是:。。。


多谢dnglee,你的意思是我的client和server端再都配一个ftp?这样可能比较麻烦,对于用户的环境要求太高了,不过我会仔细看看ftp的实现,看看能不能有些思路

论坛徽章:
0
5 [报告]
发表于 2008-08-27 08:55 |只看该作者
原帖由 gawk 于 2008-8-27 08:40 发表
这样,
请求的报文的第一个字节为0x01第二个字节为报文长度,其余字节为报文内容
二进制报文第一个字节为0x02第二个字节为报文长度,其余字节为报文内容
类似的你自己扩展吧


好的,这样就不用定义ascii的命令了,呵呵
我想再问一下,tcp传过来的数据我还是要检查的吧,好像它是用校验和,校验的并不准确,做做md5,sha校验还是有必要的吧?

论坛徽章:
0
6 [报告]
发表于 2008-08-27 09:01 |只看该作者
原帖由 chrisyan 于 2008-8-27 08:55 发表


好的,这样就不用定义ascii的命令了,呵呵
我想再问一下,tcp传过来的数据我还是要检查的吧,好像它是用校验和,校验的并不准确,做做md5,sha校验还是有必要的吧?

一般的没必要搞校验,其实普通的用crc校验都可以了,没必要那么复杂吧

论坛徽章:
0
7 [报告]
发表于 2008-08-27 09:02 |只看该作者
其实就是如3楼所言,你要定义一个自己的PDU,协议数据单元。

应用程序需要有自己的缓冲,从socket读取数据来了以后,应用程序要去分析,这是控制信息还是数据,还要校验。

比方说控制信息的PDU假如是:
同步码[4个字节的1] + 控制信息[4个字节] + 校验和

你的应用程序从它的缓冲区读100个字节,先把前面4个字节和0XFFFFFFFF(全1)比较,如果相等(判断相等的算法也很多的),则可以肯定这个数据是你的控制数据的开头,于是接着你就要读接下来的8个字节,把前4个字节按照你的校验算法计算出校验和,并和后4个字节比较,校验和相等,则说明控制信息传输无误。现在就可以开始进行业务处理了。

如果不考虑完全的话,你想想:假如现在你的应用解析出一个控制信息,是0X08000001,按照你的协议规定,是要控制一个步进电机向左转0.5度,可是传输过程中出现的问题(被攥改了),你实际收到的是0X08000002,按照你的协议规定,是要控制你的步进电机向右转0.5度

数据传输也是一样的,不要只是一味的传送,一味的接收,是要按照一定的规则来发送和接收,这个规则,就是你的协议规范,也就是服务器端和客户端的一种约定。

论坛徽章:
0
8 [报告]
发表于 2008-08-27 09:04 |只看该作者
原帖由 wuqing 于 2008-8-27 09:02 发表
其实就是如3楼所言,你要定义一个自己的PDU,协议数据单元。

应用程序需要有自己的缓冲,从socket读取数据来了以后,应用程序要去分析,这是控制信息还是数据,还要校验。

比方说控制信息的PDU假如是:
...

wuqing是做电力的么?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2008-08-27 09:27 |只看该作者
是要封装TCP协议呢,还是基于TCP协议上层做自己的协议

论坛徽章:
0
10 [报告]
发表于 2008-08-27 10:02 |只看该作者
原帖由 wuqing 于 2008-8-27 09:02 发表
其实就是如3楼所言,你要定义一个自己的PDU,协议数据单元。

应用程序需要有自己的缓冲,从socket读取数据来了以后,应用程序要去分析,这是控制信息还是数据,还要校验。

比方说控制信息的PDU假如是:
...

多谢,我知道现在就是设计一个协议,来保证server和client之间的传输。
其实我还是有点疑问,像你所说的 ”同步码[4个字节的1]“ 这个四个连续的1也有可能出现在我的数据当中啊,因为我传的是二进制数据,不是没有这个可能。
因为控制和数据在同一个链接上传输,这个就比较烦。
我所理解的gawk兄弟的意思是从一开始读的信息就是“操作代码+数据长度+数据”,这一次的传输长度就是 4(暂定操作码为一个int) + 4(暂定数据长度为一个int) + 数据长度,那么读完这么长的数据,再读4字节就是下一个操作码,然后再读数据长度,然后是数据,这样的话我都是根据长度来区分,不用去对所有的传输过来的数据进行分析,也就不用对传输数据内的可能出现的操作码进行转义。

你能不能再和我仔细说说?因为这个细节很重要,如果有一点地方我想不明白,我也就不会用这种方法去实现了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP