对于初涉网络编程的开发人员来说,在通信协议的设计上一般会有所困惑。一般的网络编程书籍上也较少涉及这方面的内容。估计是觉得太简单了。这块确实是不难,但如果不了解,又很容易出篓子或者绕弯路。下面我就来谈谈基于TCP/UDP的协议设计。 1、基于TCP的协议设计 TCP是基于流的协议。但大部分网络应用一般会有个更小的处理单元,我们称之为帧(FRAME)。 是否分帧 如上所述,大部分网络应用是需要分帧的。举IM为例,用户登录是一个帧,用户发送文本信息是一个帧。少部分应用可以不需要分帧,比如:echo服务器,接收到什么直接回复即可;转发服务器,同样是接收到数据直接转给目标机器;更常见的情况是一个TCP连接只发送/处理一个请求之后就直接关闭,这种也就没必要分帧了。 考虑到除了学习网络编程,没人做echo server。所以只要服务端不是一次连接只处理一个请求,或者纯转发,就应该采用分帧的设计。 如何分帧 注意:帧是业务处理的单元,是具体应用Care的,但这不关TCP的事情!初学者往往认为tcp这端 write一次,tcp那端就会read一次,然后惊呼“粘包”、“丢包”,其实这都是程序处理不当。在这边推荐一本书籍《TCP/IP协议详解 卷1》,挺薄的,看完可以减少很多对TCP的错误认识。实际上发送方发送一帧,接收方可能要N次才能读取完成,而且可能同时读到下帧的数据。那要怎么在接收方把一帧数据不多不少的读取出