tcp协议
TCP和UDP协议的核心原理和区别
TCP:全称是 Transmission Control Protocol,中文翻译为传输控制协议。
UDP:全称是 User Datagram Protocol,中文翻译为用户数据报协议。
1. 连接类型和服务对象
这决定了通信双方在“开聊”之前要做什么,以及能和谁聊。
- TCP(面向连接):
- 连接类型:必须通过“三次握手”建立逻辑连接。通信结束后,还需“四次挥手”断开。
- 服务对象:它是端到端的,即点对点通信。一旦连接建立,就是两个特定 IP/端口之间的独占通道。
- UDP(无连接):
- 连接类型:完全无连接。想发就发,不需要预先建立任何关系。
- 服务对象:支持一对一、一对多(广播)、多对一和多对多(组播)。它更像是一个大喇叭,谁都能听,谁都能喊。
2. 首部(Header)
这决定了协议的“管理成本”和传输效率。
- TCP(臃肿但功能全):
- 长度:最小 20 字节,如果包含选项字段会更长。
- 内容:包含序列号、确认号、各种标志位(SYN/ACK/FIN)、窗口大小等。这些复杂的字段都是为了确保“可靠传输”。
- UDP(简洁精悍):
- 长度:固定为 8 字节。
- 内容:只包含四个字段:源端口、目的端口、长度和校验和。这让它的处理速度极快,开销极低。
3. 可靠性与传输方式
这是两者最本质的区别。
- TCP(可靠的字节流):
- 可靠性:通过确认应答(ACK)、超时重传、丢包检测来保证数据不丢失、不重复、且按序到达。
- 传输方式:面向字节流。TCP 不管你应用层发的是什么,它把数据看成一串流。它可能会把你的大报文拆开,也可能把几个小报文合并。
- UDP(不可靠的报文):
- 可靠性:尽力而为。不保证送达,也不保证顺序。丢了就丢了,UDP 本身不负责重传。
- 传输方式:面向报文。你给它一个 500 字节的包,它就原封不动打上头发出去,保留了报文的边界,不会进行拆分或合并。
4. 流量控制和拥塞控制
这决定了协议如何应对网络环境的变化。
- TCP(智能管家):
- 流量控制:通过“滑动窗口”机制,根据接收方的处理能力动态调整发送速度,防止把对方“淹没”。
- 拥塞控制:当网络出现拥堵时,TCP 会通过慢启动、拥塞避免等算法主动降低发送速率。它有很强的自我约束和适应能力。
- UDP(热血青年):
- 控制机制:完全没有。网络堵不堵、对方收不收得下,UDP 全然不理。它只会按应用层要求的速度拼命发。这种特性在网络差时可能导致严重的丢包,但也保证了实时性。
5. 应用场景
基于上述特性,它们的应用领域泾渭分明。
| 协议 | 适用核心需求 | 典型应用 |
|---|---|---|
| TCP | 准确性第一,宁慢勿错 | 浏览器(HTTP/HTTPS)、文件传输(FTP)、邮件(SMTP)、远程登录(SSH) |
| UDP | 速度/实时性第一,允许少量错误 | 视频会议(Zoom/WeChat)、在线直播、实时竞技游戏、域名解析(DNS) |
TCP三次握手和四次挥手
理解 TCP 的“三次握手”和“四次挥手”,本质上是理解两个终端如何在不可靠的网络环境下,建立并优雅地释放一个可靠的双工(双向)通道。
1. 三次握手(建立连接)
目的是确认双方的收发能力都正常,并交换初始序列号(ISN)。
- 第一次握手 (SYN):客户端发送一个
SYN包(序列号为 x)给服务端。- 潜台词:客户端说:“我想和你建连,这是我的初始序列号。”
- 第二次握手 (SYN + ACK):服务端收到后,回传一个
SYN包(序列号为 y)和ACK包(确认号为 x + 1)。- 潜台词:服务端说:“收到!我同意建连,这是我的序列号,我也确认收到你的了。”
- 第三次握手 (ACK):客户端再回传一个
ACK包(确认号为 y + 1)。- 潜台词:客户端说:“收到!那我们正式开始传数据吧。”
为什么要三次?
为了防止“已失效的连接请求报文”突然又传到了服务端。如果只有两次握手,服务端一响应就建立连接,那么旧的重复请求会导致服务端浪费资源去维持一个根本不存在的连接。
2. 四次挥手(释放连接)
由于 TCP 是全双工的,断开连接时需要双方都确认“我没数据要发了”。
- 第一次挥手 (FIN):客户端发一个
FIN包给服务端。- 状态:客户端进入
FIN_WAIT_1,表示客户端不再发数据了。
- 状态:客户端进入
- 第二次挥手 (ACK):服务端回一个
ACK。- 状态:服务端进入
CLOSE_WAIT。此时连接处于半关闭状态,服务端可能还有没发完的数据。
- 状态:服务端进入
- 第三次挥手 (FIN):服务端发完最后的数据,发送
FIN包给客户端。- 状态:服务端进入
LAST_ACK。
- 状态:服务端进入
- 第四次挥手 (ACK):客户端收到后,回一个
ACK,然后进入TIME_WAIT状态。- 状态:经过 2MSL(最长报文段寿命)时间后,客户端正式关闭。
参考资料
【神奇的滑动窗口 | TCP流量控制】 https://www.bilibili.com/video/BV1sQXDYREwP/?share_source=copy_web&vd_source=5e54f7845fd2cf2828efb1bae2286590
【“我为人人,人人为我”的TCP拥塞控制】 https://www.bilibili.com/video/BV1jWS7BeEX5/?share_source=copy_web&vd_source=5e54f7845fd2cf2828efb1bae2286590