做大数据和网站开发的前景,网站国内空间价格,大学生电商创业项目,免费公众号编辑模板TCP 是面向字节流的协议#xff0c;UDP 是面向报文的协议
操作系统对 TCP 和 UDP 协议的发送方的机制不同#xff0c;也就是问题原因在发送方。
UDP面向报文协议#xff1a;
操作系统不会对UDP协议传输的消息进行拆分#xff0c;在组装好UDP头部后就交给网络层处理…TCP 是面向字节流的协议UDP 是面向报文的协议
操作系统对 TCP 和 UDP 协议的发送方的机制不同也就是问题原因在发送方。
UDP面向报文协议
操作系统不会对UDP协议传输的消息进行拆分在组装好UDP头部后就交给网络层处理每个UDP报文就是一个用户消息边界。
操作系统接收到UDP报文后放入队列队列每一个元素都是一个UDP报文
TCP面向字节流协议
TCP协议传输时一个完整的用户消息被拆分成多个 TCP 报文进行传输。我们不能认为每次 send 调用发送的数据都会作为一个整体完整地消息被发送出去至于什么时候真正被发送取决于发送窗口、拥塞窗口以及当前发送缓冲区的大小等条件。不能认为一个用户消息对应一个 TCP 报文正因为这样所以 TCP 是面向字节流的协议。
如何解决粘包
不知道一个用户消息的边界在哪
固定长度的消息
即每个用户消息都是固定长度的比如规定一个消息的长度是 64 个字节当接收方接满 64 个字节就认为这个内容是一个完整且有效的消息。
特殊字符作为边界
两个用户消息之间插入一个特殊的字符串这样接收方在接收数据时读到了这个特殊字符就把认为已经读完一个完整的消息。
自定义消息结构
我们可以自定义一个消息结构由包头和数据组成其中包头包是固定大小的而且包头里有一个字段来说明紧随其后的数据有多大。