• 关于

    有效操作数地址有什么用

    的搜索结果

回答

一。zval、引用计数、变量分离、写时拷贝我们一步步来理解1、php语言特性PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都会被PHP解析器解析执行PHP的执行是通过Zend engine(ZE, Zend引擎),ZE是用C编写的用户编写的PHP代码最终都会被翻译成PHP的虚拟机ZE的虚拟指令(OPCODES)来执行也就说最终会被翻译成一条条的指令既然这样,有什么结果和你预想的不一样,查看php源码是最直接最有效的 2、php变量的存储结构在PHP中,所有的变量都是用一个结构zval结构来保存的,在Zend/zend.h中可以看到zval的定义:zval结构包括:① value —— 值,是真正保存数据的关键部分,定义为一个联合体(union)② type —— 用来储存变量的类型 ③ is_ref —— 下面介绍④ refcount —— 下面介绍 声明一个变量$addr="北京";PHP内部都是使用zval来表示变量的,那对于上面的脚本,ZE是如何把addr和内部的zval结构联系起来的呢?变量都是有名字的(本例中变量名为addr)而zval中并没有相应的字段来体现变量名。PHP内部肯定有一个机制,来实现变量名到zval的映射在PHP中,所有的变量都会存储在一个数组中(确切的说是hash table)当你创建一个变量的时候,PHP会为这个变量分配一个zval,填入相应的信息,然后将这个变量的名字和指向这个zval的指针填入一个数组中。当你获取这个变量的时候,PHP会通过查找这个数组,取得对应的zval 注意:数组和对象这类复合类型在生成zval时,会为每个单元生成一个zval3、我们经常说每个变量都有一个内存地址,那这个zval和变量的内存地址,这俩有什么关系吗?定义一个变量会开辟一块内存,这块内存好比一个盒子,盒子里放了zval,zval里保存了变量的相关信息,需要开辟多大的内存,是由zval所占空间大小决定的zval是内存对象,垃圾回收的时候会把zval和内存地址(盒子)分别释放掉 4、引用计数、变量分离、写时拷贝zval中的refcount和is_ref还没有介绍,我们知道PHP是一个长时间运行的服务器端脚本。那么对于它来说,效率和资源占用率是一个很重要的衡量标准,也就是说,PHP必须尽量减少内存占用率。考虑下面这段代码:第一行代码创建了一个字符串变量,申请了一个大小为9字节的内存,保存了字符串“laruence”和一个NULL(0)的结尾第二行定义了一个新的字符串变量,并将变量var的值“复制”给这个新的变量第三行unset了变量var 这样的代码是很常见的,如果PHP对于每一个变量赋值都重新分配内存,copy数据的话,那么上面的这段代码就要申请18个字节的内存空间,为了申请新的内存,还需要cpu执行某些计算,这当然会加重cpu的负载而我们也很容易看出来,上面的代码其实根本没有必要申请两份空间,当第三句执行后,$var被释放了,我们刚才的设想(申请18个字节内存空间)突然变的很滑稽,这次复制显得好多余。如果早知道$var不用了,直接让$var_dup用$var的内存不就行了,还复制干嘛?如果你觉得9个字节没什么,那设想下如果$var是个10M的文件内容,或者20M,是不是我们的计算机资源消耗的有点冤枉呢?呵呵,PHP的开发者也看出来了: 刚才说了,PHP中的变量是用一个存储在symbol_table中的符号名,对应一个zval来实现的,比如对于上面的第一行代码,会在symbol_table中存储一个值“var”,对应的有一个指针指向一个zval结构,变量值“laruence”保存在这个zval中,所以不难想象,对于上面的代码来说,我们完全可以让“var”和“var_dup”对应的指针都指向同一个zval就可以了(额,鸟哥一会说hash table,一会说symbol_table,暂且理解为symbol_table是hash table的子集) PHP也是这样做的,这个时候就需要介绍一下zval结构中的refcount字段了refcount,引用计数,记录了当前的zval被引用的次数(这里的引用并不是真正的 & ,而是有几个变量指向它)比如对于代码:第一行,创建了一个整形变量,变量值是1。 此时保存整形1的这个zval的refcount为1第二行,创建了一个新的整形变量(通过赋值的方式),变量也指向刚才创建的zval,并将这个zval的refcount加1,此时这个zval的refcount为2所以,这个时候(通过值传递的方式赋值给别的变量),并没有产生新的zval,两个变量指向同一zval,通过一个计数器来共用zval及内存地址,以达到节省内存空间的目的当一个变量被第一次创建的时候,它对应的zval结构的refcount的值会被初始化为1,因为只有这一个变量在用它。但是当你把这个变量赋值给别的变量时,refcount属性便会加1变成2,因为现在有两个变量在用这个zval结构了 PHP提供了一个函数可以帮助我们了解这个过程debug_zval_dump输出:long(1) refcount(2)long(1) refcount(3)如果你奇怪 ,var的refcount应该是1啊?我们知道,对于简单变量,PHP是以传值的形式传参数的。也就是说,当执行debug_zval_dump($var)的时候,$var会以传值的方式传递给debug_zval_dump,也就是会导致var的refcount加1,所以只要能看到,当变量赋值给一个变量以后,能导致zval的refcount加1这个结果即可现在我们回头看上面的代码, 当执行了最后一行unset($var)以后,会发生什么呢?unset($var)的时候,它删除符号表里的$var的信息,准备清理它对应的zval及内存空间,这时它发现$var对应的zval结构的refcount值是2,也就是说,还有另外一个变量在一起用着这个zval,所以unset只需把这个zval的refcount减去1就行了上代码:输出:string(8) "laruence" refcount(2) 但是,对于下面的代码呢?很明显在这段代码执行以后,$var_dup的值应该还是“laruence”,那么这又是怎么实现的呢?这就是PHP的copy on write机制(简称COW):PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的过程(在Zend引擎中,分离是破坏一个引用对的过程)对于上面的代码,当执行到第三行的时候,PHP发现$var想要改变,并且它指向的zval的refcount大于1,那么PHP就会复制一个新的zval出来,改变其值,将改变的变量指向新的zval(哪个变量指向新复制的zval其实已经无所谓了),并将原zval的refcount减1,并修改symbol_table里该变量的指针,使得$var和$var_dup分离(Separation)。这个机制就是所谓的copy on write(写时复制,这里的写包括普通变量的修改及数组对象里的增加、删除单元操作)如果了解了is_ref之后,上面说的并不严谨 上代码测试:输出:long(1) refcount(2)string(8) "laruence" refcount(2) 现在我们知道,当使用变量复制的时候 ,PHP内部并不是真正的复制,而是采用指向相同的zval结构来节约开销。那么,对于PHP中的引用,又是如何实现呢?这段代码结束以后,$var也会被间接的修改为1,这个过程称作(change on write:写时改变)那么ZE是怎么知道,这次的复制不需要Separation呢?这个时候就要用到zval中的is_ref字段了:对于上面的代码,当第二行执行以后,$var所代表的zval的refcount变为2,并且设置is_ref为1到第三行的时候,PHP先检查var_ref对应的zval的is_ref字段(is_ref 表示该zval是否被&引用,仅表示真或假,就像开关的开与关一样,zval的初始化情况下为0,即非引用),如果为1,则不分离,直接更改(否则需要执行刚刚提到的zval分离),更改共享的zval实际上也间接更改了$var的值,因为引擎想所有的引用变量都看到这一改变php源码做了这样一个判断,大体逻辑示意如下:如果这个zval中的if_ref为1(即被引用),或者该zval引用计数小于2任何一种方式:都不会进行分离 尽管已经存在写时复制和写时改变,但仍然还存在一些不能通过is_ref和refcount来解决的问题对于如下的代码,又会怎样呢?这里$var、$var_dup、$var_ref三个变量将共用一个zval结构(其实这是不可能的,一个zval不可能既被&,又被指向),有两个属于change-on-write组合($var和$var_ref),有两个属于copy-on-write组合($var和$var_dup),那is_ref和refcount该怎样工作,才能正确的处理好这段复杂的关系呢?答案是不可能!在这种情况下,变量的值必须分离成两份完全独立的存在当执行第二行代码的时候,和前面讲过的一样,$var_dup 和 $var 指向相同的zval, refcount为2当执行第三行的时候,PHP发现要操作的zval的refcount大于1,则PHP会执行Separation(也就是说php将一个zval的is_ref从0设为1 之前,当然此时refcount还没有增加,会看该zval的refcount,如果refcount>1,则会分离), 将$var_dup分离出去,并将$var和$var_ref做change on write关联。也就是,refcount=2, is_ref=1;所以内存会给变量var_dup 分配出一个新的zval,类型与值同 $var和$var_ref指向的zval一样,是新分配出来的,尽管他们拥有同样的值,但是必须通过两个zval来实现。试想一下,如果三者指向同一个zval的话,改边 $var_dup 的值,那么 $var和$var_ref 也会受到影响,这样就乱套了图解:下面的这段代码在内核中同样会产生歧义,所以需要强制复制!也就是说一个zval不会既被引用,又被指向,必须分离 基于这样的分析,我们就可以让debug_zval_dump出refcount为1的结果来:输出:string(8) "laruence" refcount(1) 为什么结果是refcount(1)呢debug_zval_dump()中参数是引用的话,refcount永远为1这两段代码在执行的时候是这样的逻辑:PHP先看变量指向的zval是否被引用,如果是引用,则不再产生新的zval甭管哪个变量引用了它,比如有个变量$a被引用了,$b=&$a,就算自己引用自己$a=&$a,$a所指向的zval都不会被复制,改变其中一个变量的值,另一个值也被改变(写时改变)如果is_ref为0且refcount大于1,改变其中一个变量时,复制新的zval(写时复制) 还有一个知识点需要了解下,就是PHP数组复制的机制复制一个数组,就是把一个数组赋值给一个变量便可。会把数组指针位置一同复制。这里面有两种情况:① 指针位置合法,这时直接复制,无影响② 原数组指针位置非法时(移出界),“新”数组指针会初始化(这里的新为什么要加引号?请看下文),而老的数组指针位置不变,还是false先看例子: 结果:!结果:出现这种情况好像不对?$arr2 难道不是新数组?新数组的数组指针应该重置了啊这里注意了:$arr2 = $arr1 ,在俩变量都没发生写操作时,他们其实引用的是同一个内存地址。在其中一个变量发生写操作后,内存地址会复制一份,发生改变的变量会去引用它,并把数组指针初始化。所以 $arr1 会去引用复制的内存地址,并将指针初始化二。.foreach循环时调用current等函数!结果: 56按照之前说的,foreach先赋值,再移动指针,再执行循环体,第一次结果为2可以理解为什么三次都是2呢?咋就这么2呢?因为current函数是按引用传递的函数 在zval笔记中说了,一个zval不能既被引用,又被指向所以,变量分离,重新拷贝一份数组专门用于current函数 当然,如果数组zval的is_ref为1,则不会拷贝数组了或者:结果:current是引用传参

杨冬芳 2019-12-02 02:26:33 0 浏览量 回答数 0

回答

C语言中有一个(愚蠢的)规则,说任何普通变量都可以用大括号括起来的初始化程序列表进行初始化,就好像它是一个数组一样。 例如,您可以编写int x = {0};,这完全等同于int x = 0;。 因此,在编写时,您int *nums = {5, 2, 1, 4};实际上是在为单个指针变量提供一个初始化器列表。但是,它只是一个变量,因此只会分配第一个值5,其余的列表将被忽略(实际上,我不认为带有过多初始值设定项的代码甚至不应该使用严格的编译器进行编译)-不会完全写入内存。该代码等效于 int *nums = 5;。也就是说,nums应该指向address 5。 此时,您应该已经收到了两个编译器警告/错误: 在不强制转换的情况下将整数分配给指针。 初始化程序列表中的多余元素。 然后,当然,代码将崩溃并烧毁,因为5很可能不是您可以取消引用的有效地址nums[0]。 附带说明,您应该printf使用说明%p符指向指针地址,否则将调用未定义的行为。 我不太确定您要在这里做什么,但是如果要设置一个指向数组的指针,则应该执行以下操作: int nums[] = {5, 2, 1, 4}; int* ptr = nums; // or equivalent: int* ptr = (int[]){5, 2, 1, 4}; 或者,如果您要创建一个指针数组: int* ptr[] = { /* whatever makes sense here */ };

保持可爱mmm 2020-02-08 14:35:25 0 浏览量 回答数 0

问题

图解!24张图彻底弄懂九大常见数据结构! 7月22日 【今日算法】

游客ih62co2qqq5ww 2020-07-27 13:19:32 6 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

图解九大数据结构 6月13日 【今日算法】

游客ih62co2qqq5ww 2020-06-17 13:17:00 29 浏览量 回答数 1

回答

遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么? 遍历方式有以下几种: for 循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止。 迭代器遍历,Iterator。Iterator 是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。 foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现,使用时不需要显式声明 Iterator 或计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过程中操作数据集合,例如删除、替换。 最佳实践:Java Collections 框架中提供了一个 RandomAccess 接口,用来标记 List 实现是否支持 Random Access。 如果一个数据集合实现了该接口,就意味着它支持 Random Access,按位置读取元素的平均时间复杂度为 O(1),如ArrayList。如果没有实现该接口,表示不支持 Random Access,如LinkedList。 推荐的做法就是,支持 Random Access 的列表可用 for 循环遍历,否则建议用 Iterator 或 foreach 遍历。 说一下 ArrayList 的优缺点 ArrayList的优点如下: ArrayList 底层以数组实现,是一种随机访问模式。ArrayList 实现了 RandomAccess 接口,因此查找的时候非常快。ArrayList 在顺序添加一个元素的时候非常方便。 ArrayList 的缺点如下: 删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性能。插入元素的时候,也需要做一次元素复制操作,缺点同上。 ArrayList 比较适合顺序添加、随机访问的场景。 如何实现数组和 List 之间的转换? 数组转 List:使用 Arrays. asList(array) 进行转换。List 转数组:使用 List 自带的 toArray() 方法。 代码示例: ArrayList 和 LinkedList 的区别是什么? 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。线程安全:ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。 补充:数据结构基础之双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 ArrayList 和 Vector 的区别是什么? 这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。性能:ArrayList 在性能方面要优于 Vector。扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。 Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。 Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。 插入数据时,ArrayList、LinkedList、Vector谁速度较快?阐述 ArrayList、Vector、LinkedList 的存储性能和特性? ArrayList、LinkedList、Vector 底层的实现都是使用数组方式存储数据。数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。 Vector 中的方法由于加了 synchronized 修饰,因此 Vector 是线程安全容器,但性能上较ArrayList差。 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但插入数据时只需要记录当前项的前后项即可,所以 LinkedList 插入速度较快。 多线程场景下如何使用 ArrayList? ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样: 为什么 ArrayList 的 elementData 加上 transient 修饰? ArrayList 中的数组定义如下: private transient Object[] elementData; 再看一下 ArrayList 的定义: public class ArrayList extends AbstractList implements List<E>, RandomAccess, Cloneable, java.io.Serializable 可以看到 ArrayList 实现了 Serializable 接口,这意味着 ArrayList 支持序列化。transient 的作用是说不希望 elementData 数组被序列化,重写了 writeObject 实现: 每次序列化时,先调用 defaultWriteObject() 方法序列化 ArrayList 中的非 transient 元素,然后遍历 elementData,只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大小。 List 和 Set 的区别 List , Set 都是继承自Collection 接口 List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。 Set 特点:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。 另外 List 支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。 Set和List对比 Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变 Set接口 说一下 HashSet 的实现原理? HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。 HashSet如何检查重复?HashSet是如何保证数据不可重复的? 向HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法比较。 HashSet 中的add ()方法会使用HashMap 的put()方法。 HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复( HashMap 比较key是否相等是先比较hashcode 再比较equals )。 以下是HashSet 部分源码: hashCode()与equals()的相关规定: 如果两个对象相等,则hashcode一定也是相同的 两个对象相等,对两个equals方法返回true 两个对象有相同的hashcode值,它们也不一定是相等的 综上,equals方法被覆盖过,则hashCode方法也必须被覆盖 hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。 ** ==与equals的区别** ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同 ==是指对内存地址进行比较 equals()是对字符串的内容进行比较3.==指引用是否相同 equals()指的是值是否相同 HashSet与HashMap的区别 Queue BlockingQueue是什么? Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。 在 Queue 中 poll()和 remove()有什么区别? 相同点:都是返回第一个元素,并在队列中删除返回的对象。 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。 代码示例: Queue queue = new LinkedList (); queue. offer("string"); // add System. out. println(queue. poll()); System. out. println(queue. remove()); System. out. println(queue. size()); Map接口 说一下 HashMap 的实现原理? HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 HashMap的数据结构: 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 HashMap 基于 Hash 算法实现的 当我们往Hashmap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。 需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn) HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现 在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做拉链法的方式可以解决哈希冲突。 JDK1.8之前 JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。 JDK1.8之后 相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。 JDK1.7 VS JDK1.8 比较 JDK1.8主要解决或优化了一下问题: resize 扩容优化引入了红黑树,目的是避免单条链表过长而影响查询效率,红黑树算法请参考解决了多线程死循环问题,但仍是非线程安全的,多线程时可能会造成数据丢失问题。 HashMap的put方法的具体流程? 当我们put的时候,首先计算 key的hash值,这里调用了 hash方法,hash方法实际是让key.hashCode()与key.hashCode()>>>16进行异或操作,高16bit补0,一个数和0异或不变,所以 hash 函数大概的作用就是:高16bit不变,低16bit和高16bit做了一个异或,目的是减少碰撞。按照函数注释,因为bucket数组大小是2的幂,计算下标index = (table.length - 1) & hash,如果不做 hash 处理,相当于散列生效的只有几个低 bit 位,为了减少散列的碰撞,设计者综合考虑了速度、作用、质量之后,使用高16bit和低16bit异或来简单处理减少碰撞,而且JDK8中用了复杂度 O(logn)的树结构来提升碰撞下的性能。 putVal方法执行流程图 ①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容; ②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③; ③.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的是hashCode以及equals; ④.判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向⑤; ⑤.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可; ⑥.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。 HashMap的扩容操作是怎么实现的? ①.在jdk1.8中,resize方法是在hashmap中的键值对大于阀值时或者初始化时,就调用resize方法进行扩容; ②.每次扩展的时候,都是扩展2倍; ③.扩展后Node对象的位置要么在原位置,要么移动到原偏移量两倍的位置。 在putVal()中,我们看到在这个函数里面使用到了2次resize()方法,resize()方法表示的在进行第一次初始化时会对其进行扩容,或者当该数组的实际大小大于其临界值值(第一次为12),这个时候在扩容的同时也会伴随的桶上面的元素进行重新分发,这也是JDK1.8版本的一个优化的地方,在1.7中,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,但在1.8版本中,则是根据在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上 HashMap是怎么解决哈希冲突的? 答:在解决这个问题之前,我们首先需要知道什么是哈希冲突,而在了解哈希冲突之前我们还要知道什么是哈希才行; 什么是哈希? Hash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 所有散列函数都有如下一个基本特性**:根据同一散列函数计算出的散列值如果不同,那么输入值肯定也不同。但是,根据同一散列函数计算出的散列值如果相同,输入值不一定相同**。 什么是哈希冲突? 当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)。 HashMap的数据结构 在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做链地址法的方式可以解决哈希冲突: 这样我们就可以将拥有相同哈希值的对象组织成一个链表放在hash值所对应的bucket下,但相比于hashCode返回的int类型,我们HashMap初始的容量大小DEFAULT_INITIAL_CAPACITY = 1 << 4(即2的四次方16)要远小于int类型的范围,所以我们如果只是单纯的用hashCode取余来获取对应的bucket这将会大大增加哈希碰撞的概率,并且最坏情况下还会将HashMap变成一个单链表,所以我们还需要对hashCode作一定的优化 hash()函数 上面提到的问题,主要是因为如果使用hashCode取余,那么相当于参与运算的只有hashCode的低位,高位是没有起到任何作用的,所以我们的思路就是让hashCode取值出的高位也参与运算,进一步降低hash碰撞的概率,使得数据分布更平均,我们把这样的操作称为扰动,在JDK 1.8中的hash()函数如下: static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);// 与自己右移16位进行异或运算(高低位异或) } 这比在JDK 1.7中,更为简洁,相比在1.7中的4次位运算,5次异或运算(9次扰动),在1.8中,只进行了1次位运算和1次异或运算(2次扰动); JDK1.8新增红黑树 通过上面的链地址法(使用散列表)和扰动函数我们成功让我们的数据分布更平均,哈希碰撞减少,但是当我们的HashMap中存在大量数据时,加入我们某个bucket下对应的链表有n个元素,那么遍历时间复杂度就为O(n),为了针对这个问题,JDK1.8在HashMap中新增了红黑树的数据结构,进一步使得遍历复杂度降低至O(logn); 总结 简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的: 使用链地址法(使用散列表)来链接拥有相同hash值的数据;使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;引入红黑树进一步降低遍历的时间复杂度,使得遍历更快; **能否使用任何类作为 Map 的 key? **可以使用任何类作为 Map 的 key,然而在使用之前,需要考虑以下几点: 如果类重写了 equals() 方法,也应该重写 hashCode() 方法。 类的所有实例需要遵循与 equals() 和 hashCode() 相关的规则。 如果一个类没有使用 equals(),不应该在 hashCode() 中使用它。 用户自定义 Key 类最佳实践是使之为不可变的,这样 hashCode() 值可以被缓存起来,拥有更好的性能。不可变的类也可以确保 hashCode() 和 equals() 在未来不会改变,这样就会解决与可变相关的问题了。 为什么HashMap中String、Integer这样的包装类适合作为K? 答:String、Integer等包装类的特性能够保证Hash值的不可更改性和计算准确性,能够有效的减少Hash碰撞的几率 都是final类型,即不可变性,保证key的不可更改性,不会存在获取hash值不同的情况 内部已重写了equals()、hashCode()等方法,遵守了HashMap内部的规范(不清楚可以去上面看看putValue的过程),不容易出现Hash值计算错误的情况; 如果使用Object作为HashMap的Key,应该怎么办呢? 答:重写hashCode()和equals()方法 重写hashCode()是因为需要计算存储数据的存储位置,需要注意不要试图从散列码计算中排除掉一个对象的关键部分来提高性能,这样虽然能更快但可能会导致更多的Hash碰撞; 重写equals()方法,需要遵守自反性、对称性、传递性、一致性以及对于任何非null的引用值x,x.equals(null)必须返回false的这几个特性,目的是为了保证key在哈希表中的唯一性; HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标 答:hashCode()方法返回的是int整数类型,其范围为-(2 ^ 31)~(2 ^ 31 - 1),约有40亿个映射空间,而HashMap的容量范围是在16(初始化默认值)~2 ^ 30,HashMap通常情况下是取不到最大值的,并且设备上也难以提供这么多的存储空间,从而导致通过hashCode()计算出的哈希值可能不在数组大小范围内,进而无法匹配存储位置; 那怎么解决呢? HashMap自己实现了自己的hash()方法,通过两次扰动使得它自己的哈希值高低位自行进行异或运算,降低哈希碰撞概率也使得数据分布更平均; 在保证数组长度为2的幂次方的时候,使用hash()运算之后的值与运算(&)(数组长度 - 1)来获取数组下标的方式进行存储,这样一来是比取余操作更加有效率,二来也是因为只有当数组长度为2的幂次方时,h&(length-1)才等价于h%length,三来解决了“哈希值与数组大小范围不匹配”的问题; HashMap 的长度为什么是2的幂次方 为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。 这个算法应该如何设计呢? 我们首先可能会想到采用%取余的操作来实现。但是,重点来了:“取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是2的幂次方。 那为什么是两次扰动呢? 答:这样就是加大哈希值低位的随机性,使得分布更均匀,从而提高对应数组存储下标位置的随机性&均匀性,最终减少Hash冲突,两次就够了,已经达到了高位低位同时参与运算的目的; HashMap 与 HashTable 有什么区别? 线程安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!); 效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它; 对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛NullPointerException。 **初始容量大小和每次扩充容量大小的不同 **: ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。 如何决定使用 HashMap 还是 TreeMap? 对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。 HashMap 和 ConcurrentHashMap 的区别 ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的synchronized锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。(JDK1.8之后ConcurrentHashMap启用了一种全新的方式实现,利用CAS算法。) HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。 ConcurrentHashMap 和 Hashtable 的区别? ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。 底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的; 实现线程安全的方式(重要): ① 在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。(默认分配16个Segment,比Hashtable效率提高16倍。) 到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6以后 对 synchronized锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;② Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。 两者的对比图: HashTable: JDK1.7的ConcurrentHashMap: JDK1.8的ConcurrentHashMap(TreeBin: 红黑二叉树节点 Node: 链表节点): 答:ConcurrentHashMap 结合了 HashMap 和 HashTable 二者的优势。HashMap 没有考虑同步,HashTable 考虑了同步的问题。但是 HashTable 在每次同步执行时都要锁住整个结构。 ConcurrentHashMap 锁的方式是稍微细粒度的。 ConcurrentHashMap 底层具体实现知道吗?实现原理是什么? JDK1.7 首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。 在JDK1.7中,ConcurrentHashMap采用Segment + HashEntry的方式进行实现,结构如下: 一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。 该类包含两个静态内部类 HashEntry 和 Segment ;前者用来封装映射表的键值对,后者用来充当锁的角色;Segment 是一种可重入的锁 ReentrantLock,每个 Segment 守护一个HashEntry 数组里得元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment 锁。 JDK1.8 在JDK1.8中,放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现,synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。 结构如下: 如果该节点是TreeBin类型的节点,说明是红黑树结构,则通过putTreeVal方法往红黑树中插入节点;如果binCount不为0,说明put操作对数据产生了影响,如果当前链表的个数达到8个,则通过treeifyBin方法转化为红黑树,如果oldVal不为空,说明是一次更新操作,没有对元素个数产生影响,则直接返回旧值;如果插入的是一个新节点,则执行addCount()方法尝试更新元素个数baseCount; 辅助工具类 Array 和 ArrayList 有何区别? Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。 如何实现 Array 和 List 之间的转换? Array 转 List: Arrays. asList(array) ;List 转 Array:List 的 toArray() 方法。 comparable 和 comparator的区别? comparable接口实际上是出自java.lang包,它有一个 compareTo(Object obj)方法用来排序comparator接口实际上是出自 java.util 包,它有一个compare(Object obj1, Object obj2)方法用来排序 一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo方法或compare方法,当我们需要对某一个集合实现两种排序方式,比如一个song对象中的歌名和歌手名分别采用一种排序方法的话,我们可以重写compareTo方法和使用自制的Comparator方法或者以两个Comparator来实现歌名排序和歌星名排序,第二种代表我们只能使用两个参数版的Collections.sort(). 方法如何比较元素? TreeSet 要求存放的对象所属的类必须实现 Comparable 接口,该接口提供了比较元素的 compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元素进 行排 序。 Collections 工具类的 sort 方法有两种重载的形式, 第一种要求传入的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较; 第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator 接口的子类型(需要重写 compare 方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java 中对函数式编程的支持)。

剑曼红尘 2020-03-24 14:41:57 0 浏览量 回答数 0

回答

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 [编辑本段]基本概念 * 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。 * 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 [编辑本段]常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位ǐ 1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a•key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法 3. 平方取中法 4. 折叠法 5. 随机数法 6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。 [编辑本段]处理冲突的方法 1. 开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法: 1. di=1,2,3,…, m-1,称线性探测再散列; 2. di=1^2, (-1)^2, 2^2,(-2)^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列; 3. di=伪随机数序列,称伪随机探测再散列。 == 2. 再散列法:Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。 3. 链地址法(拉链法) 4. 建立一个公共溢出区 [编辑本段]查找的性能分析 散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平均查找长度来衡量。 查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素: 1. 散列函数是否均匀; 2. 处理冲突的方法; 3. 散列表的装填因子。 散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度 α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。 实际上,散列表的平均查找长度是装填因子α的函数,只是不同处理冲突的方法有不同的函数。 了解了hash基本定义,就不能不提到一些著名的hash算法,MD5 和 SHA-1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢? 这里简单说一下: (1) MD4 MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。 (2) MD5 MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好 (3) SHA-1 及其他 SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。 那么这些Hash算法到底有什么用呢? Hash算法在信息安全方面的应用主要体现在以下的3个方面: (1) 文件校验 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。 (2) 数字签名 Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。 (3) 鉴权协议 如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。 MD5、SHA1的破解 2004年8月17日,在美国加州圣芭芭拉召开的国际密码大会上,山东大学王小云教授在国际会议上首次宣布了她及她的研究小组近年来的研究成果——对MD5、HAVAL-128、MD4和RIPEMD等四个著名密码算法的破译结果。 次年二月宣布破解SHA-1密码。 [编辑本段]实际应用 以上就是一些关于hash以及其相关的一些基本预备知识。那么在emule里面他具体起到什么作用呢? 大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是点对点的意思的软件), 它采用了"多源文件传输协议”(MFTP,the Multisource FileTransfer Protocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule 对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。 什么是文件的hash值呢? MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。 当我们的文件放到emule里面进行共享发布的时候,emule会根据hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候, 这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了。 一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。 对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。 那么什么是userhash呢? 道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。 那么什么是hash文件呢? 我们经常在emule日志里面看到,emule正在hash文件,这里就是利用了hash算法的文件校验性这个功能了,文章前面已经说了一些这些功能,其实这部分是一个非常复杂的过程,目前在ftp,bt等软件里面都是用的这个基本原理,emule里面是采用文件分块传输,这样传输的每一块都要进行对比校验,如果错误则要进行重新下载,这期间这些相关信息写入met文件,直到整个任务完成,这个时候part文件进行重新命名,然后使用move命令,把它传送到incoming文件里面,然后met文件自动删除,所以我们有的时候会遇到hash文件失败,就是指的是met里面的信息出了错误不能够和part文件匹配,另外有的时候开机也要疯狂hash,有两种情况一种是你在第一次使用,这个时候要hash提取所有文件信息,还有一种情况就是上一次你非法关机,那么这个时候就是要进行排错校验了。 关于hash的算法研究,一直是信息科学里面的一个前沿,尤其在网络技术普及的今天,他的重要性越来越突出,其实我们每天在网上进行的信息交流安全验证,我们在使用的操作系统密钥原理,里面都有它的身影,特别对于那些研究信息安全有兴趣的朋友,这更是一个打开信息世界的钥匙,他在hack世界里面也是一个研究的焦点。 一般的线性表、树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较”的基础上,查找的效率与比较次数密切相关。理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。因而查找时,只需根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可直接取得所查记录。在此,称这个对应关系f为哈希函数,按这个思想建立的表为哈希表(又称为杂凑法或散列表)。 哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而hash(key1)=hash(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。 因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。 对于动态查找表而言,1) 表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数) 哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。 现实中哈希函数是需要构造的,并且构造的好才能使用的好。 用途:加密,解决冲突问题。。。。 用途很广,比特精灵中就使用了哈希函数,你可 以自己看看。 具体可以学习一下数据结构和算法的书。 [编辑本段]字符串哈希函数 (著名的ELFhash算法) int ELFhash(char *key) return h%MOD; }

晚来风急 2019-12-02 01:22:24 0 浏览量 回答数 0

问题

MaxCompute百问集锦

yq传送门 2019-12-01 20:16:47 2404 浏览量 回答数 1

问题

MongoDB与内存 先讲讲Linux是如何管理内存的 再说说MongoDB是如何使用内存的:报错

kun坤 2020-06-14 08:19:04 0 浏览量 回答数 0

回答

我的两个程序都遇到了相同的问题。我的错误是这样的: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 我花了几天时间解决这个问题。我已经测试了不同网站中提到的许多方法,但是没有一种有效。最后,我更改了代码,找出了问题所在。我将尝试向您介绍不同的方法,并在此处进行总结。 当我在互联网上寻找该错误的解决方案时,我发现有许多解决方案至少对一个人有用,但其他人则说这不适用于他们! 为什么有很多方法可以解决此错误? 似乎通常在连接到服务器时出现此错误。可能是因为错误的查询字符串或与数据库的连接过多。 因此,我建议您一个接一个地尝试所有解决方案,不要放弃! 这是我在互联网上找到的解决方案,对于每个解决方案,至少都有人用该解决方案解决了他的问题。 提示:对于需要更改MySQL设置的解决方案,可以参考以下文件: Linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于Linux发行版和使用的MySQL软件包) Windows:C:** ProgramData ** \ MySQL \ MySQL Server 5.6 \ my.ini(请注意,它是ProgramData,而不是Program Files) 以下是解决方案: 更改“绑定地址”属性 取消注释“绑定地址”属性或将其更改为以下IP之一: bind-address =“ 127.0.0.1” 要么 绑定地址=“ 0.0.0.0” 注释掉“跳过网络” 如果您的MySQL配置文件中有“跳过网络”行,请在该行的开头添加“#”符号使其成为注释。 更改“ wait_timeout”和“ interactive_timeout” 将这些行添加到MySQL配置文件中: wait_timeout = 数字 Interactive_timeout = 数字 connect_timeout = 数字 确保Java没有将'localhost'转换为[::: 1]而不是[127.0.0.1] 由于MySQL可以识别127.0.0.1(IPv4)但不能识别::: 1(IPv6) 可以通过使用以下两种方法之一来避免这种情况: 选项#1:在连接字符串中使用127.0.0.1代替localhost,以避免将localhost转换为::: 1 选项#2:使用选项-Djava.net.preferIPv4Stack = true运行Java,以强制Java使用IPv4而不是IPv6。在Linux上,也可以通过运行(或将其放在/ etc / profile中: export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true" 检查操作系统代理设置,防火墙和防病毒程序 确保防火墙或防病毒软件没有阻止MySQL服务。 在Linux上暂时停止iptables。如果iptables配置错误,它们可能允许将tcp数据包发送到mysql端口,但阻止tcp数据包通过同一连接返回。 Redhat enterprise and CentOS systemctl stop iptables.service Other linux distros service iptables stop 在Windows上停止防病毒软件。 更改连接字符串 检查您的查询字符串。您的连接字符串应如下所示: dbName = "my_database"; dbUserName = "root"; dbPassword = ""; String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8"; 确保您的字符串中没有空格。所有连接字符串应继续,且不包含任何空格字符。 尝试用回送地址127.0.0.1替换“ localhost”。也尝试将端口号添加到您的连接字符串中,例如: String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8"; 通常,MySQL的默认端口是3306。 不要忘记将用户名和密码更改为MySQL服务器的用户名和密码。 更新您的JDK驱动程序库文件 测试不同的JDK和JRE(例如JDK 6和7) 不要更改max_allowed_pa​​cket “ max_allowed_pa​​cket ”是MySQL配置文件中的一个变量,指示最大包大小,而不是最大包数。因此,这无助于解决此错误。 更改tomcat的安全性 将TOMCAT6_SECURITY =是更改为TOMCAT6_SECURITY =否 使用validationQuery属性 使用validationQuery =“ select now()”确保每个查询都有响应 自动重新连接 将此代码添加到您的连接字符串中: &autoReconnect=true&failOverReadOnly=false&maxReconnects=10 尽管这些解决方案都不适合我,但我建议您尝试一下。因为有些人按照以下步骤解决了他们的问题。 但是什么解决了我的问题? 我的问题是我在数据库上有很多SELECT。每次创建连接然后关闭它时。尽管我每次都关闭连接,但是系统面临许多连接,并给了我这个错误。我所做的是将连接变量定义为整个类的公共(或私有)变量,并在构造函数中对其进行了初始化。然后,每次我使用该连接时。它解决了我的问题,也大大提高了我的速度。 结论 没有简单独特的方法可以解决此问题。我建议您考虑自己的情况并选择上述解决方案。如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接字符串可能有问题。但是,如果在与数据库进行多次成功交互之后出现此错误,则问题可能出在连接数上,您可能会考虑更改“ wait_timeout”和其他MySQL设置,或者重写您的代码以减少连接数。来源:stack overflow

保持可爱mmm 2020-05-08 10:55:29 0 浏览量 回答数 0

问题

MaxCompute百问集锦(持续更新20171011)

隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

回答

HTTPS基本原理 一、http为什么不安全。 http协议没有任何的加密以及身份验证的机制,非常容易遭遇窃听、劫持、篡改,因此会造成个人隐私泄露,恶意的流量劫持等严重的安全问题。 国外很多网站都支持了全站https,国内方面目前百度已经在年初完成了搜索的全站https,其他大型的网站也在跟进中,百度最先完成全站https的最大原因就是百度作为国内最大的流量入口,劫持也必然是首当其冲的,造成的有形的和无形的损失也就越大。关于流量劫持问题,我在另一篇文章中也有提到,基本上是互联网企业的共同难题,https也是目前公认的比较好的解决方法。但是https也会带来很多性能以及访问速度上的牺牲,很多互联网公司在做大的时候都会遇到这个问题:https成本高,速度又慢,规模小的时候在涉及到登录和交易用上就够了,做大以后遇到信息泄露和劫持,想整体换,代价又很高。 2、https如何保证安全 要解决上面的问题,就要引入加密以及身份验证的机制。 这时我们引入了非对称加密的概念,我们知道非对称加密如果是公钥加密的数据私钥才能解密,所以我只要把公钥发给你,你就可以用这个公钥来加密未来我们进行数据交换的秘钥,发给我时,即使中间的人截取了信息,也无法解密,因为私钥在我这里,只有我才能解密,我拿到你的信息后用私钥解密后拿到加密数据用的对称秘钥,通过这个对称密钥来进行后续的数据加密。除此之外,非对称加密可以很好的管理秘钥,保证每次数据加密的对称密钥都是不相同的。 但是这样似乎还不够,如果中间人在收到我的给你公钥后并没有发给你,而是自己伪造了一个公钥发给你,这是你把对称密钥用这个公钥加密发回经过中间人,他可以用私钥解密并拿到对称密钥,此时他在把此对称密钥用我的公钥加密发回给我,这样中间人就拿到了对称密钥,可以解密传输的数据了。为了解决此问题,我们引入了数字证书的概念。我首先生成公私钥,将公钥提供给相关机构(CA),CA将公钥放入数字证书并将数字证书颁布给我,此时我就不是简单的把公钥给你,而是给你一个数字证书,数字证书中加入了一些数字签名的机制,保证了数字证书一定是我给你的。 所以综合以上三点: 非对称加密算法(公钥和私钥)交换秘钥 + 数字证书验证身份(验证公钥是否是伪造的) + 利用秘钥对称加密算法加密数据 = 安全 3、https协议简介 为什么是协议简介呢。因为https涉及的东西实在太多了,尤其是一些加密算法,非常的复杂,对于这些算法面的东西就不去深入研究了,这部分仅仅是梳理一下一些关于https最基本的原理,为后面分解https的连接建立以及https优化等内容打下理论基础。 3.1 对称加密算法 对称加密是指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要。 对称加密又分为两种模式:流加密和分组加密。 流加密是将消息作为位流对待,并且使用数学函数分别作用在每一个位上,使用流加密时,每加密一次,相同的明文位会转换成不同的密文位。流加密使用了密钥流生成器,它生成的位流与明文位进行异或,从而生成密文。现在常用的就是RC4,不过RC4已经不再安全,微软也建议网络尽量不要使用RC4流加密。 分组加密是将消息划分为若干位分组,这些分组随后会通过数学函数进行处理,每次一个分组。假设需要加密发生给对端的消息,并且使用的是64位的分组密码,此时如果消息长度为640位,就会被划分成10个64位的分组,每个分组都用一系列数学公式公式进行处理,最后得到10个加密文本分组。然后,将这条密文消息发送给对端。对端必须拥有相同的分组密码,以相反的顺序对10个密文分组使用前面的算法解密,最终得到明文的消息。比较常用的分组加密算法有DES、3DES、AES。其中DES是比较老的加密算法,现在已经被证明不安全。而3DES是一个过渡的加密算法,相当于在DES基础上进行三重运算来提高安全性,但其本质上还是和DES算法一致。而AES是DES算法的替代算法,是现在最安全的对称加密算法之一。分组加密算法除了算法本身外还存在很多种不同的运算方式,比如ECB、CBC、CFB、OFB、CTR等,这些不同的模式可能只针对特定功能的环境中有效,所以要了解各种不同的模式以及每种模式的用途。这个部分后面的文章中会详细讲。 对称加密算法的优、缺点: 优点:算法公开、计算量小、加密速度快、加密效率高。 缺点:(1)交易双方都使用同样钥匙,安全性得不到保证; (2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。 (3)能提供机密性,但是不能提供验证和不可否认性。 3.2 非对称加密算法 在非对称密钥交换算法出现以前,对称加密一个很大的问题就是不知道如何安全生成和保管密钥。非对称密钥交换过程主要就是为了解决这个问题,使得对称密钥的生成和使用更加安全。 密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等操作。 常见的密钥交换算法有RSA,ECDHE,DH,DHE等算法。涉及到比较复杂的数学问题,下面就简单介绍下最经典的RSA算法。RSA:算法实现简单,诞生于1977年,历史悠久,经过了长时间的破解测试,安全性高。缺点就是需要比较大的素数也就是质数(目前常用的是2048位)来保证安全强度,很消耗CPU运算资源。RSA是目前唯一一个既能用于密钥交换又能用于证书签名的算法。我觉得RSA可以算是最经典的非对称加密算法了,虽然算法本身都是数学的东西,但是作为最经典的算法,我自己也花了点时间对算法进行了研究,后面会详细介绍。 非对称加密相比对称加密更加安全,但也存在两个明显缺点: 1,CPU计算资源消耗非常大。一次完全TLS握手,密钥交换时的非对称解密计算量占整个握手过程的90%以上。而对称加密的计算量只相当于非对称加密的0.1%,如果应用层数据也使用非对称加解密,性能开销太大,无法承受。 2,非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是2048位,意味着待加密内容不能超过256个字节。 所以公钥加密(极端消耗CPU资源)目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。 3.3 身份认证 https协议中身份认证的部分是由数字证书来完成的,证书由公钥、证书主体、数字签名等内容组成,在客户端发起SSL请求后,服务端会将数字证书发给客户端,客户端会对证书进行验证(验证查看这张证书是否是伪造的。也就是公钥是否是伪造的),并获取用于秘钥交换的非对称密钥(获取公钥)。 数字证书有两个作用: 1,身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站。 2,分发公钥。每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。 申请一个受信任的数字证书通常有如下流程: 1,终端实体(可以是一个终端硬件或者网站)生成公私钥和证书请求。 2,RA(证书注册及审核机构)检查实体的合法性。如果个人或者小网站,这一步不是必须的。 3,CA(证书签发机构)签发证书,发送给申请者。 4,证书更新到repository(负责数字证书及CRL内容存储和分发),终端后续从repository更新证书,查询证书状态等。 数字证书验证: 申请者拿到CA的证书并部署在网站服务器端,那浏览器发起握手接收到证书后,如何确认这个证书就是CA签发的呢。怎样避免第三方伪造这个证书。答案就是数字签名(digital signature)。数字签名是证书的防伪标签,目前使用最广泛的SHA-RSA(SHA用于哈希算法,RSA用于非对称加密算法)数字签名的制作和验证过程如下: 1,数字签名的签发。首先是使用哈希函数对待签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。 2,数字签名的校验。使用CA的公钥解密签名,然后使用相同的签名函数对待签名证书内容进行签名并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。 需要注意的是: 1)数字签名签发和校验使用的密钥对是CA自己的公私密钥,跟证书申请者提交的公钥没有关系。 2)数字签名的签发过程跟公钥加密的过程刚好相反,即是用私钥加密,公钥解密。 3)现在大的CA都会有证书链,证书链的好处一是安全,保持根CA的私钥离线使用。第二个好处是方便部署和撤销,即如果证书出现问题,只需要撤销相应级别的证书,根证书依然安全。 4)根CA证书都是自签名,即用自己的公钥和私钥完成了签名的制作和验证。而证书链上的证书签名都是使用上一级证书的密钥对完成签名和验证的。 5)怎样获取根CA和多级CA的密钥对。它们是否可信。当然可信,因为这些厂商跟浏览器和操作系统都有合作,它们的公钥都默认装到了浏览器或者操作系统环境里。 3.4 数据完整性验证 数据传输过程中的完整性使用MAC算法来保证。为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。 MAC算法是在密钥参与下的数据摘要算法,能将密钥和任意长度的数据转换为固定长度的数据。发送者在密钥的参与下,利用MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利用同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值比较。如果二者相同,则报文没有改变;否则,报文在传输过程中被修改,接收者将丢弃该报文。 由于MD5在实际应用中存在冲突的可能性比较大,所以尽量别采用MD5来验证内容一致性。SHA也不能使用SHA0和SHA1,中国山东大学的王小云教授在2005年就宣布破解了 SHA-1完整版算法。微软和google都已经宣布16年及17年之后不再支持sha1签名证书。MAC算法涉及到很多复杂的数学问题,这里就不多讲细节了。 专题二--【实际抓包分析】 抓包结果: fiddler: wireshark: 可以看到,百度和我们公司一样,也采用以下策略: (1)对于高版本浏览器,如果支持 https,且加解密算法在TLS1.0 以上的,都将所有 http请求重定向到 https请求 (2)对于https请求,则不变。 【以下只解读https请求】 1、TCP三次握手 可以看到,我们访问的是 http://www.baidu.com/ , 在初次建立 三次握手的时候, 用户是去 连接 8080端口的(因为公司办公网做了代理,因此,我们实际和代理机做的三次握手,公司代理机再帮我们去连接百度服务器的80端口) 2、CONNECT 建立 由于公司办公网访问非腾讯域名,会做代理,因此,在进行https访问的时候,我们的电脑需要和公司代理机做 " CONNECT " 连接(关于 " CONNECT " 连接, 可以理解为虽然后续的https请求都是公司代理机和百度服务器进行公私钥连接和对称秘钥通信,但是,有了 " CONNECT " 连接之后,可以认为我们也在直接和百度服务器进行公私钥连接和对称秘钥通信。 ) fiddler抓包结果: CONNECT之后, 后面所有的通信过程,可以看做是我们的机器和百度服务器在直接通信 3、 client hello 整个 Secure Socket Layer只包含了: TLS1.2 Record Layer内容 (1)随机数 在客户端问候中,有四个字节以Unix时间格式记录了客户端的协调世界时间(UTC)。协调世界时间是从1970年1月1日开始到当前时刻所经历的秒数。在这个例子中,0x2516b84b就是协调世界时间。在他后面有28字节的随机数( random_C ),在后面的过程中我们会用到这个随机数。 (2)SID(Session ID) 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 (3) 密文族(Cipher Suites): RFC2246中建议了很多中组合,一般写法是"密钥交换算法-对称加密算法-哈希算法,以“TLS_RSA_WITH_AES_256_CBC_SHA”为例: (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 浏览器支持的加密算法一般会比较多,而服务端会根据自身的业务情况选择比较适合的加密组合发给客户端。(比如综合安全性以及速度、性能等因素) (4) Server_name扩展:( 一般浏览器也支持 SNI(Server Name Indication)) 当我们去访问一个站点时,一定是先通过DNS解析出站点对应的ip地址,通过ip地址来访问站点,由于很多时候一个ip地址是给很多的站点公用,因此如果没有server_name这个字段,server是无法给与客户端相应的数字证书的,Server_name扩展则允许服务器对浏览器的请求授予相对应的证书。 还有一个很好的功能: SNI(Server Name Indication)。这个的功能比较好,为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的CA证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8已经内置这一功能,据说新版的nginx也支持SNI。) 4、 服务器回复(包括 Server Hello, Certificate, Certificate Status) 服务器在收到client hello后,会回复三个数据包,下面分别看一下: 1)Server Hello 1、我们得到了服务器的以Unix时间格式记录的UTC和28字节的随机数 (random_S)。 2、Seesion ID,服务端对于session ID一般会有三种选择 (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) : 1)恢复的session ID:我们之前在client hello里面已经提到,如果client hello里面的session ID在服务端有缓存,服务端会尝试恢复这个session; 2)新的session ID:这里又分两种情况,第一种是client hello里面的session ID是空值,此时服务端会给客户端一个新的session ID,第二种是client hello里面的session ID此服务器并没有找到对应的缓存,此时也会回一个新的session ID给客户端; 3)NULL:服务端不希望此session被恢复,因此session ID为空。 3、我们记得在client hello里面,客户端给出了21种加密族,而在我们所提供的21个加密族中,服务端挑选了“TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”。 (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 这就意味着服务端会使用ECDHE-RSA算法进行密钥交换,通过AES_128_GCM对称加密算法来加密数据,利用SHA256哈希算法来确保数据完整性。这是百度综合了安全、性能、访问速度等多方面后选取的加密组合。 2)Certificate 在前面的https原理研究中,我们知道为了安全的将公钥发给客户端,服务端会把公钥放入数字证书中并发给客户端(数字证书可以自签发,但是一般为了保证安全会有一个专门的CA机构签发),所以这个报文就是数字证书,4097 bytes就是证书的长度。 我们打开这个证书,可以看到证书的具体信息,这个具体信息通过抓包报文的方式不是太直观,可以在浏览器上直接看。 (点击 chrome 浏览器 左上方的 绿色 锁型按钮) 3)Server Hello Done 我们抓的包是将 Server Hello Done 和 server key exchage 合并的包: 4)客户端验证证书真伪性 客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下: 证书链的可信性trusted certificate path,方法如前文所述; 证书是否吊销revocation,有两类方式离线CRL与在线OCSP,不同的客户端行为会不同; 有效期expiry date,证书是否在有效时间范围; 域名domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析; 5)秘钥交换 这个过程非常复杂,大概总结一下: (1)首先,其利用非对称加密实现身份认证和密钥协商,利用非对称加密,协商好加解密数据的 对称秘钥(外加CA认证,防止中间人窃取 对称秘钥) (2)然后,对称加密算法采用协商的密钥对数据加密,客户端和服务器利用 对称秘钥 进行通信; (3)最后,基于散列函数验证信息的完整性,确保通信数据不会被中间人恶意篡改。 此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数random_C和random_S与自己计算产生的Pre-master(由客户端和服务器的 pubkey生成的一串随机数),计算得到协商对称密钥; enc_key=Fuc(random_C, random_S, Pre-Master) 6)生成 session ticket 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 后续建立新的https会话,就可以利用 session ID 或者 session Tickets , 对称秘钥可以再次使用,从而免去了 https 公私钥交换、CA认证等等过程,极大地缩短 https 会话连接时间。 7) 利用对称秘钥传输数据 【半分钟后,再次访问百度】: 有这些大的不同: 由于服务器和浏览器缓存了 Session ID 和 Session Tickets,不需要再进行 公钥证书传递,CA认证,生成 对称秘钥等过程,直接利用半分钟前的 对称秘钥 加解密数据进行会话。 1)Client Hello 2)Server Hello

玄学酱 2019-12-02 01:27:08 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:05 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:06 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:05 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:06 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:06 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:07 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:05 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:06 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:06 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:05 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:06 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:05 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 通过阿里云 ICP 代备案系统提交备案申请,需验证您使用的阿里云产品。 产品验证时,如何选择产品类型? 如何查看云虚拟主机管理控制台用户名和密码? 产品验证失败是什么原因? 如何申请聚石塔备案服务号? 如何申请建站市场(云市场)产品备案服务号? 产品验证时,如何选择产品类型? 目前备案是在服务器提供商的备案平台提交申请。如果在阿里云备案系统申请备案,请您先购买阿里云服务器,并根据服务器选择对应的产品验证方式。 产品类型 备案平台地址 验证服务器 验证方式 参见文档 阿里云 http://beian.aliyun.com ECS、轻量应用服务器、弹性 web 托管、建站市场 备案服务号 用您购买阿里云服务器的账号登录 备案管理控制台,然后单击左侧导航栏中 备案服务号申请 。具体请参见 申请备案服务号。 万网主机 http://beian.aliyun.com 云虚拟服务器 主机管理用户名和密码 请参见本文档中:如何查看云虚拟主机管理控制台用户名和密码? 阿里巴巴旺铺/企业官网 http://icpbeian.aliyun.com 1688 旺铺/企业官网 域名 旺铺用户如何备案。 说明 如果您购买的是阿里云的域名,但是使用其他服务商的服务器来托管网站,请联系您的服务器提供商备案;如果您使用的是自己架设的服务器,请联系您的网络服务商备案,即提供您服务器上网服务的运营商,如电信、联通等。 如何查看云虚拟主机管理控制台用户名和密码? 如果您使用的是云虚拟主机,在进行备案产品验证时,选择 产品类型 为 万网主机,并通过主机账号和主机密码进行验证。 如您使用的是云享主机(锋云主机和翔云主机),请拨打咨询售后客服电话(95187 转 2),或进入 云享主机工单入口 提交工单,获取您的主机密码。 查看云虚拟主机管理控制台用户名和密码操作步骤: 用购买服务器账号登录 管理控制台,单击左侧导航栏中域名与网站(万网) > 云虚拟主机。 找到相应的主机,单击 管理 按钮。 在 账号信息 页面查看主机管理控制台用户名及密码。如果忘记密码,可单击 重置密码 修改密码。 产品验证失败是什么原因? 如果提交信息时,提示产品信息无效或已提交过备案信息等,表示产品验证失败。 验证失败原因及处理方法: 验证信息不正确,系统会提示 “产品信息无效”。请仔细核对所选产品类型是否与您已购买的产品类型一致。如果您使用的是云虚拟主机,请仔细核对填写的主机账号和密码是否正确(确认输入的信息前后没有空格)。如果信息确认无误,请登录虚拟主机管理控制台,将主机密码重置后再次验证。 系统提示“产品已经提交过网站备案”,备案主体数已经达到了规定的主体上限,请更换其他产品 ,表示此服务器可备案的主体已达到上限。建议您更换其他服务器进行产品验证。 每个阿里云 ECS 实例和轻量应用服务器可申请 5 个备案服务号,每个阿里云账号可通过弹性 Web 托管实例申请 5 个备案服务号,用于提交 5 个网站的备案申请。5 个网站备案可为同一个备案主体下,也可以是不同的备案主体,最多可对应五个不同主体。 每个建站市场(云市场)产品有 1 个备案服务号,提交一个网站的备案申请。 每个云虚拟主机(独享云虚机和共享云虚机)只能提交 1 个备案主体,但可在此主体下提交 10 个网站的备案申请。 提示:验证产品信息失败,接口异常,表示您产品验证的服务号无效。请查看申请该服务号的服务器是否已到期。如果对应服务器已到期,服务号即失效,请使用在有效期内的服务器申请服务号。 服务器相关问题,请参见 阿里云服务器与备案。 如何申请聚石塔备案服务号? 登录 聚石塔控制台。 单击 资源管理 > 弹性计算 > 续费/升级/弹性包/备案 。选择对应的产品,单击 备案 按钮。 在弹出页面单击 创建备案许可号。 说明 一个 ECS 实例和负载均衡只能申请 5 个免费的备案服务号;每个备案服务号只可以使用一次。 获取备案许可号之后,进入 备案系统 提交备案信息。备案流程可参见 备案图文引导。 申请服务号过程中遇到疑问请登录 聚石塔官网 首页咨询在线商务旺旺。 如何申请建站市场(云市场)产品备案服务号? 如果您购买的是建站市场(云市场)产品,也是通过备案服务号进行产品验证。每个云市场产品只有 1 个备案服务号。 在购买云市场产品后,登录阿里云控制台,单击 备案服务号申请。 在 备案服务号申请 页面中选择 建站市场,单击要备案产品操作栏中 查看 按钮。 将查询到的备案服务号用于备案系统验证即可。 相关文档 备案准备 阿里云服务器与备案相关问题 备案平台没有显示操作按钮 域名相关问题 填写主体信息和网站信息 网站备案域名核验 备案短信核验

2019-12-01 23:27:06 0 浏览量 回答数 0

问题

搞清楚这些,你就是域名高手——域名百问大合集

yq传送门 2019-12-01 19:38:17 24482 浏览量 回答数 41

问题

域名相关

麒麟论坛 2019-12-01 19:38:53 2165 浏览量 回答数 3

回答

在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重 视 它 , 战术上又 要 藐 视 它。先举个例子感受一下千万级到底是什么数量级?现在很流行的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服务时间,平均QPS只有30左右。对于一个后台服务器,单机的平均QPS可以到达800-1000,单独看写的业务量很简单 。为什么我们又不能说轻视它?第一,我们看它的数据存储,每天一百万的话,一年数据量的规模是多少?其次,刚才说的订单量,每一个订单要推送给附近的司机、司机要并发抢单,后面业务场景的访问量往往是前者的上百倍,轻松就超过上亿级别了。 今天我想从架构的本质谈起之后,希望大家理解在做一些建构设计的时候,它的出发点以及它解决的问题是什么。 架构,刚开始的解释是我从知乎上看到的。什么是架构?有人讲, 说架构并不是一 个很 悬 乎的 东西 , 实际 上就是一个架子 , 放一些 业务 和算法,跟我们的生活中的晾衣架很像。更抽象一点,说架构其 实 是 对 我 们 重复性业务 的抽象和我 们 未来 业务 拓展的前瞻,强调过去的经验和你对整个行业的预见。 我们要想做一个架构的话需要哪些能力?我觉得最重要的是架构师一个最重要的能力就是你要有 战 略分解能力。这个怎么来看呢: 第一,你必须要有抽象的能力,抽象的能力最基本就是去重,去重在整个架构中体现在方方面面,从定义一个函数,到定义一个类,到提供的一个服务,以及模板,背后都是要去重提高可复用率。 第二, 分类能力。做软件需要做对象的解耦,要定义对象的属性和方法,做分布式系统的时候要做服务的拆分和模块化,要定义服务的接口和规范。 第三, 算法(性能),它的价值体现在提升系统的性能,所有性能的提升,最终都会落到CPU,内存,IO和网络这4大块上。 这一页PPT举了一些例子来更深入的理解常见技术背后的架构理念。 第一个例子,在分布式系统我们会做 MySQL分 库 分表,我们要从不同的库和表中读取数据,这样的抽象最直观就是使用模板,因为绝大多数SQL语义是相同的,除了路由到哪个库哪个表,如果不使用Proxy中间件,模板就是性价比最高的方法。 第二看一下加速网络的CDN,它是做速度方面的性能提升,刚才我们也提到从CPU、内存、IO、网络四个方面来考虑,CDN本质上一个是做网络智能调度优化,另一个是多级缓存优化。 第三个看一下服务化,刚才已经提到了,各个大网站转型过程中一定会做服务化,其实它就是做抽象和做服务的拆分。第四个看一下消息队列,本质上还是做分类,只不过不是两个边际清晰的类,而是把两个边际不清晰的子系统通过队列解构并且异步化。新浪微博整体架构是什么样的 接下我们看一下微博整体架构,到一定量级的系统整个架构都会变成三层,客户端包括WEB、安卓和IOS,这里就不说了。接着还都会有一个接口层, 有三个主要作用: 第一个作用,要做 安全隔离,因为前端节点都是直接和用户交互,需要防范各种恶意攻击; 第二个还充当着一个 流量控制的作用,大家知道,在2014年春节的时候,微信红包,每分钟8亿多次的请求,其实真正到它后台的请求量,只有十万左右的数量级(这里的数据可能不准),剩余的流量在接口层就被挡住了; 第三,我们看对 PC 端和移 动 端的需求不一样的,所以我们可以进行拆分。接口层之后是后台,可以看到微博后台有三大块: 一个是 平台服 务, 第二, 搜索, 第三, 大数据。到了后台的各种服务其实都是处理的数据。 像平台的业务部门,做的就是 数据存储和读 取,对搜索来说做的是 数据的 检 索,对大数据来说是做的数据的 挖掘。微博其实和淘宝是很类似 微博其实和淘宝是很类似的。一般来说,第一代架构,基本上能支撑到用户到 百万 级别,到第二代架构基本能支撑到 千万 级别都没什么问题,当业务规模到 亿级别时,需要第三代的架构。 从 LAMP 的架构到面向服 务 的架构,有几个地方是非常难的,首先不可能在第一代基础上通过简单的修修补补满足用户量快速增长的,同时线上业务又不能停, 这是我们常说的 在 飞 机上 换 引擎的 问题。前两天我有一个朋友问我,说他在内部推行服务化的时候,把一个模块服务化做完了,其他部门就是不接。我建议在做服务化的时候,首先更多是偏向业务的梳理,同时要找准一个很好的切入点,既有架构和服务化上的提升,业务方也要有收益,比如提升性能或者降低维护成本同时升级过程要平滑,建议开始从原子化服务切入,比如基础的用户服务, 基础的短消息服务,基础的推送服务。 第二,就是可 以做无状 态 服 务,后面会详细讲,还有数据量大了后需要做数据Sharding,后面会将。 第三代 架构 要解决的 问题,就是用户量和业务趋于稳步增加(相对爆发期的指数级增长),更多考虑技术框架的稳定性, 提升系统整体的性能,降低成本,还有对整个系统监控的完善和升级。 大型网站的系统架构是如何演变的 我们通过通过数据看一下它的挑战,PV是在10亿级别,QPS在百万,数据量在千亿级别。我们可用性,就是SLA要求4个9,接口响应最多不能超过150毫秒,线上所有的故障必须得在5分钟内解决完。如果说5分钟没处理呢?那会影响你年终的绩效考核。2015年微博DAU已经过亿。我们系统有上百个微服务,每周会有两次的常规上线和不限次数的紧急上线。我们的挑战都一样,就是数据量,bigger and bigger,用户体验是faster and faster,业务是more and more。互联网业务更多是产品体验驱动, 技 术 在 产 品 体验上最有效的贡献 , 就是你的性能 越来越好 。 每次降低加载一个页面的时间,都可以间接的降低这个页面上用户的流失率。微博的技术挑战和正交分解法解析架构 下面看一下 第三代的 架构 图 以及 我 们 怎么用正交分解法 阐 述。 我们可以看到我们从两个维度,横轴和纵轴可以看到。 一个 维 度 是 水平的 分层 拆分,第二从垂直的维度会做拆分。水平的维度从接口层、到服务层到数据存储层。垂直怎么拆分,会用业务架构、技术架构、监控平台、服务治理等等来处理。我相信到第二代的时候很多架构已经有了业务架构和技术架构的拆分。我们看一下, 接口层有feed、用户关系、通讯接口;服务层,SOA里有基层服务、原子服务和组合服务,在微博我们只有原子服务和组合服务。原子服务不依赖于任何其他服务,组合服务由几个原子服务和自己的业务逻辑构建而成 ,资源层负责海量数据的存储(后面例子会详细讲)。技 术框架解决 独立于 业务 的海量高并发场景下的技术难题,由众多的技术组件共同构建而成 。在接口层,微博使用JERSY框架,帮助你做参数的解析,参数的验证,序列化和反序列化;资源层,主要是缓存、DB相关的各类组件,比如Cache组件和对象库组件。监 控平台和服 务 治理 , 完成系统服务的像素级监控,对分布式系统做提前诊断、预警以及治理。包含了SLA规则的制定、服务监控、服务调用链监控、流量监控、错误异常监控、线上灰度发布上线系统、线上扩容缩容调度系统等。 下面我们讲一下常见的设计原则。 第一个,首先是系统架构三个利器: 一个, 我 们 RPC 服 务组 件 (这里不讲了), 第二个,我们 消息中 间 件 。消息中间件起的作用:可以把两个模块之间的交互异步化,其次可以把不均匀请求流量输出为匀速的输出流量,所以说消息中间件 异步化 解耦 和流量削峰的利器。 第三个是配置管理,它是 代码级灰度发布以及 保障系统降级的利器。 第二个 , 无状态 , 接口 层 最重要的就是无状 态。我们在电商网站购物,在这个过程中很多情况下是有状态的,比如我浏览了哪些商品,为什么大家又常说接口层是无状态的,其实我们把状态从接口层剥离到了数据层。像用户在电商网站购物,选了几件商品,到了哪一步,接口无状态后,状态要么放在缓存中,要么放在数据库中, 其 实 它并不是没有状 态 , 只是在 这 个 过 程中我 们 要把一些有状 态 的 东 西抽离出来 到了数据层。 第三个, 数据 层 比服 务层 更需要 设计,这是一条非常重要的经验。对于服务层来说,可以拿PHP写,明天你可以拿JAVA来写,但是如果你的数据结构开始设计不合理,将来数据结构的改变会花费你数倍的代价,老的数据格式向新的数据格式迁移会让你痛不欲生,既有工作量上的,又有数据迁移跨越的时间周期,有一些甚至需要半年以上。 第四,物理结构与逻辑结构的映射,上一张图看到两个维度切成十二个区间,每个区间代表一个技术领域,这个可以看做我们的逻辑结构。另外,不论后台还是应用层的开发团队,一般都会分几个垂直的业务组加上一个基础技术架构组,这就是从物理组织架构到逻辑的技术架构的完美的映射,精细化团队分工,有利于提高沟通协作的效率 。 第五, www .sanhao.com 的访问过程,我们这个架构图里没有涉及到的,举个例子,比如当你在浏览器输入www.sanhao网址的时候,这个请求在接口层之前发生了什么?首先会查看你本机DNS以及DNS服务,查找域名对应的IP地址,然后发送HTTP请求过去。这个请求首先会到前端的VIP地址(公网服务IP地址),VIP之后还要经过负载均衡器(Nginx服务器),之后才到你的应用接口层。在接口层之前发生了这么多事,可能有用户报一个问题的时候,你通过在接口层查日志根本发现不了问题,原因就是问题可能发生在到达接口层之前了。 第六,我们说分布式系统,它最终的瓶颈会落在哪里呢?前端时间有一个网友跟我讨论的时候,说他们的系统遇到了一个瓶颈, 查遍了CPU,内存,网络,存储,都没有问题。我说你再查一遍,因为最终你不论用上千台服务器还是上万台服务器,最终系统出瓶颈的一定会落在某一台机(可能是叶子节点也可能是核心的节点),一定落在CPU、内存、存储和网络上,最后查出来问题出在一台服务器的网卡带宽上。微博多级双机房缓存架构 接下来我们看一下微博的Feed多级缓存。我们做业务的时候,经常很少做业务分析,技术大会上的分享又都偏向技术架构。其实大家更多的日常工作是需要花费更多时间在业务优化上。这张图是统计微博的信息流前几页的访问比例,像前三页占了97%,在做缓存设计的时候,我们最多只存最近的M条数据。 这里强调的就是做系统设计 要基于用 户 的 场 景 , 越细致越好 。举了一个例子,大家都会用电商,电商在双十一会做全国范围内的活动,他们做设计的时候也会考虑场景的,一个就是购物车,我曾经跟相关开发讨论过,购物车是在双十一之前用户的访问量非常大,就是不停地往里加商品。在真正到双十一那天他不会往购物车加东西了,但是他会频繁的浏览购物车。针对这个场景,活动之前重点设计优化购物车的写场景, 活动开始后优化购物车的读场景。 你看到的微博是由哪些部分聚合而成的呢?最右边的是Feed,就是微博所有关注的人,他们的微博所组成的。微博我们会按照时间顺序把所有关注人的顺序做一个排序。随着业务的发展,除了跟时间序相关的微博还有非时间序的微博,就是会有广告的要求,增加一些广告,还有粉丝头条,就是拿钱买的,热门微博,都会插在其中。分发控制,就是说和一些推荐相关的,我推荐一些相关的好友的微博,我推荐一些你可能没有读过的微博,我推荐一些其他类型的微博。 当然对非时序的微博和分发控制微博,实际会起多个并行的程序来读取,最后同步做统一的聚合。这里稍微分享一下, 从SNS社交领域来看,国内现在做的比较好的三个信息流: 微博 是 基于弱关系的媒体信息流 ; 朋友圈是基于 强 关系的信息流 ; 另外一个做的比 较 好的就是今日 头 条 , 它并不是基于关系来构建信息流 , 而是基于 兴趣和相关性的个性化推荐 信息流 。 信息流的聚合,体现在很多很多的产品之中,除了SNS,电商里也有信息流的聚合的影子。比如搜索一个商品后出来的列表页,它的信息流基本由几部分组成:第一,打广告的;第二个,做一些推荐,热门的商品,其次,才是关键字相关的搜索结果。 信息流 开始的时候 很 简单 , 但是到后期会 发现 , 你的 这 个流 如何做控制分发 , 非常复杂, 微博在最近一两年一直在做 这样 的工作。刚才我们是从业务上分析,那么技术上怎么解决高并发,高性能的问题?微博访问量很大的时候,底层存储是用MySQL数据库,当然也会有其他的。对于查询请求量大的时候,大家知道一定有缓存,可以复用可重用的计算结果。可以看到,发一条微博,我有很多粉丝,他们都会来看我发的内容,所以 微博是最适合使用 缓 存 的系统,微博的读写比例基本在几十比一。微博使用了 双 层缓 存,上面是L1,每个L1上都是一组(包含4-6台机器),左边的框相当于一个机房,右边又是一个机房。在这个系统中L1缓存所起的作用是什么? 首先,L1 缓 存增加整个系 统 的 QPS, 其次 以低成本灵活扩容的方式 增加 系统 的 带宽 。想象一个极端场景,只有一篇博文,但是它的访问量无限增长,其实我们不需要影响L2缓存,因为它的内容存储的量小,但它就是访问量大。这种场景下,你就需要使用L1来扩容提升QPS和带宽瓶颈。另外一个场景,就是L2级缓存发生作用,比如我有一千万个用户,去访问的是一百万个用户的微博 ,这个时候,他不只是说你的吞吐量和访问带宽,就是你要缓存的博文的内容也很多了,这个时候你要考虑缓存的容量, 第二 级缓 存更多的是从容量上来 规划,保证请求以较小的比例 穿透到 后端的 数据 库 中 ,根据你的用户模型你可以估出来,到底有百分之多少的请求不能穿透到DB, 评估这个容量之后,才能更好的评估DB需要多少库,需要承担多大的访问的压力。另外,我们看双机房的话,左边一个,右边一个。 两个机房是互 为 主 备 , 或者互 为热备 。如果两个用户在不同地域,他们访问两个不同机房的时候,假设用户从IDC1过来,因为就近原理,他会访问L1,没有的话才会跑到Master,当在IDC1没找到的时候才会跑到IDC2来找。同时有用户从IDC2访问,也会有请求从L1和Master返回或者到IDC1去查找。 IDC1 和 IDC2 ,两个机房都有全量的用户数据,同时在线提供服务,但是缓存查询又遵循最近访问原理。还有哪些多级缓存的例子呢?CDN是典型的多级缓存。CDN在国内各个地区做了很多节点,比如在杭州市部署一个节点时,在机房里肯定不止一台机器,那么对于一个地区来说,只有几台服务器到源站回源,其他节点都到这几台服务器回源即可,这么看CDN至少也有两级。Local Cache+ 分布式 缓 存,这也是常见的一种策略。有一种场景,分布式缓存并不适用, 比如 单 点 资 源 的爆发性峰值流量,这个时候使用Local Cache + 分布式缓存,Local Cache 在 应用 服 务 器 上用很小的 内存资源 挡住少量的 极端峰值流量,长尾的流量仍然访问分布式缓存,这样的Hybrid缓存架构通过复用众多的应用服务器节点,降低了系统的整体成本。 我们来看一下 Feed 的存 储 架构,微博的博文主要存在MySQL中。首先来看内容表,这个比较简单,每条内容一个索引,每天建一张表,其次看索引表,一共建了两级索引。首先想象一下用户场景,大部分用户刷微博的时候,看的是他关注所有人的微博,然后按时间来排序。仔细分析发现在这个场景下, 跟一个用户的自己的相关性很小了。所以在一级索引的时候会先根据关注的用户,取他们的前条微博ID,然后聚合排序。我们在做哈希(分库分表)的时候,同时考虑了按照UID哈希和按照时间维度。很业务和时间相关性很高的,今天的热点新闻,明天就没热度了,数据的冷热非常明显,这种场景就需要按照时间维度做分表,首先冷热数据做了分离(可以对冷热数据采用不同的存储方案来降低成本),其次, 很容止控制我数据库表的爆炸。像微博如果只按照用户维度区分,那么这个用户所有数据都在一张表里,这张表就是无限增长的,时间长了查询会越来越慢。二级索引,是我们里面一个比较特殊的场景,就是我要快速找到这个人所要发布的某一时段的微博时,通过二级索引快速定位。 分布式服务追踪系统 分布式追踪服务系统,当系统到千万级以后的时候,越来越庞杂,所解决的问题更偏向稳定性,性能和监控。刚才说用户只要有一个请求过来,你可以依赖你的服务RPC1、RPC2,你会发现RPC2又依赖RPC3、RPC4。分布式服务的时候一个痛点,就是说一个请求从用户过来之后,在后台不同的机器之间不停的调用并返回。 当你发现一个问题的时候,这些日志落在不同的机器上,你也不知道问题到底出在哪儿,各个服务之间互相隔离,互相之间没有建立关联。所以导致排查问题基本没有任何手段,就是出了问题没法儿解决。 我们要解决的问题,我们刚才说日志互相隔离,我们就要把它建立联系。建立联系我们就有一个请求ID,然后结合RPC框架, 服务治理功能。假设请求从客户端过来,其中包含一个ID 101,到服务A时仍然带有ID 101,然后调用RPC1的时候也会标识这是101 ,所以需要 一个唯一的 请求 ID 标识 递归迭代的传递到每一个 相关 节点。第二个,你做的时候,你不能说每个地方都加,对业务系统来说需要一个框架来完成这个工作, 这 个框架要 对业务 系 统 是最低侵入原 则 , 用 JAVA 的 话 就可以用 AOP,要做到零侵入的原则,就是对所有相关的中间件打点,从接口层组件(HTTP Client、HTTP Server)至到服务层组件(RPC Client、RPC Server),还有数据访问中间件的,这样业务系统只需要少量的配置信息就可以实现全链路监控 。为什么要用日志?服务化以后,每个服务可以用不同的开发语言, 考虑多种开发语言的兼容性 , 内部定 义标 准化的日志 是唯一且有效的办法。最后,如何构建基于GPS导航的路况监控?我们刚才讲分布式服务追踪。分布式服务追踪能解决的问题, 如果 单一用 户发现问题 后 , 可以通 过请 求 ID 快速找到 发 生 问题 的 节 点在什么,但是并没有解决如何发现问题。我们看现实中比较容易理解的道路监控,每辆车有GPS定位,我想看北京哪儿拥堵的时候,怎么做? 第一个 , 你肯定要知道每个 车 在什么位置,它走到哪儿了。其实可以说每个车上只要有一个标识,加上每一次流动的信息,就可以看到每个车流的位置和方向。 其次如何做 监 控和 报 警,我们怎么能了解道路的流量状况和负载,并及时报警。我们要定义这条街道多宽多高,单位时间可以通行多少辆车,这就是道路的容量。有了道路容量,再有道路的实时流量,我们就可以基于实习路况做预警? 对应于 分布式系 统 的话如何构建? 第一 , 你要 定义 每个服 务节 点它的 SLA A 是多少 ?SLA可以从系统的CPU占用率、内存占用率、磁盘占用率、QPS请求数等来定义,相当于定义系统的容量。 第二个 , 统计 线 上 动态 的流量,你要知道服务的平均QPS、最低QPS和最大QPS,有了流量和容量,就可以对系统做全面的监控和报警。 刚才讲的是理论,实际情况肯定比这个复杂。微博在春节的时候做许多活动,必须保障系统稳定,理论上你只要定义容量和流量就可以。但实际远远不行,为什么?有技术的因素,有人为的因素,因为不同的开发定义的流量和容量指标有主观性,很难全局量化标准,所以真正流量来了以后,你预先评估的系统瓶颈往往不正确。实际中我们在春节前主要采取了三个措施:第一,最简单的就是有降 级 的 预 案,流量超过系统容量后,先把哪些功能砍掉,需要有明确的优先级 。第二个, 线上全链路压测,就是把现在的流量放大到我们平常流量的五倍甚至十倍(比如下线一半的服务器,缩容而不是扩容),看看系统瓶颈最先发生在哪里。我们之前有一些例子,推测系统数据库会先出现瓶颈,但是实测发现是前端的程序先遇到瓶颈。第三,搭建在线 Docker 集群 , 所有业务共享备用的 Docker集群资源,这样可以极大的避免每个业务都预留资源,但是实际上流量没有增长造成的浪费。 总结 接下来说的是如何不停的学习和提升,这里以Java语言为例,首先, 一定要 理解 JAVA;第二步,JAVA完了以后,一定要 理 解 JVM;其次,还要 理解 操作系统;再次还是要了解一下 Design Pattern,这将告诉你怎么把过去的经验抽象沉淀供将来借鉴;还要学习 TCP/IP、 分布式系 统、数据结构和算法。

hiekay 2019-12-02 01:39:25 0 浏览量 回答数 0

问题

大数据时代——数据存储技术百问

yq传送门 2019-12-01 20:27:42 31965 浏览量 回答数 35

问题

Nginx性能为什么如此吊

小柒2012 2019-12-01 21:20:47 15038 浏览量 回答数 3

问题

服务器必备工具软件推荐,网站管理员必看

光头笨笨 2019-12-01 21:31:50 9220 浏览量 回答数 6
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站