4.9--计算机网络之TCP篇之如何理解 TCP 是面向字节流协议--(复习+大总结)---好好沉淀,沉下心来

TCP 是面向字节流的协议,UDP 是面向报文的协议
操作系统对 TCP 和 UDP 协议的发送方的机制不同,也就是问题原因在发送方

1.为什么 UDP 是面向报文的协议?

当用户消息通过 UDP 协议传输时,操作系统不会对消息进行拆分,每个 UDP 报文就是一个用户消息的边界,这样接收方在接收到 UDP 报文后,读一个 UDP 报文就能读取到完整的用户消息

如果收到了两个 UDP 报文,操作系统是怎么区分开的?

操作系统在收到 UDP 报文后,会将其插入到队列里,队列里的每一个元素就是一个 UDP 报文,当用户读数据的时候,就会从队列里取出一个数据,然后从内核里拷贝给用户缓冲区。

2.为什么 TCP 是面向字节流的协议?

我们不能认为一个用户消息对应一个 TCP 报文,正因为这样,所以 TCP 是面向字节流的协议。

当用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个的 TCP 报文,接收方的程序如果不知道发送方发送的消息的长度,也就是不知道消息的边界时,是无法读出一个有效的用户消息的

在发送端,当我们调用 send 函数完成数据“发送”以后,数据并没有被真正从网络上发送出去,只是从应用程序拷贝到了操作系统内核协议栈中。

至于什么时候真正被发送,取决于发送窗口、拥塞窗口以及当前发送缓冲区的大小等条件

TCP 粘包问题

当两个消息的某个部分内容被分到同一个 TCP 报文

如何解决粘包?

粘包的问题出现是因为不知道一个用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息。

一般有三种方式分包的方式:

1.固定长度的消息;
2.特殊字符作为边界;
3.自定义消息结构

你可能感兴趣的:(计算机网络,tcp/ip,计算机网络,网络)