之所以会说 TCP 是面向字节流的协议,UDP 是面向报文的协议,是因为操作系统对TCP 和 UDP 协议的发送机制不同,也就是问题原因在发送方。
UDP为什么面向报文协议?
当用户消息通过 UDP 协议传输时,操作系统不会对消息进行拆分,在组装好 UDP 头部后就交给网络层来处理,所以发出去的 UDP报文中的数据部分就是完整的用户消息,也就是每个 UDP 报文就是一个用户消息的边界,这样接收方在接收到 UDP 报文后,读一个 UDP 报文就能读取到完整的用户消息。你可能会问,如果收到了两个 UDP 报文,操作系统是怎么区分开的?操作系统在收到 UDP 报文后,会将其插入到队列里,队列里的每一个元素就是一个UDP 报文,这样当用户调用 recvfrom0 系统调用读数据的时候,就会从队列里取出个数据,然后从内核里拷贝给用户缓冲区。
TCP为什么是面向字节流协议?
当用户消息通过 TCP 协议传输时,消息可能会被操