【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)

news2024/9/22 22:45:16

在这里插入图片描述

🌈个人主页:努力学编程’
个人推荐
c语言从初阶到进阶
JavaEE详解
数据结构
学好数据结构,刷题刻不容缓:点击一起刷题
🌙心灵鸡汤总有人要赢,为什么不能是我呢
在这里插入图片描述

🍔🍔🍔TCP核心机制-(异常处理)

🍟🍟🍟进程崩溃

在java中的体现就是抛出异常,然后并没有catch操作,后面就交给JVM,然后JVM最后也崩溃.
看起来是一个非常严重别的问题,但其实操作系统会对进行回收,在进程崩溃的时候,操作系统就会释放进程中的PCB,对应PCB中的文件描述符表中的所有的文件也会被释放,针对 socket 文件,也会触发很正常的关闭操作(TCP四次挥手).

🍔🍔🍔主机关机

对于正常的关机操作,操作系统也是会将所有的进程进行关闭,关闭的过程就会触发四次挥手操作.
那么此时关机的情况就有两种:

  • 四次挥手的操作非常快,关机操作还没结束就已将所有的进程关闭了.
  • 四次挥手的操作比较慢,关机操作已经结束了进程还没有全部关闭.

针对第二中情况,后序的流程时候这样的:
在这里插入图片描述

此时由于主机A关机了,导致主机B发送的 FIN 操作并没有被接受到,这时就会触发超时重传的操作,主机B不断地进行的FIN但是仍然没有被接收,主机B就会尝试进行重新连接(rst),如果还是失败,此时就会删除与主机A有关的所有信息.(断开连接).

🍔🍔🍔主机掉电

主机掉电这里我们也分为两种情况:
接收方掉电:
在这里插入图片描述

此时主机A给主机B发送请求,但是由于主机B掉电,并不能接受到信息,此时主机A就会触发超时重传的机制,对主机B继续发送数据,仍然没有收到ACK,此时主机A就会尝试重新连接(rst),如果此时仍然没有接收到ACK数据包,主机A就会单方面的删除主机B的所有信息(释放连接).

发送方掉电:
在这里插入图片描述
此时由于主机A突然停止了数据的发送,对于主机B来说并不清楚主机A到底发生了什么,也许是数据的传输太快了,主机A想歇一会在发,又或者主机A掉电已将连接不上了.所以此时主机B就会发送一个不携带任何数据内容的数据包 目的就是问一下主机A “你咋啦,还在吗” .如果主机A发送ACK数据包那就表示,主机A没事,只是歇歇,如果没有任何响应的话,就说明主机A应该是 “嘎了” ,此时主机B就会单方面的删除主机A的所有信息,断开连接.

这里的不携带任何数据的数据包我们将他称为 “心脏包” 因为这个数据包的发送是有周期的,就像心脏一样,且它的功能也是探测机器是否还在,所以称为"心脏包" 是非常形象的.

🍔🍔🍔网线断开

这个过程和掉电是大同小异的,这里也是站在发送方和接收方的视角去研究这个过程:
在这里插入图片描述

  • 主机A:

不断发送数据包,但是收不到ACK,触发超时重传,仍然没有任何响应,进行rst,最后单方面删除主机B的信息.

  • 主机B:

主机A突然停止了数据的发送,试探性的发送一个 “心脏包” 没有响应的话,单方面删除主机A的所有信息,断开连接.

这里我们就把TCP中的重要的机制全部讲完了,需要注意的是:TCP不止有这十大机制,还有很多其他的机制,我们这里就不在强调.以后在简历上也不能出现 “熟练掌握TCP的十大核心机制” 这里我们不会有这样的说法,可以说"熟悉TCP协议的常见特性".

🍔🍔🍔网络编程-IP协议

我们之前提到过一个概念叫TCP-IP协议,我们将TCP讲的差不多了,现在来另一个非常重要的协议-IP协议.这里涉及的是网络层.

这里有两个非常重要的概念叫:

  • 地址管理:IP地址
  • 路由选择数据报传输数据的路径选择

IP协议的报头结构:
在这里插入图片描述

4位版本:
对应的是IPv4和IPv6

4位首部长度:
IP协议的报头长度是可以变长的,比方说之前数据的长度是15,那么数据报的长度就是15*4=60.

8位服务类型:
这里有四位已将废弃,一位是保留位,剩下四位才是TOS数据类型.这里主要分为四种形态:
在这里插入图片描述
需要注意的是这里的四种形态是互不兼容的,也就是说只能选择一中服务类型.
这也决定了我们的IP协议是可以 “变身” 的.

16位总长度:
我们在之前的学习中有讲过UDP的时候,说UDP的传输数据的大小也是16位(大约64kb),那么当传输层构造了一个非常大的数据包的时候,IP协议数据包能否运输呢,答案是肯定的,因为其内部有一套拆分规则,可以将数据包拆成很多份,从而运输大数据包.

在这里插入图片描述
针对这三个特性,第一个是将数据包拆分后,同一个数据包拆分后的小的数据包应该具有相同的16位标识,3位标志,一个是判断当前是否是 组包/拆包 另一个则是判断是否是拆包过程的最后一个包,还有一个保留位. 13位片偏移,我们需要将拆分的过程做一个记录,否则我们后面讲数据包进行合并的时候,我们就需要按照拆分的顺序将数据合并.

8位生存时间:
如果我们构造了一个IP数据包,写成了一个不存在的目的IP,那么此时这个数据包如果一直在网络中进行无效传输的话,是非常浪费资源的,所以我们规定,一定的传输时间之后,就是自动地将数据包废弃掉.
TTL并不是时间单位,而是次数.数据包每有一个路由器传输之后,就会减一,减到为零就会停止.

咱们数据包 TTL 64 中间经过了12个路由器的转发,最终到达最后的额服务器.

那么此时有一个问题,63为的TTL 到底够用吗,正常情况下,是够用的而且发送数据的时候,还有128这样的TTL.

这里有一个六度空间理论:

我只是一个普通的程序员,如果我想认识一下美国总统,
我就发动我的朋友,我的朋友在发动他的朋友~,朋友的朋友
理论上,最多6层朋友,就能找到认识川普的人.

8位协议:
IP数据包中,携带的载荷,属哪种传输层协议的数据包呢.
可以通过这里数值,感知到,接下来将数据给TCP解析,还是给UDP解析呢 类似于TCP/UDP 包头的端口号.

16位首部校验和:
验证数据在传输中书否出错了,这里我们只针对报头部分,载荷部分 TCP和UDP 都有自己的校验和.

32位源IP地址 32位目的地址:
IP数据报中最关键的信息,数据报从哪里来,到哪里去.

IP地址,是32位的整数,是一个分非常大的数字,不方便阅读,我们就将32位通过3个原点分隔开,每个字节的范围是0-255.(我们将这种写法称为点分十进制写法).

IP地址,是用来标识网络上一个设备,期望IP是唯一的,32位表示的范围是42亿9千万,这个数字,看着很大,但是现在已经不够用了,

🍔🍔🍔解决IP不够用的问题

方案一: 动态分配IP地址,

一个设备在他上网的时候,再分配IP,不上网的时候,我们先不分配IP,权宜之计,没有真正解决IP不够用的问题.

方案二:
NAT网络地址的转换.
以一当千,
使用一个IP代表一大波设备.

这里IP地址其实大体上分为两大类:

  1. 内网IP/私网IP
  2. 外网IP/公网IP
    要求:公网IP必须是唯一的,但是私网IP是允许重复的(在不同的局域网中允许重复的)

NAT网络地址的转换
一个设备在进行上网的时候,IP数据报中的IP地址,会被NAT设备(通常就是路由器)进行自动的修改~~

  1. 同一个局域网内,主机A访问主机B不会涉及到NAT机制.
  2. 公网上的设备A,访问公网设备B不会涉及NAT
  3. 一个局域网中的主机A访问另一个局域网主机BNAT机制中,是不被允许的.
    4.局域网内部的设备A,访问 公网的设备B,NAT机制要针对这个情况进行生效~~

我们在之前书写UDP回显服务的时候,我这里电脑上启动UDP服务器,同学使用UDP客户端能否访问呢? 不行!!!

我处于俺们学校的局域网.你处于你们学校的局域网.

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

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

相关文章

Nest.js

Nestjs中文文档链接 TypeORM 中文文档 小满视频 1. 安装Nest.js 安装脚手架 npm i -g nestjs/cli创建nestjs工程 nest new工程目录 app.module.ts 根模块用于处理其他类的引用与共享。app.controller.ts 常见功能是用来处理http请求(处理请求的路径&#xff09…

.net core8 使用JWT鉴权(附当前源码)

说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。 该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。 说明:OverallAuth2.0 是一个简单、易懂、功能强…

焦虑拜拜!这些维生素是你的情绪小太阳✨,焦虑星人必看!

🌿 ‌维生素B群:情绪的调节大师‌ 🎯 说到缓解焦虑,怎能不提维生素B群?它可是个大家庭,包括B1、B2、B6、B12等,每一个都是调节神经系统的关键角色。维生素B群能够促进神经递质的合成&#xff0…

Prometheus监控k8s环境构建

传统架构中比较流行的监控工具有 Zabbix、Nagios 等,这些监控工具对于 Kubernetes 这类云平台的监控不是很友好,特别是当 Kubernetes 集群中有了成千上万的容器后更是如此,本章节学习下一代的云原生监控平台---Prometheus。 一、基于kuberne…

DNS解析域名详解

你有没有想过,当一个url传过来网络对它进行了哪些操作~DNS又是怎样对域名进行解析的~或者我们为什么要用到域名,为什么不直接使用ip地址~ 对于我们而言,面对长串的ip地址,我们更喜欢记忆较短的域名,但是对于路由器来说…

第二证券:降息升温!资金涌入港股,行情还能持续多久?

在美联储行将打开降息影响下,多国股指改写高点。 当时,商场环绕美联储是25个基点仍是50个基点的降息展开预期买卖,资金流向风险财物规划扩大显着。17日,澳大利亚S&P/ASX 200指数股指、印度孟买SENSEX30指数、新加坡富时海峡指…

MySQL函数:日期函数

先贴一张黑马程序员的听课截图 1.返回当前日期 CURDATE(); select CURDATE(); //获取当前日期2. 返回当前时间 CURTIME(); select CURTIME(); //获取当前时间3.返回当前日期和时间NOW() select NOW(); //获取当前日期和时间 4.获取指定date的年份YEAR(date) select YEAR…

力扣(LeetCode)每日一题 2848. 与车相交的点

题目链接https://leetcode.cn/problems/points-that-intersect-with-cars/description/?envTypedaily-question&envId2024-09-15 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] [starti, endi] ,…

[Python]一、Python基础编程

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程 1. Python简介 Python优点: 学习成本低开源适应人群广泛应用领域广泛1.1 Python解释器 下载地址:Download Python | Python.org 1.2 Python开发IDE -- Pycharm 2. 基础语法…

人工智能(AI)的影响下人类的生活样子

讨论在人工智能(AI)的影响下人类的生活是什么样子 在21世纪的今天,人工智能(AI)已经不再是遥不可及的未来科技,而是悄然渗透到我们日常生活的每一个角落,以一种前所未有的方式改变着我们的生活方式、工作模式乃至社会…

使用 Python 绘制 BTC 期权的波动率曲面

波动率曲面(Volatility Surface)是期权交易中展示隐含波动率随行权价(strike price)和到期时间(expiry time)变化的一种三维图形。 本文尝试通过 Python,通过 ccxt 基于从交易所获取期权的指标…

远程连接MySQL并操作

配置MySQL开发环境 如果你使用的是基于Debian的系统(如Ubuntu),可以在终端通过如下步骤安装MySQL开发包。 更新软件包列表 运行以下命令以确保你拥有最新的软件包列表。 sudo apt-get update安装libmysqlclient-dev开发包 执行以下命令以…

python-字符排列问题

题目描述 有 n 个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。输入格式 第一行输入是字母个数 n 。 接下来一行输入的是待排列的 n 个字母。输出格式 计算出的 n 个字母的所有不同排列总数。样例输入输出样例输入 4 aacc样例…

道路驾驶视角人车检测数据集 16000张 带标注 voc yolo

随着智能驾驶技术和车辆辅助系统的快速发展,道路驾驶视角下的多目标检测成为了保障行车安全的关键技术之一。为了提高自动驾驶车辆以及辅助驾驶系统的性能,需要大量的高质量标注数据来训练这些系统。本数据集旨在为道路驾驶视角下的人车检测提供高质量的…

python画图|中秋到了,尝试画个月亮(球体画法)

学习了一段时间的画图,已经掌握了一些3D图的画法,部分链接如下: python画图|极坐标下的3D surface-CSDN博客 python画图|3D参数化图形输出-CSDN博客 我们今天尝试一下月亮的画法。 【1】官网教程 首先还是到达官网教程学习: …

java: 警告: 源发行版 17 需要目标发行版 17(100% 解决)

1. 问题说明 Idea启动Springboot服务报错:java: 警告: 源发行版 17 需要目标发行版 17 2. 解决方案 Project Structure指定jdk版本为我们当前使用的版本; Java Compiler指定jdk为我们当前使用的版本; Invalidate Caches重启Idea。 如果还…

NTC温度电阻--100K 10K

100K温度电阻分度表 粗精度直接用公式计算 细精度用厂家的传感器参数来计算 Y C1 C2* y C3 * y * y*y static float get_ntc_temp(double Rt) { double y log(Rt);//122.6us48M double val; static const double c1 0.0008314; static const double c2 0.00026178;…

Linux下vscode配置C++和python编译调试环境

Visual Studio Code (简称 VSCode) 是由微软开发的一款免费、开源、跨平台的代码编辑器。它支持 Windows、macOS 和 Linux 操作系统,并且内置对多种编程语言的支持,包括但不限于 C/C、Python、JavaScript、TypeScript、Java 和 Go 等。VSCode 主要用于编…

【C语言进阶】动态内存与柔性数组:C语言开发者必须知道的陷阱与技巧

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言动态内存管理 🌹🌹期待您的关注 🌹🌹 ❀C语言动态内存管理 &…

数据结构-链式二叉树-四种遍历

博客主页:【夜泉_ly】 本文专栏:【数据结构】 欢迎点赞👍收藏⭐关注❤️ 数据结构-链式二叉树-四种遍历 1.前言2.前、中、后序遍历2.1前序遍历2.1中、后序遍历 3.层序遍历3.1递归实现3.2队列实现关于在Pop之后为什么还能用tmp访问节点&#x…