| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络协议,Java虚拟机和PMEM使用学习 -> 正文阅读 |
|
[网络协议]网络协议,Java虚拟机和PMEM使用学习 |
网络协议协议三要素
一个网址请求的流程:
网络分层一般复杂的程序都要分层,这是程序设计的要求 只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。对TCP协议来说,无论是三次握手还是重试,只要想发出去包,就要有IP层和MAC层,不然是发不出去的。本质上来说, TCP 没发送一个消息, IP 层和 MAC 层的所有机制都要运行一遍。 分层设备举例,比如一个HTTP协议的包经过一个二层设备,二层设备收进去的是整个网络包,其中 HTTP、TCP、 IP、 MAC 都有。二层设备就是只把 MAC 头摘下来,三层设备就是把 MAC 头摘下来以后,再把 IP 头摘下来。 ipconfig 命令IP地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。IP 地址分 A, B ,C 三类,主要分为两部分,前一部分是网络号,后一部分是主机号。 无类型域间选路(CIDR)CIDR 打破了原来设计的几类地址的做法,将32位的IP地址一分为二,前面是网络号,后面是主机号。IP地址中间有一个 “ / ” ,斜杠后面有一个数字,比如10.256.256.1/24,就表示在32位的IP地址中,前21位是网络号,后面8位是主机号,这种地址表示形式的就是 CIDR 。 子网掩码,也是一段类似IP地址的数值,将子网掩码和 IP 地址两者按位计算 AND,就可得到网络号。 loopback,简称 lo,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经 过内核处理后直接返回,不会在任何网络中出现。 MAC地址MAC地址,是网卡的物理地址,用十六进制,6个 byte 表示。MAC 地址全局唯一,不会有两个网卡有相同的MAC地址,而且网卡自生产出来,就带着这个地址。 MAC地址的唯一性设计的目的是为了组网的时候,不同的网卡放在一个网络里时,不用担心冲突,从硬件角度来说,保证不同的网卡有不同的标识。
ipconfig 其他显示信息<BROADCAST, MULTICAST, UP, LOWER_UP>, 称 net_device flags,网络设备的状态标识。UP 表示网卡处于启动的状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP 表示 L1 是启动的,也即网线插着 qdisc pffo_fast,qdisc 全称 queueing discipline(排队规则)。内核如果需要通过某个网络接口发送数据包,都需按照此接口配置的 qdisc 把数据包加入队列。最简单的 qdisc 是 pffo,不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。pffo_fast 的队列包括三个波段,在每个波段中使用先进先出规则。三个波段优先级也不相同。band 0的优先级最高,band 2的最低。如果band 0里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配到三个波段里。TOS 是 IP 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。 DHCP与PXE在 Linux 中,如果源地址与目的地址是一个跨网段的调用,便不会直接将包发送到网络上,而是尝试将包发送到网关。 动态主机配置协议(DHCP)如果是数据中心里面的服务器,IP一旦配置好,基本不会变,而DHCP的方式就相当于都是自动配置好的,不用的时候直接删除即可。 DHCP 的工作方式
IP地址的收回和续租 客户机会在租期过去 50% 的时候,直接向为其提供IP地址的DHCP Server发送 DHCP request消息包 。客户机接收到该服务器回应的 DHCP ACK消息包 ,会根据包中所提供的新的租期以及其他已经更新的TCP/IP参数,更新自己的配置,即完成 IP 租用更新。 预启动执行环境(PXE)安装操作系统的过程,只能在BIOS启动之后。因为没安装系统之前,连启动扇区都没有。因而这个过程叫做预启动执行环境(Pre-boot Execution Environment),简称PXE。 PXE 协议分为客户端和服务器端,由于还没有操作系统,只能先把客户端放在BIOS里面。当计算机启动时,BIOS 把 PXE客户端调入内存里面,就可以连接到服务端做一些操作。在使用PXE时,通过配置DHCP Server的 next-server,指向 PXE 服务器的地址和初始启动文件,PXE客户端启动后,发送DHCP请求之后,除了能得到一个 IP 地址,还可以知道 PXE 服务器在哪里,也可以知道如何从PXE服务器上下载某个文件,去初始化操作系统。 解析PXE的工作过程
物理层和MAC层物理层(第一层)物理层主要物理链路上的传输,比如用一根网线直接连两台电脑,即构成一个局域网LAN。集线器Hub则可以将多台物理设备连接起来,与交换机不同的是,其没有大脑,完全工作在物理层,会将自己收到的每一个字节都复制到其他端口上。 数据链路层(第二层)数据链路层(MAC层)主要控制在往媒体上发送数据时,往哪发,谁先发,谁后发的问题,防止产生混乱。主要包括
已知IP地址,想要求其MAC地址,需要用到ARP地址解析协议
交换机与VLAN一般来说,对于一个网络来说,一台交换机不够用,需要把多台交换机连接起来,形成一个拓扑结构,交换机之间也会广播接收到的ARP 请求,进行消息的传递。 但当交换机数目越来越多,整个拓扑结构复杂之后,很容易出现环路问题,即两个交换机的端口可能连接到同样的局域网,两个交换机之间会相互广播,来回接收并修改记录的信息。并且一个包会转来转去,每台机器都会发广播包,交换机转发也会复制广播包,当广播包越来越多的时候,会最终导致堵塞。 STP协议生成树的算法成为STP算法,利用STP协议来设置交换机 STP协议概念
STP工作过程
解决广播和安全问题 两种方法,一种是物理隔离,另一种是虚拟隔离,即 VLAN 也称虚拟局域网 使用VLAN,一个交换机上会连属于多个局域网的机器,交换机怎么区分哪个机器属于哪个局域网? 只需要在原来的二层的头上加一个TAG,里面有一个VLAN ID,一共12位。 ICMP与pingping基于 ICMP 工作,ICMP全称Internet Control Message Protocol,互联网控制报文协议。 ICMP报文是封装在 IP 包里,格式如下所示: ICMP报文有很多的类型,不同的类型有不同的代码。最常用的类型是主动请求为8,主动请求的应答为0。 查询报文类型ping 就是查询报文,是一种主动请求,并且获得主动应答的ICMP协议。ping发的包也符合ICMP协议格式,但在后面增加了自己的格式。 对ping的主动请求,进行网络抓包,称为ICMP ECHO REQUEST。同理主动请求的回复,称为ICMP ECHO REPLY。比起原生的ICMP,多了两个字段,一个是标识符,另一个是序号。 在选项数据中,ping还会存放发送请求的时间值,来计算往返时间,说明路程的长短。 差错报文类型
ping查询报文类型的使用发送和接收过程如下:
Traceroute:差错报文类型的使用Traceroute 的其中一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。 Traceroute 的参数指向某个目的 IP 地址,它会发送一个UDP的数据包。将TTL设置成1,一旦遇到一个路由器,就表示出错了,然后会返回一个ICMP包,即网络差错包,类型是时间超时。之后将 TTL 设置为2,则到第二个路由器就出错。如此反复,直到到达目的主机,Traceroute 即获取所有路由器IP。
Traceroute 另一个作用是故意设置不分片,从而确定路径的MTU。 网关在接入网络时,配置类IP地址和网关之后,就能指定目标地址进行访问。在解析到IP地址时,无论是TCP还是UDP协议,都需要分析判断源IP地址和目标IP地址。判断两者是都在同一个网段中。
网关往往是一个路由器,是一个三层转发的设备。就是把MAC头和IP头都取下来,然后根据里面的内容,看看接下来把包往哪里转发的设备。 直接将网关称作路由器并不完全准确,假设路由器有五个网卡或者网口,其就相当于有五个不同局域网的网关. 静态路由静态路由,其实就是在路由器上,配置一条一条规则。每当要选择从哪个口出去的时候,就一条一条的匹配规则,找到符合的规则,按规则中的设置,从某个口抛出去,找下一跳IPX。 MAC地址是一个局域网内才有效的地址。只要过网关,就必定会改变,因为已经换了局域网。而IP地址则有可能变,有可能不变,不改变IP地址的网关,称为转发网关;改变IP地址的网关,称为NAT网关。一般在传递过程中,两种情况都可能有,但是第二种NAT更为常见。 NAT更为常见的原因是,一般来说一个国际通用的IP身份都很昂贵,对于一台家用路由器来说,其只需要记录下传递到该路由器的国际地址访问代表连接到这台路由器的家用实际地址即可,当收到来自这个国际地址的访问时,只需要查找就能正确转发,因此,一般来说家用路由器的包发出去的时候,都被家用路由器NAT成了运营商的地址,所以很多192.168....。 路由协议路由器:一台拥有多张网卡的网络设备,当一个入口的网络包送到路由器时,它会根据存储在本地的转发信息库即路由表,来决定如何正确地转发流量。 路由表中包含有多条路由规则,一般来说每条规则包含最少三项信息:目的网络、出口设备和下一跳网关。上述可以通过 route 命令和 ip route 命令都可以进行查询或者配置。直接修改路由表的三项信息进行配置的属于根据目的IP地址来配置路由。 一般来说,在现实中网络环境更为复杂,除了可以根据目的 IP 地址配置路由外,也可以根据多个参数来配置路由,属于策略路由。可以配置多个路由表,根据源IP地址、入口设备、TOS等选择路由表,然后在路由表中查找路由。从而使得来自不同来源的包走不同的路由。 上述配置方法本质上都是属于静态路由,一旦网络发生变化,修改较为复杂。 动态路由动态路由可以根据路由协议算法生成动态路由表,随网络运行状况的变化而变化。 对于一个网络拓扑图来说,路由肯定希望找到一种从源到目的地的最短路径,一般有如下方法:
动态路由协议
Java Agent与字节码注入Java agent是Java语言的一个特性,能够实现Java字节码的注入,本质上是通过 c agent 来实现的,C agent 是一个事件驱动的工具实现接口,通常会在 C agent 加载后的入口方案 Agent_OnLoad 处注册各个事件的钩子方法。当 Java 虚拟机触发了这些事件时,便会调用对应的钩子方法 premain 方法premain 方法指在main方法之前执行的方法,Java 虚拟机能识别的 premain 方法接收的是字符串类型的参数,不是 如果想以 Java agent 的方式运行 premain 方法,需要将其打包成 jar 包,并在 MANIFEST.MF 配置文件中制定 Premain-class,之后在命令行中指定 Java agent 方式运行。 除了在命令行中指定 Java agent 方式运行之外,还可以通过 Attach API 远程加载。 使用 Attach API 远程加载的 Java agent 不会先于 main 方法执行,取决于另一虚拟机调用 Attach API 的时机。且运行的也不再是 premain 方法,而是名为 agentmain 的方法。 Java 虚拟机不限制 Java agent 的数量。 java 命令后可以附上多个 -javaagent 参数,或者远程 attach 多个 Java agent,Java 虚拟机会按照定义顺序,或者 attach 的顺序逐个执行。 Java agent 的 instrumentation 机制,允许应用程序拦截类加载事件,并且更改该类的字节码。字节码注入即基于这一机制。 字节码注入首先,在代码的 premain 类型的方法中需要有一个 Instrumentation 类型的参数,可以用其来注册类加载事件的拦截器。该拦截器需要实现 ClassFileTransformer 接口,并重写其中的 transform 方法。 transform 方法接收一个 byte 数组类型的参数,代表正在被加载的类的字节码,其会返回一个 比优特数组,代表更新后的类的字节码。方法返回之后,Java 虚拟机会使用返回的 byte 数组,来完成类加载。但如果返回为 null 或者抛出异常,则 Java 虚拟机会使用原来的 byte 数组完成类加载工作。 基于上述类加载事件的拦截功能,可以实现字节码注入,即往正在被加载的类中插入额外的字节码 Java agent 还可以通过 redefine 和 retransform 对已加载的类进行修改,需要用户传入所要 redefine 或者 retransform 的类实例
Java agent 的这些功能都是通过 JVMTI agent,即 C agent 来实现的。 基于字节码注入的 profiler通过字节码注入可以实现代码覆盖工具,或者各种类型的 profiler,通常会定义一个运行时类·,并在某一程序行为的周围,注入对该运行时类中方法的调用,以表示该程序行为正要或者已经发生。 但在字节码注入过程中,因为注入位置不当等原因有可能会造成程序死循环,解决问题的关键在于设置一个线程私有的标识位,用以区分应用代码的上下文以及注入代码的上下文。当即将执行注入代码时,根据标识位判断是否已经位于注入代码的上下文之中。如果不是,则设置标识位并正常执行注入代码;如果是,则直接返回,不再执行注入代码。 字节码注入的命名空间可能存在问题,需要注意注入的依赖版本,否则可能会出现版本不一致的情况。 Intel PMEM的使用傲腾持久化内存(AEP)工作模式
持久化内存持久化内存(PMEM),也称非易失性内存(NVM)或内存级存储器(SCM),填补了现有层级性能和容量差距。 传统的数据被 read和write 到易失性内存(DRAM)上,然后被刷回到非易失性存储器(SSD、HDD)上。当一个应用程序启动的时候,数据需要先从非易失性存储器(SSD、HDD)上读到易失性内存(DRAM)才能被访问。 傲腾持久内存 (PMem) 与 DRAM 有一些相似之处:封装在 DIMMS(DIMM全称Dual-Inline-Memory-Modules,中文名叫双列直插式存储模块,是指奔腾CPU推出后出现的新型内存条)中,与 DRAM 驻留在同一总线/通道上,并且可以采取与 DRAM 相同的方式来存储易失性数据。 不同之处:持久内存的容量远远高于传统的 DRAM,甚至可以在不通电的情况下以持久模式存储数据,通过增加安全性来保证数据不受损。但总的来说持久内存模块的速度不如DRAM模块那么快 PMEM编程AEP PMEM 设备映射到地址空间后,读写通过内存 load/store 进行,对于store命令,数据并不会马上写到 PMEM,而是会先在CPU cache里,然后刷回到内存,即使已经刷回到内存,实际上也可能在内存控制器的请求队列 (WPQ) 里。因此应用程序如果要确保数据已经持久化(即保证落盘),需要有额外的处理。 参考文章中假定定义结构体与更新操作
一般来说,数据刚开始的时候会被存储在 CPU 的多级 cache 中,但CPU不可能每次有更新的时候就把脏数据歇会,常规方法也很难预测 CPU 把哪一部分cache写回了。理论上如果此时掉电,会出现cache中数据丢失。并且对于上面的示例代码来说,即使 student 字段最先赋值,但 CPU 可能选择将其最后歇写回。为了解决这一问题,需要使用 flush 系的 CLFLUSH、CLFLUSHOPT 和 CLWB,SFENCE。 CLFLUSH 会命令 CPU 将对应 cacheline 逐出,强制性写回介质,但是这是一个同步指令,将会阻塞流水线,损失了一定的运行速度,也有同样功能的对应的新指令 CLFLUSHOPT 和 CLWB,是两个异步的指令,都能写回介质,区别在前者会清空 cacheline,后者则会保留,大部分场景下CLWB可能有更高的性能。 但异步的代价是对于cache下刷的顺序依旧不可预测,对应到实际场景就是两个量后赋值的那个依然有可能先下刷,因此需要使用SFENCE,SFENCE强制 sfence 指令前的写操作必须在 sfence 指令后的写操作前完成。 总结归纳这几个指令就是:
上述几个指令都是优化cache,除此之外,编译器的优化策略与CPU的乱序执行也可能产生类似效果,因此提供了持久化内存开发套件 PMDK,PMDK 是一个库和工具集合,允许应用程序访问持久内存作为内存映射文件。 主要因为前述方法需要在合适的地方用一些底层CPU指令来实现,缺点是太过于底层且可移植性差, PMDK 套件的目的就是为了简化这些操作。 PMDK 库分成两大类:
Volatile libraries
Persistent libraries
PMDK中的 libpmem 中提供了API,用以处理所有与编译器的优化策略与CPU的乱序执行有关的可能产生影响的情况。
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:28:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |