传输层协议(TCP和UDP)
目录
一、UDP
1、UDPAPI
2、UDPAPI的使用
二、TCP
1、TCPAPI
2、TCP的相关特性
2.1 确认应答
2.2 超时重传
2.3 连接管理(三次握手,四次挥手)
2.4 滑动窗口
2.5 流量控制
2.6 拥塞控制
2.7 延时应答
2.8 捎带应答
2.9 面向字节流
2.10 异常情况的处理
3、TCP和UDP的区别
通过计算机网络可以实现多台计算机的连接,但是不同计算机的操作系统和硬件体系不同,为了提供通信支持,位于同一个网络中的计算机在进行连接和通信时必须遵守一定的规则,在计算机网络中,这些连接和通信的规则称为网络通信协议。
网络通信协议有很多种,目前应用最广泛的是TCP/IP协议,和UDP协议。
在传输层的两个重要的高级协议分别是UDP和TCP,其中UDP是User Datagram Protocol的缩写,称为用户数据报协议;TCP是Transmission Contral Protocol的缩写,称为传输控制协议。
一、UDP
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在,就会发送数据,同样接收端在收到数据后,也不会向发送端反馈是否收到数据。
由于使用UDP消耗资源少,通信效率高,使用通常会使用到音频、视频和普通数据的传输,列如视频会议使用UDP,因为这种情况即使偶尔丢失几个数据包,也不会对接收结果产生太大影响。在使用UDP传输数据时,由于UDP的面向无连接,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP。
1、UDPAPI
UDP是一种无连接的协议,因此在通信时发送端和接收端不用建立连接。
UDP提供了DatagramPacket类和DatagramSocket类发送数据。

DatagramPacket类用于封装UDP通信中发送或者接收的数据。
使用DatagramSocket类的实例对象可以发送和接收DatagramPacket数据包。
| 方法声明 | 功能描述 |
| void receive(DatagramPacket p) | 接收数据填充到DatagramPacket数据包中 |
| void send(DatagramPacket p) | 发送DatagramPacket数据包 |
| void close() | 关闭当前Socket |
2、UDPAPI的使用
接收端
public class ReceiverSocket {public static void main(String[] args) throws IOException {//创建一个数组,用于接收数据byte[]array=new byte[1024];//定义一个DatagramSocket对象,端口号为9090DatagramSocket datagramSocket=new DatagramSocket(9090);//定义一个DatagramPacket对象,用于接收数据DatagramPacket dp=new DatagramPacket(array,array.length);System.out.println("等待接收数据");datagramSocket.receive(dp);//接收得到的信息
String str=new String(dp.getData(),0,dp.getLength())+"from"+dp.getAddress().getHostAddress()+":"+dp.getPort();System.out.println(str);//释放资源datagramSocket.close();}
}
发送端
public class SenderSocket {public static void main(String[] args) throws IOException {//创建一个DatagramSocket对象DatagramSocket ds=new DatagramSocket(3000);//要发送的数据String str="hello bit";//将定义的字符串转化为字节数组byte[]array=str.getBytes();//创建DatagramPacket进行发送DatagramPacket dp=new DatagramPacket(array,array.length, InetAddress.getByName("localhost"),9090);System.out.println("发送信息");ds.send(dp);ds.close();}
}
二、TCP
TCP是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后在传输数据。在TCP连接中必须要明确客户端和服务器端,由客户端向服务器端发出连接请求,每次连接的创建都需要经过“三次握手”。第一次握手,客户端向服务器端发出连接请求,等待服务器确认;第二次握手,服务器端向客户端回应一个响应,通知客户端收到了连接请求;第三次握手,客户端再次向服务器端发送确认信息,确认连接。
由于TCP的面向连接特性,它可以保证传输数据的安全性,是一个被广泛采用的协议。例如,在下载文件时,如果数据接收不完整,将会导致文件数据缺失而不能被打开,因此,下载文件时必须采用TCP。
1、TCPAPI
TCP通信要严格区分客户端和服务器端,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不能主动连接客户端,并且服务器端程序需要提前启动,等待客户端的连接。
Java提供了两个实现TCP程序的类,一个是ServerSocket类,用于表示服务器端,另一个是Socket类,用于表示客户端。通信时,首先要创建代表服务器端的ServerSocket对象,创建该对象相当于开启了一个服务,此服务会等待客户端的连接;然后创建代表客户端的Socket对象,使用该对象向服务器端发起连接请求,服务器端响应请求后,两者才建立连接,开始通信。
2、TCP的相关特性
2.1 确认应答
实现TCP可靠传输的核心机制就是确认应答(ack),发送方将数据发送给接收方,接收方将应答报文发送给发送方,发送方收到应答报文后就知道数据传输成功了。
在网络传输的过程中会出现“后发先到”的情况,TCP要完成两个工作:
1、确保应答报文和发送出去的数据能对上号,不要出现歧义;
2、确保在出现后发先至的现象时,能够让应用程序按照正确的顺序来理解数据;
2.2 超时重传
如果在网络传输的过程中,出现了丢包,发送方就收不到ack,使用超时重传,对确认应答进行补充。
重传操作大幅度的提升了数据能够被传过去的概率,重传就是一个很好的丢包补救措施,会等待一段时间,超过这个时间就会重传,每经历一次超时,等待时间就会变长,时间长到一定程度,就会让TCP重置。
如果是ack包丢了,又重传了一次,TCP有“接收缓冲区”保存了已经接收了的数据和数据的序号,再发一次,如果是重复的,接收方把后来的数据丢掉,确保在read的时候,读到的是只有一条数据。
2.3 连接管理(三次握手,四次挥手)
连接管理就是建立连接和断开连接
建立连接(三次握手)
TCP中的握手,只是给对方传输一个简短的,没有业务的数据包,唤起对方的注意,触发后续的操作。TCP的三次握手,是指TCP在建立连接的过程中,需要通信双方一共“打三次招呼”才会完成建立连接。

三次握手要解决什么问题?四次握手,两次握手可行?
三次握手的核心作用:
1、确认当前网络是否通畅,可以传输;
2、让发送方和接收方都能确认自己的发送能力和接收能力均正常;
3、让通信双方,在握手的过程中,针对一些重要的参数,进行协商;
四次握手:可以,但没有必要,影响效率;
两次握手:不可以,无法同步信息,完成验证的效果;
断开连接(四次挥手)
建立连接,一般都是客户端发起的,断开连接,客户端和服务器都可以发起。

此处的四次挥手,能否把中间两次合二为一?
不一定
不能合并的原因:
ack和第二次FIN的触发时机是不同的,ack是内核响应的,服务器端收到FIN会立刻返回ack,第二个FIN是应用程序触发的,服务器端使用close()方法才会触发FIN。
三次握手中,ack和第二个syn是内核触发的,同一时机,可以合并,四次挥手,ack是内核触发的,第二个FIN是应用程序触发的,时机不同,不能合并。
2.4 滑动窗口
滑动窗口可以提高效率,TCP的可靠传输是影响效率的,滑动窗口,就可以让可靠传输的性能影响更小一点,缩短和UDP的差距。

批量传输,也不是:“无限”的,达到上限后,再统一等待ack,不等待的情况下,批量发最多的数据量,称为“窗口大小”。
2.5 流量控制
滑动窗口越大越好吗?
如果传输的速度太快,就可能使接收方处理不过来,此时,接收方就会出现丢包的现象,发送方还得重传。
流量控制:站在接收方的角度,反向制约发送方的传输速率,发送方的发送速率,不应该超过接收方的处理能力。
如何衡量处理能力?
直接通过接收方缓冲区的剩余空间大小,作为衡量处理能力的指标。
2.6 拥塞控制
拥塞控制,不仅仅考虑接收方的处理能力,还有整个通信路径。

由于中间节点,结果更复杂,无法量化,因此,就通过“实验”的方法,来找到合适的值。
先让发送方以比较低的速度发送数据,顺利不丢包,再使用更大的窗口,更快的速度,不断增大,出现问题,再调整。
2.7 延时应答

延时应答,本质是为了提高传输效率。
延时返回ack,给接收方更多的时间,来读取接收缓冲区的数据。此时,接收方读了这个数据之后,缓冲区剩余的空间变大了,返回的窗口大小也就更大了。
2.8 捎带应答
在延时应答的基础上,进一步提高效率,网络通信中,往往是“一问一答”的通信类型。

在通信过程中,ack是立刻返回的,response是应用程序代码返回的,二者的时机是不同的。由于,TCP引入了延时应答,ack等待一会,response计算好了,response返回带上ack。
2.9 面向字节流
TCP传输是面向字节流的,面向字节流可能会产生粘包问题。
如何解决粘包问题?
核心思路:通过定义好应用层协议,明确应用层数据包之间的边界。1、引入分隔符
2、引入长度
2.10 异常情况的处理
异常情况:
1、进程崩溃;2、主机关机(正常流程);
3、主机掉电(非正常流程);
4、网线断开;
1、进程崩溃
进程结束,异常终止了,文件描述符也就释放了,相当于调用了socket.close(),此时,就会触发FIN,对方收到了之后,自然就会返回FIN和ack,然后再进行ack传输。
2、主机关机
在进行关机的时候,就会触发强制终止进程的操作,触发FIN,对方收到就会返回ack和FIN,系统关闭之前,对端返回ack和FIN到了,就可以进行正常的四次挥手,如果ack和FIN没到,无法进行后续的ack响应,重传无响应,放弃连接。
3、主机掉电和网线断开
主机掉电和网线断开类似,都是一瞬间,来不及关闭进程,来不及发送FIN。
(1)、如果是接收方断电或者断网,发送方发送数据就会一直等待ack,触发超时重传,触发TCP连接重置功能,发送“复位报文段”。
(2)、如果是发送方断电或者断网,TCP中提供了“心跳包”机制,接收方周期性的给发送方发送一个特殊,不带业务的数据包,如果对方多次没有应答,视为对方已经断开连接。
3、TCP和UDP的区别
1、TCP是有连接的,UDP是无连接的。
2、TCP是可靠传输的,UDP是不可靠传输的。
3、TCP是面向字节流的,UDP是面向数据报的。
4、TCP和UDP都是全双工的。
相关文章:
传输层协议(TCP和UDP)
目录 一、UDP 1、UDPAPI 2、UDPAPI的使用 二、TCP 1、TCPAPI 2、TCP的相关特性 2.1 确认应答 2.2 超时重传 2.3 连接管理(三次握手,四次挥手) 2.4 滑动窗口 2.5 流量控制 2.6 拥塞控制 2.7 延时应答 2.8 捎带应答 2.9 面向字节…...
智能仓库|基于springBoot的智能无人仓库管理设计与实现(附项目源码+论文+数据库)
私信或留言即免费送开题报告和任务书(可指定任意题目) 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 互联网发展至今,无论是其理论还是技术都已经成熟…...
2.《DevOps》系列K8S部署CICD流水线之部署NFS网络存储与K8S创建StorageClass
架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 一、环境准备 #关闭防火墙开机自…...
【数据仓库】数据仓库常见的数据模型——维度模型
文章部分图参考自:多维数据模型各种类型(星型、雪花、星座、交叉连接) - 知乎 (zhihu.com) 文章部分文字canla一篇文章搞懂数据仓库:四种常见数据模型(维度模型、范式模型等)-腾讯云开发者社区-腾讯云 (ten…...
【Kubernetes】常见面试题汇总(三十)
目录 82. Worker 节点宕机,简述 Pods 驱逐流程。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 69-113 属于【Kubernetes】的生产应用题。 8…...
【Web】PolarCTF2024秋季个人挑战赛wp
EZ_Host 一眼丁真命令注入 payload: ?host127.0.0.1;catf* 序列一下 exp: <?phpclass Polar{public $lt;public $b; } $pnew Polar(); $p->lt"system"; $p->b"tac /f*"; echo serialize($p);payload: xO:5:"Polar":2:{s:2:"…...
职业技能大赛-自动化测试笔记分享-2
一、时间等待处理 1、强制等待(无条件等待) 使用方法:time.sleep(delay) delay的单位为秒,delay设置多少秒页面就会等待多长时间,容易让线程挂掉,使程序抛异常,所以要慎用此方法。 #导入强制等待模块 import time from selenium import webdriverwd = webdriver.Chro…...
LeetCode讲解篇之1343. 大小为 K 且平均值大于等于阈值的子数组数目
文章目录 题目描述题解思路题解代码 题目描述 题解思路 题目让我们求长度为k的子数组并且该子数组的平均值大于threshold,对于这题,我们可以考虑维护一个长度为k的窗口,窗口不断向右滑动,遍历所有长度为k的子数组,我们…...
电子元件制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
5G智能工厂与物联数字孪生平台的融合应用,不仅为电容器制造业注入了新的活力,更为整个制造业的数字化转型树立了新的标杆。电子元件制造过程中,数字孪生平台通过实时监测生产线的各个环节,实现了生产流程的可视化监控。管理人员可…...
【成品论文】2024年华为杯研赛E题25页高质量成品论文(后续会更新
您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片链接,那是获取资料的入口! 点击链接加入【2024华为杯研赛资料汇总】:https://qm.qq.com/q/Mxv2XNWxUc https://qm.qq.com/q/Mxv2XNWxUc 高速公路应急车道紧急启用模型…...
【后端】【语言】【python】python常见操作
文章目录 1. List 操作2. JSON 操作3. Dict 操作 下面是分别演示 list、json、dict 操作 1. List 操作 my_list[] # List 操作示例 my_list [1, 2, 3, "apple", True]# 添加元素 my_list.append("new item") # [1, 2, 3, "apple", True, &qu…...
二叉树的链式结构和递归程序的递归流程图
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分…...
研究生如何利用 ChatGPT 帮助开展日常科研工作?
ChatGPT科研 一、 如何精读论文“三步提问法”1.为什么要做这个研究?这个研究是否值得我们做?2.他们怎么做这个研究3.他们发现了什么? 二、如何利用ChatGPT快速精读论文?首先,“三步走之第一步”--为什么要做这个研究&…...
【LLM学习之路】9月16日 第六天
【LLM学习之路】9月16日 第六天 损失函数 L1Loss 可以取平均也可以求和 参数解析 input (N,*) N是batchsize,星号代表可以是任意维度 不是输入的参数,只是描述数据 target 形状要同上 MSELoss平方差 CrossEntr…...
Qt_窗口界面QMainWindow的介绍
目录 1、菜单栏QMenuBar 1.1 使用QMainWindow的准备工作 1.2 在ui文件中设计窗口 1.3 在代码中设计窗口 1.4 实现点击菜单项的反馈 1.5 菜单中设置快捷键 1.6 菜单中添加子菜单 1.7 菜单项中添加分割线和图标 1.8 关于菜单栏创建方式的讨论 2、工具栏QToolBar …...
华为云centos7.9按装ambari 2.7.5 hostname 踩坑记录
华为云centos7.9按装ambari 2.7.5踩坑记录 前言升华总结 前言 一般都是废话,本人专业写bug业余运维。起初找了三台不废弃的台式机,开始重装centos系统,开始了HDP3.1.5Ambari2.7.5安装。 推荐一波好文,一路长绿。跑了一段时间没啥…...
重生之我们在ES顶端相遇第15 章 - ES 的心脏-倒排索引
文章目录 前言为什么叫倒排索引数据结构如何生成如何查询TF、IDF参考文档 前言 上一章,简单介绍了 ES 的节点类型。 本章,我们要介绍 ES 中非常重要的一个概念:倒排索引。 ES 的全文索引就是基于倒排索引实现的。 本章内容建议重点学习&…...
金刚石切削工具学习笔记分享
CVD钻石-合成单晶钻石之一 金刚石具有极高的硬度和耐磨性、较低的摩擦系数、较高的弹性模量、较高的热导率、较低的热膨胀系数、与有色金属的亲和力较小等优点,是目前最硬的工具材料,主要分为单晶金刚石和聚晶金刚石两大类。单晶金刚石又分为天然单晶金…...
【文献阅读】基于原型的自适应方法增强未见到的构音障碍者的语音识别
基于原型的自适应方法增强未见到的构音障碍者的语音识别 文献原文链接 https://www.isca-archive.org/interspeech_2024/wang24x_interspeech.pdf 引言 构音障碍是一种由神经系统疾病或肌肉异常引起的言语障碍,影响了个体清晰发音的能力。这种情况常伴随脑瘫、帕金森病和头部…...
Kafka-Go学习
文章目录 1. **安装 kafka-go**2. **基本概念**3. **kafka-go 基本用法**3.1 创建 Producer(生产者)3.2 创建 Consumer(消费者)3.3 生产者和消费者配置详解生产者配置 (kafka.WriterConfig)消费者配置 (kafka.ReaderConfig) 4. **…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
