常见于TCP与UDP中的概念。
什么是字节流
连续、有序、TCP
字节流是一种连续的数据传输方式。“字节流”意味着将数据视为连续的数据流,当将数据被分割为一个一个数据包时,这些数据包之间也是有序且连续的。
举个例子,一个txt文档里面有四个数:1234。现在通过FTP将这个txt文档传给另一台机器。那么另一台机器也应该收到的是“1234”的txt文档。
现在假设这个txt很大,服务器将这个txt文件分为了四个数据包,每个包我们仍然用1234来表示。那么我们每次传输数据包,数据包的内容实际上是连续的。客户端在接受到数据包后还要将这四个数据包重新组合成顺序同样为”1234“的txt文档。
因为字节流是有序且连续的,所以TCP才需要重传和校验机制来保证连接可靠。
什么是数据报
独立、无序、UDP
数据报是一种独立的数据传输方式。
举个例子,你和另一个人通过VOIP进行语音通话。对面一共说了两句话,分别是”早上好“和”现在我有冰淇淋“。
假设现在这两个语音,刚好分别打包成了两个数据包发送给你。但是此时出现了某些问题,导致第二个数据包永远无法到达你的主机,那么根据你用的TCP还是UDP,有以下两种可能:
- TCP:由于丢包触发了TCP的重传机制,而多次尝试重传后接收方还是没能接受到数据包,导致TCP连接断开——你只听到了”早上好“,然后语音通话断开触发自动重连。
- UDP:由于每个数据包都是独立的,每个数据包都包含了目的地址,所以第二个数据包仍然正常发送——你听到了”早上好“,但你没听到”现在我有冰淇淋“,不过你们的语音通话没有断开,通话继续。
很明显,我们日常生活中的碰到的一般都是第二种情况。因为语音通话比起稳定性,对实时性的要求更高,所以我们才用的UDP。
在UDP中,每个数据包都是独立且无序的,这样即使某个数据包丢失了,其他数据包也能找到自己该去的地方。所以此时的数据包我们也可以叫它数据报,以和TCP中字节流中的数据包进行区分。
字节流与数据报的异同
TCP/UDP、有序无序、连续独立
提到字节流和数据报,一般都会先提到TCP和UDP。
先来看相同点:
- 都表示一种数据传输方式。
- 传输的都是数据包。
接下来是不同点:
- 在TCP/UDP中,传输的数据包的叫法不同
- 在TCP中,以字节流方式传输的数据包被称为”段“。因为每一段组合起来才是完整的数据。
- 在UDP中,以数据包方式传输的数据包被称为”数据报“。因为每个数据报都是独立的。
- 字节流是有序且连续的数据传输方式。数据报是无序且独立的数据传输方式。