Linux TCP和UDP协议

目录

  • TCP协议
    • TCP协议的面向连接
      • 1.三次握手
      • 2.四次挥手
    • TCP协议的可靠性
      • 1.TCP状态转移——TIME_WAIT 状态
        • TIME_WAIT 状态存在的意义:
          • (1)可靠的终止TCP连接。
          • (2)让迟来的TCP报文有足够的时间被识别并被丢弃。
      • 2.应答确认、超时重传
      • 3.去重
      • 4.乱序重排
      • 5.滑动窗口
    • TCP协议的流式服务,粘包
      • 1.粘包的产生
      • 2.粘包的影响
      • 3.解决粘包的方法
  • UDP协议
    • UDP协议数据报服务特点

TCP协议

TCP协议:面向连接 可靠的 流式服务

TCP协议的面向连接

使用TCP协议通信的双方必须先建立连接,具体是通过TCP的报文进行三次握手建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,从而来管理连接的状态和连接上数据的传输。TCP连接是全双工的,双方的数据可以通过一个连接进行读写。完成数据交换之后,通信双方都必须断开连接以释放系统资源,具体是通过四次挥手来断开连接。

1.三次握手

三次握手发生在客户端执行connect()的时候,该方法返回成功,则说明三次握手已经建立。三次握手示例图如下:

在这里插入图片描述

2.四次挥手

四次挥手发生在客户端或服务端执行close()关闭连接的时候,示例图如下:

在这里插入图片描述

TCP协议的可靠性

1.TCP状态转移——TIME_WAIT 状态

建立连接(三次握手)和断开连接(四次挥手)时会引起TCP状态发生变化。

TCP连接的任意一端在任一时刻都处于某种状态,当前状态可以通过netstat命令查看,下图是TCP连接从建立到关闭整个过程中通信两端状态的变化。其中CLOSED是假想的起始点,并不是一个实际的状态。

在这里插入图片描述

TIME_WAIT状态一般情况下是主动关闭的一端才会出现的状态。。该状态出现
后,会维持2分钟的时间,才能完全关闭。

TIME_WAIT 状态存在的意义:

(1)可靠的终止TCP连接。

挥手一共是4次,如果最后一次挥手发送的ACK确认消息丢了,这时对方没有收到确认ACK确认消息,就会重发FIN,然后收到FIN之后再给对方回复ACK。如果服务器端先关闭,服务器端如果没有TIME_WAIT 状态,第三次挥手客户端发送给服务器端的FIN会让服务器端觉得莫名其妙,因为此时服务器端已经关闭了,就无法正常完成四次挥手了。TIME_WAIT 状态就会让先关闭的一端(假设是服务器端)等待2分钟,如果这两分钟内对方不再重发FIN,说明对方已经收到ACK确认消息,这时服务器端才可以关闭。

(2)让迟来的TCP报文有足够的时间被识别并被丢弃。

假设服务器是主动关闭的一端,当服务器端处于TIME_WAIT 状态时,端口号还没有被释放出来,此时的服务器端不可以马上重新启动,在Linux 系统上,一个TCP端口不能被同时打开多次(两次及以上)。当一个TCP连接处于TIME_WAIT状态时,我们将无法立即使用该连接占用着的端口来建立一个新连接,只能等2分钟后将端口释放之后才可以重新启动服务器端,这是为了让迟来的TCP报文有足够的时间被识别并被丢弃,也就是说当某一个数据包还在路上的时候服务器端和客户端的连接断开了,然后重新启动了一个服务器端,此时这个重新启动的服务器端就会收到发给上一个服务器的数据包,这样会造成困惑,我们并不希望这样的现象出现,所以需要等待2分钟,让新服务器在这两分钟内启动不了,让网络中延迟的那个数据包先到达,发现此时端口无法收数据,然后把这个数据包丢弃,这样两分钟以后重新启动的服务器端就不会收到发给上一个服务器端的数据。

2.应答确认、超时重传

TCP协议在传输层,当把数据交到网络层之后,网络层通过IP协议进行信息的传送,无论在传输层用的是TCP协议还是UDP协议,把消息交给网络层之后都是通过IP协议进行传输的,IP是无状态无连接的,尽最大可能去提供传输,如果所传输的信息丢了,那也没办法,也就是说无论是TCP还是UDP在网络层达成IP分组之后都有可能会丢掉信息。对于UDP来说丢了就丢了,而对于TCP来说,如果信息丢了,等一段时间没有等到确认的消息,这时就需要重发这个信息,所以TCP协议的开销要比UDP大,所以TCP的可靠性是以牺牲一定的开销为代价的。TCP协议具有应答确认、超时重传的机制。

3.去重

也不用担心发过去的确认信息丢了之后对方会多收一次相同的报文,因为TCP协议具有去重的功能。

4.乱序重排

当发送的数据中途到达的次序和发送的顺序不一样也没关系,因为TCP协议具有乱序重排的功能。

5.滑动窗口

TCP还有一个功能就是滑动窗口,来进行流量控制,窗口越大单位时间内允许发送的数据就越多,窗口越小,单位时间内允许发送的数据就越少,不会让发送数据的速度太快也不会太慢。

TCP协议的流式服务,粘包

TCP 流式服务的特点,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的。

1.粘包的产生

在这里插入图片描述

send发送的次数和recv接收的次数不一定就是一样的,如上图,三次send的数据有可能一次recv就收到了。由于多次连续send发送数据被对方一次收到就会产生粘包

2.粘包的影响

粘包在不同情况下的影响不同,比如是下载文件,则没有影响,发送的多个文件可以一次性收完,但是一些交互情况是有影响的,比如客户端发送一个长方体的长、宽、高,服务器端接收这个长方体的长、宽、高之后再给客户端发送这个长方体的体积,客户端发送长方体的长、宽、高分别是20、10、2,服务器端在接收的时候由于粘包,就会一次性接收20、10、2为20102误以为20102是长方体的长,会一直等待接收长方体的宽和高,客户端也会一直等待接收服务器给它发送长方体的体积,发生了阻塞,这时粘包就产生了不好的影响。

3.解决粘包的方法

(1)让某一个端在接收数据时可以区分出数据是几个不同的报文,可以将数据用中括号“[]”括起来,这样在接收数据的时候,可以自行判断所接收的数据。

(2)可以在报文前面设计一个大小,就是用来说明一个报文到底有多大,这样的话在recv的时候接收的时候就会告诉后面有几个字节,就把那些字节全部都接收完就可以了,接收完之后,后面开始的就是一个新的报文。

(3)不要连续send,而是send发送一个数据之后就recv接收这个数据。

UDP协议

UDP协议:无连接 不可靠 数据报

UDP协议数据报服务特点

发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报发送。接收端必须及时针对每一个UDP数据报执行读操作,否则就会丢包。并且,如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断。

在这里插入图片描述

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

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

相关文章

Google Chrome 浏览器以全屏模式打开

目录 前言以全屏模式打开禁止弹出无法更新的提示窗禁止翻译网页Chrome设置禁止翻译网页可能1可能2可能3 网页添加指令禁止Chrome翻译网页 禁用脚本气泡浏览器解决办法html解决办法方法1:鼠标滑过超链接时,使状态栏不出现超链接方法2:方法3&am…

微服务06-Dockerfile自定义镜像+DockerCompose部署多个镜像

常见的镜像在DockerHub能找到,但是我们自己写项目得自己构造镜像 1 镜像结构 作用:提高复用性,当应用需要更新时,不再是整个系统重装进行更新 ,而是对需要更新的部分进行更新,其他地方不动——>这就是分…

如何写出一篇爆款产品文案,从目标受众到市场分析!

一篇爆款产品文案意味着什么?意味着更强的种草能力,更高的销售转化和更强的品牌传播力。今天来分享下如何写出一篇爆款产品文案,从目标受众到市场分析! 一、产品文案策略 一篇爆款产品文案,并不是一时兴起造就的。在撰写之前&…

【PowerQuery】Excel和PowerBI的PowerQuery 数据刷新

数据的刷新是在进行数据集成和清洗过程中非常重要的条件,试想你做了100多个不同数据来源的数据集成,如果你再添加了100个文件还需要重新再来数据集成和清洗一遍的话,你的工作量其实一点也没有减轻反而更重了,这个事情变得做起来就没有任何意义。而PowerQuery的最大优势就在…

解决报错之org.aspectj.lang不存在

一、IDEA在使用时,可能会遇到maven依赖包明明存在,但是build或者启动时,报找不存在。 解决办法:第一时间检查Setting->Maven-Runner红圈中的√有没有选上。 二、有时候,明明依赖包存在,但是Maven页签中…

录音新手必备,2款音频录制软件推荐!

“有好用的音频录制软件推荐吗?最近需要录制歌曲去参加一个线上的歌手大赛,只需要上传自己录制的音乐就可以了,但是录音软件的质量太差了,就想问问有没有好用的音频录制软件,谢谢。” 随着数字化时代的到来&#xff0…

MATLAB实现函数拟合

目录 一.理论知识 1.拟合与插值的区别 2.几何意义 3.误差分析 二.操作实现 1.数据准备 2.使用cftool——拟合工具箱 三.函数拟合典例 四.代码扩展 一.理论知识 1.拟合与插值的区别 通俗的说,插值的本质是根据现有离散点的信息创建出更多的离散点&#xf…

利用Scrum敏捷工具管理敏捷产品迭代Sprint Backlog

​什么是Sprint Backlog? Sprint Backlog是Scrum的主要工件之一。在Scrum中,团队按照迭代的方式工作,每个迭代称为一个Sprint。在Sprint开始之前,PO会准备好产品Backlog,准备好的产品Backlog应该是经过梳理、估算和优…

高校 Web 站点网络安全面临的主要的威胁

校园网 Web 站点的主要安全威胁来源于计算机病毒、内部用户恶意攻击和 破坏、内部用户非恶意的错误操作和网络黑客入侵等。 2.1 计算机病毒 计算机病毒是指编制者在计算机程序中插入的破坏计算机功能或者数据, 影响计算机使用并且能够自我复制的一组计算机指令或…

unity 编辑器时读取FairyGUI图集单个图像

原因 想要在编辑器扩展也能访问FairyGUI图集里面的小图,随便找了一下没有找到接口自己做一个 方法 使用UIPackage.GetItemByURL获得小图信息。从图集中复制出小图,如果有旋转就逆旋转90度即可 图集里面的小图是有可能旋转的,可以通过访问 …

程序依赖相关知识点(PDG,SDG)

什么叫可达性 变量v的定义d:对变量v的赋值语句称为变量v的定义 变量v的使用:在某个表达式中引用变量v的值 当变量v被再次赋值时,上一次赋值对变量v的定义d就被kill掉了 如果定义d到点p之间存在一条路径,且在路径中定义d没有被…

RabbitMQ管控台使用

安装成功RabbitMQ后,进入到管理控制台界面 拷贝配置文件到指定目录当中然后重启RabbitMQ。

ES-OAS-ERP-电子政务-企业信息化

ES-OAS-ERP-电子政务-企业信息化 专家系统ES办公自动化系统OAS企业资源规划ERP典型的信息系统架构模型 专家系统ES 模拟人类专家,解决结构化,半结构化问题 数据级,知识库级,控制级 专家系统的特点就是和人的区别 启发性知识&#…

RHCSA-VM-Linux基础配置命令

1.代码命令 1.查看本机IP地址&#xff1a; ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1&#xff1a;<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>为虚拟机自身网卡 2.测试网络联通性&#xff1a; [f…

HTTPS加密协议详解:TLS/SSL握手过程

1、握手与密钥协商过程 基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。 (1).client_hello 客户端发起请求&#xff0c;以明文传输请求信息&#xff0c;包含版本信息&#xff0c;加密套件候选列表&#xff0c;压缩算法候选列表&#xff0c;随机数&#…

Kotlin 协程 - 生命周期 Job

一、概念 对于每一个由协程构建器开启的协程&#xff0c;都会返回一个 Job 实例用来管理协程的生命周期。launch()直接返回 Job实现&#xff0c;async() 返回的 Deferred 实现了 Job接口。 Job public fun start(): Boolean public fun cancel(cause: CancellationException? …

引入Bootstrap的CSS样式后,<h>标签、<p>标签等HTML自带的标签被覆写没有?答:覆写了。

引入Bootstrap的CSS样式后,标签、 标签等HTML自带的标签被覆写没有&#xff1f;答&#xff1a;覆写了。 为什么这么说&#xff1f;证据呢&#xff1f; 写一个实例&#xff0c;然后调试模式看一下不就得了。 先看没有引入引入Bootstrap的CSS样式情况。 代码如下&#xff1a; …

一些芯片设计的冷知识

关于芯片物理版图 芯片物理版图是一种用来描述集成电路内部结构和连接的图形文件&#xff0c;它是芯片设计的最终结果&#xff0c;也是芯片制造的依据。芯片物理版图中包含了各种工艺层的信息&#xff0c;例如多晶硅层、金属层、活性区层、接触层等&#xff0c;每一层都有不同…

MySQL/MariaDB 查询某个 / 多个字段重复数据

创建测试表和数据 # 创建表 create table if not exists t_duplicate (name varchar(255) not null,age int not null );# 插入测试数据 insert into t_duplicate(name, age) values(a, 1); insert into t_duplicate(name, age) values(a, 2);查询单个字段重复 使用 count() …

什么是JavaScript中的严格模式(strict mode)?应用场景是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 严格模式&#xff08;Strict Mode&#xff09;&#xff1a;⭐ 使用场景⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…