传输层协议(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. **…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...