计算机网络--TCP和UDP学习

简介: TCP与UDP区别:TCP是可靠、面向连接的协议,保证数据有序不丢包,适用于HTTP、FTP等;UDP轻量、无连接,实时性高,适用于视频、游戏等。主要差异体现在连接方式、可靠性、速度、头部大小及应用场景。

TCP 和 UDP 有什么区别?

TCP:提供了可靠、面向连接的传输,适用于需要数据完整性和顺序的场景

UDP:提供了更轻量、面向报文的传输,适用于实时性要求高的场景

区别总结:

对比项 TCP UDP
连接方式 面向连接(三次握手、四次挥手) 无连接(直接发)
是否可靠 ✔ 保证可靠、有序、不丢包 ❌ 不保证
性能 慢(需要确认、重传) 快(无握手、无重传)
是否有头部 20~60 字节 8 字节
适合数据大小
传输方式 字节流 报文(Datagram)
是否有流量控制 ✔ 有(滑动窗口) ❌ 无
是否有拥塞控制 ✔ 有 ❌ 无
是否可广播 ❌ 不支持 ✔ 可广播、多播
常用场景 HTTP、FTP、数据库通信 视频、直播、游戏、物联网

TCP三次握手

三次握手主要是为了确定双方都有接收和发送的能力

简要步骤:

  1. 客户端:SYN
  2. 服务端:SYN + ACK
  3. 客户端:ACK

TCP 三次握手图示:

客户端首先发送一个同步序列号(SYN)消息给服务器,服务端回复一个SYN-ACK消息,最后客户端再发送一个ACK确认消息给服务端,确认已经收到服务端发来的SYN-ACK消息

img

步骤解释:

  • 客户端通过 SYN 控制消息并携带自己期望的初始序列号 SEQ 给服务端
  • 服务端收到 SYN 消息之后,通过 ACK 控制消息以及 SEQ + 1 来进行确认并带上自己的 SEQ
  • 客户端通过 ACK 控制消息以及服务端的 SEQ + 1 来进行确认,并且还能够在第三方握手通信的时候,直接携带数据进行传输

为什么要三次握手?

主要有两个原因:

  1. 避免历史错误连接建立,减少双方不必要的资源消耗
  2. 帮助通信双方同步序列号

为什么三次就能阻止错误连接?

因为网络请求比较复杂,发送方第一次发送请求后,可能由于网络原因被阻塞住了,此时发送方可能又会再次发送请求。

1)如果只有两次握手,那么接收方对于发送方的请求只能接受或者拒绝,同时接收方无法识别发送方发送的这个请求是旧的还是新的请求,如下图所示:

img

2)如果网络阻塞时间较长,发送方可能多次发送请求,且接收方还可能全部接受这些连接(它不清楚,以为都是有效的),这就造成了不必要的资源浪费

img

因此三次握手,多了一次发送方确认接收方接受的连接是否争取的验证过程,所以避免了历史重复连接的错误情况。

帮助通信双方同步序列号

因为网络本身不稳定,可能会导致:

  1. 数据重复传输
  2. 数据乱序
  3. 数据丢失

然而,因为TCP是一个可靠的传输协议,可以保证数据在传输过程不丢失且有序,所以对于上述问题在TCP中引入序列号,使得:

  • 接收方可以根据序列号去重
  • 接收方可以根据序列号排序
  • 发送方针对为接收到 ACK 的序列号对应的数据包,可以重传

序列号是有序的,因此在通信过程中,需要同步序列号,那么如何同步?

img

中间一步合并的优点在于:接收方告知发送方收到序列号的同时还可以把自己的序列号告知发送方

TCP四次挥手

四次挥手主要目的为了确保数据全部传输完成

简要步骤:

  1. 客户端:FIN
  2. 服务端:ACK
  3. 客户端:FIN
  4. 服务端:ACK(进入TIME_WAIT)

TCP 四次挥手图解:

img

  1. 第一次挥手(FIN -> ACK):客户端主动关闭连接,发送 FIN 包,进入 FIN_WAIT_1 状态。服务器收到 FIN 后,表示不再接收数据,但仍可能继续发送数据
  2. 第二次挥手(ACK):服务器发送 ACK 包,确认已收到 FIN,此时服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
  3. 第三次挥手(FIN -> ACK):服务器完成所有数据传输后,发送 FIN 包,进入 LAST_ACK 状态。客户端收到 FIN 后,准备关闭连接。
  4. 第四次挥手(ACK):客户端发送最后一个 ACK 包,进入 TIME_WAIT 状态,等待可能迟到的 FIN 包,服务器收到 ACK 后,关闭连接,进入 CLOSED 状态。客户端在 TIME_WAIT 计时结束后(2MSL),正式关闭连接。

Client 为什么要进入 TIME_WAIT ?

Client 进入**TIME_WAIT**是为保证所有数据安全接受,防止延迟的FIN包影响新连接的完整性,避免出现混淆问题。

为什么挥手需要四次?

主要是为了确保数据完整性

TCP 是一个全双工协议,也就是说双方都要关闭,每一方都向对方发送 FIN 和回应 ACK。

客户端发起连接断开,代表客户端没数据要发送的,但是服务器可能还有数据没有返回给客户端。

就像我对你说数据发完了,你收到之后回复说好的收到,然后你再对我说你数据发完了,我收到之后也回复你说好的收到。这样才能保证数据不会丢失

如果我说数据发完了,你收到之后说确认收到,但不说数据是否发完了,那我收到确认之后就会离开,而你的还没发完的数据就发不了了,那就会造成数据不完整性

一个FIN+ACK 代表一方的数据发送完了,我们有两个端就需要两个 FIN+ACK,也就是四次通信

挥手可以三次吗?

可以,不一定都是四次,也可以是三次。

主要发生在:

如果 Client 发送 FIN 给 Server 的时候 Server 已经没有数据发送给 Client,那么Server 就可以将 FIN 和 ACK 一起发送给 Client 了,那么四次挥手就可以变成三次挥手。

img

The end......

相关文章
url参数值中有+、空格、%20、%2b
url参数值中有+、空格、%20、%2b
1460 0
|
存储 API
一种新的方法来存储用户信息——ThreadLocal
一种新的方法来存储用户信息——ThreadLocal
1755 0
|
3月前
|
缓存 前端开发 API
登录校验---Filter过滤器
Filter是JavaWeb三大组件之一,用于拦截请求并实现登录校验、编码处理等功能。通过`doFilter()`方法实现过滤逻辑,支持配置拦截路径与过滤器链。常用于JWT令牌验证、跨域处理等场景。
431 10
登录校验---Filter过滤器
|
Arthas 监控 Java
Java 诊断利器 Arthas使用
Java 诊断利器 Arthas使用
4193 0
|
2月前
|
Java 开发者
Java高级技术深度解析:性能优化与架构设计
本文深入解析Java高级技术,涵盖JVM性能调优、并发编程、内存模型与架构设计。从G1/ZGC垃圾回收到CompletableFuture异步处理,剖析底层机制与实战优化策略,助力构建高性能、高可用的Java系统。
226 47
|
11月前
|
开发工具 git 开发者
vscode+git解决远程分支合并冲突
通过这些详细步骤,您可以掌握如何使用VSCode和Git高效地解决远程分支合并冲突,提高开发效率和代码质量。希望这些内容对您的学习和工作有所帮助。
2548 86
|
安全
SFX的妙用——如何在不安装软件的情况下打开自定义格式文件?
【8月更文挑战第31天】SFX(自解压文件)能在无需安装特定软件的情况下打开自定义格式文件。通过将所需程序与资源打包进 SFX 文件,用户可轻松解压并运行文件。此方法需确定所需程序、创建 SFX 文件并分发给用户,同时需注意合法性、兼容性和安全性问题,以确保文件正常且安全地运行。这为用户提供了便捷的解决方案。
848 7
|
存储 消息中间件 NoSQL
每日大厂面试题大汇总 —— 今日的是“京东-后端开发-一面”
文章汇总了京东后端开发一面的面试题目,包括ArrayList与LinkedList的区别、HashMap的数据结构和操作、线程安全问题、线程池参数、MySQL存储引擎、Redis性能和线程模型、分布式锁处理、HTTP与HTTPS、Kafka等方面的问题。
547 0
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧

热门文章

最新文章