【Java网络编程03】网络原理进阶

【Java网络编程03】网络原理进阶

1. UDP协议

1.1 基本介绍

我们首先再来回顾UDP协议的基本特点:

  1. 无连接的
  2. 不可靠传输的
  3. 面向数据报的
  4. 全双工的

既然谈到数据报,我们就来看一下UDP数据报的格式:
image.png
UDP数据报分为报头和载荷部分,其中载荷部分就是应用层报文,报头固定8字节,分为以下四个部分:

  1. 源端口:标识发送方位于源主机的哪个应用程序
  2. 目的端口:标识接收方位于目的主机的哪个应用程序
  3. 数据报长度:报头+载荷部分的总长度,最大为64KB
  4. 检验和(checksum):用于检验传送过程中是否出现差错

1.2 相关机制

1.2.1 UDP检验和

校验和(checksum):由于网络传输过程中,数据以光/电/电磁波信号进行传输,因此难免遇到外界环境干扰导致数据出现差错,造成比特0-1翻转。因此引入检验和(checksum)可以在一定程度上进行差错检验,
**UDP校验和:**UDP所采取的检验和的方式就是将报文中的所有16比特的和进行反码运算,期间遇到的任何溢出都要回卷,计算方式这里省略。。。
**校验过程:**首先在发送方会进行一次检验和算法过程然后将结果value1存放到UDP数据报的检验和字段,接收方会使用相同的算法处理接收到的数据再次得到一个结果记做value2,此时比对value1与value2是否一致,如果不一致那就证明一定出现了比特翻转,直接丢弃该数据包即可,但是检验和存在一个缺点就是如果有多于一位比特的比特差错,此时有可能得到的校验和结果是一致的!因此不一定能证明数据100%正确。

补充知识:业界还有更高精度的校验和算法例如md5和sha1算法,这里简单介绍md5的特点

  1. 定长:无论原始数据如何,生成的md5值一定是固定长度的,常见的有16位、32位、64位版本
  2. 分散:只要原始数据变化一丁点,生成的md5值就会大相径庭,这样的特性也决定了它可以被用作字符串hash算法。
  3. 不可逆:对于A(原始数据)=>B(md5值)的过程是不可逆的,原理上无法做到根据md5值反推原始数据,这个特性也决定它可以用作加密算法。很多网站所谓md5解密本质是采取暴力"打表"的方式计算各种原始值的md4值并存放到数据库的过程。

2. TCP协议

2.1 报文格式

TCP协议段的格式如下:
image.png

2.2 可靠传输机制

再来回顾TCP协议的特点:

  1. 有连接
  2. 可靠传输的
  3. 面向字节流的
  4. 全双工

其中有连接、面向字节流、全双工这几个特性我们都在TCP套接字编程中可以体会到,但是体现不出可靠传输机制,因此我们就来探究TCP实现可靠传输的网络原理
可靠传输:再来强调一下可靠传输的含义,并不是说使用TCP协议那么发送方发送的数据包能够百分百到达接收方,此处的可靠性只是"退而求其次",利用相关机制可以让发送方知道发送的数据包是否成功到达接收方,就认为是"可靠传输"了

2.2.1 确认应答机制(核心)

在保证TCP协议的可靠传输机制中,最为核心的就是 **确认-应答机制 **了

  1. Step1:接收方需要根据接收到的数据包发回响应

image.png
此时我们引入应答报文就可以让发送方知道发送报文是否到达接收方了,但是往往发送方发送的不止一个TCP段,接下来让我们发送多个报文段看看

  1. Step2:发送方发送多个TCP报文段

image.png
好像似乎也没什么问题呀,事实上如果数据包都是按序到达的,是没有什么问题的,但是现实中的网络情况十分错综复杂,因此很有可能导致"后发先至"的情况。因此事实上很有可能出现的是下面的时序情况
image.png
此时难以区分第一个"收到!"和第二个"收到!"到底针对的是哪个数据包所回复的了。因此TCP又引入了 **序号与确认号 **的机制来匹配响应报文和发送报文之间的对应关系

  1. Step3:引入序号与确认序号机制

image.png
此时就算是出现"后发先至"的情况,发送方也能够清楚的知晓响应报文是匹配哪个发送报文的了
注意
以上实际上是简化版本的模型,真实的TCP的情况要更加复杂一些,实际上TCP是面向字节流的,而不是以上所展示的对一个一个数据包进行编号,事实上TCP针对每一个字节进行编号
image.png

  • 假设发送报文中载荷部分中一共有1000个字节,编号为1001-2000,由于序号是连续的,因此只需要在TCP报头序号填上第一个字节的编号1001即可,也可以通过计算得出最后一个字节的编号。
  • 应答报文中的确认序号值,是按照接收到的最后一个字节的序号+1进行设定的,因此如果应答报文中的确认序号为1001,具有两种含义:1、1001号以前的数据都已经接收完毕,2、发送方接下来可以发送1001开始往后的数据了。

2.2.2 超时重传机制

超时重传机制:这是对于确认应答机制的补充。如果一切顺利的情况下,通过应答报文(ACK报文)就可以让发送方知晓当前数据是否成功被接收方接收。但是网络实际情况是错综复杂的,很有可能出现"丢包"现象,如果数据包没有发送到接收到,也就不存在什么应答报文了,这个情况下就需要"超时重传机制"了。本质上是设置一个等待时间阈值,如果超过等待时间仍未收到应答报文,就会触发重传数据包行为。

丢包现象:由于网络中主机A与主机B并不是直连的,中间会经过多个路由器、交换机等网络设备转发,如果一个交换机/路由器在某个时刻负载量激增,短时间内有多个数据包需要经过该设备进行转发,超过了这个设备所能承受的最大转发量,此时该网络设备就会有选择性的丢弃一部分数据包维持网络传输速率。

超时重传两种场景
超时重传可能出现以下两种情况:

  1. 情况一:发送数据包丢包

image.png
这种情况接收方本身就没有接收到数据,因此进行超时重传理所应当,是没有任何问题的

  1. 情况二:应答报文丢包

image.png
这种情况属于接收方已经接收到数据,但是由于应答报文丢包了!导致发送方超时重传,这种情况仔细想想其实是有问题的,如果是转账业务呢?那么接收方接收两次不就需要扣款两次吗?事实上设计TCP的大佬们已经帮我们处理好了,就是通过TCP的 **接收缓冲区 解决的
TCP接收缓冲区
TCP的socket在内核中存在接收缓冲区(一段内存空间),发送方发来的数据需要先保存在接收缓冲区当中,然后应用程序调用read方法读取缓冲区的数据,这里的读操作实际上针对的是缓冲区中的数据。其中接收缓冲区最重要的核心功能就是会进行
"去重"**操作,那么如何判断重复数据呢?核心判断依据就是数据的序号。

  1. 当数据还在接收缓冲区时,还没有被应用程序read读走,那么就会拿着新到达的数据序号与接收缓冲区中的数据序号依次进行比对,如果有一样的那就是有重复了,直接丢弃。
  2. 如果数据已经被应用程序从缓冲区读走了,但是应用程序读取缓冲区的数据是按照序号的先后顺序读取(即先读取序号小的,再读取序号大的)的,因此如果新到达的数据序号为3000,并且此时应用程序读取到的最后的数据序号为4000,就可以证明4000以前的数据都被读走了,因此可以判断出3000序号数据重复,直接丢弃。

总结而言就是TCP的接收缓冲区实现了"去重"数据包的功能,并且该去重机制还额外完成了排序数据包的工作。
超时重传策略
超时确实会导致发送方重传数据包,但是重传不是无限制次数的重传,重传也是有一定策略的

  1. 重传次数是有上限的,重传到一定程度,还没有收到ACK应答报文,此时就会重置连接,如果重置也失败,就直接放弃连接
  2. 重传的超时时间间隔并不是固定不变的,随着重传次数的增多,超时时间阈值也会增大(重传频率变得更低)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

臻于至善,CodeArts Snap 二维绘图来一套不?

前言 我在体验 华为云的 CodeArts Snap 时,第一个例子就是绘制三角函数图像,功能注释写的也很简单。 业务场景中,有一类就是需要产出各种二维图形的,比如,折线图、散点图、柱状图等。 为了提前积累业务素材&#xf…

AG32VF407 AGRV2K 串口printf调试输出

视频讲解 [AG32VF407]国产MCUFPGA 串口printf调试输出及演示 原理图 测试代码 新建一个platformio工程,复制如下文件到测试工程目录下 E:\tech\AGM-AG32VF\sdk-release\AgRV_pio\platforms\AgRV\boards\agrv2k_407\board.asf E:\tech\AGM-AG32VF\sdk-release\AgRV_…

WordPress反垃圾评论插件Akismet有什么用?如何使用Akismet插件?

每次我们成功搭建好WordPress网站后,都可以在后台 >> 插件 >> 已安装的插件,在插件列表中可以看到有一个“Akismet反垃圾邮件:垃圾邮件保护”的插件(个人觉得是翻译错误,应该是反垃圾评论)。具…

C/C++ 跨文件共享全局变量

目录 效果 项目 代码 下载 为了实现跨文件共享全局变量,我们可以使用 extern 关键字。extern 关键字用于声明一个变量,该变量在其他地方已经定义。它告诉编译器这个变量在其他文件中已经定义了,不需要重新分配内存空间,只需要…

大数据开发之Spark(完整版)

第 1 章:Spark概述 1.1 什么是spark 回顾:hadoop主要解决,海量数据的存储和海量数据的分析计算。 spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 1.2 hadoop与spark历史 hadoop的yarn框架比spark框架诞生的晚&#xff…

搭建Vite和Vue环境

​ 第一步:创建一个文件夹(此处为新建文件夹),并通过vscode打开 第二步:鼠标右键新建终端,并在终端处输入代码npm create vuelatest ​第三步:输入该项目名称(该项目名称并不是第一…

强制删除的文件还能恢复吗?答案分享!

“我在电脑上删除部分文件时总是显示无法删除,因此我把这部分文件强制删除了。这些文件还有机会恢复吗?怎样才能恢复这部分数据呢?希望大家帮我想想办法。” 部分用户在电脑上执行删除操作时,也可能会误删比较重要的数据。如果这部…

大模型学习与实践笔记(十三)

将训练好的模型权重上传到 OpenXLab 方式1: 先将Adapter 模型权重通过scp 传到本地,然后网页上传 步骤1. scp 到本地 命令为: scp -o StrictHostKeyCheckingno -r -P *** rootssh.intern-ai.org.cn:/root/data/ e/opencv/ 步骤2&#…

新加坡市场外贸开发攻略

新加坡,东南亚的一颗璀璨明珠,坐落于马来西亚半岛南端,与印度尼西亚的苏门答腊岛隔海相望。这个城市国家不仅拥有现代化的城市风貌,还融合了多元文化背景。 以下是对新加坡的国家介绍: 首都新加坡,是政治…

etcd技术解析:构建高可用分布式系统的利器

1. 引言 随着云原生技术的兴起,分布式系统的构建变得愈发重要。etcd作为一个高可用的分布式键值存储系统,在这个领域发挥着至关重要的作用。本文将深入探讨etcd的技术细节,以及如何利用它构建高可用的分布式系统。 2. etcd简介 etcd是一个开…

软件有必要更新吗?

软件更新是非常重要的,以下是几个理由: 1. 修复漏洞和安全问题:软件更新通常包含了对之前版本中发现的漏洞和安全问题的修复。这些漏洞和问题可能会被黑客利用,导致数据泄露、系统崩溃或其他安全风险。通过及时更新软件&#xff…

【Unity】【游戏开发】Pico打包后项目出现运行时错误如何Debug

【背景】 开发过程中的报错可以通过控制台查看,但是PICO项目这类依赖特定设备环境的应用往往存在打包后在设备端发生运行时错误。这时如何能查看到Debug信息呢? 【分析】 Pico也是安卓系统,所以这个问题就可以泛化为Unity有哪些在安卓端运…

智能AI写作大师,这几个软件你一定要看

写作是我们生活和工作中不可或缺的一部分。然而,写作是一件需要素材积累和大量时间精力的事情,对于许多人来说,写作真的是一件轻松的事情。幸运的是,由于科技的不断进步,智能AI写作软件应运而生,为我们提供…

【排序2】-交换排序

👻交换排序 🎄1、基本思想及特点🎄2、冒泡排序🎄3、快速排序(挖坑法)🎄4、快速排序优化🎊4.1 三数取中法选key🎊4.2 递归到小的子区间时,可以考虑使用插入排序…

React进阶 - 12(浅谈 state、props与render函数的关系)

本章内容 目录 一、state 与 render 函数的关系二、props 与 render函数的关系 上一节我们讲了如何使用 PropTypes及 DefaultProps来进行属性的类型校验及设置属性默认值。本节内容我们来了解一下 state、props与render函数的关系。 一、state 与 render 函数的关系 我们知道…

THM学习笔记——OSI模型和TCP/IP模型

全是文字 比较枯燥 建议视频 OSI模型由七个层次组成: 第7层 -- 应用层: OSI模型的应用层主要为在计算机上运行的程序提供网络选项。它几乎专门与应用程序一起工作,为它们提供一个界面以用于传输数据。当数据传递到应用层时,它…

大数据Doris(五十九):SQL函数之字符串函数(三)

文章目录 SQL函数之字符串函数(三) 一、​​​​​​​NULL_OR_EMPTY (VARCHAR str)

防御保护---防火墙(安全策略、NAT策略实验)

防御保护---防火墙(安全策略、NAT策略实验) 1.实验需求2.实验说明及思路3.实验配置3.1 配置IP地址以及VLAN3.2 配置防火墙IP地址及划分区域3.3 配置防火墙安全策略3.4 配置防火墙NAT策略 1.实验需求 1.生产区在工作时间内可以访问服务器区,仅…

Adobe XD 57.1.12.2软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! Adobe XD 57.1.12.2是一款功能强大的图形化界面UI/UX设计工具,它集成了原型设计、界面设计和交互设计等功能。无论是网站还是移动应用程序…

代码随想录算法训练营第14天| Leetcode 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

目录 Leetcode 102.二叉树的层序遍历 Leetcode 226.翻转二叉树 Leetcode 101.对称二叉树 Leetcode 102.二叉树的层序遍历 题目链接:Leetcode 102.二叉树的层序遍历 题目描述:给你二叉树的根节点root ,返回其节点值的 层序遍历 。 &#xff…