一. TCP和UDP的区别
-
可靠性
TCP:✅ 可靠传输(三次握手 + 重传机制)
UDP:❌ 不可靠(可能丢包)
-
连接方式
-
TCP:面向连接(需建立/断开连接)
-
UDP:无连接(直接发送数据包)
-
-
传输效率
-
TCP:慢(需保证可靠性)
-
UDP:快(无额外控制开销)
-
-
适用场景
-
TCP:文件传输(FTP)、邮件、网页(HTTP)
-
UDP:实时视频、在线游戏、直播(DNS、VoIP)
-
⚡ 核心结论
-
要可靠 → TCP(牺牲速度保数据完整)
-
要速度 → UDP(牺牲可靠保实时性)!
二. TCP通信如何保证通信的可靠性?
🔥 TCP可靠性极简核心机制
-
数据分段与重组
→ 按序切割数据包,接收端按序列号重组,确保顺序正确。 -
确认应答(ACK)
→ 接收方每收一包必回ACK,未收到ACK则触发重传。 -
超时重传
→ 动态计算超时时间,ACK超时自动重发,直到确认成功。 -
流量控制(滑动窗口)
→ 窗口大小动态调整,匹配接收方处理能力,防数据堆积。 -
拥塞控制
→ 慢启动 + 拥塞避免 + 快速恢复,动态降速防网络过载。 -
数据校验和
→ 每包计算校验和,校验失败则丢弃并重传,确保数据完整。 -
连接管理
→ 三次握手建连(防半开连接) + 四次挥手断连(保数据传完)。 -
序列号机制
→ 包头含唯一序列号,识别丢失/重复包,保证数据不丢不乱。
⚡ 终极目标
所有机制协同 → 数据不丢失、不重复、不乱序,实现可靠传输!
一句话总结:TCP靠 ACK重传保到达、滑动窗口控流量、拥塞算法防堵网、校验序列保完整!
三. TCP为什么是三次握手?
目标:确保双方发送和接收能力正常,防止失效请求误触发连接。
流程图:
步骤核心:
-
第一次握手(SYN):客户端发起连接,证明客户端发送能力正常。
-
第二次握手(SYN+ACK):服务端确认收到并同意连接,证明服务端收发能力正常。
-
第三次握手(ACK):客户端确认服务端响应,证明客户端接收能力正常。
⚡ 本质:三次握手后,双向通信通道确认可靠!
四. 为什么是四次挥手?
目标:全双工通信需双方独立关闭通道,确保数据传完且无残留。
流程图:
步骤核心:
-
第一次挥手(FIN):客户端关闭发送通道(仍可接收数据)。
-
第二次挥手(ACK):服务端确认关闭请求,但可能继续发送剩余数据。
-
第三次挥手(FIN):服务端数据发完后关闭发送通道。
-
第四次挥手(ACK):客户端确认,双方彻底断开连接。
⚡ 本质:全双工需独立关闭,四次保证双方数据传完且无残留!
五. TCP两次握手可能引发的问题
-
资源浪费与半开连接
-
问题:若客户端首次SYN因网络延迟未到达服务器,客户端超时重发SYN并完成两次握手。当延迟的SYN最终到达时,服务器误认为新连接请求,分配资源等待数据 → 资源浪费。
-
结果:服务器维护大量无效半开连接,消耗内存和端口资源。
-
-
无法防止历史连接干扰
-
问题:客户端因网络波动发送多个SYN,旧的SYN可能延迟到达服务器。两次握手下,服务器会接受所有SYN请求,导致重复建立连接。
-
结果:同一端口多连接竞争,数据包错乱或覆盖。
-
-
双向通信能力未完全确认
-
问题:两次握手仅确认了客户端→服务器的发送能力和服务器→客户端的收发能力,但未验证客户端←服务器的接收能力。
-
结果:客户端可能未正确接收服务器的初始数据,导致丢包或乱序。
-
-
无法抵御SYN洪泛攻击
-
问题:攻击者伪造大量SYN请求,服务器仅需两次握手即分配资源 → 服务器资源耗尽。
-
对比三次握手:第三次ACK需客户端真实响应,过滤无效请求。
-
⚡ 核心结论:三次握手通过双向能力验证 + 序列号同步,解决两次握手的资源泄露、历史连接干扰及安全性缺陷,确保可靠连接建立。
注:文章随手记录,如有错误,评论区交流