TCP/UDP 简介,三次握手与四次挥手

发布于:2025-02-16 ⋅ 阅读:(31) ⋅ 点赞:(0)

一、TCP 三次握手

目的:为了解决在不可靠的信道上建立可靠的网络连接
三次握手是连接请求的过程:
A 发送连接请求的数据给 B(发送 SYN 包)
B 同意连接,返回数据给 A(返回 SYN+ACK 包)
A 收到后回复数据给 B(返回 ACK 包),连接建立

以上过程不区分客户端和服务端,tcp 的连接是全双工的。两端均采用上述机制。

Q:为什么不是两次握手?

因为在不可靠的网络上可能会存在传输问题,
比如 A 的第一次连接请求没有到 B(网络滞留),又发送了一次连接请求;
B 收到了第二次的连接请求,这时建立起一条通信;
A 建立了一条通信,当第一次的请求到 B 以后,B会再次建立一条通信;
此时 B 有两条通信,造成了状态不一致

Q:一包数据被拆成多包发送,如何处理丢包问题?这些数据包到达的时间不同,如何处理乱序问题?

针对以上问题,
tcp 为每一个连接建立起一个发送缓冲区【0.1.2…N】
发送数据时,A 取一部分数据组成发送报文(在这个报文中会附带 序列号 + 长度)
B 在收到数据后,需要回复确认报文 ACK = 序列号 + 长度,也就是下一包的起始序列号
这样 A 可以分多段发送数据给 B,B 只需要返回一次报文确认即可
如果数据中有丢失的数据,则 B 端会返回报文要求 A 端重发,B 端会处理乱序问题

二、什么是四次挥手

处于连接状态的客户端和服务端,都可以发起关闭连接请求。
A 想主动结束连接,需要向 B 发送一次请求(FIN包),进入终止等待1状态(第一次挥手)
B 收到后,返回一个 ACK 包,进入关闭等待状态,A进入终止等待2状态(第二次挥手)
AB 此时还可以发送数据,B在数据接收完以后,返回 FIN 包,B进入关闭等待状态(第三次挥手)
A 收到关闭信息后返回 ACK 包,并且进入超时等待状态,超时后关闭连接,B收到信息后回立即关闭连接(第四次挥手)

Q:为什么A需要等待超时连接?

这是为了保证 B 已经收到 ACK 包(第四次挥手),一旦ACK包在网络中丢失,B会一直停留在最后确认状态;
如果 B 此时没有收到A发送来的 ACK 包,会重发 FIN包(三次挥手时机)
客户端会响应这个 FIN 包,并且重发 ACK 包,并刷新超时时间
这个机制也是为了保障在不可靠的网络中进行连接断开确认

什么是 UDP 协议?

UDP 协议是直接将一组数据通过网卡发送出去,不需要连接,所以是无状态的;同时性能损耗小,资源占用少,缺点是稳定性弱。

区别对比
稳定性 资源占用 速度 应用场景
TCP 稳定 较多 相对较慢 传输文件、发送邮件、浏览网页等
UDP 弱(无状态) 快(存在丢包风险) 域名查询、语音、视频通话、直播场景等
UDP还用于隧道网络(例如 VPN、SDN 中的 VXLAN)
三次握手:

A: 上号
B:ok
A:等你

四次挥手:

A:分手吧
B:好
B:再见
A:拜