- 臭打游戏的长毛
-
微软发布的Internet Explorer 11 (IE11)包含诸多新功能,比如改进了性能和安全性、页面加载速度更快、支持新的网页标准和WebGL等。但是也删除了部分功能,主要看个人使用习惯,以下是具体删除与新增的功能,可以比较下再做决定。
【删除功能】
1.允许使用选项卡浏览
用户可通过“Internet选项-> 常规-> 选项卡”找到该选项。在之前版本的IE中,用户能够通过勾选或取消勾选“允许使用多选项卡浏览”,开启或关闭选项卡浏览功能。但IE11删除了该选项。
2.使用兼容性视图自动恢复页面布局错误
IE10用户可通过“Internet选项-> 高级-> 浏览”部分查看该选项。勾选后可在Internet Explorer中使用“兼容性视图”浏览不兼容网站。一些旧网站不支持新的网页标准,在新的网页浏览器中表现出不同效果。因此,Internet Explorer引入了兼容性视图,能够像旧版IE一样正确打开不兼容网站。IE11取消了该选项。
3.允许网站使用搜索面板
IE10用户可通过“Internet选项-> 高级-> 浏览”部分查看该选项。勾选后可允许网站使用旧版IE的搜索面板。IE11移除了该选项。
【新增功能】
1.在后台加载站点和内容以优化性能
这是IE11的新功能。勾选该选项将允许浏览器在后台预加载网站内容,提高页面加载速度。
2.运行快捷方式时重新使用窗口(当选项卡处于关闭状态时)
用户可通过“Internet选项-> 高级-> 浏览”查看该选项。由于微软在IE11中移除了开启或关闭选项卡的功能,因而该选项不具有任何意义。
3.使用SPDY/3
这是IE11的另一个新选项,允许用户在IE11中使用或禁用SPDY/3协议。SPDY/3网络协议能够通过压缩、排序和多路复用优化网络请求延迟。用户可通过“Internet选项-> 高级-> HTTP设置”查看该选项。
4.在增强保护模式下启用64位进程
这是IE11的有一个新的有趣选项。用户能够通过该选项启用或禁用增强保护模式下Internet Explorer的64位进程。
IE11默认禁止该选项。用户可通过“Internet选项->高级-> 安全”启用该功能。
启用该选项可获得更好的安全性;禁用该选项可获得更好的兼容性。
- 血莲丿红尘
-
个人觉得IE10目前为止比IE11要好一点。
因为更新了IE11之后发现,第一次打开浏览器的时候,主页显示的会比之前慢。
建议过3个月以后再更新为IE11。
- clc1
-
iPhone 4好还是iPhone 5好。一个道理。
相关推荐
程序员面试必考题(二十五)---SPDY与HTTP/2协议
SPDY(SPDY是Speedy的昵音,意为更快),是Google开发的基于TCP协议的应用层协议。SPDY协议的目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。SPDY协议核心思想是尽量减少TCP连接数,而对于HTTP的语义未做太大修改(比如,HTTP的GET和POST消息格式保持不变),基本上兼容HTTP协议。 超文本传输协议(HTTP)是一个非常成功的协议,但是HTTP/1.1及之前版本的HTTP协议均是针对20世纪90年代之期网络与Web应用需求而设计,其一些特点已经对现代应用程序的性能产生了负面影响,比如: SPDY正是Google在HTTP即将从1.1向2.0过渡之际推出的协议,长期以来一直被认为是HTTP 2.0可行选择。 SPDY与HTTP相比,具有如下优点: HTTP/2协议通过定义一个HTTP语义向底层连接的优化映射,来解决这些问题。HTTP/2允许在同一连接上交错地发送/接收请求报文和响应报文,使用高效的HTTP报头字段编码,还支持请求优先级,使让更重要的请求能更快速被处理,从而进一步提升性能。另外,HTTP/2通过使用二进制的消息帧,实现消息的高效处理。 HTTP/2 提供了HTTP语义的优化传输。HTTP/2支持所有HTTP/1.1的核心特征,并且在不同的方面做的更高效。 HTTP/2的基本协议单元是帧(frame),每个类型帧用于不同用途。例如, HEADERS帧和DATA帧构成基本的HTTP请求报文和响应报文,其他类型帧,如SETTINGS帧、WINDOW_UPDATE帧和PUSH_PROMISE帧用于支持HTTP/2的其他特性。 HTTP/2的请求多路复用是通过将每个HTTP请求/响应交换与其自身的流进行关联来实现的。流在很大程度上是相互独立的,因此一个阻塞或终止的请求/响应并不会影响其他流。 HTTP/2的流量控制和优先级能确保高效地使用复用流。流量控制有助于确保只传输接收方使用的数据,优先级可以确保有限的资源被优先用于最重要的流。 HTTP/2添加了一种新的交互模式,即服务器可以向客户端推送消息。服务器推送允许服务端预测客户端需要来发送数据给客户端,平衡网络利用率以及潜在的延迟。 HTTP/2帧包含的HTTP报头字段是压缩的。HTTP请求有可能是高度冗余的,因此压缩能显著减少请求和响应的大小。 HTTP/2使用与HTTP/1.1相同的“http”和“https”URI方案,并且共享相同的默认端口号:“http” URI的默认端口号为80,“https” URI的默认端口号为443。HTTP/2可以使用加密(推荐),也可以不使用加密,“h2”标识使用TLS的HTTP/2(即安全的HTTP/2),“h2c”则标识运行在明文TCP之上的HTTP/2(即非加密的HTTP/2)。 例题: 下面关于HTTP/2的描述中,错误的是? A.HTTP/2基于SPDY协议,充分解决了TCP连接的限制,它允许多个并发HTTP请求公用一个TCP会话 B.针对只能由客户端发起请求的问题,HTTP/2添加了一种新的交互模式,即服务器推送 C.HTTP/2提供了HTTP语义的传输优化,支持HTTP/1.1的所有核心特征,并且在其他方面做得更高效 D.HTTP/2是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层 该题为楚楚街笔试题,根据前文的分析,可见选项A、B、C均是正确叙述,只有选项D的叙述不准确。 《横扫offer---程序员招聘真题详解700题》,开点工作室著,清华大学出版社出版,天猫、京东等各大网上书店及实体书店均已开始发售。2023-07-22 12:55:061
SPDY基本认识
关于HTTP安全性的问题,我们可以使用HTTPS来解决。但是HTTP都发布十几年了,有些规则已经过时了,HTTP/1.1的规则在功能上完全可以开发一套新的协议来弥补,但是由于遵循HTTP协议的Web浏览器已经遍布全球,无法完全抛弃,只能在HTTP基础上不断的累加一些新的功能来满足需求。SPDY就是其中之一。 SPDY(取自SPeeDY,发音同speedy)是Google在2010年发布的,其开发目标旨在解决HTTP的性能瓶颈,缩短Web页面的加载时间。 SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。 新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩等新机制。Google表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。 SPDY出现以后很多著名的互联网公司,例如百度、淘宝、UPYUN 都在自己的网站或 APP 中采用了 SPDY 系列协议,因为它对性能的提升是显而易见的。主流的浏览器(谷歌、火狐、Opera)也都早已经支持 SPDY,它已经成为了工业标准(其实现在的情况不是这样了,留个悬念后面说),HTTP Working-Group 最终决定以 SPDY/2 为基础,开发 HTTP/2。 SPDY以会话的形式加入,为了安全,它强制性使用SSL/TLS,控制对数据的流动,但还是采用HTTP建立通信连接。 前面简单说了一下SPDY的历史和发展,那么我们首先来看一下HTTP到底有哪些瓶颈,和引入SPDY的必要性。 首先来说最初的HTTP/1.0的时候,一次TCP的链接上只能发送一个HTTP请求,导致HTTP传输的效率特别低。 好在HTTP/1.1的时候,引入了持久链接和管道机制,使得HTTP的传输效率得到了很大的提升(详细和可查看 HTTP基本认识 )。持久链接满足了一条TCP链接可以发送多条HTTP请求的问题,但是每次HTTP请求必须等上一次HTTP响应了以后才能发送新的一条HTTP请求。管道机制实现了在持久链接的基础上 同时 发送多条HTTP请求的机制,但是响应的时候必须按照顺序来响应(如下图)。 HTTP/1.1之前的HTTP请求的只能有客户端发起,服务端返回响应。这种模式导致服务端不能主动发送信息给客户端,所以一些像股票之类的要求时效性的信息无法及时推送到客户端。当然人们研究出了轮训、长轮询、流等解决方案实现,其中著名的就是Comet技术。但是它也存在问题,不是本文重点,就做详细描述了。 HTTP请求或者响应首部每次都要发送一些相关信息,但是HTTP/1.1之前每次HTTP请求都要重复发送这些信息,这样就有些浪费带宽了,而且现在首部信息越来越多,这个问题就更严重了。 HTTP/1.0中就提出了Content-Encoding字段来压缩数据,但是可任意选择数据压缩格式,非强制压缩发送。 针对以上HTTP的瓶颈,Google在2010年发布了SPDY。 通过单一的TCP链接,可以无限制处理多个HTTP请求,所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。 SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题。 压缩HTTP请求和响应首部。这样一来,通信产生的数据包数量和发送的字节数就更少了。 支持服务器主动向客户端推送数据的功能。这样服务器可直接发送数据,而不必等待客户端的请求了。 服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求。 前面说了这么多SPDY的优点,但是 所以现在你可以去直接学习HTTP/2了,好在HTTP Working-Group 最终决定以 SPDY/2 为基础,开发 HTTP/2。2023-07-22 12:55:131
如何理解 TCP/IP,SPDY,WebSocket 三者之间的关系
Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。2023-07-22 12:55:201
HTTP 2.0的协议内容
异步连接多路复用;头部压缩;请求/响应管线化;保持与HTTP 1.1语义的向后兼容性也是该版本的一个关键目标。SPDY是一种HTTP兼容协议,由Google发起,Chrome、Opera、Firefox以及Amazon Silk等浏览器均已提供支持。HTTP实现的瓶颈之一是其并发要依赖于多重连接。HTTP管线化技术可以缓解这个问题,但也只能做到部分多路复用。此外,已经证实,由于存在中间干扰,浏览器无法采用管线化技术。SPDY在单个连接之上增加了一个帧层,用以多路复用多个并发流。帧层针对HTTP类的请求响应流进行了优化,因此运行在HTTP之上的应用,对应用开发者而言只要很小的修改甚至无需修改就可以运行在SPDY之上。SPDY对当前的HTTP协议有4个改进:多路复用请求;对请求划分优先级;压缩HTTP头;服务器推送流(即Server Push技术);SPDY试图保留HTTP的现有语义,所以cookies、ETags等特性都是可用的。 节选:1。超文本传输协议(HTTP)是一个非常成功的协议。 然而,HTTP/1.1消息格式是实施简单性和可访问性的优化,而不是应用程序的性能。 因此它具有对应用程序的性能产生负面影响总体几个特点。特别是,HTTP/1.0只允许一个请求显眼每次一个给定的连接上。 HTTP/1.1流水线只能部分地解决了并发的请求,并从线头的阻塞受到影响。 因此,需要进行多次请求客户端通常使用多个连接到服务器,以减少等待时间。此外,HTTP/1.1的报头字段经常重复和冗长,其中,除了产生更多或更大的网络数据包,可能会导致小的初始TCP拥塞窗口来快速填充。 这可能会导致过度的延迟,当多个请求在一个新的TCP连接进行。该文通过定义一个基础连接的HTTP的语义优化的映射来解决这些问题。 具体地,它允许对请求和响应消息交织在同一连接上,并使用高效率的编码的HTTP报头字段。 它还允许请求的优先级,让更多的重要的要求更快速的完成,进一步提高了性能。所得到的协议被设计为更友好的网络,因为较少的TCP连接都可以使用,在比较HTTP/1.x。 这意味着与其他流和长寿命的连接,而这又导致了更有效地利用可用的网络容量竞争少。最后,这种封装也可以通过使用二进制消息取景使信息更具扩展性的处理。1.1文件组织:在HTTP/2.0规范被分成三个部分:开始HTTP/2.0( 第3节 ),它涵盖了如何一个HTTP/2.0连接启动;成帧层( 第4节 ),其中复用单一的TCP连接成各个独立的帧类别,以及一个HTTP层( 第8节 ),它指定了表达机制使用成帧层的HTTP交互。 虽然一些成帧层概念是从HTTP的隔离,建立一个通用成帧层一直没有一个目标。 成帧层是针对HTTP协议和服务器推送的需求。1.2约定和术语:中的关键字“必须”,“必须不”,“要求”,“应”,“不应”,“应该”,“不应该”,“建议”,“或许”,该文件中“可选”如中解释RFC 2119 [RFC2119]。所有数值都是以网络字节顺序。 值是无符号,除非另有说明。 提供在十进制或十六进制文该值(如适用)。 十六进制文字的前缀为0X从十进制文本区分开来。术语:客户端:端点发起HTTP连接。连接:两个端点之间传输级连接。连接错误:对HTTP/2.0的连接错误。端点:连接的客户端或服务器。框架:通信的HTTP/2.0连接中的最小单元,包括根据帧类型结构的字节的报头和可变长度的序列。同行:一个端点。 当讨论一个特定的端点,“对等”指的是遥控器来讨论的首要议题端点。接收器:正在接收帧的端点。发件人:被发送的帧的端点。服务器:端点而没有主动的HTTP连接。流:帧在跨越一个虚拟通道的双向流动的HTTP/2.0连接内。流错误:个别HTTP/2.0流中的一个错误。 2, HTTP/2.0协议介绍:HTTP/2.0提供的HTTP语义优化的运输。一个HTTP/2.0连接通过一个TCP连接(上面运行的应用程序级协议[TCP] )。 客户端是TCP连接发起者。该文档描述了使用由三个部分组成的逻辑结构的HTTP/2.0协议:成帧,溪流,和应用程序映射。 这种结构提供了主要作为一种辅助手段,规范,实现可以自由从该结构发散是必要的。2.1的HTTP框架:HTTP/2.0提供HTTP语义的有效序列化。 HTTP请求和响应编码为长度前缀的帧(见第4.1节 )。HTTP标头字段被压缩成一系列包含头块碎片帧(参见4.3节 )。2.2 HTTP复用:HTTP/2.0提供了在单个连接上复用HTTP请求和响应的能力。 多个请求或响应可以同时在一个连接上使用流(发送第5节 )。 为了保持独立的流,流控制和优先级是必要的。2.3的HTTP语义:HTTP/2.0定义HTTP请求和响应如何映射到流(参见8.1节 ),并引入了新的互动模式,服务器推送(第8.2节 )。 3, 启动HTTP/2.0:HTTP/2.0使用相同的“http”和“https”开头使用HTTP/1.1的URI方案。 HTTP/2.0共享相同的默认端口号:80为“http”的URI和443为“https”开头的URI。通过这对于HTTP/2.0支持的手段被确定为不同的“http”和“https”开头的URI。 发现为“HTTP”中的URI描述第3.2节 。 发现为“https”开头的URI中说明第3.3节 。3.1 HTTP/2.0版本识别:该文档中定义的协议是使用字符串“HTTP/2.0”标识。 这种识别是用在HTTP/1.1 Upgrade头域,在TLS的应用层协议协商的扩展 [TLSALPN]字段,和其他地方的协议识别是必需的。谈判“HTTP/2.0”表示使用该文档中描述的交通,保安,取景和消息语义。[ rfc.comment.1 :编者注:请移除本节之前,这份文件的最终版该发布的其余部分]最后,公布的RFC只有实现可以认同自己是“HTTP/2.0”。实施例和文本贯穿该文档的其余部分使用“HTTP/2.0”作为唯一的编辑便利的问题。 草稿版本的实现必须不识别使用这个字符串。 唯一的例外规则是包含在连接头中的字符串建立HTTP/2.0连接后,立即通过客户端发送的(参见3.5节 );的八位这个固定长度的序列不发生变化。版本的协议草案的实现必须字符串“ - 草稿”和相应的草案号码添加到标识符分隔符之前("/")。 例如,草案,IETF-httpbis-http2-03使用的是字符串“HTTP-draft-03/2.0”标识。这是基于这些版本的草案不兼容的实验,而不是必须用不同的标识符替换字符串“草案”。 例如,一个实验实施分组基于心情的编码基于草案-IETF-httpbis-http2-07可能将自身标识为“HTTP-emo-07/2.0”。请注意,任何标签必须符合所定义的“令牌”语法第3.2.6节的[HTTP-P1] 。3.2 启动HTTP/2.0为“http”的URI:如果客户端发出请求到一个“http”的URI,没有关于对HTTP/2.0的支持先验知识使用HTTP升级机制(第6.7节的[HTTP-P1] )。 客户端发出,其中包括一个Upgrade头域识别HTTP/2.0 HTTP/1.1请求。 在HTTP/1.1请求必须包含正好一个HTTP2 -设置( 第3.2.1节 )头字段。例如:GET / default.htm的HTTP/1.1连接方式:升级,HTTP2 - 设置升级:HTTP/2.0HTTP2-设置:HTTP/2.0设置的<base64url编码payload>包含一个实体正文的请求必须在其全部被发送之前,客户端可以发送HTTP/2.0帧。 这意味着大量请求实体可以阻止使用的连接,直到它被完全发送。如果有后续请求的初始请求的并发性是很重要的,一个小小的请求可以被用来执行升级到HTTP/2.0,需支付额外的往返费用。不支持HTTP/2.0的服务器可以响应请求,就好像Upgrade头域缺席:HTTP/1.1 200 OK内容长度:243Content-Type:text / html类型支持HTTP/2.0的服务器可以接受一个101(切换协议)响应升级。 因此终止了101响应的空行后,服务器就可以开始发送HTTP/2.0帧。 这些框架必须包括发起升级请求的响应。HTTP/1.1 101交换协议连接方式:升级升级:HTTP/2.0[HTTP/2.0连接...由服务器发送的第一个HTTP/2.0帧是一个设置框( 6.5节 )。 在收到101响应,客户端发送一个连接头( 3.5节 ),其中包括一个设置框。在升级之前,发送的HTTP/1.1请求分配流标识符1并分配尽可能高的优先级。 流1半隐式从封闭向服务器的客户端,因为该请求被完成HTTP/1.1请求。 起的HTTP/2.0连接后,流1被用于反应。3.2.1 HTTP2 -设置头字段:即从升级到HTTP/1.1 HTTP/2.0请求必须完全包括一个HTTP2,设置头字段。 该HTTP2 -设置标头栏位是包括设置支配的HTTP/2.0连接,由于预期该服务器接收到升级的要求提供逐跳头字段。 服务器必须拒绝尝试升级,如果这个头域不存在。HTTP2 -设置= token68该HTTP2-设置标头字段的内容是一个有效载荷设置帧( 第6.5节 ),编码为base64url字符串(即,在所描述的URL和文件名安全Base64编码第5节的[RFC4648] ,与任何尾随"="字符省略)。 该ABNF[RFC5234]生产token68是定义在2.1节的[HTTP-P7] 。客户端必须包含值以下设置( 第6.5.1节 ):SETTINGS_MAX_CONCURRENT_STREAMSSETTINGS_INITIAL_WINDOW_SIZE作为一个逐跳头域, 连接头域必须包括HTTP2 -设置的值除了升级到HTTP/2.0何时升级 。服务器解码和解释这些值,因为它会任何其他设置框。 在升级要求提供这些值确保协议不需要进行上述设置的默认值,并给出了一个客户端一个机会,之前接受任何帧从服务器提供的其他设置。3.3 启动HTTP/2.0为“https”开头的URI:如果客户端发出请求到一个“https”开头的URI没有关于对HTTP/2.0的支持先验知识采用TLS [TLS12]与应用层协议协商的扩展 [TLSALPN]。一旦TLS协商完成后,客户端和服务器发送一个连接头( 3.5节 )。3.4 开始HTTP/2.0与前置知识:客户端可以知道某个特定的服务器通过其他方式支持HTTP/2.0。 客户端可以立即发送HTTP/2.0帧至已知支持HTTP/2.0服务器,连接头(后第3.5节 )。 这既影响了“http”的URI的分辨率;支持HTTP/2.0的服务器都必须支持的协议谈判中的TLS [TLSALPN]为“https”开头的URI。对于HTTP/2.0的支持之前是不是一个强烈的信号,一个给定的服务器将支持HTTP/2.0为将来的连接。这是可能的服务器的配置来改变或配置,以在群集的服务器实例之间的差异。 拦截代理(又名“透明”的代理)是变化的另一个来源。3.5 HTTP/2.0连接接头:当建立一个TCP连接和决心HTTP/2.0将使用两个对等的,每个端点必须发送一个连接头为最终确认,并建立了HTTP/2.0连接的初始设置。客户端连接头开始的24个字节,这在十六进制表示法是一个序列:505249202a20485454502f322e300d0a0d0a534d0d0a0d0a(字符串PRI * HTTP/2.0 r r NSM r n r n)的 。 该序列后跟一个设置框(6.5节 )。 客户端立即收到的101切换响应协议(表示成功升级),或作为一个TLS连接的第一个应用程序数据八位位组发送客户端的连接头。 如果开始对协议的服务器支持先验知识的HTTP/2.0连接,客户端连接头在连接建立发送。·客户端连接头是这样选择的HTTP/1.1或HTTP/1.0服务器和中介机构的很大比例并不试图进一步处理框架。 请注意,这并不解决所关注的问题 。服务器连接头只包含一个的设置框( 6.5节 ),必须在服务器发来的HTTP/2.0连接的第一帧。为了避免不必要的等待时间,允许客户端发送客户端的连接头,无需等待接收服务器的连接头之后立即发送额外的帧到服务器。 但是要注意,该服务器连接头是很重要的设置框架可能包括参数必然改变了客户端如何有望与服务器进行通信。 在收到设置框,在客户端有望兑现建立的任何参数。客户端和服务器必须终止TCP连接,如果不是同行不以一个有效的连接头。 一个GOAWAY框架( 第6.8节 ,如果它是明确表示,对不使用HTTP/2.0)可以省略。 4, HTTP框架:一旦HTTP/2.0建立连接,端点就可以开始交换帧。4.1 帧格式:所有的框架开始一个8字节的头,紧跟着的0和16.383个八位位组之间的有效载荷。对于保留的2位字段。 这些位的语义是不确定的和发送时该位必须保持未设置(0)和接收时必须被忽略。长度:帧有效载荷的长度表示为一个无符号14位整数。 的8个字节的帧头中不包含这个值。类型:8位类型的框架。 帧类型决定了帧头和有效载荷的其余部分被解释。 实现必须忽略不受支持或无法识别类型的帧。标志:一个8位字段保留帧类型特定的布尔标志。旗被分配到特定的表示帧类型语义。 那些没有定义的语义为特定帧类型标志必须被忽略,并且发送时必须保持未设置(0)。记:对于保留的1位字段。 该位的语义是不确定的,发送和接收时必须被忽略时,该位必须保持未设置状态(0)。流标识符:A 31-bit流标识符(见第5.1.1节 )。 值0被用于与该连接作为一个整体相联,而不是一个单独的流的帧保留。帧有效载荷的结构和内容是完全依赖帧类型。4.2 帧大小:一帧的有效载荷的最大尺寸由帧类型不同而不同。 一帧的绝对最大大小为2 -1(16.383)字节。 所有的实现应能接收和处理的最小帧截至最大尺寸。某些帧类型,如中国平安 (参见6.7节 ),施加允许的有效载荷数据量的额外限制。 同样,另外的大小限制可以通过特定的应用程序的用途进行设置(见第9节 )。如果帧大小超过任何已定义的限制,或者是太小,无法包含强制性的帧数据,端点必须发送一个FRAME_SIZE_ERROR错误。 在影响连接级状态帧帧大小错误必须被视为一个连接错误( 第5.4.1节)。4.3 报头压缩和解压:在HTTP/2.0标头字段是一个名称 - 值对与一个或多个相关联的值。 他们是在HTTP请求和响应消息,以及服务器推送操作中使用(参见8.2节 )。头列表是有序的排列,在应用层的零个或多个头部字段的集合。 当在一个连接上传输,一个头列表序列化为使用标题块的HTTP报头压缩 [压缩]。 序列化的头块被分成一个或多个字节的序列,称为头块碎片,和标头(有效载荷内传输6.2节 ),PUSH_PROMISE( 6.6节 )或延续( 第6.10节 )帧。该Cookie首部字段 [COOKIE]是由HTTP映射特殊处理,请参阅第8.1.3.3 。一种接收终端通过连接各个片段重新组合的头块,然后解压缩块来重构报头组。一个完整的头块组成之一:·单排针或PUSH_PROMISE每个分别与END_HEADERS或END_PUSH_PROMISE标志设置框,或·一排针或PUSH_PROMISE帧与END_HEADERS或END_PUSH_PROMISE标志清零和一个或多个点连续的帧,其中最后延帧具有END_HEADER标志集。头块必须被发送作为帧的连续序列,以及任何其他类型,或者通过任何其他流的无交插帧。 在序列的最后一帧接针或延帧必须有END_HEADERS标志设置。 在序列的最后一帧PUSH_PROMISE或延帧必须有END_PUSH_PROMISE或END_HEADERS标志设置(分别)。头块碎片只能作为传送的有效载荷HEADERS , PUSH_PROMISE或存续的帧。 排针 , PUSH_PROMISE和延帧传输数据,可以通过修改一个接收器保持压缩上下文。 一个端点接收接针 , PUSH_PROMISE或延帧必须重新装配头块和执行解压缩,即使帧将被丢弃。 接收器必须终止与连接错误(连接第5.4.1节类型) COMPRESSION_ERROR ,如果它没有解压缩一个头块。2023-07-22 12:55:291
如何理解 TCP/IP,SPDY,WebSocket 三者之间的关系
按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP是应用层的协议。在这三者之间,SPDY和WebSocket都是与HTTP相关的协议,而TCP是HTTP底层的协议。 一、HTTP的不足 HTTP协议经过多年的使用,发现了一些不足,主要是性能方面的,包括: HTTP的连接问题,HTTP客户端和服务器之间的交互是采用请求/应答模式,在客户端请求时,会建立一个HTTP连接,然后发送请求消息,服务端给出应答消息,然后连接就关闭了。(后来的HTTP1.1支持持久连接) 因为TCP连接的建立过程是有开销的,如果使用了SSL/TLS开销就更大。 在浏览器里,一个网页包含许多资源,包括HTML,CSS,JavaScript,图片等等,这样在加载一个网页时要同时打开连接到同一服务器的多个连接。 HTTP消息头问题,现在的客户端会发送大量的HTTP消息头,由于一个网页可能需要50-100个请求,就会有相当大的消息头的数据量。 HTTP通信方式问题,HTTP的请求/应答方式的会话都是客户端发起的,缺乏服务器通知客户端的机制,在需要通知的场景,如聊天室,游戏,客户端应用需要不断地轮询服务器。 而SPDY和WebSocket是从不同的角度来解决这些不足中的一部分。除了这两个技术,还有其他技术也在针对这些不足提出改进。 二、SPDY SPDY的主要目的是减少50%以上的页面加载时间,但是呢不增加部署的复杂性,不影响客户端和服务端的Web应用,只需要浏览器和Web服务器支持SPDY。主要有以下几点: 多路复用,一个TCP连接上同时跑多个HTTP请求。请求可设定优先级。 去除不需要的HTTP头,压缩HTTP头,以减少需要的网络带宽。 使用了SSL作为传输协议提供数据安全。 对传输的数据使用gzip进行压缩 提供服务方发起通信,并向客户端推送数据的机制。 实质上,SPDY就是想不影响HTTP语义的情况下,替换HTTP底层传输的协议来加快页面加载时间。 SPDY的解决办法就是设计了一个会话层协议--帧协议,解决多路复用,优先级等问题,然后在其上实现了HTTP的语义。 三、WebSocket WebSocket则提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。 本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。 由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。 WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。 WebSocket也有自己一套帧协议。 四、SPDY和WebSocket的关系 SPDY和WebSocket的关系比较复杂。 补充关系,二者侧重点不同。SPDY更侧重于给Web页面的加载提速,而WebSocket更强调为Web应用提供一种双向的通讯机制以及API。 竞争关系,二者解决的问题有交集,比如在服务器推送上SPDY和WebSocket都提供了方案。 承载关系,试想,如果SPDY的标准化早于WebSocket,WebSocket完全可以侧重于API,利用SPDY的帧机制和多路复用机制实现该API。 Google提出草案,说WebSocket可以跑在SPDY之上。WebSocket的连接建立在SPDY的流之上,将WebSocket的帧映射到SPDY的帧上。 融合关系,如微软在HTTP Speed+Mobility中所做的。2023-07-22 12:55:432
如何理解 TCP/IP,SPDY,WebSocket 三者之间的关系
tcp/ip是三层及以下的协议,spdy是应用层的加密协议,websocket是应用层套接字模块,实现基于tcpip的一种方式吧2023-07-22 12:55:501
如何验证网站是否是 HTTP2.0[译]
现在已经有许多人在讨论 HTTP2.0了,那如何帮助人们去识别他们的网站上运行的 HTTP是哪个版本?这里有三种工具可以帮到你。 想要阅读更多HTTP/2的相关条件的话,可以查看文章 Rachel Andrew from Smashing Magazine [译?]。 如果你还没打开过你的Chrome开发者工具,那我建议你尝试着从他入手去优化你的SEO以网站分析。这里有两篇文章可以供你查看他的好处: 看完以后你会感受到这个工具令人惊讶的强大,并且还是免费的! 要检测HTTP版本,只需要在Chrome developer tool里边的network加上Protocol一栏,因为版本的不同,加入方法会有所不同,但都很简单。 旧版的chrome点击all就可以出现 如图1 的选项了 如果你更喜欢一个更快速的替代品,那么有一个出众的浏览器插件可以用来检测HTTP/2。Chrome插件 HTTp/2和SPDY指示器 给浏览器添加了一个闪电标记(如图4),当你的页面运行于HTTP/2或SPDY时会改变颜色。若你不喜欢使用Chrome,这款插件还有 Firefox版 的。 既不想用Chrome开发者工具,也不想在浏览器上装插件的话,可以使用 在线检测工具 如图8 写在最后 不是逐字逐句翻译,能清楚地表达出意思就行。 原文地址: https://www.branded3.com/blog/test-website-supports-http2-0/2023-07-22 12:55:561
HTTP 和 WebSocket的区别
按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP是应用层的协议。在这三者之间,SPDY和WebSocket都是与HTTP相关的协议,而TCP是HTTP底层的协议。WebSocket则提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。 WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。WebSocket也有自己一套帧协议。2023-07-22 12:56:041
ERR_SPDY_PROTOCOL_ERROR什么原因?
一、可以通过电脑管家网络修复功能修复一下。1. 打开电脑管家,点击工具箱。2. 找到网络修复工具3. 点击“立即修复”即可。二、也可以使用命令重置网络。1. 在“开始”菜单找到“运行“2. 然后在里面输入cmd3. 出现的命令提示框内输入“netsh winsock reset"按”Enter“键。重启计算机后生效。2023-07-22 12:56:121
HTTPS报错ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
Nginx 默认设置是 ssl_ciphers HIGH:!aNULL:!MD5; 这样设置包含有最安全可靠版本的 SSL/TLS 的加密套件。但是对于 低版本 的浏览器或者浏览器本身使用的加密方式是其他的加密方式就会报出: ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY 的错误; 配置 ssl_ciphers , Mozilla基金会推荐 如果你的 OpenSSL 是旧的,不可用的密码将被自动丢弃。始终使用上面的完整的 ciphersuite ,并让 OpenSSL 选择它支持的那些。 ciphersuite 的排序非常重要,因为它决定优先选择哪种算法。上面的建议优先考虑提供完美的正向保密的算法。 原文链接 https://cipherli.st/ https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html https://github.com/cloudflare/sslconfig/blob/master/conf2023-07-22 12:56:301
Java开源项目有哪些
四川中公优就业的老师认为:对于JAVA的新手来说,需要结合着相关书籍的学习和开源项目一起,才能达到比较好的效果。在此推荐一些轻量级适合入门的JAVA开源项目,希望对你的学习有所帮助。1、 项目名称: jFinal-Paladin项目简介:以jfinal为底层的java后台基础框架,结合了beetl、druid、shiro、ehcache; 初始目的是为了学习jfinal,最终目的形成一个工作中比较通用的基础后台框架。2、项目名称:spring-authority项目简介:是由 spring+springmvc+hibernate+spring-security +easyui +boostrap 写的一个框架集合,目前实现了一个基础的权限管理系统,权限是基于细粒度的过滤,对于初学权限设计的人来说也算是个最简洁的权限实现,基于它来做项目,它只是做了一些绝大部分项目都应该做的一些基础功能。3、项目名称:springboot-learning-example项目简介:spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。4、项目名称:DockerFly项目简介:Dockerfly是基于 Docker1.12+ (Docker API 1.24+) 开发出Docker 管理工具,提供里最基本的基于 Docker 的管理功能,目的是能够方便广大Docker初学者以及 Docker 管理员能够快速的进行Docker 容器的管理和维护。2023-07-22 12:56:391
如何在 Android 手机上实现抓包
千锋扣丁学堂Android开发为您解答: tcpdump是最快捷方便的抓包方式,还可以加深对网络协议的理解。android下可以通过如下方式抓包: 1 Android上启动tcpdump Android设备可以把tcpdump的可执行文件上传到android设备上,然后通过mac远程登录android设备运行tcpdump,前提是这台android设备必须已经root过。步骤如下: 下载android版本的tcpdump为android系统编译的tcpdump版本。 通过adb将tcpdump上传到android设备 通过adb push将tcpdump文件上传到特定的目录,这里我们选择/sdcard/data目录。 在android设备上运行tcpdump 通过adb shell登陆设备,并执行tcpdump,最后一步执行./tcpdump即可。 2. 分析tcpdump输出 经过上面的步骤成功运行tcpdump之后,接下来就可以分析输出的网络包内容了,iOS设备和Android设备的输出是一致的。我们先来解析下几个基本的格式: 图中红色方框内的部分是一个ip包的详细记录,类似的纪录还有好几条。这里我们着重分析第一条的各部分字段含义。 14:37:41.615018 很简单,是该包接收到的时间。 17.143.164.37.5223 是发送方的ip地址及端口号(5223是端口号)。 10.29.44.140.58036 是我android的ip地址及端口号。 Flags [P.] 是tcp包header部分的第14个字节的P位。这个字节所包含的几个flag很重要,后面我会单独详细讲解。这里P位表示接受方需要马上将包push到应用层。 seq 1:54 tcp包的seq号,1是起始值,54结束值。tcp之所以被认为是流,是因为tcp包所携带的每一个字节都有标号(seq号)。1:54表明总共有54个字节被接受,其中一个字节是三次握手阶段所使用,所以一共发送的长度是53字节。 ack 101 tcp包的ack号,ack 101表明seq号为100的字节已被确认收到,下一个期望接收的seq号从101开始。 win 255 win表示的是tcp包发送方,作为接受方还可以接受的字节数。这里win 255表明ip为17.143.164.37的主机还可以接受255个字节。 options [nop,nop,…] options[…]表示的是该tcp包的options区域,nop是no opertion的缩写,没什么实际用途,主要是用做padding,因为options区域按协议规定必须是4字节的倍数。 options[… TS val 2381386761] ts val这个值是tcp包的时间戳,不过这个时间戳和设备的系统时间没啥关系,刚开始是随机值,后面随着系统时钟自增长。这个时间戳主要用处是seq序列号越界从0重新开始后,可以确认包的顺序。 options[… ecr 427050796] ts ecr这个值主要用来计算RTT。比如A发送一个tcp包给B,A会在包里带上TS val,B收到之后在ack包里再把这个值原样返回,A收到B的ack包之后再根据本地时钟就可以计算出RTT了。这个值只在ack包里有效,非ack包ecr的值就为0. length 53 这个length是应用层传过来的数据大小,不包括tcp的header。这个值和我们上面分析的seq 1:54是一致的。 以上就是一个基本的tcp包结构,大家可以按照上面的分析再把其他几个包理解下。我们在做应用的时候面对的更多是http协议,但对一个http请求是怎么通过tcp/ip分解成一个个的packet,然后怎么在网络上稳定可靠的传输,要有个基本的印象。下面我们再看下tcpdump更多的功能,这些功能都是基于对tcp/ip协议的理解,遇到不理解的建议多google下相关的技术概念。 3. tcpdump知识拓展 再继续深入tcpdump之前,先贴上一张tcp header格式图,常看常新。 [https://github.com/music4kid/music4kid.github.io/blob/master/images/tcpheader.png?raw=true](https://github.com/music4kid/music4kid.github.io/blob/master/images/tcpheader.png?raw=true)" width="1056"> 3.1 TCP Flags(tcp header第十四个字节) 我们再仔细看下上面提到的flags概念,flags位于tcp header的第十四个字节,包含8个比特位,也就是上图的CWR到FIN。这8个比特位都有特定的功能用途,分别是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。 CWR ,ECE 两个flag是用来配合做congestion control的,一般情况下和应用层关系不大。发送方的包ECE(ECN-Echo)为0的时候表示出现了congestion,接收方回的包里CWR(Congestion Window Reduced)为1表明收到congestion信息并做了处理。我们重点看其他六个flag。 URG URG代表Urgent,表明包的优先级高,需要优先传送对方并处理。像我们平时使用terminal的时候经常ctrl+c来结束某个任务,这种命令产生的网络数据包就需要urgent。 ACK 也就是我们所熟悉的ack包,用来告诉对方上一个数据包已经成功收到。不过一般不会为了ack单独发送一个包,都是在下一个要发送的packet里设置ack位,这属于tcp的优化机制,参见delayed ack。 PSH Push我们上面解释过,接收方接收到P位的flag包需要马上将包交给应用层处理,一般我们在http request的最后一个包里都能看到P位被设置。 RST Reset位,表明packet的发送方马上就要断开当前连接了。在http请求结束的时候一般可以看到一个数据包设置了RST位。 SYN SYN位在发送建立连接请求的时候会设置,我们所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。 FIN Finish位设置了就表示发送方没有更多的数据要发送了,之后就要单向关闭连接了,接收方一般会回一个ack包。接收方再同理发送一个FIN就可以双向关闭连接了。 这8个flag首字母分别是:C E U A P R S F。初看难以记忆,我脑洞了下,把它们组合成 supr cafe,当然少了super少了个e,我可以将就下。我们在使用tcpdump的时候会经常看到这几个flag,[S],[P],[R],[F],[.]。其他几个都好理解,[.]特殊点,是个占位符,没有其他flag被设置的时候就显示这个占位符,一般表示ack。 3.2 tcpdump 更多使用参数 这部分我们来看下tcpdump常用的一些命令参数。文章最开始部分的tcpdump命令是这样的:sudo tcpdump -i rvi0 -AAl。 -i rvi0 -AAl都是属于参数部分。常见的有这些: -i, 要监听的网卡名称,-i rvi0监听虚拟网卡。不设置的时候默认监听所有网卡流量。 -A, 用ASCII码展示所截取的流量,一般用于网页或者app里http请求。-AA可以获取更多的信息。 -X,用ASCII码和hex来展示包的内容,和上面的-A比较像。-XX可以展示更多的信息(比如link layer的header)。 -n,不解析hostname,tcpdump会优先暂时主机的名字。-nn则不展示主机名和端口名(比如443端口会被展示成https)。 -s,截取的包字节长度,默认情况下tcpdump会展示96字节的长度,要获取完整的长度可以用-s0或者-s1600。 -c,只截取指定数目的包,然后退出。 -v,展示更多的有用信息,还可以用-vv -vvv增加信息的展示量。 src,指明ip包的发送方地址。 dst,指明ip包的接收方地址。 port,指明tcp包发送方或者接收方的端口号。 and,or,not,操作法,字面意思。 上面几个是我个人比较常用的,更多的参数可以参考这个详细文档。有兴趣的可以分析下面几个例子练习下: tcpdump ‘tcp[13] & 16!=0" tcpdump src port 80 and tcp tcpdump -vv src baidu and not dst port 23 tcpdump -nnvvS src 192.0.1.100 and dst port 443 4. 用tcpdump分析http完整请求 说了这么多,我们再来实战下,看一个完整的http请求流程。sudo tcpdump -i rvi0 -AAl src 60.28.215.123 or dst 60.28.215.123 列出了6个前面的packet,10.29.44.240是我android的ip地址,60.28.215.123是知乎server的ip地址,红色方框内是android发出的packet,白色方框内是server发出的packet。packet1是android三次握手的第一个syn包,packet2是server ack+syn的包,packet3是android ack的包。这3个packet之后tcp的三次握手就完成了。 packet4是android发出的http request。长度只有240个字节,所以一个packet就发过去了,当然还设置了flags的P位,request需要马上被应用层处理。包里面出现了spdy,点赞。 packet5是server ack刚收到的包,长度位0,所以这仅仅是一个ack包。 packet6是server返回http的response了,1388个字节。packet5和packet6都ack了seq为241的包,当然是为了增加ack的成功率。 中间还有好几个packet就不仔细分析了,最后再看下请求完成的最后几个包: 最后两个packet比较简单,android发送个FIN+ACK的包就断开连接了,server直接发送了一个RST包后也断开连接了。2023-07-22 12:56:531
为什么很多IDE都会开发linux版的?他们能收回成本吗?
据Stack Overflow 2019年的调查数据显示,Linux和Windows是最常见的开发平台,大约有一半的人使用Windows做开发,其余的大约平均分配给了MacOS和Linux。 单论IDE面向的用户来说,Linux一点也不小众,IDE不开发Linux版不仅仅是散失四分之一的用户,而是丢失了一整个生态。 Linux版IDE的需求是切切实实存在的,开发IDE的商业公司都不会忽略这个市场,而且现有的跨平台GUI开发方案都比较成熟了,这也降低了不少的开发成本,如JetBrains全家桶大量使用Java,迁移难度相对较低。 商业化很成功的IDE收回成本肯定不是问题,因为单套IDE售价通常都不便宜,加上销售规模庞大,利润十分可观。也有不少IDE是非盈利性质的,根本不用考虑收回成本,它们的资金由某些基金会提供或来自 社会 捐赠。 IDE跨平台是必然趋势 很多大厂背后都有自己的小心思,不愿意把技术绑死在Windows上面白白的给微软打工,通过跨平台来压制微软在操作系统上的优势,重新制定 游戏 规则。如:Sun有自己的工作站和Solaris、IBM有PowerPC和OS2。 现在语言和框架层面已经基本解决了跨平台问题,那么即使在应用方面还需要进行少量的适配,成本也并不会高到哪里去。如果只专注一到两个平台的话,确实可以做到深度优化,但这个代价是放弃未来在其他平台发展的可能性。未来如果还要移植到其他平台,如:Android、ARM架构,跨平台的IDE就会显得得心应手。 开源社区也广泛接受了跨平台的思想,并且一直致力于实现跨平台的目标。像Wine、OpenOffice、Cygwin这样的适配工作都有人搞,做IDE的怎么可能放弃Linux平台呢? 微软发现风向标变了不能继续这样玩下去了 细心的小伙伴们就会发现这几年微软变了,开始拥抱Linux、拥抱开源、拥抱跨平台。除了Windows、Office、Azure这些可以直接盈利的项目没有开源之外,其他的都开源了,目前微软的开源项目已经有一千多个了。 Vscode、GitHub、Azure已经形成了一条完整的生态链,只要在这条生态链上稍微进行扶持,就能吸引更多的开发者、应用选择Azure。 套用一下纳德拉说过的话:“微软长期坚持的一个信条是,Linux等开源软件是公司的敌人。现在我们已经无力为这样的态度买单。我们必须满足客户的需求,而更重要的是确保我们以一种前瞻的方式而不是透过后视镜寻找机遇”。只有在战略上拥抱Linux、开源、跨平台,只有通过开源社区的广泛参与,微软才可能持续的壮大。 跨平台开发正在成为主流,微软免费推出的跨平台Web和云开发代码编辑器vscode支持多达 30 多种编程语言,为跨平台开发者带来了极大的便利。VSCode和Typescript的组合也让复杂的前端项目变得容易许多。 从IOS、Android、Windows Phone的混战就可以看出开源、跨平台的重要性 如果让一个软件开发者只开发IOS应用,而不开发Android应用,他绝对会说这样是很明智的。这时跨平台开发的重要性就开始凸显出来,它可以减少代码重构、部署的时间,降低开发成本。所以跨平台的IDE是非常有优势的。 以上个人浅见,欢迎批评指正。 IDE的开发是商业行为,一样是符合市场规律的。 首先,Linux服务器占用率很高,所以使用Linux开发的程序员的比例很高。因此开发Linux版本是符合市场规律的。 其次,使用c或是Java开发的IDE,gui改改就能移植到Linux,所以开发成本可控。 最后,不论是Linux还是Windows版本,很多IDE都有免费社区版,一方面很多开源的东西需要更多人参与维护才能完善,另一方面使用量上来了各种赚钱的方式就产生了。而不只是卖软件license赚钱一条路。 linux主要用户群就是程序员,编程语言IDE主要用户也是程序员,有什么理由不开发Liunx版 大公司开发跨平台ide不一定单纯为了钱,像是google的chrome,通过市场占有率可以推动互联网一些新技术的发展,比如 ssl,spdy,只有通过较大的市场份额才有制定标准的话语权。 还有是培养用户习惯,增加用户粘性后推广自家其他服务,比如vscode,微软家的。 还有就是软件成本是一次性的,开发出来后销售的是使用权,不是所有权,所以可以无限授权,现在linux开发用户也不少,企业看中的是大客户企业授权。这个是营收大头,还有一些定制化服务也是单独收费的。总之,一个企业公司不是做福利事业的,他是需要盈利的,只是我们一时半会没看明白他的盈利模式。 c语言的几个IDE是用c语言或java写的。开发的时候注意的话,很容易跨windows和linux,成本差别很小 如果是使用跨平台语言做的IDE(如java),不需要针对windows和linux单独开发。 因为开发windows比开发跨平台的成本高,开发windows要么mfc,开发超慢,要么.net,但是.net客户端部署成本高。反而是qt开发,效率高,部署简单,而且跨平台,python开发人员也好招。 ide很多都是社区版的,都是程序员自己义务工作搞出来自己用的工具。所以,为什么不开发linux版本?难道你准备在windows上调试linux程序? 你说的是idea吗?idea是java写的,随便套个壳可以在任何平台使用。也是它消耗内存巨大的原因 eclipse 开源的2023-07-22 12:57:001
浏览器是IE11版本,在网上报名时,提示使用的不是IE浏览器?
1.首先将我们的浏览器的主页面打开,尽量选择电脑本身自带的IE浏览器,以免其他的不能兼容。2.点击浏览器右上角的设置按钮,在设置中我们可以找到有兼容模式,如果更改IE版本失败我们就只能尝试更改兼容模式。3. 弹出的对话框中我们看见了最下端有兼容的勾选,建议大家可以将下面的选择都进行勾选上。4.勾选完成之后我们还需要将上部的已经填写好的浏览器添加到下方的框中,全都选择好后就可以直接将其关掉即可。5.最后我们将浏览器重新刷新一下就会看到报名的界面出来了。扩展资料:IE11在IE10的基础上再次扩大对HTML5和CSS 3的支持,且添加的这些新特性多数均是非常新潮的特性(如HTML5拖放,HTML5全屏,CSS边框图,视频码率控制,视频字幕隐藏,媒体加密,WebGL等等),使得IE11在显示HTML5网页时基本不出现到处不支持的问题。IE11在功能上新增对Google的SPDY协议的支持,对Chakra进行了更多优化,硬件加速渲染相比IE9和IE10更快,在同样多加载项的情况下,IE11网页加载速度已超过WebKit和Blink内核浏览器,支持在后台智能预判并迅速在内存中取出已经看过的网页而不需要重新连接网站加载。2023-07-22 12:57:081
弱网下移动端网络连接处理策略
一、背景 如何度量和模拟“弱网络”对移动APP的开发有着重大的意义,比如:节约测试成本、易于问题重现、加快产品上线等。 一般的方法是使用“丢包率”和“网络延时”来定义和衡量“弱网络”。 二、手机接入服务器的流程 要讲这个问题,首先要来了解下手机接入服务器的流程。 首先,手机要通过无线网络协议,从基站获得无线链路分配,才能跟网络进行通讯。 无线网络基站、基站控制器这方面,会给手机进行信号的分配,已完成手机连接和交互。 获得无线链路后,会进行网络附着、加密、鉴权,核心网络会检查你是不是可以连接在这个网络上,是否开通套餐,是不是漫游等。核心网络有SGSN和GGSN,在这一步完成无线网络协议和有线以太网的协议转换。 再下一步,核心网络会给你进行APN选择、IP分配、启动计费。 再往下面,才是传统网络的步骤:DNS查询、响应,建立TCP链接,HTTP GET,RTTP RESPONSE 200 OK,HTTP RESPONSE DATA,LAST HTTP RESPONSE DATA,开始UI展现。 这是手机通过无线网络接入服务器的全过程。整个过程当中有几个困扰开发者的问题: 无线网络是怎么给手机分配到无线链路的? 核心网络有接入点(APN),这里的CMNET和CMWAP有什么区别,仅仅是协议不同吗吗?数据转发又有什么区别?一个数据包在不同网络上传输有不同吗? 用户怎么最快的找到正确的服务器?内容怎么快速有效的加载,在第一时间显示出来? 这几个问题的重点在于其中的几个连接点: 3.2 一秒钟法则 根据以上情况,就形成无线网络的一大特点:秒级状态管理,秒级状态转换。这两个操作都在几百ms到几秒之间进行,对于维持连接来说时间太短,对于从无连接到有连接的转换来说时间又太长。 相比之下,有线网络的状态管理如ip分配、tcp连接释放,都是分钟级,而状态转换则是毫秒级。 这些通讯机制,同时加上无线网络的高延迟、高丢包。如何保证移动互联网的产品提供稳定的、可预期的服务质量,成为非常大的挑战: 2G网络上无线部分数据传输的延迟有几百ms,4G网络上无线部分传输延迟减少到几十ms,核心网状态转换、协议转换30~100ms,IP骨干网上的延迟又跟物理距离以及运营商互联互通质量有关,跨运营商50-400ms,同运营商5-80ms,这个还要取决于网络拥塞的情况。 无线网络误码率比有线高两个数量级,在不同时间段的波动也非常巨大。 怎么基于移动网络的特性去优化服务? 这就是我们总结的一秒钟法则:在一秒内要完成的规定动作。 1,2g网络:1秒内完成dns查询、和后台服务器建立连接 2,3g网络:1秒内完成首字显示(首字时间) 3,wifi网络:1秒内完成首屏显示(首屏时间) 4,这些指标需要在终端度量,必须跟用户体验相关:首字时间、首屏时间都必须是用户可以直观感受到的。 四、优化思路 4.1 服务保证原则 从以上分析可知,如何保证移动互联网的产品提供稳定的、可预期的服务质量,具有非常大的挑战。以下几点原则可能会有帮助: 1), 接口设计优化 ,接口的优化理论上不属于APP弱网络的优化,但是这个的API性能的问题,确实在网络条件不好的情况下才暴露无遗。大家都在谈论服务器的好坏,设备的性能高低,其实,对于一个良好的Server来说,绝大部分拖延请求速度的地方都是在IO上。包括,磁盘读写的IO,SQL查询的IO等等。常用的优化点:慢查询监控 、多次查询优化、常用接口cache等。 2) 图片相关策略。 1)使用更快的图片格式,严格说也不算弱网下的优化,但一个更快的图片格式真的很重要!这里建议采用WebP格式。(WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。但WebP是一种有损压缩。相较编码JPEG文件,编码同样质量的WebP文件需要占用更多的计算资源。) 2)、不同网络的不同图片下发。如(对于原图是600X480的图片):2/3G使用低清晰度图片——>下发300X240,精度为80的图片、4G普通清晰度图片——>下发600X480,精度为80的图片、WiFi高清晰度图片(最好根据网速来判断,wifi也有慢的)——>下发600X480,精度为100的图片。 3) 断线重连 。这可能是最重的一个特性,因为在无线网络中有太多的原因导致数据连接中断了。这里可以使用CDN。(CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN 的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。) 4)由于创建连接是一个非常昂贵的操作,所以应尽量 减少数据连接的创建次数 ,且在一次请求中应尽量以批量的方式执行任务。如果多次发送小数据包,应该尽量保证在2秒以内发送出去。在短时间内访问不同服务器时,尽可能地复用无线连接。 5), 优化DNS查询 。应尽量减少DNS查询、避免域名劫持、DNS污染,同时把用户调度到“最优接入点”。 6), 减小数据包大小和优化包量 。通过压缩、精简包头、消息合并等方式,来减小数据包大小和包量。 7),控制数据包大小不超过1500, 避免分片 。包括逻辑链路控制(Logic Link Control)分片、GGSN分片,以及IP分片。其中,当数据包大小超出GGSN所允许的最大大小时,GGSN的处理方式有以下三种:分片、丢弃和拒绝。 8), 优化TCP socket参数 ,包括:是否关闭快速回收、初始RTO、初始拥塞窗口、socket缓存大小、Delay-ACK、Selective-ACK、TCP_CORK、拥塞算法(westwood/TLP/cubic)等。做这件事情的意义在于:由于2G/3G/4G/WIFI/公司内网等接入网络的QoS差异很大,所以不同网络下为了取得较好的服务质量,上述参数的取值差异可能会很大。 9), 优化ACK包 。在弱网络的情况下,TCP协议中的ACK包是非常昂贵的,延时甚至能够达到秒级别,而TCP协议的拥塞控制、快速重传、快速恢复等特性都非常依赖接收端反馈的ACK包。可想而知,如果发送端接收到的ACK包延时太长,会严重影响TCP协议的效率。但是如果发送ACK太多又会占用宝贵过多的无线资源。在移动网络下通信,“在可靠的连接上,如何在减少ACK包的情况下,降低数据包的延时”是研究的热点。基本的思想:平衡冗余包和ACK包个数,达到降低延时,提高吞吐量的目的。例如SGSN和GGSN之间的通信实现:二者之间通过UDP协议通信,发送者在无新的数据包的情况下,每隔一定的时间重试已发送的包,达到最大重试次数后,则丢弃该包。 10), TCP的拥塞控制算法 是以“丢包意味着网络出现拥塞”为假设设计的,很明显这个假设在无线网络环境下是不合适的。但是在无线网络环境下,在设计可靠UDP协议时是否能够完全丢弃拥塞控制呢?这里有其它的文章中提出了几种在无线网络环境下的TCP友好的拥塞控制算法,有兴趣可以自行查阅。 11), 灵活使用长连接/短连接 ,支持不同协议(TCP/UDP, http、二进制协议等),支持不同端口等。 12), 让用户觉得快 。到这里已经不能算是技术层面的方法了,属于一种心理层面的博弈,一种改善用户体验的方式。比如: 1)、不从0开始的进度条。不管网页的加载进度如何,不管网络条件如何,加载进度始终是从50%起,并且停留在大约98%进度左右的地方。 2)、先显示文字在加载图片。同样是在Webview之中,图片或者多媒体的加载速度肯定是远远慢过文字的加载速度的。由于不同的webview显示和渲染效果不同,我们可以先让webview先显示文字,在显示图片。给用户一种可以先预览整个网页概况的感觉。 4.2 接入调度优化 接入调度优化首先要考虑的是减少DNS的影响。移动网络的DNS有如下特点: 1)骨干网无法识别移动用户在哪个城市,东西南北各个地方的调度没有充分调用。目前有一部分全国范围的DNS承载了超过40%的全网用户 2),很多山寨机的终端local dns设置是错误的 3),另外还有一些有线网络也一样会遇到的问题,如终端DNS解析滥用、域名劫持、DNS污染、老化、脆弱等。不过对于这些问题,桌面的自愈性会比较好,而在手机上则比较难以解决。 对于DNS的问题,有两条主要的解决思路: 1),减少DNS的请求、查询、更新,也就是做DNS缓存 2),在终端配置server list,直接访问IP,不用DNS 但仅仅这么做还不够,因为用户可能来自国内外不同的运营商,还需要进一步优化调度策略: 1),DNS缓存需要多建立接入点,用不同域名区分 2),IP列表需要更新以适应不同网络情况,要做到主动调度。好比最早我们只服务好移动用户就行,保证移动用户的接入质量优先,因为绝大多数用户集中在移动;现在国内有三个运营商,用户分布的比例在慢慢接近,要区分清楚;智能手机会用wifi,接入的是电信、联通还是哪个运营商,不知道,所以你不可能预先设置场景再if then,必须通过后台调度能力来解决。 再进一步优化,就产生一种融合的方式: 1),先做域名解析,客户端直接连接解析的IP,可以用http协议,也可以用tcp socket 2),多端口、多协议组合:不同协议有不同的限制,有些只能http,有些只能tcp socket,各种环境都要适应,客户端不能只支持一种协议 3),终端测速:接入点越来越多,接入哪个合适,要选择,可以通过终端测速来选择最快的。你当然可以每一次新建连接都做测速,但是这样建立连接时间可能会很长;我们可以给用户先建立连接后,在后台根据长期速度监控、当前测速的结果,来做动态调度。也就是说,第一次连接可能不是最优,连接建立后动态测速,再转移到最快接入点。更进一步就是建立网络profile,终端学习的思路。 关于测速采样的粒度,移动互联网取IP段是没用的,比较好的粒度是到网元级别,比如广东有20多个wap网关,每一个网关的情况都不一样,这就是一个比较合适的粒度。 最后强调一个所有的接入调度原则:不要把调度逻辑写死在客户端,一定要由后台完成。 4.3 协议优化 协议参数优化这块就简单列一下,是长期运营过程中总结的一些经验,在启动移动互联网服务时作为运营的规范,可以少走很多弯路: 1,关闭TCP快速回收 2,Init RTO不低于3秒 3,初始拥塞控制窗口不小于10。因为大部分页面在10kB以下,很多请求在慢启动阶段已经结束,改为10可以降低小页面资源传输时延。内容越大,这个选项的效果就比较不明显。 4,Socket buffer > 64k 5,TCP滑动窗口可变 6,控制发包大小在1400字节以下,避免分片 协议优化的原则总结下来是这么几条: 1,连接重用 2,并发连接控制 3,超时控制 4,包头精简 5,内容压缩 6,选择更高效率的协议。无论是TCP、HTTP、UDP、长连接、GZIP、SPDY、WUP还是WebP,每一种协议、方案都有其道理,没有最优,只有是否适合你的产品和服务特点,需要大家在运营过程验证和取舍。 4.4 WAP接入点优化 关于WAP接入点优化,可能有些人会说,我们的App是高端大气上档次的应用,是不是就不用做WAP优化?实际上我们的统计显示,目前有5%-20%的用户选择的接入点是*WAP(CMWAP、3GWAP、CTWAP),这甚至包括一些iPhone终端。实际上,WAP网关本质是个代理,不完全是落后的东西,随着技术的进步也在演进,以后在组网架构中可能有综合网关、内容计费网关来取代目前的WAP网关,所以建议也要一并考虑。以下是做WAP优化需要注意的一些问题: 1,资费提醒页面 2,302跳转处理 3,X-Online-Host使用与处理 4,包大小限制 5,劫持与缓存 6,正确获取资源包大小 4.5 业务逻辑优化 1, 简化逻辑 :交互繁琐的内容尽量用标识更新。举一个例子,我们在老版的手机QQ上做过一个测试:假如我有100个好友,用手机QQ完成登陆,完成好友列表更新一遍,需要3.5分钟。这肯定是不合理的。建议用信令状态来通知是否需要更新,同时合理利用缓存。在比如玩游戏,好友给你送了很多星星,是让用户一次一次点还是批量点?从优化的角度肯定是批量点,从用户体验的角度这也更加舒服。 另一方面,延长域名图标的缓存时间也可以有效地优化访问次数。我们把手机腾讯网图标的缓存时长从120分钟延长到2天后,访问次数优化了差不多35%。 2, 柔性可用 :这个意思就是在网络质量好的时候给高清大图,不好的时候先给用户看小图,点一下再拉取原图。举一个极端的例子,比如万一地震了,基站毁掉20%,用户要给家人报平安,这时候产品上就必须优化,比如只发送文字,合理降3, 低网络消耗 。另外在响应很慢的时候,需要给用户一些合理的页面提示,比如提示用户再过5秒会发送,所以你不要一直刷屏,这也可以减少访问对后台服务、对网络的冲击。 上面说了那么多,这里就给出一个实例帮助大家更直观的理解。 这里给出一个DNS系统设计来实现最优调度。其拓扑结构如下: TGCP SDK的职责: 1,用HTTP的Get/Post方法从DNSvr获服务器和DNSvr本身的最优接入点列表。Get/Post方法的查询参数包括uin/openid、客户端版本号、IP列表的MD5(注意IP顺序)、域名列表、VIP、ServiceID等。 2,缓存访问服务器和DNSvr的IP列表,以及其它元数据(比如IP列表等),且以APN为主键。 3,满足一定的条件下,要主动更新缓存的IP列表,例如缓存过期。 Tconnd的职责: 1,路由查询请求给活动的DNSvr; DNSvr的职责: 1,根据静态和动态策略来决定客户端的“最优接入点”。静态策略:根据uin/openid、客户端版本号或者强制规则来决定IP列表;动态策略:灯塔根据测速数据动态决定用户的服务器接入点。 2,支持以手动或自动的方式拉黑某些IP。自动方式:由服务器的接入tconnd向DNSvr上报其是否存活(需要向多个点上报,包括用公网IP上报),如果在一定时间内没有接收到上报或者上报消息中明确所有的逻辑服务器已经挂掉,则自动拉黑相应的IP。如果业务恢复,则自动激活相应的IP。如果项目组接入TGW,对于某个IP和端口是否可用,则需要考虑进程与VIP的映射关系。 3,在tcaplus中缓存灯塔的计算结果。此时要求DNSvr能够根据客户端IP判断所属的国家、省份、运营商和网关(可以通过访问MIG的IP库实现)。如果缓存了灯塔的计算结果,当缓存超时后,要重新从灯塔拉取相应数据。 灯塔的职责: 1,根据客户端IP和服务器接入点IP,返回最优的接入点列表,包括IP的排序,以及客户端接入的国家、省份、运营商、APN和网关。 Tcaplus的职责: 1,保存接入的IP列表和端口、静态策略,或缓存灯塔的计算结果; 主要的流程: 客户端批量解析域名流程 1,TGCP以APN和域名列表为关键字查询缓存,如果存在且没有过期,则直接把IP返回给用户。如果指定强制解析域名列表,则跳过此步骤; 2,TGCP用预配置或缓存的IP向DNSvr发起查询请求,如果成功返回结果,则执行步骤3,否则,重试IP列表中的其它IP,如果都失败,则用域名访问DNSvr。注意:如果是结果格式不正确,则使用上次的IP重试,不要更换IP重试。 3,DNSvr比较客户端IP列表和当前最新的IP列表的MD5,如果相等,则告诉客户端不需要更新本地缓存。否则,TGCP把接入服务器和DNSvr的IP列表写入本地。注意:在访问服务器时,这些IP的优先级要高于静态配置在客户端的IP。 客户端使用域名访问服务器流程 1,如果本地存在有效的IP(即存在对应APN的IP列表,且没有失效),则使用IP访问服务器。 2,否则,发起“客户端批量解析域名流程”后,再访问服务器。 服务器接入tconnd主动上报状态流程: 1,Tconnd周期性向DNSvr上报心跳消息,其中包含本接入点是否可用的信息。 2,DNSvr在一定的时间内没有收到心跳消息或者相应的接入点不可用,则把相应的IP和端口拉黑,黑掉的IP不在下发给客户端。 注意:实际部署的时候,接入的Tconnd要向多个DNSvr接入tconnd上报。 向客户端主动push接入点列表的流程 1,当TGCP连接到服务器接入的Tconnd时,Tconnd要向DNSvr发起请求,以校验当前接入IP的质量和时效性。如果IP列表发生变化,Tconnd要把最新的IP列表下发给客户端缓存起来。 2,当TGCP下次访问服务器时,则使用最新的IP列表。 客户端访问DNSvr失败的流程 1,如果访问DNSvr失败(包括IP+域名),如果配置了本地IP,则直接用IP访问服务器,否则用域名访问。 优化传输层协议设计 在原有tconnd支持的可靠UDP的基础之上,添加以下逻辑: 1,数据压缩; 2,数据加密; 3,合并多个数据包; 4,支持流式数据传输,便于控制每个UDP包的大小,也便于数据加密和压缩; 5,可选地支持改进的拥塞控制算法; 6,即使没有接收到ACK包,也需要主动重试以发送的数据包; 5.2 Hybird开发下的一些优化 要处理在弱网络下的加载速度,那么我们要先确定一下我们的整个APP在哪个地方加载的速度如何,最长的加载路径在哪里,我们从而才有针对性的进行优化与修改。 5.2.1 WebView 如果是对是APP中内嵌的webview网页,针对网页体验优化已经由来已久了。我们可以使用Chrome的开发者模式,调整到Network模式下,将网络条件设置为3G去请求网页,那么我们就能够看出来一个网页加载的速度主要都耗费在哪个地方,如下图所示: 当然,html的加速方式有很多种 1,使用gulpgrunt进行打包压缩:jscss资源压缩,CSS Sprites合并等。 2,使用font-awesome替换图片:字体可以很好的兼容,无限放大,常用的图片都有2023-07-22 12:57:451
长板理论----激发自身优势
有一条主线,激发自身优势。长版理论:当代公司只需要有一块优势长坂,以及完整的桶的意识,围绕这块长坂展开布局,就能取得成就,而对于短板,只需要通过合作就能弥补。 相比激发自身优势和改变自身劣势,显然前者更容易实现,这就确保战略方向的正确性。 例子: 百事可乐只保留市场部,专注于运行百事可乐品牌;谷歌出售手机公司业务,将精力投入到整个安卓生态系统的创新中;恒大集团出售粮油、乳制品及矿泉水等非主营业务,基于公司的战略意图,使恒大更加专注于自己的强项:房地产及其他相关业务。 百事可乐为什么只专注于品牌经营?因为百事可乐的品牌就是他们的优势。 谷歌为什么将精力投入到安卓系统中?因为他们擅长系统开发,那时他们的强项。 恒大为什么把战略放回到房地产板块?因为他们专业的是做房地产,这才是他们的核心业务。 从恒大的案例中可以发现,恒大投资了很多他们并不专业的非主营业务,目的可能是增加恒大业务的多样性、全面性,但分散了资源最终的结果是浪费了他多公司资源却收效甚微,而这段时间最赚钱的还是老本行房地产。 从这些案例告诉我们,与其花时间治愈短板,不如花时间和精力,把自身优势激发到极致。 那从自身方面去考虑,对于我而言,我的自身优势是什么?如何激发我的自身优势呢? 提问: 1.什么是自身优势? 2.激发自身优势的本质是什么? 3.我有什么自身优势? 4.我要如何发掘我的自身优势? 5.要如何激发自身优势? 6.什么是我的自身优势呢? 7.身体长处是自身优势吗? 8.知识水平、学历、专业是自身优势吗? 9.突出能力是自身优势吗? 10.自身优势包括外部因素吗?时间、人力、财力、物力?时间? 11.习惯会是自身优势吗? 12.优势是否是相对的? 13.那我的优势是相对哪些方面而言? 14.相对于自己?相对于竞争对手?相对于消费者? 15.如何理解“相对”这个关键词? 16.对于自己而言,自身优势是相对于劣势吗? 17.自身优势是相对于我的过去? 18.自身优势是相对于我的竞争对手? 19.自身优势是代表我比竞争对手强吗? 20.是如何相比较的? 21.我有他无? 22.他有我也有且更强? 23.自身优势是相对竞争对手的劣势吗? 24.就是与竞品的差异化? 25.相对于消费者,什么是自身优势? 26.更能让消费者接受的方面是自身优势吗? 27.更能让消费者接受的方面包括哪些方面? 28.行为特征?身体特征?学历、专业、知识水平?突出能力? 29.如果把自身比喻为产品,是否这产品更能让消费者接受就是自身优势? 30.如何能更让消费者接受,打造自己的自身优势? 31.我的自身优势为什么是优势? 32.确定了我的自身优势,如何激发自身优势? 33.激发自身优势需要对自身优势进行目标细分吗? 34.如何目标细分?用什么标准进行细分? 35.针对于不同的目标,激发不同的自身优势? 36.激发自身优势需要单爆吗? 37.智能激发一个自身优势?还是可以同时激发几个自身优势? 38.激发自身优势是聚焦在主要问题还是可以分散? 39.有没有激发自身优势的故事? 40.他们是如何激发自身优势的? 41.他们在激发自身优势有遇到什么问题吗? 42.他们遇到的问题,我有可能也会遇到吗? 43.他们是如何解决所遇到的问题的? 44.他们是如何把自身优势激发到极致的? 45.我可以学习+借鉴吗? 46.在多个自身优势中,如何确定哪个自身优势更适合当前情况去激发? 47.可以用排除法去判断主要的自身优势吗? 48.如何用排除法去判断? 49.通过市调可以发掘自身优势吗? 50.如何通过市调发掘自身优势? 51.市调自身?竞品?消费者? 52.一定要通过市调才能真正发掘自身优势吗? 53.学习三大,如何激发自身优势? 54.对于学习三大,我有哪些自身优势? 55.我的自身优势对学习三大有帮助吗? 56.为了学习三大,如何把自身优势激发到极致? 57.我的自身优势可以强化吗? 58.如何强化自身优势? 59.可以增加新的自身优势吗? 60.学习三大可以增强我的自身优势吗?可以增加自身优势吗? 61.掌握了三大,我们会有哪些自身优势? 62.强化了自身优势,如何把我们的自身优势再激发到极致? …… 分析问题: ①我们每一个人都有自己的短处、长处,老大说正如兔子会跑、鸭子会游,每个人具有的优势不尽相同,重点是精确的范县自身优势,并将自身优势激发出来。 ②在自己的优势领域里做任何事,效果都会更好,成就感更强,自信心更强,只有这样的状态,事情才会干得更出色。 ③激发自身优势到极致=借力+战斗力翻倍+与竞品形成有效差异化+打造核心优势+零投入+满血复活+快速起效。 ④发挥自身优势,要与机会进行匹配,不能分散自己的优势资源,目标细分+单爆。 ⑤激发自身优势还有一个关键点,就是“强化”,强化自身优势不但需要我们的奋斗精神,更重要的是要有高手的帮助,单靠自己的努力不借助外力,只会事倍功半,只有通过高手的点拨和指导,才是最快成长途径。 解决问题: 要保持把事情做到极致的心态,因为就算你有很好的自身优势,激发过程中不发挥到极致,这些都是无效的自身优势,竹篮打水,白费心机。 我们都是平凡人,我们没比别人厉害多少,享有高人一等,与别人形成有效差异化,就要比别人更努力、更能吃苦,更能坚持、更加奋斗,把事情做到极致就是别人的努力的十倍。【本文由“生活需要比力”发布,2017年5月5日】 spdy": 2?i 3_>7B2023-07-22 12:57:591
电脑用4g上网好快
新到来的4G时代,究竟上网速度是怎样的。下面是我为大家整理的关于电脑用4g上网好快,一起来看看吧! 电脑用4g上网好快 理论上,一个4G网络的连接速度可以提供100 mbps(兆/秒)的速度。但现实情况是,可能我们会看到4G的下载速度最多只达到30mbps。然而,根据作者对终端用户在竞争性研究的调查,通常会发现超过10mbps的速度并不算快。 在5000个美国智能手机和平板电脑用户的调查中,作者发现“虽然根据桌面、智能手机或平板电脑工作平台的不同,预期会有一定程度的变化。但是它们无疑是增加的。所以,用户期望的是无论使用什么样的设备都要具备非常快的网络性能。但很多网站,特别是对于智能手机和平板电脑来说,缓慢的网页速度经常会使消费者感到失望。研究显示,关于性能的“期望差距”已经跨平台大幅收紧,而供应商却忽略了关于网速性能预期增加这一对自身不利的因素。 当谈到令人沮丧的移动网络体验时,三分之二的智能手机用户引用了“网页加载速度慢”这句话。近一半的开发人员认为下一个最大难点是“网站没有为智能手机等移动终端做到充分优化。”64%的智能手机用户希望网站的加载速度在四秒以内,然而82%的人希望手机网站的加载速度在5秒之内。 平板电脑用户也有同感。作者发现60%的平板电脑用户期望登陆一个网站的时间要少于三秒钟。但在关于流行网站性能的调查中,几乎没有网站可以为平板电脑或智能手机用户提供这样的速度。 显然,移动用户希望得到更快的上网速度,并且他们中近一半的人将会选择为智能手机做了优化的网址,但仅仅做到这些还是不够的。 有限的网络带宽 首先,要确保有没有足够的4G宽带供我们使用。在一个地区的4G用户越多,用户之间就会有更多可用的宽带被划分出来。因此,对于美国电话电报公司和通讯公司来说,就要采取放缓网速的措施,就是所谓的“节流”,以此来确保每个人都能得到他们所分享的可用宽带。 不够成熟的HTTP协议 此外,超文本传输协议本身还不够成熟。SPDY应用层协议的作者Chris Storm解释说,以每人使用不超过六个连接为例,显示一个HTTP网页需要启动和停止每个页面中众多的网页连接。斯道姆说,一旦你的连接超过4 mbps,在常规文本或Java描述语言大量的页面上你将不会感到网页加载性能有多大的改进。 Chris Storm表明,要想避免以上的问题,对于移动用户和针对这些用户的网站来说,需要迁移到支持谷歌应用层协议SPDY(HTTP的一个替代协议)的浏览器和网络服务器中来。 Storm解释说,“SPDY应用层协议,对于网络请求的数量是没有限制的,并且可以在一个单一的SPDY连接中同时发布。因为请求在单一通道上是交错的,这个协议比传输控制协议更加有效率。另一方面,HTTP每次只能获取一种资源和支持,而且每次最多只能有六个连接。SPDY应用层协议的网络效应是像网页浏览器那样减少延迟,并且服务器不需要浪费时间来进行交换数据请求和响应。”对于移动用户来说,仅使用SPDY应用层次协议就可以使网页性能从28%增至55%。 Keynote高级副总裁Don Aoki补充到:“这一调查发现,大多数移动用户选择通过他们的移动浏览器来进行消费类行为, 而像电子邮件和银行个人任务是通过移动应用访问为智能手机或平板电脑用户提供服务。而移动消费者则需要了解如何能够访问和使用这些应用资源。对品牌而言,关键是要整合和开发可以跨多种类型移动设备平台的移动发展战略,并通过网上搜索工具,比如Keynote的网络有效性来评估智能手机和平板电脑用户的应用经验。 总之,不管你决定要怎么做,有一点是可以肯定的,如果移动用户对网站的网页速度感到不满意,要么你需要改善你网页的加载速度提高用户体验;要么你就对网站的智能手机和平板电脑用户说再见。2023-07-22 12:58:061
求大神详解Flash 烟花代码。
var FireTimer:Timer=new Timer(1000);//创建一个定时器,每1000毫秒(即1秒)触发一次FireTimer.addEventListener(TimerEvent.TIMER,addFire);//给定时器注册侦听,当定时器触发时执行addFire函数FireTimer.start();//计时器开始运作var tempRo:Number;//创建一个临时的数字对象,记录烟花的角度function addFire(e:TimerEvent):void { var X:Number=Math.random()*550;//创建一个随机的横坐标值,范围在 0~550间var Y:Number=Math.random()*400;//创建一个随机的纵坐标值,范围在 0~550间var color:uint=0xffffff* Math.random();//创建一个随机的颜色值,范围在0x000000~0xffffff之间(这是一个16进制的数值)trace(color.toString());//在调试面板输出颜色的值,测试用for(var i:int=0;i<100;i++) { var mc :MovieClip=new MovieClip();//创建烟花的实体 mc.graphics.beginFill(color);//用刚才的随机颜色填充烟花的内容 mc.graphics.drawCircle(0,0,4+3* Math.random());//绘制烟花的形状(圆形),半径在(4 + 0) ~ (4 + 3)之间,即4~7之间。 mc.graphics.endFill();//终止填充颜色 addChild(mc);//把烟花加载到场景里,使其可见mc.x=X;//给烟花的横坐标赋值,X就是刚才随机生成的横坐标值mc.y=Y;//给烟花的纵坐标赋值,Y就是刚才随机生成的纵坐标值 mc.scaleX=mc.scaleY=0.4+Math.random()*0.6;//烟花的长宽在 (0.4 + 0)~(0.4 + 0.6)倍之间随机缩放,即随机缩放为原大小的0.4~1倍tempRo=Math.random()*360/180;//创建烟花的随机角度mc.spdX=Math.random()*10*Math.sin(tempRo)*Math.pow(-1,Math.floor(Math.random()*100)%2);//根据随机角度,随机创建烟花沿x轴移动的矢量值,其值为 -10~10之间,记录在mc的动态变量spdX中mc.spdY=Math.random()*10*Math.cos(tempRo)*Math.pow(-1,Math.floor(Math.random()*100)%2);//根据随机角度,随机创建烟花沿y轴移动的矢量值,其值为 -10~10之间,记录在mc的动态变量spdY中mc.addEventListener(Event.ENTER_FRAME,FireMove);//给烟花注册帧事件函数,在FireMove函数中同步烟花的效果} } function FireMove(e:Event):void { var obj:Object=e.target;//创建一个对象,获得注册事件的对象(烟花)的索引,这个obj就是烟花mcobj.x+=obj.spdX;//烟花的x坐标每一帧递增spdX个单位,obj.spdX就是刚才的mc.spdXobj.y+=obj.spdY;//烟花的y坐标每一帧递增spdY个单位,obj.spdY就是刚才的mc.spdYobj.alpha-=0.05;//烟花每一帧的透明度衰减5%if(obj.alpha<=0)//当烟花的透明度小于或等于0时{ obj.removeEventListener(Event.ENTER_FRAME,FireMove);//注销烟花的帧事件//建议这里增加一行代码 removeChild(MovieClip(obj)),从场景里移除已经看不见的烟花,节省资源} }2023-07-22 12:58:271
http1、http1.1和http2的区别
影响一个HTTP网络请求的因素主要有2个:带宽和延迟 主要区别体现在缓存处理: 1u20e3ufe0f缓存处理。 在http1.0中主要使用header的if-modified-since/expires来做缓存的判断依据。 http1.1引入了更多的缓存策略控制策略。比如Entity tag,If-Unmodified-Since,If-match,If-None-Match等更多可供选择的缓存头来控制缓存。 2u20e3ufe0f带宽优化及网络连接的使用。 HTTP1.0中存在一些浪费带宽的现象。例如客户端只需要某个对象中的一部分,服务器端却把整个对象送过来了,并且不能支持断点续传的功能。 HTTP1.1在请求头中引入了range头域,它允许只请求资源中的某一部分,即返回码是206(partial content)。方便开发者的自由选择、节省带宽。 3u20e3ufe0f错误通知的管理。 在HTTP1.1中新增了24个错误状态响应码。如409(conflict)表示请求的资源与资源当前的状态发生冲突,401(gone)表示服务器上的资源被永久的删除。 4u20e3ufe0fhost头处理。 在HTTP1.0中认为每一个服务器都绑定一个ip地址,因此请求消息头中并没有传递主机名(hostname)。 但是随着虚拟主机技术的发展,在一台物理服务器上可以存在多台虚拟主机,并且他们共享一个ip地址。 HTTP1.1中请求和响应都支持host头域,且请求消息中如果没有host头域会报错(400bad request) 5u20e3ufe0f长链接 HTTP1.1支持长链接和请求的流水线处理,在 一个TCP连接上可以传送多个HTTP请求和响应 ,减少了建立多个连接的消耗和延迟。在HTTP1.1中默认打开onnection:keep-alive,在一定程度上弥补了http1.0每次请求都要重新连接的缺陷。 SPDY优化了HTTP1.x的请求延迟,解决了HTTP1.x的安全性 SPDY的构成图 SPDY位于HTTP之下,TCP和SSL之上,这样就可以轻松兼容老版本的HTTP协议,同时可以使用已有的SSL功能 HTTP2的性能比HTTP1.1好很多,这里是Akamai公司的一个 官方演示 HTTP2.0可以说是SPDY的升级版(原本也是基于SPDY设计的),但是两者还是有一些区别: 服务器推送能把客户端所需要的资源伴随index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务器推送的方式可以极大地提升速度。 假定一个页面有100个资源需要加载,每一次请求都有1kb的消息头,则至少需要消耗100kb来获取这些请求头。HTTP2.0维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。 HTTP优化的性能并不在于高带宽,而是低延迟。TCP连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据传输成功,会随着时间的推移提高传输的速度。这种调谐叫做TCP的慢启动。由于这种原因,让原本就具有突发性和短时性的HTTP连接变得十分低效。 HTTP/2让所有的数据流共用同一个连接 ,可以更有效地使用TCP连接,让高带宽也能真正的服务于HTTP的性能提升。2023-07-22 12:58:451
智能手机和平板电脑4G网速暂难满足
理论上,4G连接的速度上限为100 Mbps。但在实践中,在4G网络状况最佳的情况下,用户能体验到的最快下载速度仅为30 Mbps。而在通常情况下,用户所能体验到的下行速度只有10Mbps左右。据Keynote Competitive Research的调查结果显示,这一速度根本无法满足用户需求。 智能手机和平板电脑4G网速暂难满足 调查机构Keynote此项结果是通过对5000名美国智能手机和平板电脑用户调查得出的。调查还发现,用户对于各种网络设备,无论是台式机、智能手机还是平板电脑的连接速度要求在逐渐提高。绝大多数被调查者对现状并不满意,尤其是智能手机和平板电脑用户。用户更期望智能手机和平板电脑的网速能够接近台式机,但大多数运营商并不重视这一点,这很有可能让他们付出代价。 在Keynote对智能手机用户“过去两个月中最糟糕的移动网络体验”的调查问卷中,三分之二的受访者选择了“网页加载过慢。”近半数的受访者选择了“智能手机网页优化不佳”。此外,64%的受访者希望智能手机网页加载在4秒内完成,82%的受访者希望在5秒内完成。 平板电脑用户调查结果和智能手机用户大体一致,只是在网速方面要求更高。60%的平板电脑用户希望网页加载时间在3秒以内。但这一愿望恐难实现,因为Keynote调查机构已对绝大多数主流网站进行了调查,没有任何一家网站的网页加载时间能达到3秒以内。 综上所述,移动设备用户希望体验更快的网速,近半数的智能手机用户希望网页得到优化。但目前的现状,很难满足用户的这些需求。 首先,4G网络带宽存在限制。在某一区域内,可用带宽会随着用户数量的增加而不断被瓜分。当用户达到一定数量时,AT&T和Verizon很可能限制网络服务的速度,以确保每个用户都能正常的使用带宽网络。 此外,HTTP协议本身也没有跟上时代的发展。The SPDY Book作者Chris Storm指出,在HTTP协议下,为打开一个新的网页,需要多个链接重启或断开。但每次操作的链接上限为6个。当连接速度达到4Mbps以后,即使继续提速,传统的文本或JavaScript网页的加载速度也不会有明显改善。 Storm表示,用户如果想获得更好的移动网络体验,就应该选择支持谷歌SPDY协议的浏览器或Web服务。 Storm 表示,“在SPDY协议下,单个SPDY连接所能处理的Web指令没有上限。这种Web指令单程处理的模式使得SPDY具有比HTTP和TCP协议更高的效率。由于浏览器或者其它Web服务不必对指令进行重复接受和回复,加载时间会也会明显的缩短。”对移动网络用户而言,SPDY协议可以减少28%到 55%的网页加载时间。 Keynote的高级主管Don Aoki指出:“我们的调查发现,用户不仅利用智能手机、平板电脑等移动设备处理即时信息,还越来越多的通过移动应用收发电子邮件或完成银行交易。用户的这种对移动网络服务的自主选择对运营商而言至关重要。因为根据不同设备用户的需求,运营商可以制定相应的移动服务业务,并对用户体验进行调查评估。”2023-07-22 12:58:521
http 10 1.1 2.0
HTTP是基于TCP/IP的应用层协议。影响HTTP网络请求的因素主要有两个:宽带和延迟。 宽带: 现在网络基础建设已经很完善,宽带得到了极大的提升,我们不在会担心由宽带而影响网速。 延迟: 1、 浏览器阻塞:浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有4个连接(浏览器内核不同可能会有差异),当超过浏览器最大连接数限制,后续请求就会被阻塞。 2、DNS查询:浏览器需要知道目标服务器的IP才能建立连接。将域名解析为IP的这个系统就是DNS。通常可以利用DNS缓存结果达到减少这个时间的目的。 3、建立连接:HTTP是基于TCP协议的,浏览器最快也要在第三次握手时才能捎带HTTP请求报文,达到真正建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响比较明显,慢启动对大文件类请求影响比较大。 持久链接(Persistent Connection) HTTP1.0需要使用connection: keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。 HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP链接,服务器不跟踪每个客户记录和请求。 会话方式如下: 1、建立连接 2、发出请求信息 3、回包响应信息 4、关掉连接 小结:浏览器和web服务器连接很短,每次连接只处理一个请求和响应。对每个请求,浏览器和web服务器都要建立一次单独的链接,服务器回完包,会直接断开链接,所以他们之间的通信是完全独立分开的请求和响应对,没法做到连接状态控制。同时建立和关掉链接会占用连接时间。 HTTP1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。 HTTP1.1还允许客户端不用等待上一次结果返回,就可以发送下一次请求。但服务器的回包策略必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分每次请求的响应内容。 节约宽带 HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。 当服务器返回401的时候,客户端就可以不用发送body了,节约了宽带。 Range HTTP1.1还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。 Host头处理 HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。随着虚拟主机技术的发展,在一台屋里服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。 HTTP1.1的请求消息和响应消息都支持Host头域,且请求消息中没有Host头域会报告一个错误(400 Bad Request)。 HTTP2.0 目前iOS系统网络请求框架NSURLSessionTask使用的就是HTTP2.0 新的二进制格式,HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性, 要做到健壮性考虑的场景必然很多。二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便其健壮。 多路复用,既连接共享,每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个链接的request可以随机的混杂在一起,接收方可以根据request的id将request在归属到各自不同的服务端请求里面。多路复用。 header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份 header fields表,既避免了重复header的传输,又减小了需要传输的大小。 服务端推送,同SPDY一样,HTTP2.0也具有server push功能,具体看下面提到的SPDY 链接:https://www.jianshu.com/p/8a3a8fdc3a752023-07-22 12:58:591
HTTPS和HTTP2.0详解
title: HTTPS和HTTP2.0详解 date: 2018-05-21 14:19:31 tags: 影响一个HTTP网络请求的因素主要有两个:带宽和延迟。 带宽 :如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。 延迟 : HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在: HTTP 有以下安全性问题: HTTPS可以理解为 HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。 HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是说 HTTPS 使用了隧道进行通信。 通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改) 对称密钥加密(Symmetric-Key Encryption),加密的加密和解密使用同一密钥。 优点:运算速度快; 缺点:密钥容易被获取。 公开密钥加密(Public-Key Encryption),也称为非对称密钥加密,使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。 优点:更为安全; 缺点:运算速度慢; HTTPS 采用混合的加密机制,使用公开密钥加密用于传输对称密钥来保证安全性,之后使用对称密钥加密进行通信来保证效率。 原理图: 2012年google如一声惊雷提出了SPDY的方案,大家才开始从正面看待和解决老版本HTTP协议本身的问题,SPDY可以说是综合了HTTPS和HTTP两者有点于一体的传输协议,主要解决: HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的),但是,HTTP2.0 跟 SPDY 仍有不同的地方,主要是以下两点:2023-07-22 12:59:061
HTTP/2.0 相比1.0有哪些重大改进
HTTP 2.0 的出现,相比于 HTTP 1.x ,大幅度的提升了 web 性能。在与 HTTP/1.1 完全语义兼容的基础上,进一步减少了网络延迟。而对于前端开发人员来说,无疑减少了在前端方面的优化工作。本文将对 HTTP 2.0 协议 个基本技术点进行总结,联系相关知识,探索 HTTP 2.0 是如何提高性能的。 初露锋芒 HTTP/2: the Future of the Internet 这是 Akamai 公司建立的一个官方的演示,用以说明 HTTP/2 相比于之前的 HTTP/1.1 在性能上的大幅度提升。 同时请求 379 张图片,从Load time 的对比可以看出 HTTP/2 在速度上的优势。 此时如果我们打开 Chrome Developer Tools 查看 Network 一栏可以发现,HTTP/2 在网络请求方面与 HTTP /1.1的明显区别。 HTTP/1: HTTP/2: 多路复用 (Multiplexing) 多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。 众所周知 ,在 HTTP/1.1 协议中 「浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞」。 Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion. 来源:RFC-2616-8.1.4 Practical Considerations HTTP/1.1: Connections 该图总结了不同浏览器对该限制的数目。 来源: Roundup on Parallel Connections 这也是为何一些站点会有多个静态资源 CDN 域名的原因之一,拿 Twitter 为例,http://twimg.com,目的就是变相的解决浏览器针对同一域名的请求限制阻塞问题。 而 HTTP/2 的多路复用(Multiplexing) 则允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。 因此 HTTP/2 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。 二进制分帧 在不改动 HTTP/1.x 的语义、方法、状态码、URI 以及首部字段….. 的情况下, HTTP/2 是如何做到「突破 HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量」的 ? 关键之一就是在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。 在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码 ,其中 HTTP1.x 的首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame 里面。 HTTP/2 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。 在过去, HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。 HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。 总结: 单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大 由于 TCP 连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快 首部压缩(Header Compression) HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。 服务端推送(Server Push) 服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。Server Push 让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义;如果一个请求是由你的主页发起的,服务器很可能会响应主页内容、logo 以及样式表,因为它知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送还有一个很大的优势:可以缓存!也让在遵循同源的情况下,不同页面之间可以共享缓存资源成为可能。 关于 HTTP/2 的 Server Push 以及 HTTP/2 的缓存策略 典型问题: 「如果客户端早已在缓存中有了一份 copy 怎么办?」还要 Push 吗? 详情参考另一个答案: HTTP/2 对现在的网页访问,有什么大的优化呢?体现在什么地方 PS: 强烈推荐阅读 Mark Nottingham 在 Velocity Beijing 2015 的 speech HTTP/2 for Front-End Developers ,关于 HTTP/2 下的前端性能优化相关。 Slide 地址:HTTP/2 for Front-End Developers 参考资料: Gitbook 《HTTP2 讲解》 by Calvin Zhang and Simon Xia:http2讲解 - GitBook HTTPS、SPDY 以及 HTTP/2 性能简单对比:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 HTTP/2 的压缩算法--HPACK(RFC7541):HPACK: Header Compression for HTTP/2 NGINX HTTP/2 白皮书:https://www.nginx.com/wp-content/uploads/2015/09/NGINX_HTTP2_White_Paper_v4.pdf NGINX Blog--提升 HTTP/2 性能的 7个小建议: 7 Tips for Faster HTTP/2 Performance(原文) [译]使用HTTP/2提升性能的7个建议(李松峰译) HTTP/2 for a Faster Web O"Reilly HTTP2-high-perf-browser-networking:http://www.oreilly.com/webops-perf/free/files/HTTP2-high-perf-browser-networking.pdf HTTP/2 新特性浅析:HTTP/2 新特性浅析 Kevin blog 关于 HTTP/2 的系列归档:HTTP/2 | 凯文叔叔的网志 Can i use 上关于支持HTTP/2 的浏览器:Can I use... Support tables for HTML5, CSS3, etc2023-07-22 12:59:131
HTTP协议和IP协议什么区别
HTTP协议和IP协议什么区别 OSI 是7层 TCP/IP 协议是 4层 OIS 包括的层 从底到上依次为 1.物理层 2.数据链路层 3.网络层 4.传输层 5.会话层 6.表示层 7.应用层 TCP/IP 协议 协议包括的层 从底到上 依次为 1.网络接口层,2.互联网层 3.传输层 4.应用层 楼下说的 HTTP协议是应用层的协议 怎么能跟 TCP/IP 协议无关呢 还有 楼下还说了 TCP/IP协议是 传输层和网络层的协议,和 数据链路层/物理层无关,这句话上表意楼下的意思是 说TCP/IP是 3层协议。呵呵,书上都写着呢,TCP/IP协议是 4层。(他指的 物理层 和 数据链路层 是 TCP/IP 里的 网络接口层,网络接口层包含 物里层 和数据链路层) TCP/IP 是 网络上 数据通信的一种协议,如果没有这个协议,你就在TCP/IP 网络上 什么也做不了 HTTP 协议是 TCP/IP 协议里面包含的 应用层的协议而已,没有这个协议 只是 不能浏览网页而已,其他的 服务是正常的 比如 邮件SMTP,POP3 协议,FTP等协议,这些协议都是 应用层协议 PS: 还有TCP/IP 协议里 有 网络接口层,互联网层,传输层,应用层(HTTP协议就包含在应用层里的 一个协议) 各层都有 各自的 协议,在这里 就不在一一介绍,如果感兴趣,可以参考 TCP/IP 详解 卷一:协议 Http协议和TCP/IP协议有啥区别和联系? TCP/IP 协议 协议包括的层 从底到上 依次为 1.网络接口层,2.互联网层 3.传输层 4.应用层 TCP/IP 是 网络上 数据通信的一种协议,如果没有这个协议,你就在TCP/IP 网络上 什么也做不了 HTTP 协议是 TCP/IP 协议里面包含的 应用层的协议而已,没有这个协议 只是 不能浏览网页而已,其他的 服务是正常的 比如 邮件SMTP,POP3 协议,FTP等协议,这些协议都是 应用层协议 PS: 还有TCP/IP 协议里 有 网络接口层,互联网层,传输层,应用层(HTTP协议就包含在应用层里的 一个协议) TCP/IP协议和HTTP协议如何区分? 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 tcp/ip 传输控制协议/因特网互联协议 TCP/IP(Tran *** ission Control Protocol/Inter Protocol)的简写,又叫网络通讯协议,这个协议是Inter最基本的协议、Inter国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。 协议和tcp/ip协议关系? IP (网际协议) 在网络通信中,网络组件的寻址对信息的路由选择和传输来说是相当关键的。相同网络中的两台机器间的消息传输有各自的技术协定。LAN 是通过提供6字节的唯一标识符(“MAC”地址)在机器间发送消息的。SNA 网络中的每台机器都有一个逻辑单元及与其相应的网络地址。DECNET、AppleTalk 和 Novell IPX 均有一个用来分配编号到各个本地网和工作站的配置。 TCP (传输控制协议) 通过序列化应答和必要时重发数据包,TCP 为应用程序提供了可靠的传输流和虚拟连接服务。TCP 主要提供数据流转送,可靠传输,有效流控制,全双工操作和多路传输技术。可查阅 TCP 部分获取更多详细资料。 至于HTTP协议,它是TCP协议族中的一种。使用TCP80端口 协议和tcp/ip协议关系是什么 HTTP协议目前是TCP/IP协议中的一部分。 TCP/IP协议是一个协议簇,包含很多协议的。 如果按OSI模型来说, 第二层,ARP 第三层,IP 第三层,TCP,UDP 高层,HTTP,TELNET,FTP,SMTP,POP3,等等 平时上网其实下面几层的协议都在用。只是感觉不到而已。高层常用HTTP,FTP,SMTP,POP3,后两个时邮件。 协议和websocket协议的区别 按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP是应用层的协议。在这三者之间,SPDY和WebSocket都是与HTTP相关的协议,而TCP是HTTP底层的协议。 WebSocket则提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API, ssl协议和协议的区别 两种都是应用于电子商务用的网络安全协议。都能保证交易数据的安全性、保密性和完整性。 SSL叫安全套接层协议,是国际上最早用的,已成工业标准,但它的基点是商家对客户信息保密的承诺,因此有利于商家而不利于客户。 SET叫安全电子交易协议,是为了在互联网上进行在线交易时保证信用卡支付的安全而设立的一个开放的规范。因它的对象包括消费者、商家、发卡银行、收单银行、支付网关、认证中心,所以对消费者与商家同样有利。它越来越得到众人认同,将会成为未来电子商务的规范 近年来,IT业界与金融行业一起,推出不少更有效的安全交易标准。主要有: (1) 安全超文本传输协议(S-HTTP):依靠密钥对的加密,保障Web站点间的交易信息传输的安全性。 (2) 安全套接层协议(SSL协议:Secure Socket Layer)是由网景(Netscape)公司推出的一种安全通信协议,是对计算机之间整个会话进行加密的协议,提供了加密、认证服务和报文完整性。它能够对信用卡和个人信息提供较强的保护。SSL被用于Netscape Communicator和Microsoft IE浏览器,用以完成需要的安全交易操作。在SSL中,采用了公开密钥和私有密钥两种加密方法。 (3) 安全交易技术协议(STT:Secure Transaction Technology):由Microsoft公司提出,STT将认证和解密在浏览器中分离开,用以提高安全控制能力。Microsoft将在Inter Explorer中采用这一技术。 (4) 安全电子交易协议(SET:Secure Electronic Transaction):SET协议是由VISA和MasterCard两大信用卡公司于1997年5月联合推出的规范。SET主要是为了解决用户、商家和银行之间通过信用卡支付的交易而设计的,以保证支付信息的机密、支付过程的完整、商户及持卡人的合法身份、以及可操作性。SET中的核心技术主要有公开密匙加密、电子数字签名、电子信封、电子安全证书等。 目前公布的SET正式文本涵盖了信用卡在电子商务交易中的交易协定、信息保密、资料完整及数字认证、数字签名等。这一标准被公认为全球网际网络的标准,其交易形态将成为未来“电子商务”的规范。 支付系统是电子商务的关键,但支持支付系统的关键技术的未来走向尚未确定。安全套接层(SSL)和安全电子交易(SET)是两种重要的通信协议,每一种都提供了通过Inter进行支付的手段。但是,两者之中谁将领导未来呢?SET将立刻替换SSL吗?SET会因其复杂性而消亡吗?SSL真的能完全满足电子商务的需要吗?我们可以从以下几点对比作管中一窥: SSL提供了两台机器间的安全连接。支付系统经常通过在SSL连接上传输信用卡卡号的方式来构建,在线银行和其他金融系统也常常构建在SSL之上。虽然基于SSL的信用卡支付方式促进了电子商务的发展,但如果想要电子商务得以成功地广泛开展的话,必须采用更先进的支付系统。SSL被广泛应用的原因在于它被大部分Web浏览器和Web服务器所内置,比较容易被应用。 SET和SSL除了都采用RSA公钥算法以外,二者在其他技术方面没有任何相似之处。而RSA在二者中也被用来实现不同的安全目标。 SET是一种基于消息流的协议,它主要由MasterCard和Visa以及其他一些业界主流厂商设计发布,用来保证公共网络上银行卡支付交易的安全性。SET已经在国际上被大量实验性地使用并经受了考验,但大多数在Inter上购的消费者并没有真正使用SET。 SET是一个非常复杂的协议,因为它非常详细而准确地反映了卡交易各方之间存在的各种关系。SET还定义了加密信息的格式和完成一笔卡支付交易过程中各方传输信息的规则。事实上,SET远远不止是一个技术方面的协议,它还说明了每一方所持有的数字证书的合法含义,希望得到数字证书以及响应信息的各方应有的动作,与一笔交易紧密相关的责任分担。 . SSL安全协议 SSL安全协议最初是由Netscape Communication公司设计开发的,又叫“安全套接层(Secure Sockets Layer)协议”,主要用于提高应用程序之间的数据的安全系数。SSL协议的整个概念可以被总结为:一个保证任何安装了安全套接字的客户和服务器间事务安全的协议,它涉及所有TC/IP应用程序。 SSL安全协议主要提供三方面的服务: 用户和服务器的合法性认证 认证用户和服务器的合法性,使得它们能够确信数据将被发送到正确的客户机和服务器上。客户机和服务器都是有各自的识别号,这些识别号由公开密钥进行编号,为了验证用户是否合法,安全套接层协议要求在握手交换数据进行数字认证,以此来确保用户的合法性。 加密数据以隐藏被传送的数据 安全套接层协议所采用的加密技术既有对称密钥技术,也有公开密钥技术。在客户机与服务器进行数据交换之前,交换SSL初始握手信息,在SSL握手情息中采用了各种加密技术对其加密,以保证其机密性和数据的完整性,并且用数字证书进行鉴别。这样就可以防止非法用户进行破译。 护数据的完整性 安全套接层协议采用Hash函数和机密共享的方法来提供信息的完整 *** ,建立客户机与服务器之间的安全通道,使所有经过安全套接层协议处理的业务在传输过程中能全部完整准确无误地到达目的地。 要说明的是,安全套接层协议是一个保证计算机通信安全的协议,对通信对话过程进行安全保护。例如,一台客户机与一台主机连接上了,首先是要初始化握手协议,然后就建立了一个SSL。对话进段。直到对话结束,安全套接层协议都会对整个通信过程加密,并且检查其完整性。这样一个对话时段算一次握手。而HTTP协议中的每一次连接就是一次握手,因此,与HTTP相比。安全套接层协议的通信效率会高一些。 (1)接通阶段:客户通过网络向服务商打招呼,服务商回应; (2)密码交换阶段:客户与服务器之间交换双方认可的密码,一般选用RSA密码算法,也有的选用Diffie-Hellmanf和Fortezza-KEA密码算法; (3)会谈密码阶段:客户与服务商间产生彼此交谈的会谈密码; (4)检验阶段:检验服务商取得的密码; (5)客户认证阶段:验证客户的可信度; (6)结束阶段,客户与服务商之间相互交换结束的信息。 当上述动作完成之后,两者间的资料传送就会加密,另外一方收到资料后,再将编码资料还原。即使盗窃者在网络上取得编码后的资料,如果没有原先编制的密码算法,也不能获得可读的有用资料。 发送时信息用对称密钥加密,对称密钥用非对称算法加密,再把两个包绑在一起传送过去。 接收的过程与发送正好相反,先打开有对称密钥的加密包,再用对称密钥解密。 在电子商务交易过程中,由于有银行参与,按照SSL协议,客户的购买信息首先发往商家,商家再将信息转发银行,银行验证客户信息的合法性后,通知商家付款成功,商家再通知客户购买成功,并将商品寄送客户。 SSL安全协议是国际上最早应用于电子商务的一种网络安全协议,至今仍然有很多网上商店使用。在传统的邮购活动中,客户首先寻找商品信息,然后汇款给商家,商家将商品寄给客户。这里,商家是可以信赖的,所以客户先付款给商家。在电子商务的开始阶段,商家也是担心客户购买后不付款,或使用过期的信用卡,因而希望银行给予认证。SSL安全协议正是在这种背景下产生的。 SSL协议运行的基点是商家对客户信息保密的承诺。但在上述流程中我们也可以注意到,SSL协议有利于商家而不利于客户。客户的信息首先传到商家,商家阅读后再传至(银行,这样,客户资料的安全性便受到威胁。商家认证客户是必要的,但整个过程中,缺少了客户对商家的认证。在电子商务的开始阶段,由于参与电子商务的公司大都是一些大公司,信誉较高,这个问题没有引起人们的重视。随着电子商务参与的厂商迅速增加,对厂商的认证问题越来越突出,SSL协议的缺点完全暴露出来。SSL协议将逐渐被新的电子商务协议(例如SET)所取代。 [page] 11. SET安全协议 在开放的因特网上处理电子商务,保证买卖双方传输数据的安全成为电子商务的重要的问题。为了克服SSL安全协议的缺点,满足电子交易持续不断地增加的安全要求,为了达到交易安全及合乎成本效益的市场要求,VISA国际组织及其它公司如Master Card、Micro Soft、IBM等共同制定了安全电子交易(SET:Secure Electronic Transactions)公告。这是一个为在线交易而设立的一个开放的、以电子货币为基础的电子付款系统规范。SET在保留对客户信用卡认证的前提下,又增加了对商家身份的认证,这对于需要支付货币的交易来讲是至关重要的。由于设计合理,SET协议得到了许多大公司和消费者的支持,己成为全球网络的工业标准,其交易形态将成为未来“电子商务”的规范。 安全电子交易规范,为在因特网上进行安全的电子商务提供了一个开放的标准。SET主要使用电子认证技术,其认证过程使用RS 协议和ftp协议的区别 以下列出了协议和ftp协议的不同点: 1、HTTP协议是用来浏览网站的,而FTP是用来访问和传输文件的,FTP文件传输有点批量上传和维护网站的意思,而HTTP文件传输更多的是为终端用户提供文件传输,比如电影、图片、音乐之类。 2、HTTP 和 FTP 客户端:通常的HTTP客户端就是浏览器,而FTP服务可以通过命令行或者用户自有的图形界面客户端。 3、HTTP 头:HTTP 头包含了 metadata ,比如说最后更改的日期、编码方式、服务器名称版本还有其他的一些信息,而这些在FTP中是不存在的。 4、FTP要比HTTP早出现10年左右。 5、数据格式:FTP能传输ACSII数据或者二进制格式的数据,而HTTP只用二进制格式。 6、HTTP中的流水线:HTTP支持流水线,这就意味着客户端可以在上一个请求处理完之前,发出下一个请求,其结果就是多次请求数据之前省掉了部分服务器客户端往返时延。而FTP并没有这项支持。 7、HTTP中的动态端口:FTP一个最大的问题就是它使用两个连接,第一个连接用来发送控制指令,当接受或者发送数据的时候,又打开第二个TCP连接。而HTTP在双向传输中使用动态端口。 8、HTTP中的持久连接:对一个HTTP会话来讲,客户端可以维护一个单个的连接并使用它进行任意数量的数据传输。FTP每次有数据的需要时都创建一个新的连接。重复的创建新的连接带来的体验并不好,因为每次创建连接都必须让双方握手验证,这消耗了很多时间。 9、HTTP中的压缩算法:HTTP提供了一个在一些压缩算法中客户端和服务器共同协商选择的办法。其中gzip可以说是最有影响力的一种,而FTP中并不存在这种复杂的算法。 10、HTTP支持代理:HTTP一个很大的特点就是支持代理,这种功能是构建在协议里的,而FTP并不支持。 11、而FTP也能脱颖而出的一点是这个协议是直接面向文件级别的。这以为着FTP有例如可以通过命令列出远程服务器上的目录列表,而HTTP没有这个概念。 OPC协议和TCP/IP协议的区别和联系是什么? TCP/IP协议只是网络层的协议,OPC协议是应用层的数据协议,把自动化采集数据以一定格式传输给客户端,在网络的底层传输过程是基于TCP/IP协议得以进行的。 OPC协议:OPC是一种利用微软的COM/DCOM技术来达成自动化控制的协定,采用典型的C/S模式,针对硬件设备的驱动程序由硬件厂商完成,提供统一OPC接口标准的Server程序,软件厂商只需按照OPC标准接口编写Client程序就访问Server程序进行读写,即可实现与硬件设备的通信。 TCP/IP协议:TCP/IP协议又名网络通讯协议,是Inter最基本的协议、Inter国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。2023-07-22 12:59:211
详细分析http2 和http1.1 区别
之前整理了一遍http1.0, http1.1, http2.0之前的区别,但是里面很多细节都没有弄清。特别是在http1.1和2.0之间关于多路复用,头压缩这一块儿。 最近在外网上搜到一遍蛮详细的文章,觉得讲的很清晰,所以就翻译了分享给大家。 原文地址 在比较http2 和http1.1区别之前,让我们先宏观的看一看两者历史性的发展。 1989年作为万维网交流标准,属于应用层协议,在客户端和服务器端进行信息交换。这个过程中,客户端发送一个基于文本的请求到服务器通过调用GET 或者POST方法。 相应的,服务器返回资源给客户端。 例如: GET /index.html HTTP/1.1 Host: www.example.com 该请求用GET方法。 服务器会返回一个HTML页面和一些图片,样式表和一些其他资源。注意:所有的资源并不是一次性返回给客户端。两者会在之间反反复复进行几次请求和响应,直到该html页面所有的资源内容在你的屏幕上被绘制。 http2 刚开始为SPDY协议,起初Google为了减少加载延迟而开发的,通过使用例如压缩,多路复用,优化等。 目前该协议已经被很多浏览器所支持。 从技术角度而言,http1.1和2.0 最大的区别是二进制框架层。与 http1.1把所有请求和响应作为纯文本不同,http2 使用二进制框架层把所有消息封装成二进制,且仍然保持http语法,消息的转换让http2能够尝试http1.1所不能的传输方式。 客户端首次接受的响应常常不能完全渲染。相反,它包含一些其他需要的资源。 因此,客户端必须发出一些其他请求。 Http1.0客户端的每一个请求必须重新连接,这是非常耗时和资源的。 Http1.1 通过引入长连接和流水线技术处理了这个问题。 通过长连接,http1.1假定这个tcp连接应该一直打开直到被通知关闭。 这就允许客户端通过同一连接发送多个请求。不巧的是,这优化策略有个瓶颈。当一个队头的请求不能收到响应的资源,它将会阻塞后面的请求。这就是知名的队头阻塞问题。虽然添加并行的tcp连接能够减轻这个问题,但是tcp连接的数量是有限的,且每个新的连接需要额外的资源。 在http2 , 二进制框架层编码 请求和响应 并把它们分成更小的包,能显著的提高传输的灵活性。 与http1.1利用多个tcp连接来减少队头阻塞的影响相反,http2在两端建立一个单独的连接。该连接包含多个数据流。 每个流包含多个请求/响应格式的消息 。 最终,每个消息被划分为更小的帧单元。 在最细微层面上,交流通道由一系列二进制帧组成,每一个被标记到特定的流。可识别标签允许连接在传输过程中来交错这些帧并在另一端去组合它们。 交错的请求和响应能够并行的传输而不被阻塞。该过程被称作多路复用技术。 因为多路复用允许客户端并行的构建多个流,这些流仅仅需要一个tcp连接。 相比http1.1能很大程度上减少内存和整个网络中的足迹。所以有更好的网络及带宽利用率。 Tcp连接也能改善https协议的性能,因为客户端可针对多个请求/响应 复用同一个连接 在tls和ssl握手期间,双方在整个会话同意使用唯一的key。 如果连接中断,新的会话需要一个新生成的key。 因此,维持单链接能很大程度优化https。 流优先级不仅仅解决同一资源的竞态问题,也允许开发人员自定义请求的权重。 如你所知,二进制框架层把消息组织成并行数据流。 当一个客户端发送并行请求,它能把请求的响应设置优先级权重 ,从1-256 ,更高的数字代表更高的优先级。 此外,该客户端也通过特定的流ID指明每个流的依赖。如果id被忽略,说明这个流是根流。 上图中,channel包含6个流,每个有一个唯一id 且有一个特定的权重。 流1没有父ID,说明是根节点。分配给每个流的资源将根据权重和它们需要的依赖。 服务器端利用该信息创建一个依赖树,通过次树来决定响应的数据。根据之前的图表,依赖树如下: 根据此依赖树,所有可用资源将会先分配给 流1。 因为流2依赖流1,流2直到流1完成后才处理。流2完成后,资源分配给流3,流4. 两者权重比为2:4,资源也会依此来分配。3,4完成后,流5,流6将会等分资源。 作为开发者,你可以根据需要去设置权重,例如,给高分辨率图片设置低优先级。Http2协议允许客户端在运行时根据用户交互重新分配权重和改变依赖。 然而,服务器端会改变优先级根据如果某个流因为请求特定资源被阻塞。 客户端和服务器都有一定数量的缓冲区来持有还未被处理的请求。 当服务器返回给客户端一大堆数据,或者客户端上传一个大的图片和视频,可能造成缓冲区溢出。 为了避免缓冲区溢出,流控制机制可以禁止发送者发送太多数据。下面我们聊聊http1.1和http2不同的流控制机制。 http1.1流控制基于tcp连接。当连接建立时,两端通过系统默认机制建立缓冲区。 并通过ack报文来通知对方接收窗口大小。 因为Http1.1 依靠传输层来避免流溢出,每个tcp连接需要一个独立的流控制机制。 http2通过一个连接来多路复用。 结果是在传输层的tcp连接不足以管理每个流的发送。http2允许客户端和服务器端实现他们自己的流控制机制,而不是依赖传输层。两端在传输层交换可用的缓冲区大小,来让他们在多路复用流上设置自己的接收窗口。 通常web应用,客户端发送一个GET请求且收到一个HTML。当检测收到html的内容,会发现它需要拿取其他的资源。例如CSS和JS文件。然后就会继续请求其他资源。这些请求会最终加长连接加载时间。 解决办法:因为服务器端提前知道客户端需要额外资源,服务器端可以通过提前发送这些资源给客户来节省时间,而不用客户来请求。 如果开发者提前知道客户机器需要哪些额外的资源来渲染界面,他们使用资源内联的技术来包含需要的资源。例如:如果一个客户需要一个特定的CSS文件,内联该文件就可以不通过请求来拿到,减少客户端必须发送的请求数。 该技术对于小文件是可行的,但是大文件会降低连接的速度。还可能造成文件多次请求。 因为http2支持多个并发响应,服务器可以提前把HTML 页面中的其他资源在客户端请求之前发给它。 服务器先发送一个PUSH_PROMISE 帧通知客户端将推送资源。该帧只包含头消息,且允许用户提前知道哪些资源将会推送。如果客户端已经缓存,可以拒绝该推送。 常用的优化web应用是用压缩算法减少HTTP消息大小。 HTTP/1.1 和2 都用该技术HTTP/1.1不支持整个消息压缩。下面我们来聊聊区别。 Gzip已经被用于压缩http消息很久了,特别是减少CSS和JS脚本的文件。然而消息头部分依然是纯文本发送。尽管每个头都很小,但随着请求越来越多,连接的负担就会越重,如果带了cookie. Header将变得更大。 Http2 的二进制框架层在细节上表现出强大的控制力,在头压缩上也是如此。 http2 能把头从他们的数据中分离,并封城头帧和数据帧。 http2特定的压缩程序HPACK可以压缩头帧。 该算法用Huffman编码头metadata,可以很大程度上减少头大小。此外, HPACK可以跟踪先前传输的metadata字段,然后通过动态改变服务器端和客户端共享的索引来进一步压缩。如下: 如上图,上述字段只有path有不同的值。 因此,HPACK可以只发送需要改变的值 此外: 关于Https,Http1.0, 1.1, 2.0的区别,可以参考 这篇文章 关于tcp,udp报文讲解和分析,可以参考 这里 关于tcp,udp 三次握手和四次挥手,可以 参考这里2023-07-22 12:59:291
常见的几种SSL/TLS漏洞及攻击方式
SSL/TLS漏洞目前还是比较普遍的,首先关闭协议:SSL2、SSL3(比较老的SSL协议)配置完成ATS安全标准就可以避免以下的攻击了,最新的服务器环境都不会有一下问题,当然这种漏洞都是自己部署证书没有配置好导致的。Export 加密算法Export是一种老旧的弱加密算法,是被美国法律标示为可出口的加密算法,其限制对称加密最大强度位数为40位,限制密钥交换强度为最大512位。这是一个现今被强制丢弃的算法。Downgrade(降级攻击)降级攻击是一种对计算机系统或者通信协议的攻击,在降级攻击中,攻击者故意使系统放弃新式、安全性高的工作方式,反而使用为向下兼容而准备的老式、安全性差的工作方式,降级攻击常被用于中间人攻击,讲加密的通信协议安全性大幅削弱,得以进行原本不可能做到的攻击。 在现代的回退防御中,使用单独的信号套件来指示自愿降级行为,需要理解该信号并支持更高协议版本的服务器来终止协商,该套件是TLS_FALLBACK_SCSV(0x5600)MITM(中间人攻击)MITM(Man-in-the-MiddleAttack) ,是指攻击者与通讯的两端分别创建独立的联系,并交换其所有收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个对话都被攻击者完全控制,在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。一个中间人攻击能成功的前提条件是攻击者能够将自己伪装成每个参与会话的终端,并且不被其他终端识破。BEAST(野兽攻击)BEAST(CVE-2011-3389) BEAST是一种明文攻击,通过从SSL/TLS加密的会话中获取受害者的COOKIE值(通过进行一次会话劫持攻击),进而篡改一个加密算法的 CBC(密码块链)的模式以实现攻击目录,其主要针对TLS1.0和更早版本的协议中的对称加密算法CBC模式。RC4 加密算法由于早期的BEAST野兽攻击而采用的加密算法,RC4算法能减轻野兽攻击的危害,后来随着客户端版本升级,有了客户端缓解方案(Chrome 和 Firefox 提供了缓解方案),野兽攻击就不是什么大问题了。同样这是一个现今被强制丢弃的算法。CRIME(罪恶攻击)CRIME(CVE-2012-4929),全称Compression Ratio Info-leak Made Easy,这是一种因SSL压缩造成的安全隐患,通过它可窃取启用数据压缩特性的HTTPS或SPDY协议传输的私密Web Cookie。在成功读取身份验证Cookie后,攻击者可以实行会话劫持和发动进一步攻击。SSL 压缩在下述版本是默认关闭的: nginx 1.1.6及更高/1.0.9及更高(如果使用了 OpenSSL 1.0.0及更高), nginx 1.3.2及更高/1.2.2及更高(如果使用较旧版本的 OpenSSL)。如果你使用一个早期版本的 nginx 或 OpenSSL,而且你的发行版没有向后移植该选项,那么你需要重新编译没有一个 ZLIB 支持的 OpenSSL。这会禁止 OpenSSL 使用 DEFLATE 压缩方式。如果你禁用了这个,你仍然可以使用常规的 HTML DEFLATE 压缩。Heartbleed(心血漏洞)Heartbleed(CVE-2014-0160) 是一个于2014年4月公布的 OpenSSL 加密库的漏洞,它是一个被广泛使用的传输层安全(TLS)协议的实现。无论是服务器端还是客户端在 TLS 中使用了有缺陷的 OpenSSL,都可以被利用该缺陷。由于它是因 DTLS 心跳扩展(RFC 6520)中的输入验证不正确(缺少了边界检查)而导致的,所以该漏洞根据“心跳”而命名。这个漏洞是一种缓存区超读漏洞,它可以读取到本不应该读取的数据。如果使用带缺陷的Openssl版本,无论是服务器还是客户端,都可能因此受到攻击。POODLE漏洞(卷毛狗攻击)2014年10月14号由Google发现的POODLE漏洞,全称是Padding Oracle On Downloaded Legacy Encryption vulnerability,又被称为“贵宾犬攻击”(CVE-2014-3566),POODLE漏洞只对CBC模式的明文进行了身份验证,但是没有对填充字节进行完整性验证,攻击者窃取采用SSL3.0版加密通信过程中的内容,对填充字节修改并且利用预置填充来恢复加密内容,以达到攻击目的。TLS POODLE(TLS卷毛狗攻击)TLS POODLE(CVE-2014-8730) 该漏洞的原理和POODLE漏洞的原理一致,但不是SSL3协议。由于TLS填充是SSLv3的一个子集,因此可以重新使用针对TLS的POODLE攻击。TLS对于它的填充格式是非常严格的,但是一些TLS实现在解密之后不执行填充结构的检查。即使使用TLS也不会容易受到POODLE攻击的影响。CCSCCS(CVE-2014-0224) 全称openssl MITM CCS injection attack,Openssl 0.9.8za之前的版本、1.0.0m之前的以及1.0.1h之前的openssl没有适当的限制ChangeCipherSpec信息的处理,这允许中间人攻击者在通信之间使用0长度的主密钥。FREAKFREAK(CVE-2015-0204) 客户端会在一个全安全强度的RSA握手过程中接受使用弱安全强度的出口RSA密钥,其中关键在于客户端并没有允许协商任何出口级别的RSA密码套件。LogjamLogjam(CVE-2015-4000) 使用 Diffie-Hellman 密钥交换协议的 TLS 连接很容易受到攻击,尤其是DH密钥中的公钥强度小于1024bits。中间人攻击者可将有漏洞的 TLS 连接降级至使用 512 字节导出级加密。这种攻击会影响支持 DHE_EXPORT 密码的所有服务器。这个攻击可通过为两组弱 Diffie-Hellman 参数预先计算 512 字节质数完成,特别是 Apache 的 httpd 版本 2.1.5 到 2.4.7,以及 OpenSSL 的所有版本。DROWN(溺水攻击/溺亡攻击)2016年3月发现的针对TLS的新漏洞攻击——DROWN(Decrypting RSA with Obsolete and Weakened eNcryption,CVE-2016-0800),也即利用过时的、弱化的一种RSA加密算法来解密破解TLS协议中被该算法加密的会话密钥。 具体说来,DROWN漏洞可以利用过时的SSLv2协议来解密与之共享相同RSA私钥的TLS协议所保护的流量。 DROWN攻击依赖于SSLv2协议的设计缺陷以及知名的Bleichenbacher攻击。通常检查以下两点服务器的配置服务器允许SSL2连接,需要将其关闭。私钥同时用于允许SSL2连接的其他服务器。例如,Web服务器和邮件服务器上使用相同的私钥和证书,如果邮件服务器支持SSL2,即使web服务器不支持SSL2,攻击者可以利用邮件服务器来破坏与web服务器的TLS连接。Openssl Padding OracleOpenssl Padding Oracle(CVE-2016-2107) openssl 1.0.1t到openssl 1.0.2h之前没有考虑某些填充检查期间的内存分配,这允许远程攻击者通过针对AES CBC会话的padding-oracle攻击来获取敏感的明文信息。强制丢弃的算法aNULL 包含了非验证的 Diffie-Hellman 密钥交换,这会受到中间人(MITM)攻击eNULL 包含了无加密的算法(明文)EXPORT 是老旧的弱加密算法,是被美国法律标示为可出口的RC4 包含的加密算法使用了已弃用的 ARCFOUR 算法DES 包含的加密算法使用了弃用的数据加密标准(DES)SSLv2 包含了定义在旧版本 SSL 标准中的所有算法,现已弃用MD5 包含了使用已弃用的 MD5 作为哈希算法的所有算法2023-07-22 12:59:383
ur发u0259的音的单词(是短音) 如:Saturday
nurse,burn,turn,surprise,Thursday。2023-07-22 12:59:532
Windows10系统上怎么安装loadrunner 11
Windows10系统上安装loadrunner 11的步骤如下:1、下载LoadRunner后,以管理员身份运行setup.exe;2、点击安装,其中会有提示缺少Microsoft Visual C++ 2005 SP1运行组件,下载这个组件。这里安装vcredist_x86.exe。安装完成后在一次运行setup.exe时,安装程序会自动检查所需组件是否都已安装;3、勾选我同意后,点击下一步;4、填写姓名和组织后;5、选择安装目标文件夹后;6、确认安装页面,点击下一步;7、直至安装完成;8、安装完成后,系统会自动打开Loadrunner License Information窗口。并提示你的license只有十天的使用期,此时,可以启动Loadrunner了。2023-07-22 13:00:263
RabbitMQ 镜像集群 宕机恢复、负载均衡、跨机房多活
起因:在实际项目开发过程中,需要使用RabbitMQ来实现消息队列的功能,但仅仅实现功能之后并不能对自己满足,既然学一次,就要更深的了解她,吃一吃架构方面的相关内容,提升自己。 RabbitMQ在镜像集群中,机器其实是平行关系,所有的节点都是互相复制的 场景描述: A是Master B是Slave A正常运行,B宕机了,只需要启动B即可,B就会自动加入集群 A和B都宕机了,只要A在B之前启动就可以了 A和B都宕机了,A启动不起来了,即便是B启动了,有可以B直接启动不了啦 B和C都加入了A为Master的集群,这个时候都需要将B和C从A的集群中forget,B和C启动不起来了 RabbitMQv3.2版本以后提供了一个离线清除集群节点的命令参数,也就是节点无法启动状态下 HAProxy是一款提供高可用的负载均衡器(之前大家都是使用的Nginx居多,upstream反向代理实现负载均衡非常容易),HAProxy可以基于TCP四层(Lvs也是TCP四层的),HTTP七层(Nginx是HTTP七层)的负载均衡应用代理软件,免费高速可靠的一种LBS解决方案 HAProxy的并发连接完全可以支持以万为单位的 Nginx 优点: 1、工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名、目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行。 2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能。 3、Nginx安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来。 4、可以承担高负载压力且稳定,硬件不差的情况下一般能支撑几万次的并发量。 5、Nginx可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点。 6、不仅仅是优秀的负载均衡器/反向代理软件,同时也是强大的Web应用服务器。可作为静态网页和图片服务器,在高流量环境中稳定性也很好。 7、可作为中层反向代理使用。 缺点: 1、适应范围较小,仅能支持http、https、Email协议。 2、对后端服务器的健康检查,只支持通过端口检测,不支持url来检测 3、负载均衡策略比较少:轮询、权重、IP_hash、url_hash HAProxy 优点: 1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段) 2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。 3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。 4、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。 5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种 缺点: 1、不支持POP/SMTP协议 2、不支持SPDY协议 3、不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。 4、重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。 5、多进程模式支持不够好 HAProxy+Keepalived(负载均衡节点的高可用) 将上面的配置文件内容放入 /etc/haproxy/haproxy.cfg中 启动HAProxy 启用成功后可以到控制台进行验证 通过federation的配置来进行数据通道搭建 这个时候你需要自己定义一个上游节点upstream(166节点),一个下游节点downstream(167节点),federation是单向发送的,相当于消息发送到upstream的一个exchange上,然后转发到downstream的queue上 1、 在下游节点创建一个exchage和一个queue和binding的routingkey,用来进行数据接收 2、 在下游节点建立federation upstream规则和上游节点进行数据同步 3、 进入下游节点的federation status没有任何数据,需要建立策略来保证通道连通 4、 进入下游节点的Policy菜单,Pattern是个正则表达式,这里表示以down开头的exchange和queue都匹配 5、 这个时候看exchange和queue,规则就应用上了 6、 这个时候去federation status看,发现上游连接已经连接上了 7、 这个时候我们先去看上游的overview 8、 再看上游的exchange和queue就已经根据下游配置的upstream和policy规则将exchange和queue创建好了 灰色的这个重定向exchange不能发送消息,如果要发送则在down-exchange上进行发送 9、 我们在上游的down-exchange发送一条消息,进行测试 可以在下游查看这条消息 10、 因为上游及节点只是一个中转,如果上游及诶单也要消息down-exchange里的消息怎么办? 只需要在本地建立一个binding关系就好 不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!2023-07-22 13:00:331
okhttp,retrofit,android-async-http,volley应该选择哪一个
个人认为okhttp是android平台最好的网络库。volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。android-async-http,与volley一样是异步网络库。但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。picasso就是利用okhttp的缓存机制实现其文件缓存,实现的很优雅,很正确,反例就是UIL(universal image loader),自己做的文件缓存,而且不遵守http缓存机制。retrofit与picasso一样都是在okhttp基础之上做的封装,项目中可以直接用了。另外AndroidAsync这个网络库使用了nio的方式实现的。okhttp没有提供nio的方式,不过nio更适合大量连接的情况,对于移动平台有点杀鸡用牛刀的味道。picasso、uil都不支持inbitmap,项目中有用到picasso的富图片应用需要注意这点。2023-07-22 13:00:411
主动关闭TCP连接的一方为什么要有TIME
这确实是历史包袱。原因很简单,早先客户端处理HTTP是单线程的、阻塞的,服务器端发送完信息后客户端要一直等到信息处理完毕、渲染完毕,才能有处理能力来通知服务器处理完成。在当时这个过程可以长达数分钟,而且当时服务器没有能力去承载这么多等待响应的连接(可以用Erlang计算一下这个延迟下需要满足%99.9的可用性需要多么恐怖的硬件)。所以解决方案就是服务器发送完之后就关闭连接。等客户端接收到了所有信息,处理完毕,一看连接也关掉了,此时服务器早已在处理其他连接了。另外这也是为什么有大量TIME_WAIT的原因,相比挂着连接等待客户端关闭,服务器等待确认TCP连接状态要快太多了。说到底就是HTTP协议太老了,虽然高级应用一直在更新,但是这种底层设计很难做出大的改变。这也是为什么Google要弄SPDY来更新HTTP的底层机制。2023-07-22 13:00:481
作为前端,我为什么选择 Angular 2
ALL-IN-ONE不管是1还是2,Angular最显著的特征就是其整合性。它是由单一项目组常年开发维护的一体化框架,涵盖了M、V、C/VM等各个层面,不需要组合、评估其它技术就能完成大部分前端开发任务。这样可以有效降低决策成本,提高决策速度,对需要快速起步的团队是非常有帮助的。让我们换一种问法吧:你想用乐高搭一个客厅,还是买宜家套装?Angular 2就是前端开发领域的“宜家套装”,它经过精心的前期设计,涵盖了开发中的各个层面,层与层之间都经过了精心调适,是一个“开箱即用”的框架。当然,你可能还记着Angular 1带给你的那些快乐以及……痛苦。这是有历史原因的。由于它是从一个用来做原型的框架演化而来的,加上诞生时间很早(2009年,作为对比,jQuery诞生于2006年),当时生态不完善,连模块化机制都得自己实现(这就是angular.module的由来,也是Angular 2中抛弃它的理由)。在长达七年的演化过程中,各种进化的遗迹非常明显,留下了不少“阑尾”。但Angular 2就不同了,它的起点更高,整合了现代前端的各种先进理念,在框架、文档、工具等各个层面提供了全方位的支持。比如它的“组件样式”能让你在无需了解CSS Module的前提下获得CSS Module的好处,它的Starter工程能让你在无需了解Webpack的前提下获得Hot Module Replacement等先进特性,它能让你从Web Worker(你知道这是什么吗?)中获得显著的性能提升。你只管在前台秀肌肉吧!剩下的,让Angular在幕后帮你搞定!模块化的技术虽然Angular是一个ALL-IN-ONE的框架,但这并不妨碍它同时是一个灵活的框架。还记得OCP(开闭原则)吗?一个好的设计,对扩展应该是开放的,对修改应该是关闭的。Angular 2很好的践行了OCP原则以及SoC(关注点分离)原则。它非常有效的分离了渲染与交互逻辑,这就让它可以很好的跟包括React在内的渲染引擎搭配使用,除此之外,它还可以使用内存渲染引擎,以实现服务端渲染;还可以使用Native渲染引擎,以编译出真正的原生程序(NativeScript)。它还分离了数据供应与变更检测逻辑,从而让它可以自由使用包括RxJS以及ImmutableJS在内的第三方数据框架/工具。不仅如此。在Angular 1和Angular 2中最具特色的应该算是依赖注入(DI)系统了,它把后端开发中用来解决复杂问题、实现高弹性设计的DI技术引入了前端。Angular 2中更是通过引入TypeScript赋予它更高的灵活性和便利性。不过,Angular 2并没有敝帚自珍,把它跟框架本身紧紧黏结在一起,而是把它设计成了一个独立可用的模块。这就意味着,无论你正在使用什么前端框架,甚至NodeJS后端框架,都可以自由使用它,并从中获益。全生命周期支持除非你打算写一个一次性应用,否则软件的生命周期会很长。宏观来看,真正的挑战来自多个方面,而且在不断变化。开始的阶段,我们需要非常快速的建立原型,让它跑起来,引入最终用户来试用,这个时候,挑战来自开发速度以及可复用资产。之后,会建立一个逐渐扩大的项目组,来完善这个原型的功能。主要的挑战是让这个原型通过重构不断进行演化,特别是在演化的后半个阶段,产品需要保持随时可以上线的状态。但技术上的挑战那都不是事儿!关键是人。如何让新人快速融入项目组,贡献生产力?这可没那么简单。“你先去学xxx 0.5、yyy 0.9、zzz 5.3...还要了解它们前后版本之间的差异,我再给你讲代码”,这种话,我可说不出口。一个优秀的框架需要对分工提供良好的支持,每个人都可以先从一些简单任务开始,逐步的从修改一个文件扩大到修改一个目录再到独立实现一个特性。有了这种分工,每个团队成员就可以从一个成功走向一个更大的成功。这就需要框架在设计上具有良好的局部性:你可以放心大胆的修改一部分,而不用担心影响另一部分。你可以只修改CSS,可以只修改HTML,可以只修改TS/js,而不用担心自己的修改破坏了其他部分。而Angular 2通过声明式界面、组件样式以及独立模板文件等对这种安全感提供了有力的保障。再然后,如果你的软件顺利的进入了线上维护阶段,那么恭喜你,你终于迎来真正的大Boss了!这个大Boss就是可维护性。Angular开发组有很多程序员来自Google,如果要问谁的软件维护经验最丰富,Google和微软必然名列前茅。微软通过TypeScript的强类型机制体现了自己的经验,而Google则通过将OCP、SoC、SRP等一系列软件设计原则融入Angular体现了自己的经验。具体技术上则体现为:DI、生命周期钩子、组件等等。最后,如果你的软件完成了历史使命需要逐步退出,是不是就能松口气了?不行,你还得继续留人维护它。如果你选择的是一个闭源的或某个社区很羸弱的开源技术,你就把以前的主力架构师、资深程序员留下来继续维护它吧。或者你就得鼓起勇气跟用户说:你们玩儿,我先走了。而Angular是一个大型开源项目,并得到了Google的鼎力支持。即使经历过Angular 2项目组初期的公关失败,它仍然有着其它竞品无法企及的繁荣社区 —— 无论在全球还是在中国。显然,无论是对传统社区资源的继承,还是对新社区资源的开拓,我们都有理由相信,Angular社区仍将一如既往地繁荣。至少,如果你不想让自己的软件建立在一大堆由个人维护的核心库上,那么Angular毫无疑问是最好的选择。逃离“版本地狱”如果是一两个人开发一个预期寿命不到一年的系统,那么任何框架都可以胜任。但,现实中我们都把这种系统称之为“坑”。作为一个高度专业、高度工程化的开发组,我们不能把“坑”留给友军。这些坑中,最明显的就是“版本地狱”。想象一下,你仅仅升级了库的次版本号,原来的软件就不能用了,损坏了N处单元测试以及M个E2E场景。这种情况对于开发组来说简直是一个噩梦 —— 毕竟,谁也不想做无用功,更何况是一而再、再而三的。或者,它每次小的改动都会修改主版本号 —— 对,我就是不向后兼容,你能咋地?你所能做的就是每一次决定升级都如临大敌,不但要小心翼翼的升级这个库本身还要升级与它协作的几乎所有库。可见,乱标版本号可能会让使用者付出巨大的代价。这不但体现在工作量上,还会体现在研发团队的招募与培养上,想象一下,对小版本之间都不兼容的框架,研发团队都需要记住多少东西?那简直是噩梦!但是,版本号的问题在业内早就有了事实性标准,那就是SemVer语义化版本标准。唯一的问题是,作为框架/库的作者,遵循SemVer标准需要付出的努力是巨大的。是否愿意付出这些代价,是一个框架(及其开发组)是否成熟的重要标志。Angular就是这样一个框架,其开发组曾作出的努力是有目共睹的。如果你是从Angular 1.2开始使用的,那么你为1.2所写的代码都可以毫无障碍的迁移到最新的1.5版,新的版本只是引入了新特性,而没有破坏老特性。这是因为Angular开发组写了大量单元测试和E2E测试,借助CI来保障这种平滑过渡。只有在从1.0到1.2的迁移过程中(1.1一直是beta,忽略不计),出现了一系列破坏性变更,这些变更被明确的记录在文档中,并且解释了做出这些变更的理由 —— 大多数是因为提升前端代码安全性。即使你恰好遇到了这些破坏性变更,它也会给出明确的错误提示。这些必要而无聊的工作,正是帮助我们逃离“版本地狱”的关键。是否愿意做这些无聊而琐碎的工作,是一个框架的开发组是否成熟、专业的关键特征。而Angular的开发组已经证明了它值得你信任!遇见未来的标准编程领域,创新无处不在。但对一个工程团队来说,最难得的是标准。标准意味着:招人容易。因为标准的东西会的人最多,而且人们愿意学它 —— 因为知道学了就不会浪费。养人容易。因为网上有很多教程可用,即使不得已自己做教程,性价比也是最高的。换人容易。标准就意味着不是私有技术,一个人离开了,就能用另一个人补上,而不会出现长期空缺,影响业务。但是,标准永远会比创新慢一拍或N拍。这就意味着如果你追新,那么在获得技术上的收益的同时,也要付出工程上的代价。固然,两者不可兼得,但是还是有一些策略能够调和两者的。最简单的策略就是:遇见未来的标准。所谓未来的标准,就是某个标准的草案,它很有希望成为未来的标准,这代表了业界对某项技术的认可,于是,即使它还不成熟,人们也愿意为之投资。比如虽然Google曾经提出过N种自有技术,包括SPDY、Gears、OGG等,但却并没有把它们变成私有技术,而是对社区开放以及并入W3C的标准草案。Angular 2采用的就是这种策略。它所参照的标准草案比较多,一个是WebWorker,它借助WebWorker来把繁重的计算工作移入辅助线程,让界面线程不受影响;另一个是WebComponents,Angular 2的组件化体系就是对WebComponents的一种实现;最后是CSS scoping,现在虽然市面上有了很多CSS模块化技术,但事实上最终还是会被统一到CSS Scoping标准上,届时,如果:local等关键字无法进入标准,就会成为私有技术。而Angular 2选择的方式是直接实现CSS scoping标准草案,比如:host、:host-context等。显然,采用这种策略,“遇见未来的标准”的成功率会高得多。可以看到,Angular 2的设计哲学中贯穿着对标准化的热烈拥抱,这是我判断它将赢得未来的另一个信心来源。速度与激情Angular 2终于摆脱了旧的技术框架束缚,开始了对速度的极致追求。在Angular 1中,虽然绝大多数场景下性能都不是问题,不过还是因为其代码中存在的一个用来实现脏检查的三重循环而饱受抨击 —— 似乎真有人能感受到30毫秒和100毫秒的差异似的。不过,有软肋总是不太好。于是,在Angular 2中,通过重新设计和引入新技术,从原理上对速度进行了提升,据官方以前提供的一个数据说是把“变更检测”的效率提升了500%。它在“变更检测”算法上做了两项主要的改进:在设计上,把以前的“多轮检查、直到稳定”策略改成了“一轮检查、直接稳定”策略。当然,这会对自己的代码产生一定的限制,但实际上只在有限的少数几个场景下才会遇到这个限制,而且官方文档中也给出了明确的提示。在实现上,把“变更检测”算法移入了由WebWorker创建的辅助线程中执行。现代的家用电脑很多都已经是多核超线程的,但是浏览网页时实际上无法充分利用全部线程,而WebWorker提供了一个新的机制,让一些相对繁重的计算工作运行在辅助线程中,等执行完了再通知主线程。即使你不明白WebWorker的工作原理,至少也能知道Ajax请求是不会阻塞界面响应的,WebWorker也一样。除此之外,Angular还对数据源进行了抽象,你完全可以用ImmutableJS来作为Angular的数据源,获得其在提升“变更检测”速度方面的所有优势。除了“变更检测”外,Angular以及所有前端SPA程序,都有一个通病:首次加载太慢,要下载完所有js和css才能渲染出完整的界面来。react通过虚拟DOM解决了此问题,而Angular 2则通过独立的服务端渲染引擎解决了这个问题。我们前面说过,Angular 2把渲染引擎独立了出来,因此可以在NodeJS中实现服务端的内存渲染。所谓内存渲染就是在内存中把DOM结构渲染出来并发回给浏览器,这样,客户端不需要等JS代码下载完就可以显示出完整的界面了。这种分离还带来了另一个好处,那就是SEO。SEO同样是传统SPA的一个难点,它和服务端渲染是同一个问题的两个方面,因此随着服务端渲染的完成,SEO问题也被顺便解决了。让你无缝升级Angular 2开发组在早期阶段曾犯下一个严重的公关错误:过早宣布不兼容Angular 1,也不提供从Angular 1到2的升级方案。这让Angular 2开发组付出了沉重的代价,可谓伤透了粉丝的心。作为技术人员,这种失误固然是可以理解的,但却需要付出更多的努力来弥补它。而Angular 2确实这么做了。在Angular 2中,开发组提供了一个UpgradeAdapter类,这个升级适配器让Angular 1.x的所有部件都能和Angular 2.x中的所有部件协同工作。而最牛的地方在于,它让你可以一个文件一个文件的逐步升级到Angular 2,而在整个升级过程中,应用可以继续在线上跑!看着神奇吗?其实也算不了啥,Google做这种事早就是轻车熟路了。这只不过是对Angular开发组出色的工程化开发能力的一点小小证明而已。不过,既然如此,当初又何必急匆匆宣布不兼容呢?可见,再出色的工程团队,如果缺少了和社区沟通的产品运营技巧,也会付出巨大代价。希望Angular开发组以后能谨言慎行,多用行动来平息质疑。幕后 —— 当Google牵手微软当年的浏览器大战,让人记忆犹新,Chrome的出品商Google和IE的出品商微软正是浏览器大战的两大主角。俗话说:没有永远的朋友,也没有永远的敌人,只有永远的…… 精益求精。正是在这样的“俗话”指导下,Google与微软相逢一笑泯恩仇,撤销了很多针对彼此的诉讼,甚至在一些领域开始合作。而实际上,在他们公开和解之前,就已经开始公开合作了,其契机就是Angular 2。这就要扯出一点小八卦了。在Angular 2开发的早期阶段,由于传统JS(ES5)以及当时的ES6草案无法满足项目组的开发需求,项目组有点烦。后来有人灵机一动开发了一种叫做AtScript的新语言,它是什么呢?一个带类型支持和Annotation支持的升级版JS。其实在类型支持方面,TypeScript早就已经做了,而且那时候已经比较成熟,唯一的遗憾是不支持Annotation,也就是像Java中那样通过@符号定义元数据的方式。Angular开发组就这样孤独的走过了一小段儿时间,后来也不知道怎么这两个欢喜冤家就公然牵手了。总之,最后的结果是:TypeScript中加入了与Annotation相似的Decorator特性,而Angular放弃了AtScript改用TypeScript。这次结合无论对两大厂商还是对各自的粉丝,都是一个皆大欢喜的结局,称其为世纪联手也不为过。此后,Google与微软不再止于暗送秋波,而是开始了一系列秀恩爱的动作。无论如何,对于开发者来说,这都是一个好消息。软粉们可能还记得在6.1的微软开发者大会上,微软曾公开提及Angular 2。事实上,TypeScript目前虽然已经相当完备,但应用度仍然不高。就个人感觉来说,Angular 2将是TypeScript的一个杀手级应用。TypeScript如果当选TIOBE年度语言,Angular 2的推出功不可没。为什么我要特意插播这段儿故事呢?那是因为我认为一个产品的未来最终取决于开发组的未来,而不是相反。软件的本质是人!一个心态开放、讲究合作、勇于打破陈规陋习的开发组,才是框架给人信心的根本保障。后端程序员的终南捷径前端程序员自不必说,因为有很多人就是靠Angular进入专业前端领域的。下面这段话主要写给后端程序员。不管是想学习新技术还是出于工作需要,都有很多后端程序员对前端技术跃跃欲试。但面对前端让人眼花缭乱的大量候选技术以及未知的概念,他们往往感觉感觉无所适从。如果你是其中的一员,那么Angular可以“治愈”你的选择恐惧症。正如前面所说,Angular是一个“ALL-IN-ONE”的框架,这就意味着你只要掌握了Angular就可以完成大量的前端工作了。这首先得益于它对各种技术的封装,让你不用关心它的实现细节。Angular隔离了浏览器的细节,大多数工作你甚至都不需要知道DOM等前端知识就可以完成。其次,Angular选择了TypeScript作为主语言。如果你是个C#程序员,一定会对它的语法感觉似曾相识。没错,TypeScript和C#、Delphi有同一个“爹” —— 传奇人物Anders Hejlsberg。即使是Java程序员,也不会觉得陌生:强类型、类、接口、注解等等,无一不是后端程序员们耳熟能详的概念。说到底,并没有什么前端语言和后端语言,在语言领域耕耘多年的Anders太熟悉优秀语言的共性了,他所做的取舍值得你信赖。再次,Angular在前端实现了服务与依赖注入的概念。随着前端需求的进一步膨胀,即使只算逻辑代码,其需求复杂度也即将甚至已经赶上了大部分后端程序。所以,后端遇到过的挑战前端也迟早会遇到,这正是后端程序员弯道超车的好机会,而依赖注入正是后端程序员的看家本领。最后,Angular对团队作战提供了良好的支持,比如模板与代码的分离、样式表的局部化、组件化的设计、服务与依赖注入体系等。这些特性让后端程序员可以先专注于跟后端代码最像的模型和交互逻辑部分,而把诸如样式、模板等自己不擅长的部分交给队友。2023-07-22 13:00:552
如何设计好的RESTful API
安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。那么,您认为一个好的RESTful API应该具有哪些特征呢?李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。这个API应该是松耦合的。RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。parse.com提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中必须加上签名参数。这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。HTTP Digest身份认证可以单独使用,具备中等程度的安全性。HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。不过插入自定义加密算法在面向互联网的API中用的不是很多。这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。其中的加密机制与HTTP Digest身份认证相比,安全性更高。需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。至于WS-族的协议,我不太了解,不太能参与讨论。丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。丁雪丰:个人认为最好的版本化,就是没有明显的版本。在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 v1.rest.com 或者 rest.com/v1/ 这样。InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。如果在资源上定义的操作过多,我们会选择拆分出更多的资源。李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。这三部分的内容对于开发者来说都很有用。遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。李锟:这个问题我就不详细回答了。不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。保持多样性是繁荣生态环境的基础。像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。这些框架目前都做的不错。我对框架的选择没有倾向性。RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。增加更多的动词,以适应除CRUD之外的其他场景。HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。2023-07-22 13:01:091
1.Windows口令管理的策略有哪些?
组策略从Windows 2000就已经存在了,它不仅允许你从中央控制台集中管理多台计算机和用户的配置,还允许你简单地从活动目录域对配置进行更改。每一次Windows Server新版本发布,组策略都有改进,包括重要的和不重要的。但Windows Server 2012 R2有所不同,其中的组策略鲜有改进或新的功能。先来看看Windows Server 2012 R2本身发生的改变:IPv6支持(改进):现在包括打印机、项目级别导向和VPN网络支持。缓存策略(新的):该功能支持将域控制器的最新策略写入到本地的系统存储。这样运行组策略的系统可以在同步模式下从本地存储阅读策略,而不需要从网上下载。这反过来提供了同步模式下更快的启动时间和较短的处理时间——这对WAN中的域控制器或DirectAccess非常有意义。事件日志(改进):组策略的新日志包括需要多长时间下载和处理客户的政策。但是组策略MVP和GPanswers.com的创始人Jeremy Moskowitz指出Windows 8.1中引入了额外的变化:Windows 8.1其中的一个改进——当Windows Server 2012 R2作为客户端——是登录脚本延迟。目的是最小化磁盘访问提高登录和启动时间。在Windows 8.1和Windows Server 2012 R2中新的默认设置是登录脚本在用户登录五分钟后启动。如果你不知道这个,可能会感到很困惑!注意,这个可以使用策略设置(配置登录脚本延迟)关闭。Moskowitz指出,组策略还有一个新功能,当Windows Server 2012 R2或Windows 8.1作为客户端使用时提供一个“固定的”开始屏幕。因此IT可以获得一个一致的和锁定的体验。如果有需要的话,你可以对不同的用户配置不同的布局。对于Internet Explorer,Windows Server 2012的组策略允许IT配置SPDY/3网络协议,配置是否不得对网站和其他内容进行背景加载,配置防病毒程序是否违反ActiveX控件以及关掉电话号码检测。组策略有着悠久的历史,是它将配置调整发展到了顶点,而不是让配置调整适应它的发展。但是谨记,不要以为组策略成熟了,你就可以完全忽略它。2023-07-22 13:01:181
生活是一场不断奔跑的马拉松
毕业近9年,浏览学校网站的习惯像午后喝一杯香醇的咖啡从未舍得间断。从新闻中感受母校发展的日新月异,同学们开拓进取,洋溢着青春,挥洒着汗水,收获着果实。与昔日的同学保持联系,交流着工作生活中的心得体会,互相鼓励前行。时常回想起我的母校时光,满满的记忆,昔日的恩师,同窗好友,快乐的寝室卧谈,情人坡上的长椅,金沙滩的海,远遥的海鲜,东门的集市…… 大学是一个过程 大学是一个大家可以任性、荒废时间、不负责、甚至是犯错的最好场所,也是一个大家可以长大、成熟、学会担当、养成良好人生习惯的圣地。也许已经身处高年级的你常常会觉得有点晚了,后悔自己大一、大二荒废了,再也找不到高中时那三点一线,为了一个目标全力以赴的感觉了。其实不晚,而且你还应该庆幸自己终于明白了一些事情,明白需要为自己的行为和选择负责,需要在今天或者将来为之做些改变。当然,即使你现在不明白,工作后也会逼着你明白。即使家境殷实,暂不需要工作的人,早晚也会认识到我们总要为自己去担当。 不断认识自己。如果能够在大学阶段就充分地认识到自己,特别是优缺点和兴趣爱好,将是非常幸运的。可惜的是我并没有那么幸运。大学四年可以说一直奋斗努力到毕业离校当天,因为前一晚上我给同学们刻录班级纪念光盘同宣传部的一个学弟忙到半夜12点多(我所在的0201101班级在2006年获得了全校首个全国先进班集体荣誉称号)。我是比较能折腾的,做了很多学生工作和社会工作,从体育委员到团支部委员,从国旗班到校团委,从舞协到青年志愿者,家教、职业规划、创新设计……大学三大目标实现一个半:十佳大学生和所谓好工作。当时我并不清楚自己喜欢做什么,求职意向胡乱填了个与机械相关的管理职位。所以,2006年2月28日傍晚在大连通往威海的船上得知考研失败,3月1日就坐上威海去北京的火车,投了2份简历去了我的第一家公司广州本田,虽然在工作9年的时候又将更换公司,但是供应链管理的专业方向从来没有更改,我想这个让我经常为之烦恼的专业方向会成为我职业经理人的终身选择。 其实,大家很难在选择职业的时候就有清晰的认识,很明确知道自己喜欢做什么,因为企业的分工与我们学到的东西差别比较大,而我们经历的教育当时也缺少这方面的积累。有几点建议供大家参考,根据我的理解,我们所从事的职业大致可以分为两类:专家型和管理型。 所谓专家型人才是指立足于在某一领域的特有专长开展工作,如在科研单位、研究所、企业研究院、技术中心,围绕企业技术的工艺工程、质量,从事技术路线或者偏重技术应用的岗位,喜欢研究、创新的同学们可以选择这样的职位。所谓管理型人才是指立足于企业运营管理进行工作,如产品制造、销售、人事、安全、总务、采购、计划、设备维护,侧重交流、组织与领导等,并不是这些岗位不需要技术背景,而是不需要过多开发设计,仅在应用层面即可,譬如制造管理当然也需要熟悉产品设计质量工艺等技术知识。 在工作中发展比较好的同学都是那些具备专家型特质的管理型人才。也就是说,首先我们要成为某个领域的专家,你首先是个技术能手、成本控制专家、销售冠军,同时如果还喜欢管理,即可寻找机会过渡到管理者,走管理的通道。如果不喜欢管理,继续做专家型人才也可以。 目前企业用人趋势是专家型的综合人才,既你要精通某个领域,同时还具备围绕这个领域的相关领域的综合知识。这里要提醒同学们,并不是每个人都适合做领导者,不要为了做管理者而勉强去向管理岗位方向靠拢,要知道具备深厚专业技能的人才一点也不比管理人员收入低,甚至在危机来临时能够保你在公司有个位置。一定要在不断成长的过程中确认自己的职业方向,适合自己的方向才是最好的选择。只要当初选择是经过慎重考虑过的,建议在一个公司(岗位)上最好能够坚持三年,三年里要不断总结,这段经历肯定会给你最深刻的体会。 生活是痛并快乐着 我们经常郁闷、痛苦,因为欲望经常像洪水一样冲破我们的大坝,让我们溃不成军,痛苦不已。水是堵不住的,大禹治水重在疏导。很多看似独立的事件,往往是不独立的。我们曾经为了挂科、失恋痛苦,纠结于如何取得好成绩、怎样才能在学生会取得部长的信赖、成为社团负责人的第一候选人。当我们因为努力,综合素质成绩名列前茅,而获得奖学金,下个学期你会发现又在不停地纠结上个学期发生过的事。这样几个循环下来也将近毕业,毕业了还会遇到如何找到所谓的好工作,因为你根本不知道看起来的好工作是否是你真正想要的。真正开展工作了,会有让你头疼的项目、难以摆平的上司同事的关系……摆出一堆的烦恼和问题,是想让大家客观地来看这些烦恼,就像我们要吃饭睡觉一样,避免不了地会出现在我们人生中的痛苦和郁闷。 大学时为了争取保研我可谓费尽心力但仍未能如愿。平均分差0.8分(液压传动挂科),被称为铁人奋战了6个月也没考上研究生。最让我难受和苦恼的不是这些,读研更多是能和我的妻子当时的女朋友在一起,所以即使找到了看似大家羡慕的好工作,也并不是我真正想要的,所以说实现了一个半大学目标。当然,这些遗憾和担心都得到了补偿,研究生梦想在2010年全国MBA联考中实现在了中山大学读MBA,担心距离产生问题的女友也成为了我的老婆。所以很多担心的事情都没有发生。对于烦恼,我们要正确地认识并接受它们,踏实而用心地去面对解决。在不断解决问题中提升,不要再陷入这类问题。当你能够解决更大或者更高级的问题时,我想你已经找到了自己的方向,并且会愿意为了这个方向继续努力和挑战,成果和快乐也随之而来。 养成好的习惯仅需要三周 唯一不变的就是变化,随着时间我们都在变化。相比变坏的方面就是如何变得更好。要让自己变得更好,需要不断地坚持、不断地努力。成功或许有偶然因素,但是好的习惯可以相伴一生,也会让大家获得更多的朋友。 相比大学时那个喜欢表现、初生牛犊不怕虎的少年,现在已是工作近9年、换过2份工作、两个孩子的爸爸,能跑马拉松、被90后的同事称为哥的深沉冷静的80后。多年好友说从来没发现我还这么能跑,要知道2年前跑2公里都上不来气,如今已经跑了3场马拉松。时至今日才能深刻理解大学那个每天跑5公里的哥们,原来他挖到了那么大的金矿,怪不得成绩全院第一(此人冯原,与本人同为第三届十佳大学生)。原来跑步不仅让人更加精神、坚韧,还能开发大脑啊。 相比一个坏的习惯,养成一个好的习惯只需要三周时间。除了跑步,同学们曾经上过的素描课,参加过的摄影培训,羽毛球爱好都是不错的爱好,能够在工作之余给大家和家人带来无限欢乐的好习惯。坚持三周,每天半个小时,好的习惯会让你受益匪浅。 跑步后遇到很多形形色色的跑友,经理人、企业家、公职人员、退休老者,职业虽然不同,却都是积极向上、充满热情、热爱生活、能够给人正能量的人。我想跑步这个活动我是可以一直坚持下去的,我们这代退休要改到65岁了,所以现在的口号是坚持跑步,为祖国奋斗40年。每年2-3场,我准备跑100场马拉松,为了传递正能量,也为了不断修行自己。 每一个哈工大威海人,都在不断践行着规格严格,功夫到家的校训,怀着感恩的心奋斗在各行各业,为母校争光,为工大喝彩。 spdy"wLu045722023-07-22 13:01:391
HTTP 和 WebSocket的区别
按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP是应用层的协议。在这三者之间,SPDY和WebSocket都是与HTTP相关的协议,而TCP是HTTP底层的协议。WebSocket则提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。 WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。WebSocket也有自己一套帧协议。2023-07-22 13:01:591
浏览器是IE11版本,在网上报名时,提示使用的不是IE浏览器?
1.首先将我们的浏览器的主页面打开,尽量选择电脑本身自带的IE浏览器,以免其他的不能兼容。2.点击浏览器右上角的设置按钮,在设置中我们可以找到有兼容模式,如果更改IE版本失败我们就只能尝试更改兼容模式。3. 弹出的对话框中我们看见了最下端有兼容的勾选,建议大家可以将下面的选择都进行勾选上。4.勾选完成之后我们还需要将上部的已经填写好的浏览器添加到下方的框中,全都选择好后就可以直接将其关掉即可。5.最后我们将浏览器重新刷新一下就会看到报名的界面出来了。扩展资料:IE11在IE10的基础上再次扩大对HTML5和CSS 3的支持,且添加的这些新特性多数均是非常新潮的特性(如HTML5拖放,HTML5全屏,CSS边框图,视频码率控制,视频字幕隐藏,媒体加密,WebGL等等),使得IE11在显示HTML5网页时基本不出现到处不支持的问题。IE11在功能上新增对Google的SPDY协议的支持,对Chakra进行了更多优化,硬件加速渲染相比IE9和IE10更快,在同样多加载项的情况下,IE11网页加载速度已超过WebKit和Blink内核浏览器,支持在后台智能预判并迅速在内存中取出已经看过的网页而不需要重新连接网站加载。2023-07-22 13:02:092
le浏览器有哪些
IE浏览器自1995年诞生以来,截至到2019年11月,共有11个主版本。1、IE1:1995年8月16日,微软发布IE1,它在Windows95的MicrosoftPlus!中提供选择安装。之后,微软大约投入了六个人的工作小组研发IE1.5,并在几个月后发行。2、IE2:1995年11月22日,微软IE2发布。IE2支持当时所有Windows,在Windows95A系统的MicrosoftPlus!中提供选择安装。3、IE3:1996年8月13日,微软IE3发布。IE3仍然支持所有Windows,在Windows95OSR2(俗称Windows97)系统的MicrosoftPlus!中提供选择安装。4、IE4:1997年9月,微软发布IE4(版本号4.71.1712.6),其在部分安装Windows95OSR2.5的品牌机中集成,并且也支持当时所有Windows升级安装。5、IE5:1999年3月18日,最后支持Windows3.X和早期WindowsNT3系列的IE5发布供用户升级,随后IE5(版本5.0.2614.3500)集成在5月发布的Windows98SE中。6、IE6:2002年9月9日,IE6SP1(版本号6.0.2800.1106)随着WindowsXPSP1一同发布,IE6SP1禁用了越来越不重要的信息检索工具Gopher的功能。7、IE7:2005年7月27日,伴随着WindowsVistaBeta的发布,IE7Beta1版问世。最初微软打算将IE7作为WindowsVista的专属浏览器而不单独发布。8、IE8:2009年3月19日,经历了众多测试版后,IE8(版本号8.0.6001.18702)最终发布提供给WindowsXPSP2/SP3、WindowsXPProx64、WindowsServer2003R2SP2和WindowsVista用户升级。9、IE9:2011年3月14日,微软发布IE9(版本号9.0.8112.16421),IE9采用了新的JavaScript引擎Chakra,使网页加载速度很快,同时利用显卡GPU加速文字和图形的渲染、使CPU的负担也大大减轻。10、IE10:2011年4月11日,微软提供IE10PP1的下载,仅支持Windows7以上用户安装,仅两个月后,微软又提供IE10PP2,可以看出微软对于IE开发进度的加快。随后微软便宣布于2012年面世的Windows8将集成IE10。11、IE11:2013年10月17日,随着Windows8.1的正式发布,IE11(11.0.9600.16384)问世,IE11的内核为Trident7.0。扩展资料:IE11在IE10的基础上再次扩大对HTML5和CSS3的支持,且添加的这些新特性多数均是非常新潮的特性(如HTML5拖放,HTML5全屏,CSS边框图,视频码率控制,视频字幕隐藏,媒体加密,WebGL等等),使得IE11在显示HTML5网页时基本不出现到处不支持的问题。IE11在功能上新增对Google的SPDY协议的支持,对Chakra进行了更多优化,硬件加速渲染相比IE9和IE10更快,在同样多加载项的情况下,IE11网页加载速度已超过WebKit和Blink内核浏览器,支持在后台智能预判并迅速在内存中取出已经看过的网页而不需要重新连接网站加载。2023-07-22 13:02:471
如何设计好的RESTful API
安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。那么,您认为一个好的RESTful API应该具有哪些特征呢?李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。这个API应该是松耦合的。RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。parse.com提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中必须加上签名参数。这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。HTTP Digest身份认证可以单独使用,具备中等程度的安全性。HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。不过插入自定义加密算法在面向互联网的API中用的不是很多。这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。其中的加密机制与HTTP Digest身份认证相比,安全性更高。需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。至于WS-族的协议,我不太了解,不太能参与讨论。丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。丁雪丰:个人认为最好的版本化,就是没有明显的版本。在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 v1.rest.com 或者 rest.com/v1/ 这样。InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。如果在资源上定义的操作过多,我们会选择拆分出更多的资源。李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。这三部分的内容对于开发者来说都很有用。遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。李锟:这个问题我就不详细回答了。不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。保持多样性是繁荣生态环境的基础。像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。这些框架目前都做的不错。我对框架的选择没有倾向性。RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。增加更多的动词,以适应除CRUD之外的其他场景。HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。2023-07-22 13:02:531
如何获得fpspread中三种状态的复选框单元格的值
spread 中checkbox的用法forpoint spreadsheet 列类别选择combo就可以了spread的帮助文件中间搜索 CellType property, check box cells//------------------------------------------------------是这样的,我的webform上放了一个FpSpread控件,我想把行头变成checkbox样式,我的方法是在后台代码中定义: FarPoint.Web.Spread.CheckBoxCellType celltype = new FarPoint.Web.Spread.CheckBoxCellType(); 然后将此type赋给行头: FpSpread1.ActiveSheetView.RowHeader.Cells[0,0].CellType=celltype; 我的问题是:1.如果我想用一个Button控制当点击Button时,如果CheckBox是选中状态,则在该中显示某某字符,但我不知道这种CheckBox的标识是什么,还有他的状态为选中或没选中返回值是什么? 2.还有其他方法吗?比如我用 FpSpread1.ActiveSheetView.RowHeader.Cells[0,0].Text="<Input id="nihao" checked type ="CheckBox" />" 遇到的困难和刚才一样。 请问怎么解决,多谢!FpSpread1.columnsheader.cells(0,0).text="Check #"//-------------------------------------------------------------确定check所在的位置,然后直接判断FpSpread1.Sheets(0).Cells(1,6).Value是否为1,为1就是选中状态。我是这样的。Public Sub SetCOLCheck(spd As vaSpread, ByVal lCol1 As Long, ByVal lCol2 As Long, _ Optional ByVal IsCenter As Boolean = True) With spd .Col = lCol1 .Col2 = lCol2 .Row = -1 .BlockMode = True .CellType = 10 .TypeHAlign = 0 .TypeCheckCenter = IsCenter .BlockMode = False End With End Sub 我使用的是Spread,是这么填加的//---------------------------------------------------------1.BorderStyle:调整是否有边框 默认为Fixed3D FixedSingle只有一条线 2.location x,y 调整位置 3.horizontalScrollBarPolicy 默认为Always横向向滚共条始终存在,就是AsNeeded条数超过显示就存在,否则不显示,Never始终没有滚动条 4.verticalScrollBarPolicy 默认为Always纵向滚共条始终存在,就是AsNeeded条数超过显示就存在,否则不显示,Never始终没有滚动条 5.Enabled 是否可以编辑点击Sheets属性旁的按钮就会出现关于Sheets页里面属性的设置 1.selectionUnit 默认为Cell运行的时候,点击单元格选中的只是一个单元 Column整列,Row整行 2.ColumnCount Spread表示数据的列数 3.RowCount Spread表示数据的行数 4.*OperationMode 主要是MultiSelect,SingleSelect两种的区分SingleSelect只能选一行, MultiSelect可以择多行。 5.rows和Column下的Resizable可以将列和行的大小固定为不可调整AddColumns(Integer i, Integer j)添加列,i是起始位置,j是列数。AddRows(Integer i, Integer j)添加列,i是起始位置,j是列数。.AddSelection(I,j,k,m)添加选中的cell.ClearRange AddSelection(I,j,k,m,true)清空Spread.还有很多常用的方法。就往Spread中放值的方法 1.创建对应的DataSource Me.FpSpread1_Sheet1().DataSource =objDs.Tables(0)Me.FpSpread1_Sheet1().Columns(0).DataField = "id"Me.FpSpread1_Sheet1().Columns(1).DataField = "name“**Id,和name是从数据库中查出来得数据结果集中数据表的字段名。这样从数据库中查出的值就可放在相应的列上了。 2.也可单独往单元格中放值Me.FpSpread1_Sheet1.Cells(0, 0).Value() = “123”*放值时需要注意的是FpSpread1_Sheet1的起始位置是(0,0)如果只有4行4列的话是不存在(4,4)这样的Cells的 Me.FpSpread1_Sheet1.ActiveRowIndex可以取得选择的行的索引值,从0开始 FpSpread1_Sheet1.Cells(FpSpread1_Sheet1.ActiveRowIndex, 1)可以取得选择的行对应单元格的值。Dim cellButtonType As New FarPoint.Win.Spread.CellType.ButtonCellType cellButtonType.Text = "Detail" Me.SpdYoteyi_Sheet1.ColumnHeader.Cells.Get(0, 3).BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(192, Byte))With frm.SpdYoteyi.Sheets(0) .Columns.Get(0).ForeColor = System.Drawing.Color.Red .Columns.Get(3).ForeColor = System.Drawing.Color.Blue .SetText(0, 0, "eld001") .SetText(0, 7, "2006/04/20") .SetText(0, 9, "会社AAA") // 动态添加列。 .AddColumns(10, 1) .Columns.Get(10).Label = "详しい" .Columns.Get(10).CellType = cellButtonTypeEnd With// 获得当前选中行.SpdYoteyi.ActiveSheet.ActiveRowIndex()//-------------------------------------------------关于spread的一些基本操作对日软件开发,经常会用到spread控件。使用中积累了一些经验,自己总结一下。1.spread的cell在spread的设计界面里可以设置cell的各种属性,和用惯的vb差不多。其实它的help写的挺详细的,刚开始日文不好看起来不方便,现在可以顺利理解了。Cell可以是checkbox,文字,数字,时间等等类型,可以只读,可读写,还可以设置背景色,边框等。和excel相像的。2.Cell的读写模式。 1. 只读 ① 全体只读 With spdTEMP .Col = 1 .Col2 = .MaxCols .Row = 1 .Row2 = -1 "当spd里数据是0条时,.MaxRows会出错。用-1安全。 .Protect = True .BlockMode = True .Lock = True .BlockMode = False End With ②部分只读,设置行和列就可以 With spdTEMP .Col = 2 .Col2 = 5 .Row = 1 .Row2 = 8 .Protect = True .BlockMode = True .Lock = True .BlockMode = False End With2.一般写模式和覆盖写模式 一般写模式:.EditMode = True 覆盖写模式:.EditModeReplace = True区别在于 1)光标模式不同,一般写为单个鼠标入力光标,覆盖写已有内容全选,替换输入。 2)当输入带有小数的数字时,覆盖写会自动跳到小数最末位,这可能是spread3.0在win2000下的bug吧。症状是第一遍输入10.23时会变成1.03,第二遍输入时就好了。试验了很多次,最后不得已换成一般写模式。3.spread的click事件 ① 这是一段点击每行第三列时,自动全行copy数据的例子。Private Sub spdTMSR160_Click(ByVal Col As Long, ByVal Row As Long) Dim temp As String Dim i As Integer If Row = 0 Then Exit Sub If spdTMSR160.Lock = True Then Exit Sub With spdTMSR160 .Col = 3 .Col2 = .MaxRows .Row = Row .Row2 = Row If Col = 2 And .Value <> "" Then If MsgBox("3月の予算金额を全ての月にコピーしてもよろしいですか?", vbQuestion + vbYesNo) = vbYes Then .BlockMode = True temp = .Value For i = 1 To 11 .Col = .Col + 1: .Value = temp Next End If End If .BlockMode = False End With End Sub ② 这是一段有选择按钮的例子。选中时行变色,部分cell改变入力状态。Private Sub spdTMSR020_Click(ByVal Col As Long, ByVal Row As Long) If Row = 0 Then Exit Sub" If spdTMSR020.Lock = True Then Exit Sub If Col >= 1 And Col <= 7 Then With spdTMSR020 .Col = 1 .Col2 = .MaxCols .Row = Row .Row2 = Row .Value = IIf(.Value = 0, 1, 0) .BlockMode = True If .Value = 0 Then" If Row Mod 2 = 0 Then" .BackColor = RGB(245, 236, 233)" Else .BackColor = RGB(255, 255, 255)" End If .Col = 8 .Col2 = 11 .Row = Row .Row2 = Row .Protect = True .Lock = True Else .BackColor = RGB(128, 255, 128) .Col = 8 .Col2 = 11 .Row = Row .Row2 = Row .Lock = False .EditMode = True End If .BlockMode = False End WithEnd IfEnd Subspread3.0的选择按钮很脆弱,一不小心小红钩不见了,事件却没有触发。所以把边上的固定列都设为可选择状态。4.关于背景色的设置。Backcolor 指定范围,设置背景色SetOddEvenRowColor,设置奇数,偶数行的颜色。本来背景色是粉红和白色相间的,但是单行变色判断和全体变色中产生问题,不得不改成全白的。其根本原因是backcolor比SetOddEvenRowColor要强。Backcolor可以更改SetOddEvenRowColor设置的颜色,而SetOddEvenRowColor却无法改变Backcolor设定的颜色。而当数据很多时,背景需要刷新时,用backcolor一行一行判断更改,画面会产生剧烈颤抖….//----------------------------------序号属性说明1.MaxRows = 10设置总行数为10行2.MaxCols = 5设置总列数为5列3.ColHeaderRows = 2表头(列标题)行数为24.Row = SpreadHeader定位到表头(列标题)5.Row = -1定位到行头(在设置列格式时使用)6.ColWidth(1) = 16设置第1列的列宽为167.RowHeight(1) = 12设置第1行的行高为128.FontSize = 10"设置当前栏位的字体大小为10(如果.Row = -1,则设置整列,下同)"9.TypeHAlign = TypeHAlignRight设置文字水平对齐方式为右对齐.TypeVAlign = TypeVAlignCenter设置文字垂直对齐方式为居中10.CellType = CellTypeNumber设置为数字类型11.TypeNumberDecPlaces = 2设置小数位数12.TypeNumberShowSep = True设置千位分隔13.SetText 2, 3, "test"设置第2列第3行的文本为"test"14.GetText 2, 3, MyText将第2列第3行的值赋给变量MyText15.Row = 3定位到第3行16.Col = 2定位到第2列17.Text = "test"设置当前栏位的文本为"test"18MyRow = .ActiveRow将当前行号赋值给变量MyRow19.InsertRows 2, 1在第2行前插入1行20.DeleteRows 2, 1"在第2行前删除1行(如果Spread是通过设置数据源取得数据的话,则必须设置.DataSource = Nothing才能删除)"21.InsertCols 2, 1在第2列前插入1列22.DeleteCols 2, 1在第2列前删除1列23.AddCellSpan 3, 4, 2, 1从第3列第4行起合并单元格,跨度为2列1行24.RowHeadersShow = False隐藏行标题25.ColHeadersShow = False隐藏列标题26.PrintMarginLeft = 1000打印时左边距=1000(包括预览)27.PrintMarginTop = 1000打印时上边距=1000(包括预览)28.OperationMode = OperationModeRow设置Spread的操作模式为行定位(共有6种模式)29.DataSource = Rs设置Spread的数据源为Rs记录集2023-07-22 13:04:091
如何获得fpspread中三种状态的复选框单元格
spread 中checkbox的用法forpoint spreadsheet 列类别选择combo就可以了spread的帮助文件中间搜索 CellType property, check box cells//------------------------------------------------------是这样的,我的webform上放了一个FpSpread控件,我想把行头变成checkbox样式,我的方法是在后台代码中定义: FarPoint.Web.Spread.CheckBoxCellType celltype = new FarPoint.Web.Spread.CheckBoxCellType(); 然后将此type赋给行头: FpSpread1.ActiveSheetView.RowHeader.Cells[0,0].CellType=celltype; 我的问题是:1.如果我想用一个Button控制当点击Button时,如果CheckBox是选中状态,则在该中显示某某字符,但我不知道这种CheckBox的标识是什么,还有他的状态为选中或没选中返回值是什么? 2.还有其他方法吗?比如我用 FpSpread1.ActiveSheetView.RowHeader.Cells[0,0].Text="<Input id="nihao" checked type ="CheckBox" />" 遇到的困难和刚才一样。 请问怎么解决,多谢!FpSpread1.columnsheader.cells(0,0).text="Check #"//-------------------------------------------------------------确定check所在的位置,然后直接判断FpSpread1.Sheets(0).Cells(1,6).Value是否为1,为1就是选中状态。我是这样的。Public Sub SetCOLCheck(spd As vaSpread, ByVal lCol1 As Long, ByVal lCol2 As Long, _ Optional ByVal IsCenter As Boolean = True) With spd .Col = lCol1 .Col2 = lCol2 .Row = -1 .BlockMode = True .CellType = 10 .TypeHAlign = 0 .TypeCheckCenter = IsCenter .BlockMode = False End With End Sub 我使用的是Spread,是这么填加的//---------------------------------------------------------1.BorderStyle:调整是否有边框 默认为Fixed3D FixedSingle只有一条线 2.location x,y 调整位置 3.horizontalScrollBarPolicy 默认为Always横向向滚共条始终存在,就是AsNeeded条数超过显示就存在,否则不显示,Never始终没有滚动条 4.verticalScrollBarPolicy 默认为Always纵向滚共条始终存在,就是AsNeeded条数超过显示就存在,否则不显示,Never始终没有滚动条 5.Enabled 是否可以编辑点击Sheets属性旁的按钮就会出现关于Sheets页里面属性的设置 1.selectionUnit 默认为Cell运行的时候,点击单元格选中的只是一个单元 Column整列,Row整行 2.ColumnCount Spread表示数据的列数 3.RowCount Spread表示数据的行数 4.*OperationMode 主要是MultiSelect,SingleSelect两种的区分SingleSelect只能选一行, MultiSelect可以择多行。 5.rows和Column下的Resizable可以将列和行的大小固定为不可调整AddColumns(Integer i, Integer j)添加列,i是起始位置,j是列数。AddRows(Integer i, Integer j)添加列,i是起始位置,j是列数。.AddSelection(I,j,k,m)添加选中的cell.ClearRange AddSelection(I,j,k,m,true)清空Spread.还有很多常用的方法。就往Spread中放值的方法 1.创建对应的DataSource Me.FpSpread1_Sheet1().DataSource =objDs.Tables(0)Me.FpSpread1_Sheet1().Columns(0).DataField = "id"Me.FpSpread1_Sheet1().Columns(1).DataField = "name“**Id,和name是从数据库中查出来得数据结果集中数据表的字段名。这样从数据库中查出的值就可放在相应的列上了。 2.也可单独往单元格中放值Me.FpSpread1_Sheet1.Cells(0, 0).Value() = “123”*放值时需要注意的是FpSpread1_Sheet1的起始位置是(0,0)如果只有4行4列的话是不存在(4,4)这样的Cells的 Me.FpSpread1_Sheet1.ActiveRowIndex可以取得选择的行的索引值,从0开始 FpSpread1_Sheet1.Cells(FpSpread1_Sheet1.ActiveRowIndex, 1)可以取得选择的行对应单元格的值。Dim cellButtonType As New FarPoint.Win.Spread.CellType.ButtonCellType cellButtonType.Text = "Detail" Me.SpdYoteyi_Sheet1.ColumnHeader.Cells.Get(0, 3).BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(192, Byte))With frm.SpdYoteyi.Sheets(0) .Columns.Get(0).ForeColor = System.Drawing.Color.Red .Columns.Get(3).ForeColor = System.Drawing.Color.Blue .SetText(0, 0, "eld001") .SetText(0, 7, "2006/04/20") .SetText(0, 9, "会社AAA") // 动态添加列。 .AddColumns(10, 1) .Columns.Get(10).Label = "详しい" .Columns.Get(10).CellType = cellButtonTypeEnd With// 获得当前选中行.SpdYoteyi.ActiveSheet.ActiveRowIndex()//-------------------------------------------------关于spread的一些基本操作对日软件开发,经常会用到spread控件。使用中积累了一些经验,自己总结一下。1.spread的cell在spread的设计界面里可以设置cell的各种属性,和用惯的vb差不多。其实它的help写的挺详细的,刚开始日文不好看起来不方便,现在可以顺利理解了。Cell可以是checkbox,文字,数字,时间等等类型,可以只读,可读写,还可以设置背景色,边框等。和excel相像的。2.Cell的读写模式。 1. 只读 ① 全体只读 With spdTEMP .Col = 1 .Col2 = .MaxCols .Row = 1 .Row2 = -1 "当spd里数据是0条时,.MaxRows会出错。用-1安全。 .Protect = True .BlockMode = True .Lock = True .BlockMode = False End With ②部分只读,设置行和列就可以 With spdTEMP .Col = 2 .Col2 = 5 .Row = 1 .Row2 = 8 .Protect = True .BlockMode = True .Lock = True .BlockMode = False End With2.一般写模式和覆盖写模式 一般写模式:.EditMode = True 覆盖写模式:.EditModeReplace = True区别在于 1)光标模式不同,一般写为单个鼠标入力光标,覆盖写已有内容全选,替换输入。 2)当输入带有小数的数字时,覆盖写会自动跳到小数最末位,这可能是spread3.0在win2000下的bug吧。症状是第一遍输入10.23时会变成1.03,第二遍输入时就好了。试验了很多次,最后不得已换成一般写模式。3.spread的click事件 ① 这是一段点击每行第三列时,自动全行copy数据的例子。Private Sub spdTMSR160_Click(ByVal Col As Long, ByVal Row As Long) Dim temp As String Dim i As Integer If Row = 0 Then Exit Sub If spdTMSR160.Lock = True Then Exit Sub With spdTMSR160 .Col = 3 .Col2 = .MaxRows .Row = Row .Row2 = Row If Col = 2 And .Value <> "" Then If MsgBox("3月の予算金额を全ての月にコピーしてもよろしいですか?", vbQuestion + vbYesNo) = vbYes Then .BlockMode = True temp = .Value For i = 1 To 11 .Col = .Col + 1: .Value = temp Next End If End If .BlockMode = False End With End Sub ② 这是一段有选择按钮的例子。选中时行变色,部分cell改变入力状态。Private Sub spdTMSR020_Click(ByVal Col As Long, ByVal Row As Long) If Row = 0 Then Exit Sub" If spdTMSR020.Lock = True Then Exit Sub If Col >= 1 And Col <= 7 Then With spdTMSR020 .Col = 1 .Col2 = .MaxCols .Row = Row .Row2 = Row .Value = IIf(.Value = 0, 1, 0) .BlockMode = True If .Value = 0 Then" If Row Mod 2 = 0 Then" .BackColor = RGB(245, 236, 233)" Else .BackColor = RGB(255, 255, 255)" End If .Col = 8 .Col2 = 11 .Row = Row .Row2 = Row .Protect = True .Lock = True Else .BackColor = RGB(128, 255, 128) .Col = 8 .Col2 = 11 .Row = Row .Row2 = Row .Lock = False .EditMode = True End If .BlockMode = False End WithEnd IfEnd Subspread3.0的选择按钮很脆弱,一不小心小红钩不见了,事件却没有触发。所以把边上的固定列都设为可选择状态。4.关于背景色的设置。Backcolor 指定范围,设置背景色SetOddEvenRowColor,设置奇数,偶数行的颜色。本来背景色是粉红和白色相间的,但是单行变色判断和全体变色中产生问题,不得不改成全白的。其根本原因是backcolor比SetOddEvenRowColor要强。Backcolor可以更改SetOddEvenRowColor设置的颜色,而SetOddEvenRowColor却无法改变Backcolor设定的颜色。而当数据很多时,背景需要刷新时,用backcolor一行一行判断更改,画面会产生剧烈颤抖….//----------------------------------序号属性说明1.MaxRows = 10设置总行数为10行2.MaxCols = 5设置总列数为5列3.ColHeaderRows = 2表头(列标题)行数为24.Row = SpreadHeader定位到表头(列标题)5.Row = -1定位到行头(在设置列格式时使用)6.ColWidth(1) = 16设置第1列的列宽为167.RowHeight(1) = 12设置第1行的行高为128.FontSize = 10"设置当前栏位的字体大小为10(如果.Row = -1,则设置整列,下同)"9.TypeHAlign = TypeHAlignRight设置文字水平对齐方式为右对齐.TypeVAlign = TypeVAlignCenter设置文字垂直对齐方式为居中10.CellType = CellTypeNumber设置为数字类型11.TypeNumberDecPlaces = 2设置小数位数12.TypeNumberShowSep = True设置千位分隔13.SetText 2, 3, "test"设置第2列第3行的文本为"test"14.GetText 2, 3, MyText将第2列第3行的值赋给变量MyText15.Row = 3定位到第3行16.Col = 2定位到第2列17.Text = "test"设置当前栏位的文本为"test"18MyRow = .ActiveRow将当前行号赋值给变量MyRow19.InsertRows 2, 1在第2行前插入1行20.DeleteRows 2, 1"在第2行前删除1行(如果Spread是通过设置数据源取得数据的话,则必须设置.DataSource = Nothing才能删除)"21.InsertCols 2, 1在第2列前插入1列22.DeleteCols 2, 1在第2列前删除1列23.AddCellSpan 3, 4, 2, 1从第3列第4行起合并单元格,跨度为2列1行24.RowHeadersShow = False隐藏行标题25.ColHeadersShow = False隐藏列标题26.PrintMarginLeft = 1000打印时左边距=1000(包括预览)27.PrintMarginTop = 1000打印时上边距=1000(包括预览)28.OperationMode = OperationModeRow设置Spread的操作模式为行定位(共有6种模式)29.DataSource = Rs设置Spread的数据源为Rs记录集2023-07-22 13:04:161
SSL/TLS站点应用面临的问题有哪些?如何解决?
下面是面临的常见问题,相关SSL证书也可以淘宝Gworg进行申请。1.网站无法访问,提示 ERR_CERTIFICATE_TRANSPARENCY_REQUIRED使用 Chrome 53 访问使用 Symantec 证书的网站,很可能会出现这个错误提示。这个问题由 Chrome 的某个 Bug 引起,目前最好的解决方案是升级到 Chrome 54+。2.浏览器提示证书有错误首先确保网站使用的是合法 CA 签发的有效证书,其次检查 Web Server 配置中证书的完整性(一定要包含站点证书及所有中间证书)。如果缺失了中间证书,部分浏览器能够自动获取但严重影响 TLS 握手性能;部分浏览器直接报证书错误。如果只有老旧浏览器(例如 IE8 on Windows XP)提示这个错误,多半是因为你的服务器同时部署了使用不同证书的多个 HTTPS 站点,这样,不支持 SNI(Server Name Indication)的浏览器通常会获得错误的证书,从而无法访问。要解决浏览器不支持 SNI 带来的问题,可以将使用不同证书的 HTTPS 站点部署在不同服务器上;还可以利用 SAN(Subject Alternative Name)机制将多个域名放入同一张证书;当然你也可以直接无视这些老旧浏览器。特别地,使用不支持 SNI 的浏览器访问商业 HTTPS CDN,基本都会因为证书错误而无法使用。3.启用 HTTP/2 后网站无法访问,提示 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY这个问题一般是由于 CipherSuite 配置有误造成的。建议对照「 Mozilla 的推荐配置 、 CloudFlare 使用的配置 」等权威配置修改 Nginx 的 ssl_ciphers 配置项。4.网站无法访问,提示 ERR_SSL_VERSION_OR_CIPHER_MISMATCH出现这种错误,通常都是配置了不安全的 SSL 版本或者 CipherSuite —— 例如服务器只支持 SSLv3,或者 CipherSuite 只配置了 RC4 系列,使用 Chrome 访问就会得到这个提示。解决方案跟上一节一样。还有一种情况会出现这种错误 —— 使用不支持 ECC 的浏览器访问只提供 ECC 证书的网站。例如在 Windows XP 中,使用 ECC 证书的网站只有 Firefox 能访问(Firefox 的 TLS 自己实现,不依赖操作系统);Android 平台中,也需要 Android 4+ 才支持 ECC 证书。如果是这种情况,有一个比较完美的解决方案,请看「开始使用 ECC 证书」。5.在 Nginx 启用 HTTP/2 后,浏览器依然使用 HTTP/1.1Chrome 51+ 移除了对 NPN 的支持,只支持 ALPN,而浏览器和服务端都支持 NPN 或 ALPN,是用上 HTTP/2 的大前提。换句话说,如果服务端不支持 ALPN,Chrome 51+ 无法使用 HTTP/2。OpenSSL 1.0.2 才开始支持 ALPN —— 很多主流服务器系统自带的 OpenSSL 都低于这个版本,所以推荐在编译 Web Server 时自己指定 OpenSSL 的位置。6.升级到 HTTPS 后,网站部分资源不加载或提示不安全记住一个原则:HTTPS 网站的所有外链资源(CSS、JS、图片、音频、字体文件、异步接口、表单 action 地址等等)都需要升级为 HTTPS,就不会遇到这个问题了。2023-07-22 13:04:313
SSL/TLS站点应用面临的问题有哪些?
SSL/TLS站点应用面临的问题有以下几点:SSL证书安装错误;因为不熟悉SSL证书技术引发的问题网站无法访问升级到 HTTPS 后,网站部分资源不加载或提示不安全密码通信之前后的数据是不受保护的,SSL/TLS仅对通信过程中的数据进行保护2023-07-22 13:04:523
android怎么实现后台访问网页
目前Github上使用比较多的Android Http库依次是Retrofit,okhttp,android-async-http,okhttp-utils,async-http-client,等等; 中间经过一系列的分析,根据start,更新速度,作者,库的实用性,性能,以及拓展性等等,最终选出了3个PK.(Retrofit,okhttp,okhttp-utils) 其中Retrofit,okhttp都是square公司出的okhttp是底层库,使用起来比较麻烦,肯定需要2次封装,这里okhttp-utils是洪洋大神在okhttp上进行的封装开源库,刚好弥补了这个缺陷,是目前封装的比较好的。 而Retrofit同样也是在okhttp上进行封装的,使用的是注解,使用起来相当方便,并且有很好的扩展性,PK下来。 Retrofit获胜。这里说下自己所了解到的1、okhttp 和 async http是一个基础的通信库,都很强大,但需要自己封装使用才更方便。另外okhttp已经被谷歌官方用在android源码中了。2、retrofit和 volley是属于比较高级点的封装库了 其中 retrofit是默认使用okhttp volley也支持okhttp作为其底层通信的部件。retrofit的特点是使用清晰简单的接口,非常方便,而 volley在使用的时候也还简单,不过要使用高级一点的功能需要自己自定义很多东西3、volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。4、android-async-http。与volley一样是异步网络库,但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。5、okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。6、retrofit与picasso一样都是在okhttp基础之上做的封装,项目中可以直接用了。7、retrofit主要针对的是url请求 ,okhttp在实际项目中直接用很麻烦,一般需要自己封装一下(有一个大坑是他onResponse方法默认是在异步线程,不能直接操作UI既然选择了Retrofit,那我们就来一起了解一下吧。本次分享要求:理解Retrofit与okhttp的区别,简单的学会使用Retrofit;2023-07-22 13:04:591
千牛上面收货信息怎么打不开
千牛是淘宝卖家用于管理淘宝店铺工具,卖家使用千牛管理店铺更加得心应手。千牛功能很多,卖家使用时也会遇到一些问题,这不,有卖家就问千牛接待中心为何看不到订单,我这就给大家回答。space电脑端千牛右侧显示订单信息需要勾选官方插件,操作如下:1.打开与买家聊天对话框,点击右侧“+”:space2.点击“交易”,勾选“淘宝交易管理”或其他第三方插件。space千牛怎么自动核对订单?1.登陆【千牛卖家工作台】进入千牛卖家中心。2.在【千牛卖家中心】首页上方搜索框搜索【客服服务】。3.点击进入【客户服务平台】,在左侧栏找到【自动化任务】--【自动核对订单】点击【启用】4.进入【核对订单】设置页面,在右上角找到【规则设置】,点击进入5.进入之后可以编辑所要核对的信息,然后点击【保存】即可。6.开通之后,买家在下完订单后,就会自动发送核对订单的信息了。2023-07-22 13:05:082
什么是好的API与设计流程和设计原则
安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。那么,您认为一个好的RESTful API应该具有哪些特征呢?李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。这个API应该是松耦合的。RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。parse.com提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中必须加上签名参数。这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。HTTP Digest身份认证可以单独使用,具备中等程度的安全性。HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。不过插入自定义加密算法在面向互联网的API中用的不是很多。这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。其中的加密机制与HTTP Digest身份认证相比,安全性更高。需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。至于WS-族的协议,我不太了解,不太能参与讨论。丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。丁雪丰:个人认为最好的版本化,就是没有明显的版本。在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 v1.rest.com 或者 rest.com/v1/ 这样。InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。如果在资源上定义的操作过多,我们会选择拆分出更多的资源。李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。这三部分的内容对于开发者来说都很有用。遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。李锟:这个问题我就不详细回答了。不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。保持多样性是繁荣生态环境的基础。像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。这些框架目前都做的不错。我对框架的选择没有倾向性。RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。增加更多的动词,以适应除CRUD之外的其他场景。HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。2023-07-22 13:05:501
wireshark 和 charles,burpsuite的区别
TcpIP协议,HTTP,DNS 实战:基于wireshark与BurpSuite抓包分析使用 wireshark 前的基本配置磨刀不误砍柴工。为了高效率的利用 wireshark 来帮助我们分析,学习网络协议,以及故障排除,需要对其进行一些使用前配置,大致内容如下:1。将数据包摘要列表(packet list)中的“time”列的精度调整为 1 毫秒。默认情况下,wireshark 的时间显示精度为 1 纳秒,但是在现实环境中通常用不到如此高的精度,一般用于评估站点响应速度,用户体验的性能指标,精确到毫秒级别就足够了,而且纳秒会多显示小数点后 6 位数字,造成数据包摘要列表中的显示空间的浪费。具体设置方法如下图:2。根据应用场景选择时间列的显示格式。默认情况下,以抓取到的第一个数据包的时间为参考点,后续的数据包的抓取时间都是相对开始抓包(第一个)的时点计算的。但是在某些场景中,需要将显示格式调整为:与上一个抓取到的数据包的时间差,也就是相邻2个数据包的抓包时间间隔。我们知道,某些网络应用,如即时通信,会议软件的视频,音频流量等,对于数据包的连续发送或接收时间间隔,非常敏感,如果相邻2个或多个包的间隔时间太长,就会造成应用的画面和声音延迟,一个更明显的例子是网络游戏的“卡”现象,由于收发包的间隔过长导致声音与画面的不一致和连续性问题。(通常与两端通信链路的负载和其中路由器的负载过高,导致丢包而引发的 TCP 分段重传有关)这个时候,显示时间间隔就非常有用,可以对当前网络的稳定性,流畅性进行快速的检视,具体配置方法如下图:3。修改并导出 wireshark 的默认数据包着色识别规则。通过数据包着色功能,用户可以迅速定位感兴趣的数据包分析,但是默认的着色规则太复杂,导致启用色彩识别时,一个包列表中显示“五颜六色”的信息,分散了我们的注意力,通常情况,我们仅对一种或两种类型的数据包感兴趣,或者进一步讲,我们每次只需要标识一种或两种类型的数据包颜色,这就需要修改其默认着色规则,具体配置方法参考下图:依序选择菜单栏的“View”,“Coloring Rules”,打开配色规则对话框:4。自定义数据包列表的显示列。默认的显示列从左至右依序为:数据帧编号,抓取时间,源地址,目标地址,协议,数据包(帧)长度,摘要信息。在实战场景中,这些列提供的信息可能不够,例如,我想要快速浏览每个包的 IP 分组头部的生存期(TTL)字段值,而且不用在每个包的详细结构窗口(packet details)中查找该字段,以便节省时间,可以按照下图操作:依序选择菜单栏的“Edit”,“Preferences”,打开首选项对话框:5。根据实际需求配置 wireshark 的名称解析功能。依序选择菜单栏的“Edit”,“Preferences”,切换到首选项对话框中的“Name Resolution”标签,参考下图解说进行配置:通常只需要保持默认的不解析链路层,网络层地址以及传输层端口号即可,但是有些时候就需要开启相应的解析功能,还是那句老话:具体情况具体分析。上图中没有解释到的名称解析剩余的配置选项部分,各位可以自行研究。6。隐藏 wireshark 主用户界面的数据包字节窗口(Packet Btyes)默认的用户界面布局中,窗口被分隔成为3部分:数据包列表,数据包结构(详情),以及数据包字节,后者以16进制的字节显示数据包内容,通常是我们不必关心的,除非你有某种特殊的需求要修改原始的数据包;否则可以隐藏字节窗口,释放额外的显示空间。依序选择“View”,取消勾选“Packet Bytes”即可。7。wireshark 中与 IPv4 协议相关的配置参数配置各种协议的参数,实际上就是改变 wireshark 对该协议数据包的“捕获”与“呈现”方式。要配置 IPv4 协议,依序选择菜单栏的“Edit”,“Preferences”,展开首选项对话框中的“Protocols”标签,定位到“IPv4”子标签。参考下图解说进行配置:下面来比较一下,对于同一个数据包的 IP 分组头部的 ToS 字段,wireshark 用旧的服务质量标准(服务类型)与用新的服务质量标准(即差异化/区分 服务)解析之间的区别,可以看出,两者仅是对这个占一字节的头部字段中,每个比特位的解释不同而已:8。wireshark 中与 TCP 协议相关的配置参数要配置 TCP 协议,依序选择菜单栏的“Edit”,“Preferences”,展开首选项对话框中的“Protocols”标签,定位到“TCP”子标签。参考下图解说进行配置:(由于 TCP 协议规范相当复杂,而且各种操作系统有其不同的实现,下面的每个选项不一定在所有系统上都会产生描述中预期的结果,并且这里仅对一些重要,常见的 TCP 协议特性相关的选项配置进行说明,剩余的各位可以自行研究,理想情况下,在阅读完《TCP/IP详解》丛书后,应该能了解下图中绝大多数的配置参数的含义)2023-07-22 13:06:102
什么车要求加98号汽油
什么车要加98号汽油?下面就让我们一起来了解一下吧:加98号汽油的车主要有:1、发动机压缩比为10或以上的车辆。2、发动机复杂、电子系统复杂的豪华车、大功率跑车。3、汽车油箱盖上标有“请加95号以上车用汽油”的车辆。其中加98号汽油的豪车有布加迪威航、兰博基尼AventadorSVJ、宾利飞驰、迈凯伦600LT、法拉利458、奔驰G级(进口)、迈凯伦P1、保时捷918 Spdyer、新款福特GT、阿斯顿马丁ONE77、帕加尼ZONDAR等。这些车辆的发动机压缩比通常都大于10.0以上,对于汽油的要求比较高,因此就需要使用标号为98的汽油。需要注意的是,车主给车加油的时候,最好直接到正规、大型的加油站进行加油,虽然这些地方油费会稍微贵一点,但是对于车辆有很好的保护效果。因为若是选择到小型的加油站进行加油,虽然油费比较便宜,但是很容易添加到质量劣质的油,而这对于车辆的影响是很大的,很容易造成发动机严重积碳的问题。以上就是小编的分享了,希望能够帮助到大家。2023-07-22 13:06:171
求小时候看过的一个国产动画片 记忆中好像是一条全白的小鲤鱼 努力冲过激流瀑布 变成七彩鱼...
小鲤鱼历险记1958年12月美影摄制完成。故事讲述了一群勇敢的小鲤鱼听鲤鱼奶奶讲了中国古代就有鲤鱼跃入龙门化为龙的传说之后,一心寻找龙门,不畏艰难困苦,在勇敢奋斗中学会了迎战各种困难的本领,经过顽强拼搏,齐心协力,最终跃入理想的家园,看到了美丽的景色,成为世界上最幸福的鱼。 它们游过大江和急流,克服重重困难,最后来到了一个宏伟的水库。这儿堤坝高筑, 水急浪高,它们都非常高兴,以为这就是奶奶说的龙门了。 可是小鲤鱼们 谁也跳不过去,一次又一次地被急流冲了下来。最后黑鲤鱼想出了一个办法,让小鲤鱼们一个弹一个地跳了过去。 到了水库那边,壮美的现代化建设使它们惊呆了。只见堤坝上灯火辉 煌,工厂林立,高楼冲天,汽车飞驰 。它们向燕子打听这是什么地方。燕 子告诉它们,这儿是龙门水库。 小鲤鱼们真以为跳过龙门了,高兴地请燕 子捎个信回去:龙门真好,让奶奶也到这里来。2023-07-22 13:06:254
我想要“Eric”出演的所有MV
Shinhwa - Once in a lifetimehttp://www.tudou.com/programs/view/QhUNKbMAwMA/Shinhwa - Honestyhttp://www.tudou.com/programs/view/cVvxvn71pXE/Shinhwa - 消除岁月的痕迹+天生缘分http://www.tudou.com/programs/view/izmQKkdqgLY/Shinhwa - Young gunzhttp://www.tudou.com/programs/view/jobG9FO2oS4/Shinhwa - There is a sun in my heartshttp://www.tudou.com/programs/view/H2fObr6YbDI/Shinhwa - The Snowy Nighthttp://www.tudou.com/programs/view/pRME6u160Zg/Shinhwa - 祈祷http://www.tudou.com/programs/view/i7ISAmj9G8Y/[剧情类]Shinhwa - Angelhttp://www.tudou.com/programs/view/kO2eNAqNazc/Shinhwa - Throw My Fisthttp://www.tudou.com/programs/view/K0WERM_k82M/Shinhwa - Runhttp://www.tudou.com/programs/view/QFazRach3D4/Shinhwa - 恋魂千日http://www.tudou.com/programs/view/iVoiGZmUFFA/Shinhwa - Yo!http://www.tudou.com/programs/view/60qh0aKJ7us/Shinhwa - All Your Dreamshttp://www.tudou.com/programs/view/3XgBW4aBWH4/申彗星&Lyn - 爱情...之后http://www.tudou.com/programs/view/D5r_95GYZTo/M - Sweet Soundhttp://www.tudou.com/programs/view/kz6t622aH7c/李孝利&Eric - Anyclubhttp://www.tudou.com/programs/view/krsLNHsA_20/李孝利 - Anymotion(Feat.Eric)http://www.tudou.com/programs/view/SIDhjPlkVuE/[搞笑类]Shinhwa - ub108uc758 uacc1uc5d0uc11c(Forever With You)Jumphttp://www.tudou.com/programs/view/5Dp3I2ucet4/[舞蹈类]Shinhwa - ub108uc758 uacb0ud63cuc2dd(Wedding)http://www.tudou.com/programs/view/SCE-GZp-cUQ/Shinhwa - Brand newhttp://www.tudou.com/programs/view/LBeFDTKevI8/Shinhwa - Wild eyeshttp://www.tudou.com/programs/view/hQTpC1fH3Ro/Shinhwa - Hey, Come On!http://www.tudou.com/programs/view/vIx3nIfNXmg/Shinhwa - Only Onehttp://www.tudou.com/programs/view/2a-19TauWqY/Shinhwa - Perfect manhttp://www.tudou.com/programs/view/-uiloMC8TWY/Shinhwa - T.O.P(Twinkling Of Paradise)http://www.tudou.com/programs/view/GthMooZmkmk/Shinhwa - Wedding marchhttp://www.tudou.com/programs/view/B81AB2QhHdA/Shinhwa - 终结者http://www.tudou.com/programs/view/KR31X_j-K4I/Shinhwa - Go!海滩http://www.tudou.com/programs/view/iPNfFn6_nj4/神话 - Herohttp://www.tudou.com/programs/view/-T2tv1MZRNg/[记录类]Shinhwa - First Lovehttp://www.tudou.com/programs/view/PzCTTBqgK2Y/Shinhwa - Falling in lovehttp://www.tudou.com/programs/view/-abm7ngYn0U/Shinhwa - I Pray 4 Uhttp://www.tudou.com/programs/view/NieGtMid9gw/Shinhwa - 2gether 4everhttp://www.tudou.com/programs/view/EzH5D-dIt0M/Shinhwa - How do I sayhttp://www.tudou.com/programs/view/7-Oi_bpFbQU/Shinhwa - 很漂亮嘛http://www.tudou.com/programs/view/spDyr0GzB6A/神话 - Hey, Dude!http://www.tudou.com/programs/view/hQSqvbawjGI/Andy - Never Give Up(Feat.Eric,Dongwan,Minwoo)http://www.tudou.com/programs/view/BNre7IxuMok/2023-07-22 13:07:255