关于 TCP 流与包的概念
首先需要明确一个概念,TCP 是以二进制流式传送数据的,既发送端与接收端成功建立连接下即可以不停的发送数据包,不同数据包间并没有明确的边界定义;而 UDP 发送数据的时候是按照一个一个的数据包去发送的。所以 TCP 发送数据是一个二进制流,而管道内的数据是一个个封装好的数据包。另外很重要的一点是,无论是发送端发送数据,还是接收端接收数据,都存在一个数据的缓冲区,而当发送端等待缓冲区满才发送数据,就会造成缓冲区有多个数据包,数据包可能会在开启 Nagle 算法的情况下进行合并发送;而接收端不及时处理缓冲区的数据包时,既同样造成缓冲区存在多个数据包,应用层可能会一次 read 完多个数据包。所以在发送端,我们需要对数据按照事先约定好的协议进行合理的封装,在接收端,我们需要按照协议对数据进行拆分。
Continue reading