TCP 为什么采用三次握手和四次挥手以及 TCP 和 UDP 的区别

1. TCP 为什么采用三次握手和四次挥手

采用三次握手的原因:

  1. 确认双方的收发能力。第一次握手,客户端发送 SYN 报文,告诉服务器自身具备发送数据的能力,第二次握手,服务器回应 SYN + ACK 报文,表名自己既能发送数据也能接受数据,第三次握手,客户端发送 ACK 报文,确认自己也具备接受数据能力,以此来确保双方的收发能力处于正常情况。
  2. 防止失效连接请求干扰。如果客户端发送的连接请求因为网路延迟或其他原因停滞,之后客户端重新发送请求并成功建立连接,此时上一次停滞的连接请求到达服务器,如果服务器仅使用两次握手就建立连接,就会导致错误连接,通过三次握手,服务器收到延迟请求后回应,客户端并不知道这次回应是回应上次的消息,所以也不会向服务端发送 ACK 报文。
  3. 避免重复连接请求。如果没有第三次握手,客户端发送连接请求后未收到服务器响应而重发,服务器可能受到重复请求建立多个相同连接,造成资源浪费和混乱,第三次握手可以确认连接请求的唯一性。

采用四次挥手的原因:

  1. 全双工通信模式。由于 TCP 连接是全双工的,数据可在两个方向上同时传输,关闭连接时,每个方向的通信都需要单独关闭,所以需要双方分别发送 FIN 报文来通知对方自己不再发送数据了,再由对方发送 ACK 报文确认,这样另一端关闭时也需要向对方重复上述步骤,就是四次挥手。
  2. 确认数据完整传输。当一方发送 FIN 报文表示不再发送数据时,另一方可能还有数据没有发送完,接受 FIN 报文的一方先发送 ACK 确认,等到自身的数据发送完毕后,再发送 FIN 报文通知对方,这样就确保双方的数据都完整传输,避免数据丢失。
  3. 保证可靠的连接终止。每一次报文交互都是对对方关闭操作的确认,这种确认方式保证了连接关闭的可靠性和有序性,使双方都能明确连接的状态变化,正确释放与连接相关的资源。
  4. 等待时间保障。在第四次挥手中,最开始发送 FIN 报文的一方接收到对方的 FIN 报文并发送 ACK 后需要进入 TIME_WAIT 状态等待一段时间(通常为 2 倍的最大报文段寿命),这是为了确保对方能收到 ACK 报文,防止因为 ACK 丢失导致对方重发 FIN 报文,而这一方先结束了,也就保证了连接能够可靠的终止。

2. TCP 和 UDP 的区别:

  1. 连接方式:TCP 是有链接的协议(通信双方保存了通信对端的信息),UDP 是无连接的协议(没有保存)
  2. 可靠性:TCP 提供可靠的数据传输,通过确认应答,超时重传等机制来确保数据的完整性和准确性,如果说发送方发送的数据没有被接收方正确接收,发送方就会重新发送数据。UDP 则不提供可靠的数据传输,不会关心发送的数据是否被正确接收
  3. 传输效率:TCP 相对与 UDP 来说效率较低
  4. 传输的大小:TCP 传输是面向字节流的,UDP 传输是面向数据报的,传输的单位就不是字节了,一次发送 / 接收完整的数据报
  5. TCP 支持全双工(一个通信链路可以发送数据,也可以接收数据),UDP 支持全双工和半双工(一个通信链路只能发送/接收)
相关推荐
ipooipoo118813 小时前
动态住宅IP的定义、核心优势与技术场景应用
网络·网络协议·tcp/ip
祁鱼鱼鱼鱼鱼13 小时前
Keepalived实验环境设定
linux·服务器·网络
滴水之功13 小时前
OpenWrt的WAN和LAN的切换
linux·网络·openwrt
莹莹学编程—成长记15 小时前
预备知识socket
网络
winfreedoms15 小时前
java-网络编程——黑马程序员学习笔记
java·网络·学习
零基础的修炼15 小时前
Linux网络---网络层
运维·服务器·网络
开开心心就好15 小时前
键盘改键工具免安装,自定义键位屏蔽误触
java·网络·windows·随机森林·计算机外设·电脑·excel
旖旎夜光16 小时前
Linux(13)(上)
linux·网络
郝学胜-神的一滴16 小时前
深入解析Linux网络编程之bind函数:从基础到实践的艺术
linux·服务器·网络·c++·websocket·程序人生
pythonchashaoyou16 小时前
静态住宅ip是什么,静态住宅IP选型全解
网络·网络协议·tcp/ip