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.rhkb.cn/news/127897.html

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

相关文章

信息安全技术概论-李剑-持续更新

图片和细节来源于 用户 xiejava1018 一.概述 随着计算机网络技术的发展,与时代的变化,计算机病毒也经历了从早期的破坏为主到勒索钱财敲诈经济为主,破坏方式也多种多样,由早期的破坏网络到破坏硬件设备等等 ,这也…

类和对象:构造函数,析构函数与拷贝构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器…

Python之线程Thread(一)

一、什么是线程 线程(Thread)特点: 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;…

elasticsearch的索引库操作

索引库就类似数据库表,mapping映射就类似表的结构。我们要向es中存储数据,必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束,常见的mapping属性包括: type:字段数据类型,常见的…

【C++漂流记】一文搞懂类与对象中的对象特征

在C中,类与对象是面向对象编程的基本概念。类是一种抽象的数据类型,用于描述对象的属性和行为。而对象则是类的实例,具体化了类的属性和行为。本文将介绍C中类与对象的对象特征,并重点讨论了对象的引用。 文章目录 一、构造函数和…

Python入门教程35:使用email模块发送HTML和图片邮件

smtplib模块实现邮件的发送功能,模拟一个stmp客户端,通过与smtp服务器交互来实现邮件发送的功能,可以理解成Foxmail的发邮件功能,在使用之前我们需要准备smtp服务器主机地址、邮箱账号以及密码信息。 #我的Python教程 #官方微信公…

什么是 DNS 隧道以及如何检测和防止攻击

什么是 DNS 隧道? DNS 隧道是一种DNS 攻击技术,涉及在 DNS 查询和响应中对其他协议或程序的信息进行编码。DNS 隧道通常具有可以锁定目标 DNS 服务器的数据有效负载,允许攻击者管理应用程序和远程服务器。 DNS 隧道往往依赖于受感染系统的…

sklearn中的数据集使用

导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集:{iris}) print(f查看数据集的特征:{iris.feature_names}) print(f查看数据集的标签:{iris.target_names}) print(f查看数据集的描述…

linux 安装Docker

# 1、yum 包更新到最新 yum update # 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manager --add-repo h…

Lua01——概述

Lua是啥? 官网 https://www.lua.org Lua这个名字在葡萄牙语中的意思是“美丽的月亮”,诞生于巴西的大学实验室。 这是一个小巧、高效且能够很好的和C语言一起工作的编程语言。 在脚本语言领域中,Lua因为有资格作为游戏开发的备选方案&…

51单片机项目(10)——基于51单片机的电压计

本次设计的电压计,使用ADC0832芯片,测到电压后,将电压信息发送到串口进行显示。仿真功能正常,能够运行。(工程文件和代码放在最后) 电路图如下: 运行过程如下: ADC0832介绍&#xff…

「网页开发|前端开发|Vue」07 前后端分离:如何在Vue中请求外部数据

本文主要介绍两种在Vue中访问外部API获取数据的方式,通过让Vue通过项目外部的接口来获取数据,而不是直接由项目本身进行数据库交互,可以实现前端代码和后端代码的分离,让两个部分的代码编写更独立高效。 文章目录 本系列前文传送…

Flink CDC 菜鸟教程 -环境篇

本教程将介绍如何使用 Flink CDC 来实现这个需求, 在 Flink SQL CLI 中进行,只涉及 SQL,无需一行 Java/Scala 代码,也无需安装 IDE。 系统的整体架构如下图所示: 环境篇 1、 准备一台Linux 2、准备教程所需要的组件 下载 flink-1.13.2 并将其解压至目录 flink-1.13.2 …

CSS学习笔记05

CSS笔记05 定位 position CSS 属性position - 用于指定一个元素在文档中的定位方式。top,right,bottom 和 left 属性则决定了该元素的最终位置。position 有以下常用的属性值: position: static; - 默认值。指定元素使用正常的布局行为&am…

Mojo 摸脚语言,似乎已经可以安装

文章原地址:https://i.scwy.net/it/2023/090821-mojo/ Mojo 吹得很凶,面向AI编程,甩Python几十条街,融资上亿.... 但无缘一试,在Win和Ubuntu上试都不能通过。 由 LLVM 和 Swift 编程语言的联合创始人 Chris Lattner…

想要精通算法和SQL的成长之路 - 课程表III

想要精通算法和SQL的成长之路 - 课程表III 前言一. 课程表III(贪心优先队列)1.1 优先选择截止时间更小的课程1.2 如果当前课程无法学习怎么办?1.3 优化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 课程表III(贪心优先队列&…

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错,具体的报错截图如下图所示。 要解决这个问题,首先使用下面的命令进到相应的目录下。 cd /var/…

使用openWRT 配置SFTP 实现远程文件安全传输

文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务,并结合cpolar内网穿透,创建安全隧道映射22端口,实现在公网环境下远程OpenWRT SFTP&#xf…

生信豆芽菜-机器学习筛选特征基因

网址:http://www.sxdyc.com/mlscreenfeature 一、使用方法 1、准备数据 第一个文件:特征表达数据 第二个文件:分组信息,第一列为样本名,第二列为患者分组 第三个文件:分析基因名 2、选择机器学习的方…

PHP设备检验系统Dreamweaver开发mysql数据库web结构php编程计算机网页代码

一、源码特点 PHP设备检验系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88306259 php设备检验系统1 …