TCP传输控制协议
面向字节流
- TCP的一个连接,既有发送缓冲区,也有接收缓冲区,对于这个连接,既可以读数据,也可以写数据:
调用write时,数据会先写入发送缓冲区中;如果发送的字节数太长,会被拆分成多个TCP的数据包发出;如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者其他合适的时机发送出去;
接收数据的时候,数据也是从网卡驱动程序到达内核的接收缓冲区;然后应用程序可以调用read从接收缓冲区拿数据; - 由于缓冲区的存在,TCP程序的读和写不需要一一匹配。
粘包问题
- 什么是? 应用层多读或者少读数据,导致其它数据包无法被使用的情况;
- 如何解决? 要明确两个包之间的界限:定长报文、特殊字符、自描述+定长报文、自描述+特殊字符;
- 基于tcp的应用层协议可能会存在粘包问题,因为tcp是面向字节流的;udp不存在粘包问题,其使用定长报头+自描述的形式,把数据报一个一个的交付给应用层。
TCP异常情况
- 进程终止:进程终止会释放文件描述符,仍然可以发送FIN,和正常关闭没有什么区别;
- 机器重启:和进程终止的情况相同;
- 机器掉电/网线断开:接收端认为连接还在, 一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset; 即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在, 如果对方不在, 也会把连接释放。
TCP既要保证可靠性、又要提高性能
- 保证可靠性:检验和、序列号、确认应答机制、超时重传机制、连接管理机制、流量控制、拥塞控制;
- 提高性能:滑动窗口、快重传、延迟应答、捎带应答。
本文围绕TCP展开,介绍其面向字节流的特性,即数据读写通过缓冲区,读写无需一一匹配。还阐述了粘包问题的定义与解决办法,分析了TCP的异常情况及处理方式。同时说明了TCP保证可靠性和提高性能的机制,如检验和、滑动窗口等。

被折叠的 条评论
为什么被折叠?



