0%

tcp-faq

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 洪水攻击