TCP和UDP的原理及其区别(三次握手、四次挥手)

 TCP和UDP都是在传输层上工作的协议,用于在网络中传输数据。

1、TCP和UDP之间的区别

        TCP和UDP的主要区别在于它们提供的服务和特性。TCP提供可靠的、有序的、基于连接的数据传输,适用于对数据完整性和可靠性要求较高的应用(邮件、短信)。UDP提供不可靠的、无序的数据传输,适用于对实时性要求较高的应用(视频通话)。选择使用TCP还是UDP取决于应用的需求和优先级,需要权衡数据的可靠性、延迟和带宽利用率等因素。

TCP比作是打电话:必须要对方接通才能进行通话,最后进行挂断。

UDP比作写信:只管将要写的内容写入信中发出去,不管对方是否收到,内容是否被篡改等等。

2、TCP连接的工作流程:

        TCP是一种面向连接的协议,TCP通过建立一个连接,确保数据包的可靠传递和按顺序接收。它使用序列号、确认和重传等机制来保证数据的准确传输。TCP还提供流量控制、拥塞控制和错误恢复等功能,以确保数据的完整性和可靠性。缺点就是他比起UDP来说消耗的性能更多,速度更慢。

2.1建立连接:

       

  1. 第一步:客户端向服务器发送一个带有SYN(同步)标志的TCP报文段,表示请求建立连接。
  2. 第二步:服务器收到客户端的请求后,向客户端发送一个带有SYN/ACK(同步/确认)标志的TCP报文段,表示同意建立连接。
  3. 第三步:客户端收到服务器的响应后,再向服务器发送一个带有ACK(确认)标志的TCP报文段,表示连接已建立。

为什么要进行三次握手呢,而不是两次握手就建立连接呢?

        这是因为网络通信的不可靠性,假设一种情况,当客户端给服务端发送第一个SYN包,然后因为网络拥堵,没发到服务端,此时客户端又发了一个SYN包给服务端,服务端接到建立连接的请求,就给客户端发送SYN/ACK包,此时建立了连接,突然之前第一个SYN包发到了服务端,则服务端以为客户端又要建立一个连接请求,则给客户端发送SYN/ACK包,建立了第二条请求。

此时情况就是服务端以为和客户端建立了两条请求,而客户端这边认为只建立了一条请求,则服务端那边有一条连接一直接收不到数据,如果有第三次握手就不会出现这种情况了。

2.2数据传输

TCP协议通过一些机制来处理乱序问题和丢包问题,确保数据的可靠传输。

  • 序列号和确认机制:TCP在每个数据包中使用序列号来标识数据的顺序。接收方收到数据包后,会发送一个确认(ACK)消息,其中包含下一个期望接收的序列号。如果发送方收到确认消息,就知道数据已经成功传输,如果没有收到确认消息,发送方会重新发送数据。

  • 重传机制:如果发送方没有收到确认消息,或者接收方在一定时间内没有收到数据包,TCP会触发重传机制。发送方会重新发送丢失的数据包,确保数据的可靠传输。

  • 滑动窗口机制:TCP使用滑动窗口机制来控制发送方发送数据的速率。接收方会告诉发送方它的接收窗口大小,发送方根据接收窗口大小来发送数据。如果接收方的窗口大小变小,发送方会相应地减少发送的数据量,以避免数据的丢失。

  • 接收方缓冲区:接收方使用缓冲区来存储接收到的数据。如果数据包乱序到达,接收方会根据序列号将数据包重新排序,排序后如果发现某个包丢失会发送请求给发送端,请求他重发这段数据,待数据整合完毕。然后交付给应用程序。

通过这些机制,TCP可以有效地处理乱序问题和丢包问题。它确保数据的有序传输,并通过重传机制和滑动窗口机制来保证数据的可靠性。接收方的缓冲区可以处理乱序到达的数据包,确保数据按正确的顺序交付给应用程序。这些机制使得TCP成为一种可靠的传输协议。TCP是全双工的,所以客户端和服务端都可能是数据的接收方和发送方。

2.3四次挥手

  1. 第一步:客户端发送一个带有FIN(结束)标志的TCP报文段给服务器,表示客户端不再发送数据,但仍然可以接收数据。
  2. 第二步:服务器收到客户端的结束请求后,向客户端发送一个带有ACK(确认)标志的TCP报文段,确认收到了结束请求。服务器仍然可以发送数据给客户端。此时服务端处理之前未处理完的数据。
  3. 第三步:当服务端数据处理完毕,也可以关闭时,发送一个带有FIN标志的TCP报文段给客户端,表示服务器不再发送数据。
  4. 第四步:客户端收到服务器的结束请求后,向服务器发送一个带有ACK标志的TCP报文段,确认收到了服务器的结束请求。服务端马上进入了CLOSED状态,客户端等待超时时间后再进入CLOSED状态,连接成功关闭。

为什么客户端在发送ACK(最后一次挥手)后还要进行等待一段时间才正式关闭? 

        这也是因为不稳定网络通信。当客户端接收到服务端的FIN包时,会给服务端发送最后的ACK,此时这个ACK又因为某些因素没发送到服务端,服务端在等待一段时间后没有收到客户端的正式关闭连接的信息ACK包,就会再次给客户端发送FIN包。所以让客户端最后再等待超时时间,是为了看看还会不会收到这个FIN,如果再次收到,则会给服务端重发ACK包,刷新超时等待时间。

3、UDP连接的工作流程:

        UDP的工作流程是简单的。UDP是一种无连接的协议,UDP将数据分割成数据报,每个数据报都是独立的,没有建立连接的过程。发送方将数据分割成数据报并直接发送给目标地址,接收方监听指定的端口号并等待数据报的到达。UDP不提供可靠性保证,数据报可能会丢失、重复或乱序到达。UDP的优势在于它的简单性和低延迟性,适用于那些对实时性要求较高的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166248.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见面试题-Redis专栏(二)

theme: cyanosis typora-copy-images-to: imgsRedisson 分布式锁?在项目中哪里使用?多久会进行释放?如何加强一个分布式锁? 答: 首先入门级别的分布式锁是通过 setnx 进行实现,使用 setnx 实现有四个注意…

学生学徒作品分享——金融大模型-房屋租金价格影响因素分析与预测

金融大模型-房屋租金价格影响因素分析与预测项目背景 广州作为中国最发达的城市之一,每年都吸引大量务工人员前来就业,而租房是他们需要解决的最大问题之一,各地区租房需求日益增长。在租房过程,价格、交通是重要的考虑因素&a…

LabVIEW中管理大型数据

LabVIEW中管理大数据 LabVIEW的最大优势之一是自动内存管理。这种内存管理允许用户轻松创建字符串、数组和集群,而无需C/C用户经常担心。但是,这种内存管理设计为绝对安全,因此数据被非常频繁地复制。这通常不会造成任何问题,但是…

Python--循环中的两大关键词 break 与 continue

在Python循环中,经常会遇到两个常见的关键词:break 与 continue break:代表终止整个循环结构 continue:代表中止当前本次循环,继续下一次循环 break: 英 /breɪk/ v. 打破,打碎&#xff0c…

asp.net企业招聘管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 企业招聘管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语 言开发 asp.net企业招聘管理系统 二、功…

【LeetCode】94. 二叉树的中序遍历 [ 左子树 根结点 右子树 ]

题目链接 文章目录 Python3方法一: 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二: 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三: Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯ C…

库的操作【MySQL】

文章目录 创建数据库字符集和校验规则概念分类例子 查看数据库显示创建语句修改数据库删除数据库备份和恢复备份恢复 创建数据库 SQL: CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name];其中,大写的单…

ubuntu 18.04 开机自启 打开终端执行脚本

一 打开设置开机自启配置程序 alt F2 输入 gnome-session-properties 或 终端输入 gnome-session-properties 二 添加开机自启配置 点右方的add加入 填写名称,可自定义 填写指令,即开机想要执行的指令 gnome-terminal -x bash -c “ls; exec bash” …

SpringBoot(二)集成 Quartz:2.5.4

Quartz是一个广泛使用的开源任务调度框架,用于在Java应用程序中执行定时任务和周期性任务。它提供了强大的调度功能,允许您计划、管理和执行各种任务,从简单的任务到复杂的任务。 以下是Quartz的一些关键特点和功能: 灵活的调度器…

Oracle的立场:官网更换首页与以色列站在一起

Oracle公司的官网,更换了首页内容,明确表明立场:Oracle与以色列站在一起。 声明指出: Oracle谴责针对以色列及其公民的恐怖袭击。Oracle将为其员工、以色列政府和国防机构提供一切必要的支持。 Magen David Adom是一家为以色列公民…

Android屏幕刷新机制

基础知识 CPU运行在Android设备上的中央处理器(Central Processing Unit)是Android设备的核心组件之一,负责执行计算和控制设备的各种操作。 Android设备上的CPU通常采用ARM架构,如ARM Cortex-A系列处理器。这些处理器具有高性能…

Hadoop3教程(三十三):(生产调优篇)慢磁盘监控与小文件归档

文章目录 (161)慢磁盘监控(162)小文件归档小文件过多的问题如何对小文件进行归档 参考文献 (161)慢磁盘监控 慢磁盘,是指写入数据时特别慢的一类磁盘。这种磁盘并不少见,当机器运行…

Java学习笔记(五)——数组、排序和查找

一、数组 数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。即数组就是一组数据。 (一)数组的使用 1、使用方式1——动态初始化 (1)数组的定义: 数据类型 数组名[] new 数据类型…

【C语言】每日一题(添加逗号)

添加逗号,链接奉上 目录 方法1:整体存入思路:代码实现: 方法2:分段输出思路:代码实现: 方法1:整体存入 思路: 整体思路: 我们发现这个整数N对于最后1位是比…

会声会影2023官方破解版激活码

随着短视频、vlog等媒体形式的兴起,视频剪辑已经成为了热门技能。甚至有人说,不会修图可以,但不能不会剪视频。实际上,随着各种智能软件的发展,视频剪辑已经变得越来越简单。功能最全的2023新版,全新视差转…

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 (164)MR跑得慢的原因(165)MR常用调优参数Map阶段Reduce阶段 (166)MR数据倾斜问题参考文献 (164)MR跑得慢的原因 MR程序执行效率的瓶颈,或者说当你觉得你的MR程…

《动手学深度学习 Pytorch版》 9.4 双向循环神经网络

之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模,然而也存在需要后文预测前文的情况。 9.4.1 隐马尔可夫模型中的动态规划 数学推导太复杂了,略。 9.4.2 双向模型 双向循环神经网络(bidirectional RNNs)…

解决windows10、windows11故障:Microsoft-Windows-Kernel-Processor-Power 事件ID:37

一、现象 windows系统日志中出现大量的“Microsoft-Windows-Kernel-Processor-Power”错误。 经过分析:原因是windows配置的【使用电池】默认值是5%,按5%计算出来的功率与CPU的最小功率不兼容,如:本机CPU最高功率是25W&#xff0…

flink中使用GenericWriteAheadSink的优缺点

背景 GenericWriteAheadSink是flink中提供的实现几乎精确一次输出的数据汇抽象类,本文就来看一下使用GenericWriteAheadSink的优缺点 GenericWriteAheadSink的优缺点 先看一下GenericWriteAheadSink的原理图 优点: 几乎可以精确一次的输出&#xf…

数据库MongoDB

MongoDB记录是一个文档,由一个字段和值对组成的数据结构,文档类似于JSON对象。 一个文档认为就是一个对象,字段的数据类型是字符型,值除了使用基本类型外,还可以包括其他文档,普通数组和文档数组。 一、…