TCP应用程序通信协议的处理

TCP应用程序通信协议的处理

flyfish 2015-6-29

一 流式处理
TCP是一种流协议(stream protocol)。TCP数据是以字节流的形式传递给接收者的,没有固有的”报文”或”报文边界”或者用户可见的”分组”的概念。
它只是传送了一个字节流,我们无法准确地预测在一个特定的读操作中会返回多少字节。尽管网络层数据在节点之间是以IP分组的形式传输的,但分组中的数据量与send调用中传送给TCP多少数据并没有直接关系。而且,接收程序也没有什么可靠的方法可以判断数据是如何分组的,因为在两次recv调用之间可能会有多个分组到来。如果你的应用程序的设计与TCP对数据的分组方式有所关联,那么请重新设计应用程序。
处理”粘包”,“分包”正是因为错误了理解了TCP数据传输模型,当以字节流处理时这个问题就不存在了。

二 检测客户端是否在线
因为TCP无法将连接的丢失立即通知应用程序
TCP有一种保持活跃(keep-alive)的机制可以用来检测死连接,但这对应用程序来说,通常没什么用处。保持活跃机制并没有真正成为连接监测机制的主要原因之一就是默认的时间区间太长了。

可以使用检测方式比较灵活
1 心跳检测:客户端直接发送给服务器“我在线”的信息
2 心跳检测:客户端连接到服务器之后,会向服务器发送一个端口号,之后在这个端口上监听来自服务器的心跳连接
3 在读操作上设置一个定时器,这样的话,如果客户端在某段时间区间内没有发出请求,服务器就假定客户端已经不存在了

三 采用防御性编程以防止客户端的不友好操作

1检验客户端的有效数据,防止发生非预期行为。
2检查缓冲区的溢出情况

参考《TCP/IP高效编程:改善网络程序的44个技巧》

你可能感兴趣的:(网络)