本文作者:xiaoshi

网络编程 TCP 粘包面试题解决方案

网络编程 TCP 粘包面试题解决方案摘要: ...

网络编程TCP粘包面试题,一文讲清解决方案

在网络编程的面试中,TCP 粘包问题可是个高频考点。不少小伙伴对这个问题一知半解,今天咱就把它彻底弄明白,看看都有哪些靠谱的解决方案。

TCP 粘包问题是咋回事

网络编程 TCP 粘包面试题解决方案

要搞清楚怎么解决 TCP 粘包,咱得先知道这问题是咋来的。简单来说,TCP 是面向流的协议,数据就像水流一样连续不断地传输。发送方发数据的时候,可能会把多个小数据包合并成一个大的发出去;接收方接收数据时,也不一定能恰好按发送方的数据包边界来接收,这就导致了多个数据包粘在一起,出现粘包现象。

比如说,发送方先后发了 “Hello” 和 “World” 两个数据包,接收方可能收到的是 “HelloWorld”,这就分不清两个数据包的界限了。

解决方案之定长包

定长包的思路很直接。就是规定每个数据包的长度都是固定的。发送方在发送数据前,把数据填充到固定长度,如果数据本身长度不够,就用特定字符填充。接收方每次按固定长度读取数据,这样就能准确区分每个数据包。

举个例子,假如我们规定数据包长度是 10 个字节。发送 “Hello” 时,后面补 5 个空格,变成 “Hello ” 再发送。接收方每次读 10 个字节,读到 “Hello ” 就知道这是一个完整数据包,处理完再读下一个 10 字节。

这种方法优点是简单直接,实现容易。但缺点也明显,如果数据包长度经常变化,填充数据会造成带宽浪费。

解决方案之包尾加特殊标记

这种方法是在每个数据包的末尾加上一个特殊标记,用来表示数据包的结束。接收方在接收数据时,不断读取,直到遇到这个特殊标记,就认为一个完整数据包接收完毕。

常见的特殊标记有换行符 “\n”,像 HTTP 协议中就有用到类似原理。当发送数据 “data1\n”“data2\n”,接收方读到 “\n” 就知道一个数据包结束了。

这种方案灵活性比定长包好,适合数据长度不固定的情况。但如果数据本身就可能包含这个特殊标记,就需要做额外处理,比如转义,不然会误判数据包结束。

解决方案之包头+包体结构

包头+包体结构是比较常用且灵活的方法。发送方把数据包分为包头和包体两部分,包头里包含包体的长度等信息。接收方先接收包头,解析出包体长度,再根据这个长度接收包体数据。

比如包头固定 4 个字节用来表示包体长度。发送 “Hello”,先把 “Hello” 的长度 5 放在包头,包体就是 “Hello”。接收方先读 4 个字节包头得到长度 5,再读 5 个字节得到完整的 “Hello”。

这种方式适应性强,能很好处理各种复杂数据结构。但实现相对复杂点,需要精心设计包头格式。

总结

TCP 粘包问题在网络编程中很重要,上面这几种解决方案各有优劣。定长包简单但可能浪费带宽;包尾加特殊标记灵活但要处理数据包含标记的情况;包头+包体结构适应性强不过实现复杂些。面试时,咱得根据实际场景选合适方案,这样就能妥妥拿下 TCP 粘包相关面试题啦。

文章版权及转载声明

作者:xiaoshi本文地址:http://blog.luashi.cn/post/1705.html发布于 05-30
文章转载或复制请以超链接形式并注明出处小小石博客

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,11人围观)参与讨论

还没有评论,来说两句吧...