TCP 是传输层协议, 对应 OSI 网络模型的第四层传输层, 特点如下.
TCP 协议是基于链接的, 也就是传输数据前需要先建立好链接, 然后再进行传输.
TCP 链接一旦建立, 就可以在链接上进行双向的通信.
TCP 的传输是基于字节流而不是报文, 将数据按字节大小进行编号, 接收端通过 ACK 来确认收到的数据编号, 通过这种机制, TCP 协议能够保证接收数据的有序性和完整性, 因此 TCP 能够提供可靠性传输.
TCP 还能提供流量控制能力, 通过滑动窗口来控制数据的发送速率. 滑动窗口的本质是动态缓冲区, 接收端根据自己的处理能力, 在 TCP 的 Header 中动态调整窗口大小, 通过 ACK 应答包通知给发送端, 发送端根据窗口大小调整发送的的速度.
仅仅有了流量控制能力还不够, TCP 协议还考虑到了网络问题可能会导致大量重传, 进而导致网络情况进一步恶化, 因此 TCP 协议还提供拥塞控制. TCP 处理拥塞控制主要用到了慢启动, 拥塞避免, 拥塞发生, 快速恢复四个算法, 感兴趣的同学可以进一步了解.
1. TCP 协议问题, 例如特定场景下 Nagel 和 ACK 延迟机制配合使用可能会出现 delay40ms 超时后才回复 ACK 包的问题.
2. 3 次握手
3. 4 次挥手
4. SYN 洪水攻击
SYN 洪水攻击发生的原因, 就是 Server 端收到 Client 端的 SYN 请求后, 发送了 ACK 和 SYN, 但是 Client 端不进行回复, 导致 Server 端大量的链接处在 SYN_RCVD 状态, 进而影响其他正常请求的建连. 可以设置 tcp_synack_retries = 0 加快半链接的回收速度, 或者调大 tcp_max_syn_backlog 来应对少量的 SYN 洪水攻击