1.面向字节流:
-
创建一个TCP的socket,会在网络中同时创建一个发送缓冲区和接受缓冲区。
-
刚开始会将数据写入发送缓冲区。若数据太短,则在发送缓冲区中等待,等到合适时机会将合适大小的数据以字节流的形式发送出去;若数据太长,则进行拆分,然后发送。
-
由于TCP是全双工的,所以读写数据时没有限制,可以一次性接受所有数据;也可以每次接收一点,分多次接收。
TCP面向字节流的特点是:传输灵活,但是存在粘包问题。
2.粘包问题:
-
什么是粘包问题?
TCP传输的数据在发送缓冲区或接收缓冲区中堆积,因为TCP收发的灵活性,可能导致多条数据被当做一条数据接收。简单来说,就是两条数据的黏连。
-
本质原因:TCP在传输层对数据的格式并不关心,所以每条数据之间没有明显的边界区分,这样会造成粘包问题。
-
解决方案:需要用户在应用层对数据进行边界管理
- 特殊字符间隔:对于定长数据,在包与包之间采用明显的特殊字符间隔,HTTP就采用这样的方法。
- 定长数据:每次按照数据长度大小读即可。
- 对于不定长数据,可以在应用层协议头中显式声明数据长度,这是最佳的方案,UDP协议就采用这种方案。
3.TCP连接管理中的保活机制:
- 若是通信双方,长时间(7200s)没有数据往来,则会向对方发送一个保活探测包,要求对方对这个包进行回复;