当前位置: 首页 > article >正文

全栈杂谈第三期 我们用的网络协议是什么

TCP协议

引言

在我们使用互联网的每一天,像浏览网页、观看视频、发送邮件等操作,背后都有一个重要的协议在默默地保障数据的传输,它就是TCP(Transmission Control Protocol,传输控制协议)。它是互联网协议套件中的一个核心协议,主要负责在网络中实现可靠的数据传输。本文将通过通俗易懂的语言,带大家了解TCP协议的基本概念、工作原理、特点及应用场景。

基本概念

TCP协议是一种面向连接、可靠的传输层协议,它主要用于确保数据在复杂的网络环境中可以准确无误地传递到目标位置。与它并列的传输层协议是UDP(User Datagram Protocol,用户数据报协议),后者虽然速度快,但不保证数据的可靠性。因此,TCP协议广泛应用于对数据传输有严格要求的场景,比如网页浏览、文件传输等。

TCP协议的核心目标是确保数据在发送过程中即使出现丢包、乱序等问题,也能够最终按照正确的顺序、完整地到达接收方。

三大特点

  1. 面向连接:TCP是一个面向连接的协议,也就是说,在传输数据之前,通信双方需要先建立一条虚拟的连接。这有点像打电话,双方必须先通话连接成功,才能开始交流数据。这种连接在传输结束时需要明确关闭。
  2. 可靠传输:TCP通过多种机制来确保数据可靠传输。包括序列号、确认应答、超时重传等机制。简单来说,每次发送的数据段都会有一个序号,接收方在收到后会向发送方发送确认信息,如果没有收到确认信息,发送方会重新发送数据。
  3. 字节流服务:TCP协议将数据看作一连串的字节流,这样可以处理大文件的传输。即使数据被分成多个小段发送,接收方也能够将其重新组装为完整的数据。

工作原理

TCP协议为了确保数据可靠传输,采用了很多复杂的机制。我们以一个简单的例子来讲解TCP的整个工作流程。

假设你正在浏览一个网页,当你输入网址按下回车键后,浏览器会向服务器发送请求。这个请求的传输是通过TCP协议来完成的。

1. 三次握手(建立连接)

在正式发送数据之前,TCP需要建立一条可靠的通信通道。这一步通过“三次握手”完成。

  • 第一次握手:客户端发送一个SYN(Synchronize,同步)报文给服务器,表示客户端想要建立连接。
  • 第二次握手:服务器收到SYN报文后,回应一个SYN-ACK报文,表示同意连接请求,并且同时向客户端发送一个同步信号。
  • 第三次握手:客户端收到SYN-ACK后,再次发送一个ACK(Acknowledgment,确认)报文,确认通信建立成功。

通过这三步操作,TCP保证双方的连接建立是可靠的,并且双方的通信能力是正常的。

为什么需要三次握手TCP协议才能确定建立连接呢?

因为:

  1. 防止失效的连接请求突然又传送到了服务器端
    • 如果使用两次握手,客户端发送的连接请求在某些情况下可能会延迟,导致服务器端误认为客户端仍然想建立连接,从而打开一个不存在的连接。
  2. 确保双方的接收和发送通道都正常
    • 三次握手确保了客户端和服务器端的接收和发送通道都是开放的。第一次握手确认了客户端到服务器的通道是开放的;第二次握手确认了服务器到客户端的通道是开放的;第三次握手确认了客户端的接收通道也是开放的。
  3. 防止资源浪费
    • 如果只使用两次握手,服务器可能会在没有收到客户端确认的情况下就打开一个连接,这会导致服务器端浪费资源。
  4. 提高连接的可靠性
    • 三次握手确保了双方都准备好进行数据传输,从而提高了连接的可靠性。

通过这三次握手,TCP协议能够建立一个稳定可靠的连接,为后续的数据传输提供了保障。

2. 数据传输

在建立连接后,数据传输可以开始。TCP会将数据分成多个数据段,并为每个段分配一个序列号。当这些数据段通过网络传输到目标主机时,目标主机会根据序列号对数据进行重新排序。传输的过程中,接收方会给发送方发送ACK报文来确认数据段的接收。

如果某个数据段丢失或者发生了错误,接收方不会发送ACK,发送方在等待超时时间后会自动重传该数据段。通过这种机制,TCP确保了即使网络出现问题,数据也能被完整传输。

3. 四次挥手(断开连接)

当数据传输完成后,双方需要断开连接。这一步通过“四次挥手”完成。

  • 第一次挥手:客户端发送一个FIN(Finish,结束)报文,表示不再发送数据。
  • 第二次挥手:服务器收到FIN后,回应一个ACK,确认客户端的请求。
  • 第三次挥手:服务器向客户端发送一个FIN报文,表示自己也准备好断开连接。
  • 第四次挥手:客户端收到FIN后,回应一个ACK,表示连接断开。

通过四次挥手,TCP能够优雅地关闭连接,确保所有数据都被正确传输。

为什么需要四次挥手才能断开连接呢?

因为:

  1. 确保数据传输完成
    • 四次挥手确保了双方都能发送完它们所有的数据。在第一次挥手中,发起方通知对方它已经完成了数据发送。在第二次挥手中,接收方确认了这一点,并且可能还在发送自己的数据。
  2. 确保数据被接收
    • 在第三次挥手中,接收方通知发起方它也完成了数据的发送。在第四次挥手中,发起方确认了这一点。
  3. 防止数据丢失
    • 如果使用三次挥手,可能会在一方还有数据要发送时就关闭连接,导致数据丢失。
  4. 允许半关闭状态
    • TCP允许半关闭状态,这意味着一方可以停止发送数据,但仍然可以接收数据。四次挥手允许这种状态的存在。
  5. 确认双方的结束
    • 四次挥手确保了双方都明确表示了它们已经完成了数据的发送和接收。
  6. 防止连接过早关闭
    • 如果使用三次挥手,一方可能会在另一方还有数据要发送时关闭连接,导致数据丢失。

可靠性保障机制

TCP协议之所以能够提供可靠的数据传输,主要得益于以下几种机制:

1. 序列号与确认机制

TCP为每个数据段分配一个序列号,接收方在收到数据后会返回一个确认号(ACK)。通过序列号和确认号,发送方可以知道哪些数据已经被正确接收,哪些需要重传。

2. 超时重传

如果发送方在一段时间内没有收到接收方的确认信息(ACK),它会假设数据在传输过程中丢失或损坏,并重新发送数据段。这一机制可以有效应对网络不稳定导致的丢包问题。

3. 流量控制

TCP通过滑动窗口机制来控制数据的发送速率,避免发送方发送过多数据而使接收方处理不过来。窗口大小会根据网络状况进行动态调整,确保网络资源的充分利用,同时避免拥塞。

4. 拥塞控制

TCP具有多种拥塞控制算法,如慢启动、拥塞避免等。当网络出现拥塞时,TCP会主动减少数据的发送速率,避免网络进一步恶化。这也是为什么在网络较差的环境下,TCP仍然能维持一定的数据传输速度,而不是彻底中断。

应用场景

由于TCP的可靠性保障,它广泛应用于以下场景:

  1. 网页浏览(HTTP/HTTPS):当你访问一个网站时,浏览器会通过TCP与服务器建立连接,确保网页数据可以完整地传送到你的设备上。
  2. 文件传输(FTP):TCP的可靠性使得它成为文件传输协议(FTP)背后的核心传输协议,确保文件在传输过程中不会丢失或损坏。
  3. 电子邮件(SMTP/POP3/IMAP):无论是发送还是接收电子邮件,TCP都负责确保邮件内容的准确无误传输。
  4. 远程登录(SSH):在远程登录中,数据传输的正确性尤为重要,因此TCP被用于保障远程命令和响应的准确传递。

结语

TCP协议是互联网传输层的基石,它通过三次握手、序列号、确认机制、流量控制和拥塞控制等多种机制,确保了数据在不可靠的网络环境下也能实现可靠传输。虽然它的传输速度不如UDP,但在需要数据完整性和可靠性的场景下,TCP无疑是最佳选择。

无论是日常的网页浏览,还是重要的文件传输,TCP都在幕后默默工作,保障我们的网络体验。这就是TCP的魅力所在,它让复杂的网络世界变得简单而可靠。

欢迎关注公众号:“全栈开发指南针”
这里是技术潮流的风向标,也是你代码旅程的导航仪!🚀
Let’s code and have fun! 🎉


http://www.kler.cn/news/319413.html

相关文章:

  • 前端css样式覆盖
  • 我的AI工具箱Tauri版-MicrosoftTTS文本转语音
  • 24.9.23学习笔记
  • “永辉优品”会是中国零售的答案吗?
  • 通信工程学习:什么是WLAN无线局域网
  • Python 从入门到实战28(文件的读操作)
  • 从王卫在全球可持续交通高峰论坛上的发言,透视顺丰的变革逻辑
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第十集:制作后坐力系统Recoil和小骑士的生命系统和受伤系统
  • docker容器安装nginx
  • 如何在 Linux 中管理和清理日志文件( `find` 命令按时间批量删除日志)
  • Unity DOTS系列之Struct Change核心机制分析
  • 大模型-模型预训练-训练过程优化配置
  • 【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库
  • 克里金插值算法文件
  • react学习笔记一:react介绍
  • Linux:路径末尾加/和不加/的区别
  • C#版Halcon:HalconDotNet最详细最全面教程(万字详细总结)
  • 算法-回溯
  • 【java入门】JDK的下载安装与环境配置,最新最详细教程!
  • ubuntu错误GPG error: http://repo.mysql.com/apt/ubuntu noble InRelease
  • 01-ZYNQ linux开发环境安装,基于Petalinux2023.2和Vitis2023.2
  • Python pyppeteer 与playwright 模拟浏览器请求 部署服务器遇到的坑
  • php发送邮箱教程:如何实现邮件发送功能?
  • 算法记录——链表
  • 【Linux基础IO】深入解析Linux基础IO缓冲区机制:提升文件操作效率的关键
  • MySQL—存储过程详解
  • 望繁信科技受邀出席ACS2023,为汽车行业数智化护航添翼
  • vue3自动暴露element-plus组件的ref
  • C# 找到给定点集的简单闭合路径(Find Simple Closed Path for a given set of points)
  • 203. 移除链表元素