TCP 协议如何保证性能( 五 )


面向字节流
创建 TCP连接时,会同时在内核中创建 发送缓冲区 和 接受缓冲区 。
调用 write() 方法发送数据时,数据首先会被保存在缓冲区中 。如果数据本身很大,则分多个数据包分别发送,如果数据很小,则先保存在缓冲区中,后续等待数据稍微多一点时再重新发送 。
调用 read() 方法读取数据时,直接从缓冲区读取 。
由于每个 TCP 连接都有独立的发送缓冲区和接受缓冲区,因此这个概念也叫全双工 。
TCP 常见问题
上面我们总结了 TCP 如果保证效率以及安全性,下面我们来看看关于 TCP 常见的问题及解决方案:
黏包问题
顾名思义,黏包问题是指数据传输到接收端时,接收端缓冲区看到的是一连串字节数据,无法区分哪一段属于一个完整的数据包 。
黏包问题产生的原因:
发送端发送数据时没有在数据包之间做区分接收端收到数据后不会提交到应用层处理,而是由应用层主动从缓冲区读取,当读取的速率小于写入的速率时,就可能造成黏包
由此可以看出,处理黏包问题的关键在于找到数据包之间的间隔,一般情况有有以下几种解决方案:
格式化数据:在数据包之间通过标识符来做分割,但需要特别注意数据中不能包含分割符 。发送长度:每次发送数据包是,在数据报头添加标识记录数据包的长度固定数据包的长度,每次读取固定长度的字节符号作为一个完整数据包断开问题总结
最后我们来回顾一下本篇都整理了哪些内容:
【TCP 协议如何保证性能】参考