TCP应用程序通信协议的处理
flyfish 2015-6-29
一 流式处理
TCP是一种流协议(stream protocol)。TCP数据是以字节流的形式传递给接收者的,没有固有的”报文”或”报文边界”或者用户可见的”分组”的概念。
它仅仅是传送了一个字节流,我们无法准确地预測在一个特定的读操作中会返回多少字节。虽然网络层数据在节点之间是以IP分组的形式传输的,但分组中的数据量与send调用中传送给TCP多少数据并没有直接关系。并且,接收程序也没有什么可靠的方法能够推断数据是怎样分组的,由于在两次recv调用之间可能会有多个分组到来。假设你的应用程序的设计与TCP对数据的分组方式有所关联。那么请又一次设计应用程序。
处理”粘包”。“分包”正是由于错误了理解了TCP传输数据模型。当以字节流处理时这个问题就不存在了。
二 检測client是否在线
由于TCP无法将连接的丢失马上通知应用程序
TCP有一种保持活跃(keep-alive)的机制能够用来检測死连接,但这相应用程序来说,通常没什么用处。保持活跃机制并没有真正成为连接监測机制的主要原因之中的一个就是默认的时间区间太长了。
能够使用检測方式比較灵活
1 心跳检測:client直接发送给server“我在线”的信息
2 心跳检測:client连接到server之后,会向server发送一个port号,之后在这个port上监听来自server的心跳连接
3 在读操作上设置一个定时器,这种话,假设client在某段时间区间内没有发出请求,server就假定client已经不存在了
三 採用防御性编程以防止client的不友好操作
1检验client的有效数据,防止发生非预期行为。
2检查缓冲区的溢出情况
參考《TCP/IP高效编程:改善网络程序的44个技巧》
转载于:https://www.cnblogs.com/gavanwanggw/p/7265198.html