TCP面试题(三)之粘包问题

    上次说到了,“粘包问题”产生的根本原因,要是不清楚的可以看看我的这篇文章: TCP面试题(二)之TCP糊涂窗口问题,这次就不再赘述了。

“粘包问题”概念

     “粘包问题”的概念用一句话说:就是,不同结构的多个包合成了一个大包,从而不知道怎么去把这个大包分割出原来的包。

解决方案

      具体方案由使用的场景决定,即分为:实时性要求高和实时性要求不高,这两种情况。

      一、对于实时性要求高的场景:

           关闭Nagle算法(TCP_NODELAY)和Crok算法(TCP_CROK)。以Linux为例,这两个算法可以参考一下           tcp_output.c的实现。

           具体是通过设置TCP_NODELAYTCP_CROK来实现的。

                (1)如果包长度已经到达MSS,则直接允许发送。

                (2)如果该包含有了FIN,则允许发送。

                (3TCP_NODELAY:如果不设置,则会延时确认ACK,从而达到积攒小包的效果。

                (4TCP_CROK:CROK意思为塞子,如果设置,则会将发送端堵住,一直到超时或者这些包已经拼凑成超过              MSS长度的包。

  二、对于实时性要求不高的场景:

    (1)约定结束标志。

    (2)设置控制结构。

    (3)每次发一个包,等待其超时(利用超时会立即发的特点)。

总结

  总体说来,“粘包问题”就是由于为了解决“糊涂窗口”而引发的,果然bug是无穷无尽的。

你可能感兴趣的:(一些面试总结)