【Java网络编程04】网络原理进阶(二)

news2024/11/18 17:37:22

1. 前言

在网络原理进阶(一)部分我们详细介绍了UDP/TCP两大协议及其相关特性,本章我们会讨论网络层、数据链路层、物理层相关协议。但是需要注意的是,如果有小伙伴们未来是想成为Java后端开发工程师的,那么未来工作中大概率会涉及到网络通信,因此TCP相关特性是及其重要,必学不可的!!而网络层的IP协议确实很复杂、也很重要(站在网络协议设计者的角度),对于咱们职业来说,只需要适当了解即可。

2. 网络层

IP协议:网络层中最重要的协议就是IP协议了,其中IP协议主要完成的工作有两方面:1、地址管理(使用一套地址体系来描述网络设备所处的位置)2、路由选择(将数据报从一个地址转发到另一个地址)

2.1 IP数据报格式

image.png
下面对报头中各个字段进行简要介绍:

  • 4位版本号:指定遵循的IP协议版本,例如IPv4来说值就是4,IPv6就是6
  • 4位首部长度:与UDP协议一样,单位为4字节,因此首部最大长度是15 * 4即60字节
  • 8位服务类型:其中起作用的只有4位,这四位分别表示最小延时、最大吞吐量、最高可靠性、最小成本,这四者相互冲突,只能选择一个
  • 16位总长度:IP数据报整体占据多少个字节
  • 16位标识:当IP数据报被分片时,可以根据该字段确定哪些IP分片应该组包在一起
  • 3位标志:第一位保留,第二位为1表示禁止分片,第三位表示如果使用分片,那么如果为1表示这个最后一个分片,类似于“结束位”标记
  • 13位片偏移:是分片相对于原始IP报文开始处的偏移,可以根据该字段对于分片进行排序组包
  • 8位生存时间:指定数据报到达目的地的的最大报文跳数,一般是64,经过一个路由,跳数-1,如果一直减到0还没有到达,那么就丢弃了,这个字段主要用来防止出现路由循环
  • 8位协议:表示上层协议的类型(TCP或UDP)
  • 16位首部检验和:使用CRC等机制判断首部是否损坏
  • 32位源地址与目的地址:表示发送端与接收端
  • 选项字段:不定长,最多40字节

2.2 IP协议如何管理地址

IP地址:前面我们提到过,IP地址本质上是一个32位的二进制数,但是为了阅读起来方便,我们通常使用点分十进制的方式将IP地址分为4部分,其中每个部分1个字节,使用十进制进行表示,每个部分取值为0-255,例如IP地址为01111111 00000000 00000000 00000001,采用点分十进制表示后为127.0.0.1
IPv4地址数量:IP地址的出现是为了给每一个网络设备进行唯一的身份标识,32位能够表示的IP地址数目为2^32 - 1大约42亿9千万,尽管这个数目看起来很大,但是随着移动互联网时代的到来,每个用户甚至拥有4、5台网络设备,总的网络设备是很可能超过百亿的,因此解决IP地址不够用的问题迫在眉睫!!!

2.2.1 IP地址数量解决方案

如何解决IP地址不够用的问题成了上世纪90年代非常严重的问题!下面我们来简要介绍几种解决IP地址不够用的常见方案

2.2.1.1 动态分配IP地址

该方案的依据是全世界所以的网络设备不可能同时一起上网,因此对于正在上网的网络设备进行按需分配IP地址,就可以解决IP地址不够用的问题,但是缺点也非常的明显,这毕竟只是权宜之计,并不能真正解决IP地址不够用的问题!!!

2.2.1.2 NAT机制(网络地址映射)

IP地址分类:NAT机制要求把IP地址分为两大类:1、私网IP;2、公网IP,其中10.*192.168.*172.16-172.31.*这三类地址都是私网IP,剩下的都是公网IP了。NAT机制要求公网上设备对应的公网IP必须是唯一的,但是私网(局域网)上的IP地址只要保证当前局域网类不重复即可,不同局域网的IP可以重复。
由于上述规定,因此NAT机制就具有以下限制:

  1. 局域网设备访问局域网设备(同一局域网中),允许访问
  2. 局域网设备访问局域网设备(不同局域网中),不允许访问
  3. 局域网设备访问公网设备,可以访问,但是需要使用NAT机制对IP进行转换
  4. 公网设备访问公网设备,可以访问
  5. 公网设备访问局域网设备,不允许访问

image.png
这里我们简化一下模型,假设主机只经过一个路由器就将数据转入公网,最终到达服务器,中间路由器所做的工作我们并不关心,此时假设从主机(192.168.0.1)的数据想要经过路由器,进一步进行转发,此时NAT机制就会将IP报头中的源IP进行替换成路由器的IP,如下图所示:
image.png
此时数据报中的源IP就被替换为路由器的WAN口IP,并且更换后的数据报到达服务器后,服务器端看到的源IP就是5.6.7.8了,感知不到局域网的IP,达到多个局域网IP对应一个公网IP,起到节省IP地址的效果了。

注意:路由器的LAN口IP往往是一个局域网IP,WAN口可能是局域网IP,也可能是公网IP,路由器的核心就是能够将两个网络连接起来,并且不是所有的路由器都会替换源IP,当源IP被修改为公网IP后,路由器就不再进行替换

NAT工作原理
下面我们就来详细介绍NAT机制的工作原理

  1. 不同主机访问不同服务器

image.png

  1. 此时主机(192.168.0.1)访问服务器(1.2.3.4),此时源IP被替换为5.6.7.8,此时路由器内部维护一个数据结构保存对应映射信息
  2. 此时主机(192.168.0.2)访问服务器(9.10.11.12),此时源IP被替换为5.6.7.8,此时路由器内部维护的映射表新增记录

image.png

  1. 此时服务器1.2.3.4返回给目的IP地址5.6.7.8,然后根据映射表找到源IP地址为192.168.0.1然后成功返回给对应主机
  2. 此时服务器9.10.11.12返回给目的IP地址5.6.7.8,然后根据映射表找到源IP地址为192.168.0.2然后成功返回给对应主机
  3. 不同主机(不同端口)访问同一服务器

image.png

  1. 此时主机(192.168.0.1)上的应用程序端口是26000,此时访问服务器1.2.3.4,此时源IP地址被替换为5.6.7.8,并在映射表中新增记录表项
  2. 此时主机(192.168.0.2)上的应用程序端口是26001,此时访问服务器1.2.3.4,此时源IP地址被替换为5.6.7.8,并在映射表中新增记录表项

image.png

  1. 此时服务器返回目的IP为5.6.7.8,目的端口号为26000,此时路由器根据映射表找到端口号26000对应的源主机IP地址为192.168.0.1,然后成功返回给对应主机
  2. 此时服务器返回目的IP为5.6.7.8,目的端口号为26001,此时路由器根据映射表找到端口号26001对应的源主机IP地址为192.168.0.2,然后成功返回给对应主机
  3. 不同主机(同一端口)访问同一服务器

image.png

  1. 此时主机(192.168.0.1)上的应用程序端口是26000,此时访问服务器1.2.3.4,此时源IP地址被替换为5.6.7.8,并在映射表中新增记录表项
  2. 此时主机(192.168.0.2)上的应用程序端口是26000,此时访问服务器1.2.3.4,此时源IP地址被替换为5.6.7.8,并在映射表中新增记录表项

image.png

  1. 此时服务器返回目的IP为5.6.7.8,目的端口号为26001,此时路由器根据映射表找到替换端口号26001对应的源主机IP地址为192.168.0.1,然后成功返回给对应主机
  2. 此时服务器返回目的IP为5.6.7.8,目的端口号为26002,此时路由器根据映射表找到替换端口号26002对应的源主机IP地址为192.168.0.2,然后成功返回给对应主机

总结

  • 如果同一局域网内不同主机访问不同的服务器,那么返回数据时只需要根据服务器的IP地址就可以查表找到对应的主机
  • 如果同一局域网内不同主机访问同一个服务器,但是端口号不同,那么此时可以根据端口号的不同进行区分
  • 如果同一局域网内不同主机访问同一个服务器,但是端口号相同(极小概率),NAT机制可以替换源端口,仍然能够区分,此时路由器就不是单纯作用在网络层的设备了,还工作在传输层(因为可以修改传输层报文中的端口号)

NAT机制本质上并没有增加IP地址的数目,只是将IP地址进行了复用,当前互联网就是NAT+动态分配相结合的方案解决IP地址不够用的问题,但是始终是权宜之计,并没有从根本上解决问题!!!

2.2.1.3 IPv6

IPv6:IPv6的出现是在根本上解决了IPv4地址不够用的问题,IPv6使用16个字节表示一个IP地址,总的表示范围是2^128,这是一个天文数字,号称可以给世界上每一粒沙子都分配一个IP地址。
关于IPv6的有关内容,本章不做过多讨论,感兴趣的小伙伴可以自行查阅相关资料,这里提供一个超赞的科普视频
点击查看【bilibili】

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

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

相关文章

【机器学习】贝叶斯垃圾邮件识别

实验三:贝叶斯垃圾邮件识别 本次作业以垃圾邮件分类任务为基础,要求提取文本特征并使用朴素贝叶斯算法进行垃圾邮件识别(调用已有工具包或自行实现)。 1 任务介绍 ​ 电子邮件是互联网的一项重要服务,在大家的学习、…

Linux/Uinx 系统编程:进程管理(3)

Linux/Uinx 系统编程:进程管理(3) 本章来讲解进程管理的最后一部分内容。 文章目录 Linux/Uinx 系统编程:进程管理(3)I/O重定向原理FILE结构体的内部结构重定向的实现过程 scanf 与 printfscanfprintf 重定…

LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

10 排序的概念

目录 1.排序的概念和运用 2.排序的分类 1. 排序的概念及运用 1.1 排序的概念 排序: 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作 稳定性:假定在待排序的记录序列中,存在…

微调实操一: 增量预训练(Pretraining)

1、前言 《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代…

编译Duilib库

编译Duilib,遇到几个错误; 最终生成的lib如下; 报一个错误,无法打开源文件"StdAfx.h", 查了一下资料,反正我的在下图 C/C - 常规 - 附加包含目录,填入下图内容就可以了,这…

还在用findViewById,不来了解下其它方式?

众所周知,都2225年了,如果你还在用Java敲安卓代码,findViewById已经是一种非常繁琐的操作,如果要去获取的id数量多,则对开发更加不友好。如果一个页面id过多,经常会有如下场景: TextView title…

100 C++内存高级话题 new 细节探秘,重载类内 operator new ,delete

一 new 内存分配细节探秘 我们以分配10个char为例,说明,观察内存发现,当delete 的时候,实际上很多内存都改变了。 实际上 new 内存不是一个简单的事情。为了记录和管理分配出去的内存,额外分配了不少内存,…

clickhouse行转列的转换

1、原表select * from test 2、一个人的每个科目作为一行记录 改为一个人的所有科目作为一行记录 方式1 select name, sum(case when subject‘语文’ then score else 0 end) as chinese, sum(case when subject‘数学’ then score else 0 end) as math from test group by …

Redis学习——高级篇⑨

Redis学习——高级篇⑨ Redis7高级之Redlock算法和Redisson的使用(十) 10.1 Redlock 红锁算法1.解决手写分布式锁的单点故障问题2.设计理念3. 解决方案 10.2 Redisson进行代码改造10.3 多机案例(解决单点故障)10.4 R…

线性代数:矩阵的秩

目录 一、矩阵的子式 二、矩阵的秩 三、重要性质定理推论 一、矩阵的子式 二、矩阵的秩 三、重要性质定理推论

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(下)

11.7.2 值语义与生命期 值语义的一个巨大好处是生命期管理很简单,就跟int一样——你不需要操心int的生命期。值语义的对象要么是stack object,要么直接作为其他object的成员,因此我们不用担心它的生命期(一个函数使用自己stack上…

TryHackMe-File Inclusion练习

本文相关的TryHackMe实验房间链接:TryHackMe | Why Subscribe 路径遍历(目录遍历) LocationDescription/etc/issue包含要在登录提示之前打印的消息或系统标识。/etc/profile控制系统范围的默认变量,例如导出(Export)变量、文件创…

纯国产,3款黑科技软件,被误认为外国佬开发

闲话不多说,直接为大家推荐三款实用工具。 1、知犀思维导图 这款国产的思维导图工具,堪称业界的良心之选。它不仅能捕捉你每一个稍纵即逝的灵感,而且界面简洁、操作轻松。无论是团队协作、灵感记录、规划制定,还是日常笔记&…

jenkins添加linux节点

jenkins添加linux节点并创建任务_创建linux jenkins结点-CSDN博客文章浏览阅读1.1k次。jenkins添加linux节点并创建任务_创建linux jenkins结点https://blog.csdn.net/qq_32828053/article/details/128905581

加速知识检索:伯克利DeepMind联合研究,RaLMSpec让语言模型服务飞速提升2-7倍!

近年来,随着大型语言模型(LLM)的出现,在多样化的 NLP 任务上取得了令人瞩目的成果。然而,知识密集型任务仍是 NLP 领域中的一项挑战,因为这些任务不仅要求模型要理解和生成自然语言,还要能够访问…

【论文笔记】Multi-Chain Reasoning:对多思维链进行元推理

目录 写在前面1. 摘要2. 相关知识3. MCR方法3.1 生成推理链3.2 基于推理链的推理 4. 实验4.1 实验设置4.2 实验结果 5. 提及文献 写在前面 文章标题:Answering Questions by Meta-Reasoning over Multiple Chains of Thought论文链接:【1】代码链接&…

江科大stm32学习笔记11——旋转编码器计次

一、接线 旋转编码器,旋钮会不断接触断开触点产生电波。 由于两个电波之间相差90,即为正交波,一个电波处于高电平时另一个处于低电平,所以可以用来判断旋转方向。 二、代码 复制粘贴4-1的工程文件,重命名为“5-2 旋转…

Could not resolve host: github.com问题解决

git clone的时候发现机器无法解析github.com,其实应该改用ssh协议去clone,但是我用的是公用的机器,密钥对一直没配置好,所以也就堵死了。那么如果想让机器能解析github.com,(机器本身没有ping命令&#xff…

深度学习入门笔记(五)前馈网络与反向传播

接着上一节,本节讲解模型自我学习的数学计算过程究竟是怎么样的。 5.1 前馈网络 一个最简单的前馈神经网络如图所示,对于每一个隐藏层,输入对应前一层每一个节点权重乘以节点输出值,输出则是经过激活函数(例如sigmoid函数)计算后的值。 在这样的网络中,输入的数据 x 经…