一、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:拜