Memcache文本协议中文版

Memcache 协议 (译)

协议

---------------------------------------------------------

   Memcache客户端通过TCP连接与服务器进行通信(UDP接口也是可用的,在下文的"UDP协议"部分有详细描述)。Memcache服务器在一个(可配置的)端口上监听;客户端连接该端口,发送命令到服务器,读取响应,最后关闭连接。

   终止会话是没有必要发送命令的:如果不需要该连接,客户端任何时候都可以将其关闭。但即便是这样,客户端最好还是缓存连接,而不是在要存取数据时再打开连
接。这是由于memcache被特意设计成可以处理大量(数百个,需要的话可以上千个)打开的连接。缓存这些连接会减少建立TCP连接所带来的开销(相对
于此,在服务器端建立一个新连接的准备工作所带来的开销,可以忽略不计)。

   在Memcache协议中发送的数据分两种:文本行和非结构数据(unstructured
data)。由客户端发送的命令和服务器端的响应使用的是文本行。非结构数据用于客户端存储数据的时候。服务器会将接收到的非结构数据,
以字节流的形式原样返回。服务器并不关心在非结构数据中的字节序的问题。对于非结构数据中的字符没有任何限制,但数据的读取方(客户端或服务器)需要通过
一个文本行数据,得知正在传输的数据块的精确长度。

   文本行总是以/r/n结束,非结构数据也总以/r/n结束, 但/r, /n或者其它的8位字符也可能出现在数据中,所以当客户端从服务器读取数据时,必须使用所提供数据长度来决定数据何时结束,而不是基于/r/n在数据块的结束处。

键(Keys)
在Memcache中存储的数据是以键来标识的。键是一个全局唯一的文本串标识,客户端通过经来存取所需的数据。当前,键的长度限制是250个字符(当然,通常来说客户端并不需要使用那么长的键)。键不参包含控制字符和空格

命令(Commands)
   存储命令(有6个: "set", "add" ,"replace", "append", "prepend" 和 "cas")要求服务器存储以键标识的数据。客户端发送一个命令行,然后是一个数据块;之后客户端等待一个表示成功/失败的响应行。

   提取命令(有两个:"get"和"gets")
要求服务器提取一个键集(一次请求一个或多个键)的数据。客户端发送一个包含所有请求键的命令行。对于每一个数据项,服务器查找到后,发送一个响应行到客
户端,内含该数据项的信息,后跟该数据项的数据,直到服务器发送了一个"END"响应行,表示整个过程的结束。

   命令行总是以命令行开头,后跟以空格分隔的参数(如果有的话)。命令行是小写的并且大小写敏感

过期时限(Expiration times)
---------------------------------------------------------

   客户端发送给服务器的某些命令可以带有(一个数据项或一个客户端请求操作的)过期时限信息。在这些情况下,发送的实际值可以是Unix时间(自1970年1月1日至今的秒数,32位值),或是从当前起的秒数。在后一种情况下,秒数不能超过60*60*24*30(30天的秒数)。如果客户端发送的数值超过此值,服务器会认为它是一个Unix时间值,而不是距当前时间的偏移值。

出错字符串(Error strings)
---------------------------------------------------------

客户端发送的每一个命令,服务器可能会发送一个出错字符串作为响应。这些出错字符串有三种类型:

"ERROR/r/n"
表示客户端发送了一个不存在的命令

"CLIENT_ERROR <error>/r/n"
表示客户端的输入行出现了某些错误,例如,输入行没有遵从协议。<error>是一个可读的错误描述。

"SERVER_ERROR <error>/r/n"
表示服务器的一些错误导致服务器不能执行该命令。<error>是一个可读的出错描述字符串。如果出现了使服务器无法继续为客户端服务的服务器错误(这一般不应发生),服务器在发送完错误字符串后会关闭连接。这是服务器端关闭客户端连接的唯一情况

在以下的每个命令描述中,错误行不会再次提及,但客户端必须考虑到它们可能会出现

存储命令
---------------------------------------------------------
首先,客户端发送一个类似这样的命令行:

<command name>  <key> <flags> <exptime> <bytes> [noreply]/r/n
cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]/r/n
<command> 有 "set ", "add ", "replace", "append" 和 "prepend":

"set" 存储这个数据。
"add" 只在服务器没有存储该Key的数据的情况下存储这个数据。
"replace" 只在服务器存储了该Key的数据的情况下存储这个数据。
"append" 为一个已存在的Key的数据尾部追加该部分的数据。
"prepend" 为一个已存在的Key的数据在头部添加该部分的数据。

append和prepend命令不接受flag和exptime,它们更新已存数据,而忽略新的flag和exptime设置。
cas是一个检查并设置的操作,意思是"存储这个数据,但只有在自我上次取得该数据以来没有人再更新该数据的情况下才存储"。

<key>:客户端要求存储的数据键值
<flags>:一个可选的16位无符串整数(以十进制形式写入),服务器会在取回该数据项时一同原样返回。客户端可以将其用作一个位存储域来存储一些数据特征信息。这个域对服务器是透明的。注意在memcached 1.2.1和更高版本,flags可以是32位的,而不是16位,不过你或许会限制使用16位来兼容旧版本。
<exptime>:过期时间。如果设置为0,
则该数据项永不过期(尽管如此,它还是可能从缓存中被删除掉,以为其它数据项腾出空间)。如果它不为0(或者是Unix
时间,或者是相当于当前时间的偏移值), 它可以保证在过期时间到后,客户端不会查询到该数据(用服务器时间度量)。
<bytes>:后跟数据的字节长度,没有计算作为分隔符的/r/n. <bytes>可能为0 (在这种情况下,它后跟一个空的数据块)。
<cas unique> 是一个与已存数据条目相关的全局唯一的64位数。客户端应该使用"gets"命令返回的该值来进行"cas"更新操作。
"noreply"  可选项指示服务器不要回送响应。注意:如果请求行格式错误,服务器不一定能可靠地解析"noreply"选项。在此种情况下,它可能会发送错误信息给客户端,如果客户端没有读取该信息的话会带来问题。客户端应该只构造合法的请求。
在此行后,客户端发送数据块。
<data block>
<data block>是一个任意的8位字节数据块,长度为前面一行所指定的数据长度<bytes>。

在发送了该命令行和数据块后,客户端等待可能的响应:
"STORED/r/n",  指示成功
"NOT_STORED/r/n" 指示数据没有被存储,但不是出错。这通常是表示"add"或"replace"的条件没有满足。
"EXIST/r/n" 指示使用"cas"命令所要更新的数据自你上次取过后已经过修改。
"NO_FOUND/r/n" 指示你用"cas"命令要修改的数据并不存在。

数据提取命令
---------------------------------------------------------
数据提取命令有"get"和"gets",如:
get <key>*/r/n
gets <key>*/r/n
<key>* 表示一个或多个由空格分隔的key串
在这个命令后,客户端期待零个或多个数据项,每个接受到的数据项是一个文本行,后跟数据块。当所有数据项传送完后,服务器发送一个"END/r/n"指示响应的终止。

每一个由服务器发送的数据项如下所示:
VALUE <key> <flags> <bytes> [<cas unique>]/r/n
<data block>/r/n
<key>: 数据项的Key值
<flags>:由存储命令设置的flags
<bytes>:是后跟数据块的长度,没有包括作为分隔符的/r/n
<cas unique>:是一个64位整数,唯一标识了一个特定的数据项。
<data block>:数据项的数据
如果有某些在请求中出现的Key没有服务器没有在数据项列表中回送,表示服务器没有这些Key的数据项(因为它们没有被存储过,或者删除以为其它数据项腾出空间,或者过期了,又或者被客户端的delete 操作删除了)。

删除
---------------------------------------------------------

delete命令允许显式删除数据项:
delete <key> [noreply]/r/n
<key>:客户端要求服务器删除的数据项的key值
"norply":可选参数指示服务器不要回送响应。参见存储命令中对格式错误请求的说明。
这个命令的响应行可能是以下的一个:
"DELETED/r/n"  指示成功
"NOT_FOUND/r/n" 指示Key所指的数据项不存在。
参见下文的"flush_all"命令,该命令使所有数据项立即无效。

递增/递减
---------------------------------------------------------
incr 和decr命令用来原地改变某些数据项,递增或递减其值。数据项的数据被看作是64位的无符号十进制整数。如果当前的数据值不能转换为这样一种表示,则 incr/decr命令返回一个错误(memcached <= 1.2.6将这种伪值(bogus value)看成是0, 这会导致混乱)。另外,这个数据项必须已存在使得 incr/decr能工作。这些命令不会假设一个不存在的key数值为0,而是会失败。

客户端发送的命令行如下:
incr <key> <value> [noreply]/r/n

desc <key> <value> [noreply]/r/n
<key>:客户端想改变的数据项的key值
<value>:客户端要对数据项递增/递减的值。它是一个64位的无符号十进制整数。
"norply":可选参数指示服务器不要回送响应。参见存储命令中对格式错误请求的说明。
响应可能是以下之一:
"NOT_FOUND/r/n" 指示这个数据项找不到。
"<value>/r/n", 其中<value>是这个数据项在经过递增/递减操作后的新值。

注意: 如果"desc"命令捕获到下溢异常:如果客户端尝试将一个值减少到小于0, 新值将会是0. "incr"命令的上溢异常会经64位回绕(wrap around the 64 bit mark)。【译者注:即 (原值+value) & 0xffffffffffffffff】.

同样要注意的是减少一个数值使得其实际长度减少了,但并不保证其返回长度值的减少。这个数值可能会在尾部加上空格,但这纯属一个实现上的优化手段,所以你不能依赖它。

统计
---------------------------------------------------------
"stats" 命令用于查询服务器维护的一些统计数据和内部数据。它有两种形式。不用参数:
stats/r/n
它使服务器输出常规统计和设置,下文中有说明。 另一种形式带有参数:
stats <args>/r/n
根据 <args> ,服务器会返回不同的内部数据。参数的类型和发送的数据没有在这个版本的协议中说明,这有利于memcache开发者(对代码)进行更改。

常规统计
当接收到不带参数的"stats"命令后, 服务器发送若干行数据,如下所示:
STAT <name> <value>/r/n
服务器用以下行作为终结:
END/r/n
在每一行统计数据中, <name>是统计项的名称,<value>是统计值。在以下的列表中有对"stats"命令响应的所有统计名称,和这个统计项的类型,以及这个值的意义。

在下面的类型列中,"32u" 表示32位无符号整数,"64u"表示64位无符号整数,"32u.32.u"表示两个由分号分隔的32位无符号整数(当作是浮点数)。

名称

类型

含义

pid

32u

服务器进程的id

uptime

32u

自服务器启动以来的秒数

time

32u

服务器上的UNIX时间

version

string

服务器的版本

pointer_size

32

主机操作系统的默认指针长度(一般是3264)

rusage_user

32u.32u

进程用户空间的累计时长(秒:微秒)

rusage_system

32u.32u

进程内核空间的累计时长

(秒:微秒)

curr_items

32u

当前存储的数据项数目

total_items

32u

自服务器启动以来存储的数据项总数(译者注:其实就是成功执行存储命令(STORED)的计数)

bytes

64u

当前用于存储数据项所用的字节数

curr_connections

32u

打开的连接数

total_connections

32u

自服务器启动以来的打开的连接数

connection_structures

32u

服务器分配的连接结构的数目

cmd_get

64u

提取命令的累计数目

cmd_set

64u

存储命令的累计数目(译者注:也包括NOT_STORED)

get_hits

64u

请求并找到的数据项的数目

get_missed

64u

请求但找不到的数据项的数目

delete_missed

64u

删除无效key的请求数

delete_hits

64u

使得数据项删除的删除请求数目

incr_missed

64u

没有找到keyincr请求数

incr_hits

64u

成功的incr请求数

decr_misses

64u

没有找到keydecr请求数

decr_hits

64u

成功的decr请求数

cas_misses

64u

没有找到keyCAS请求数

cas_hits

64u

成功CAS请求数

cas_badval

64u

key存在但CAS值不匹配的CAS请求的数目

auth_cmds

64u

认证命令处理的次数,包括成功和失败

auth_errors

64u

身份认证失败的数目

evictions

64u

从缓存中移除数据项来为新数据项腾出空间的数目

reclaimed

64u

利用一个过期数据条目来存储新数据条目的数目

bytes_read

64u

本服务器从网络中读取的字节总数

bytes_written

64u

本服务器发送到网络的字节总数

limit_maxbytes

32u

本服务器允许使用的内存字节数

threads

64u

请求的工作线程数(参见 doc/threads.txt

conn_yields

64u

由于达到-R选项指定数目的限制,一个连接的操作主动放弃让给另一个连接的数目

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

设置项统计

警告:这部分所描述的统计项以后可能会有变更。
带有"settings" 的 "stats"命令返回memcached的设置细节。这基本上就是由进程命令行的选项所组成的。注意这里不保证统计项的次序,列表也不一定是详尽的。除此之外,它的返回结果与其它的stats命令是一样的。

名称

类型

含义

maxbytes

size_t

缓存中的最大字节数

maxconns

32

最大的并发客户端数

tcpport

32

TCP监听端口

udpport

32

UDP监听端口

inter

string

监听地址

verbosity

32

0=, 1=部分, 2=很多

oldest

32u

最老对象的时长

evictions

on/off

当为off时,LRU清除策略禁用

domain_socket

string

Unix socket的文件路径

umask

32 (oct)

Unix socket 的屏蔽字

growth_factor

float

Chunk大小的增长因子

chunk_size

32

key+ value + flag分配的最小空间

num_threads

32

线程数(包括分派线程)

stat_key_prefix

char

统计前缀分隔符

detail_enabled

bool

如果为真,启用统计细节

reqs_per_event

32

在一个事件处理里的最大IO请求数

cas_enabled

bool

当为假时,CAS会被禁用

tcp_backlog

32

TCP 监听backlog

auth_enabled_sasl

yes/no

是否使用SASL


数据项统计
警告: 这部分所描述的统计项以后可能会有变更。
带有“items”选项的"stats"命令返回每个slab class的item存储信息。返回的数据格式:
STAT items:<slabclass>:<stat> <value>/r/n
服务器使用以下行终止这个列表:
END/r/n
<slabclass>和 "stats slabs"命令使用的类id是一致的。"stats slabs"描述内存的大小和使用率, "stats items"描述更上一层的信息。

以下的项的值被定义为

名称

含义

number

当前存储在这个class中的item数.过期的item不会自动排除

age

在LRU中最老的item

evicted

不得不从LRU中移除未过期item的次数 

evicted_nonzero

过期时间设置不为0,但不得不从LRU中称除该未过期的item的次数

evicted_time

自最后一次清除过期item起所经历的秒数。用这个来判断数据被移除的最近时间

outofmemory

slab class为新item分配空间失败的次数。这意味着你运行时带上了-M或者移除操作失败

tailrepairs

自解决slab 引用泄漏问题的次数。如果这个计数器增长很多,请将你的情况告诉开发者

reclaimed

用一个过期的数据条目存储新一个数据条目的次数

注意仅仅会显示存在的slab的信息,因此对于空的缓存会返回空集。

Item大小统计
警告: 这部分所描述的统计项以后可能会有变更。
带有"sizes"选项的"stats"命令返回缓存中全部数据的一般大小和数目。
警告:这个命令会对缓存上锁!它会遍历每一个数据项并检查其大小。
尽管这个操作很快,但如果你有很多数据项,你会阻止其它的请求几秒。
数据的返回格式如下所示:
<size> <count>/r/n
服务器以下面的行来终止列表:
END/r/n
"size"是数据项的大约大小,在32字节内
"count"是在该32字节范围的数据项的数目。

这使我们了解到对于所有的item,是否都有一个相应32字节长度内的slab class。你可以以此来决定如何调整slab增长因子来减少内存开销。例如:如果大部分的item都小于200字节,在小容量的范围中产生更多的 class可以使得item在slab中的分配更紧凑。

Slab 统计
警告: 这部分所描述的统计项以后可能会有变更。
带有"slabs"选项的"stats"命令返回在运行期memcache建立的每一个slab的信息。这包括每个slab的信息和一些总计信息。返回数据的格式为:

STAT <slabclass>:<stat> <value>/r/n
STAT <stat> <value>/r/n
服务器以下面的行终止列表:
END/r/n

名称

含义

chunk_size

每一个chunk占用的空间。一个item会使用一个合适大小的chunk来存储

chunk_per_page

 一个页中有多少个chunk.一个页的大小默认是小于等于1M。Slab在页中分配,然后分割成chunk

total_pages

为该slab class分配的页数

total_chunks

为该slab class分配的chunk数

get_hits

在该class中数据提取请求(命中)的总数

cmd_set

在该class 中数据存储请求的总数

delete_hits

在该class 中成功删除数据的总数

incr_hits

在该class中递增操作的总数

decr_hits 在该class中递减操作的总数
cas_hits 在该class中CAS命令更新的总数
cas_badval 在该class中因不匹配的CAS id而失败而导致更新失败的CAS命令的总数
used_chunks 有多少个chunk用于分配item
free_chunks 还没有用于item分配,或因删除变空闲的chunk数目
free_chunks_end 在最近分配的Page尾部空闲chunk的数目
mem_requested 在该slab 中申请分配的内存字节数
active_slabs slab class分配的总数
total_malloced 分配的slab page内存量

Item存储于与大于等于其大小的slab中。mem_request显示在一个slab中所有内存请求的总大小(total_chunks * chunk_size)- mem_requestd 显示该slab浪费的内存数。如果你看到有大量的浪费,考虑调slab 增长因子。

其它命令
---------------------------------------------------------
"flush_all" 命令带有一个可选的数目参数。它总是成功,服务器返回"OK/r/n"作为响应(除非在最后一个参数中指定了"noreply")。它的作用是使得所有现存的item立即无效(默认)或者在一个指定的时间后无效。在失效操作后,不会有item作为响应返回给数据提取命令(除非它在flush_all操作后又在相同的key中存储了一次)。flush_all实际上并没有释放item占用的所有的内存,它们会逐渐被用于存储新的item。flush_all 最精确的定义如下:它使得所有最后更新时间小于flush_all指定的时间的item在提取操作中被忽略。

带延迟的flush_all的目的在于,当你设置了一个memcache服务池,而且要清除所有内容,你可以选择不要同时重置所有的memcache服务
(例如这会使所有客户端原本从memcache中取得的数据,现在要由数据库重新生成而导致数据库负担的突然加重)。
这个延迟选项允许你以10秒的间隔来重置它们(例如,第一个10秒后,第二个20秒后,第三个......)
"version"命令没有参数:
version/r/n
在响应中,服务器返回:
"VERSION <version>/r/n", 其中<version>该服务器的版本字符串。
"verbosity"是一个带一个数目参数的命令。它总是成功,服务器返回"OK/r/n"作为响应(除非在最后一个参数指定了noreply).它的作用是设置日志输出的显示级别。
"quit"命令没有任何参数:
quit/r/n

当收到该命令时, 服务器端关闭连接。但客户端也可以在它不需要该连接时将其简单地关闭,不用发送任何命令。

UDP协议
---------------------------------------------------------
对于客户端的数目非常多的情况下,TCP连接数限制了扩展性。也有一个基于UDP的接口。UDP接口不提供可靠传输, 所以只应用于不需要保证成功的操作中;典型的情况是在"get"请求时,一个丢失或不完整的响应会简单地被认为是缓存不命中。

每一个UDP数据报包含一个简单的帧头,后跟与上述TCP协议一样格式的数据。在当前的实现中,请求必须在一个UDP数据报中,但响应可以跨多个数据报
(一般仅用于在多个key的"get"和"set"请求中。考虑到可靠性,这两种请求其实还是用TCP传输比较合适)。

帧头是8个字节的长度,如下所示(所有的值都是16位整数,网络字节序,高位在前)

0-1  请求ID
2-3  序列号
4-5  该消息包含的数据报数目
6-7  保留字段,必须为0

请求ID由客户端提供,典型是使用一个基于某个随机数的自增序列,但客户端可以自由决定请求ID。服务器的响应中会包含与请求相同的ID。客户端使用请求
ID来区分不同来自同一个服务器的对不同请求的响应。那些带有不能识别的请求ID的响应可能是对之前请求的延迟响应,应该丢弃。

序列号是范围是从0到n-1, 这里的n是该消息的数据报总数。客户端应该将数据报的负载部分以序列号顺序进行连接。合并字节流的结果与TCP协议(包含结束符/r/n)的格式一致。

摘自: http://www.cnblogs.com/warriorlee/archive/2011/09/18/2180661.html

发表在 article | 标签为 | Memcache文本协议中文版已关闭评论

Windows Socket Connections

最大TCP连接数

[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip
\Parameters] TcpNumConnections = 0x00fffffe (Default = 16,777,214)

以上注册表信息配置单机的最大允许的TCP连接数,默认为 16M。这个数值看似很大,这个并不是限制最大连接数的唯一条件,还有其他条件会限制到TCP 连接的最大连接数。

最大动态端口数

TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 个Socket 连接。我们可以修改如下注册表来调整这个动态端口的范围

[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] MaxUserPort = 5000 (Default = 5000, Max = 65534)

最大TCB 数量

系统为每个TCP 连接分配一个TCP 控制块(TCP control block or
TCB),这个控制块用于缓存TCP连接的一些参数,每个TCB需要分配 0.5 KB的pagepool 和 0.5KB
的Non-pagepool,也就说,每个TCP连接会占用 1KB 的系统内存。

系统的最大TCB数量由如下注册表设置决定

[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip
\Parameters] MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro =
1000, Srv=2000)

非Server版本,MaxFreeTcbs 的默认值为1000 (64M 以上物理内存)

Server 版本,这个的默认值为 2000。

也就是说,默认情况下,Server 版本最多同时可以建立并保持2000个TCP 连接。

最大TCB Hash table 数量

TCB 是通过Hash table 来管理的,下面注册表设置决定了这个Hash table 的大小

HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip
\Parameters] MaxHashTableSize = 512 (Default = 512, Range = 64-65536)

这个值指明分配 pagepool 内存的数量,也就是说,如果MaxFreeTcbs = 1000 , 则 pagepool 的内存数量为 500KB

那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP 连接用时就越少。这个值必须是2的幂,且最大为65536.

TcpTimedWaitDelay
微軟建議最低可設定續存時間為 30 秒,而且也提到設定 30 秒應該不會出問題,因此我幾乎都只設定 30 秒而已:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e

参考:

IBM WebSphere Voice Server 在windows server 2003 下的典型配置

MaxUserPort = 65534 (Decimal)

MaxHashTableSize = 65536 (Decimal)

MaxFreeTcbs = 16000 (Decimal)

这里 MaxHashTableSize 被配置为比MaxFreeTcbs 大4倍,这样可以大大增加TCP建立的速度。

Links:
http://www.xiaobo.li/network/538.html

发表在 network | 标签为 | Windows Socket Connections已关闭评论

vmware linux copy network

linux copy

/etc/udev/rules.d/   

              70-persistent-net.rules

发表在 linux | vmware linux copy network已关闭评论

WARNING overcommit_memory , vm.overcommit_memory=1

来源:http://m.blog.csdn.net/article/details?id=50864933

 

Redis 3.0.7版本启动时出现警告的解决办法

7283:M 12 Mar 12:13:33.749 # WARNING: The
TCP backlog setting of 511 cannot be enforced because
/proc/sys/net/core/somaxconn is set to the lower value of 128.

7283:M 12 Mar 12:13:33.749 # Server started, Redis version 3.0.7
7283:M 12 Mar 12:13:33.749 # WARNING
overcommit_memory is set to 0! Background save may fail under low memory
condition. To fix this issue add 'vm.overcommit_memory = 1' to
/etc/sysctl.conf and then reboot or run the command 'sysctl
vm.overcommit_memory=1' for this to take effect.

7283:M 12 Mar 12:13:33.749 * The server is now ready to accept connections on port 6379

第1个警告(WARNING: The TCP backlog setting of 511 ......)解决办法
方法1: 临时设置生效: sysctl -w net.core.somaxconn = 1024
方法2: 永久生效: 修改/etc/sysctl.conf文件,增加一行
net.core.somaxconn= 1024
然后执行命令
sysctl -p

补充:
net.core.somaxconn是linux中的一个kernel参数,表示socket监听(listen)的backlog上限。
backlog是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。
而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。
当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
所以说net.core.somaxconn限制了接收新 TCP 连接侦听队列的大小。
对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。

第2个警告(WARNING overcommit_memory is set to 0! ......)同样也有两个解决办法
方法1: 临时设置生效: sysctl -w vm.overcommit_memory = 1
方法2: 永久生效: 修改/etc/sysctl.conf文件,增加一行
vm.overcommit_memory = 1
然后执行命令
sysctl -p

补充: 
overcommit_memory参数说明:
设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
注意:redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存
为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里
比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。

 

发表在 cache | WARNING overcommit_memory , vm.overcommit_memory=1已关闭评论

Google Chrome VIEW HTTP/2

Google Chrome
 
Google Chrome 中在开发者工具中看不到 HTTP/2 指示器。
 Chrome 用特殊的地址
chrome://net-internals/#http2 给出了相关信息。

chrome://net-internals/#events&q=id:336

发表在 technologys | Google Chrome VIEW HTTP/2已关闭评论

windows 7/windows 2008/ Apple / ATS

配置windows7/windows 2008 支持ats
 

苹果提出的ATS强制标准:

部署服务器SSL证书,启用HTTPS加密连接。但需满足以下ATS默认的安全要求

1、ATS要求服务器必须支持传输层安全(TLS)协议1.2以上版本;

2、通讯中的加密套件配置要求支持列出的正向保密;(以下Apple官方文档列表)

3、数字证书必须使用SHA256或者更高级的签名哈希算法签名,并且保证密钥是2048位及以上的RSA密钥或者256位及以上的ECC算法。

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

 

DSA算法要求使用以下加密套件:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

 

 

支持ATS标准:

1、购买苹果信任CA所颁发的证书;

2、部署https网站的web服务器也有一定要求,如下:

Apache,Nginx要求关联的openssl版本在1.0.1+,这样网站才支持TLS1.2,同时您需要对证书相关参数做一定调整:

Apache:

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;

Nginx:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;

Tomcat要求环境 tomcat7+和JDK1.7+,配置参考如下:

     <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
     keystoreFile="keystore/domain.jks"  keystorePass="证书密码"
               clientAuth="false" sslProtocol="TLS"
               ciphers="TLS_RSA_WITH_AES_128_GCM_SHA256,
                        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                        TLS_RSA_WITH_AES_128_CBC_SHA,
                        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
                        TLS_RSA_WITH_AES_128_CBC_SHA256,
                        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
                        SSL_RSA_WITH_3DES_EDE_CBC_SHA,
                        TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />

IIS 要求环境 windows server 2008 R2/IIS 7+

Apple Documents:

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW57

 Requirements for Connecting Using ATS

Windows 安全通告:
https://technet.microsoft.com/en-us/library/security/3042058.aspx

Microsoft Security Advisory 3042058
https://support.microsoft.com/en-us/help/3042058/microsoft-security-advisory-update-to-default-cipher-suite-priority-order-may-12,-2015

在安装3042058之前可能需要先确定安装了: KB3020369
https://support.microsoft.com/en-us/help/3020369/april-2015-servicing-stack-update-for-windows-7-and-windows-server-2008-r2
其它相关链接
https://support.microsoft.com/en-us/help/947821/fix-windows-update-errors-by-using-the-dism-or-system-update-readiness-tool
https://help.aliyun.com/knowledge_detail/48151.html

Cipher Suites Added by the Update

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

TLS_RSA_WITH_AES_256_GCM_SHA384

TLS_RSA_WITH_AES_128_GCM_SHA256

 

windows iis:

开启TLS 1.2

在Windows 2012中,缺省就已经开启了TLS 1.2,但在Windows 2008中缺省并没有开启TLS 1.2,所以需要我们通过修改注册表来启动TLS 1.2功能。

    点击“开始”—“运行”,输入 “Regedit”,点击OK.
    在注册表中寻找:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server
    如果在Protocols下没有“TLS 1.2”选项,请依次新建“TLS 1.2”和“Server”项。
    新建一个DWORD值,在名称中输入“Enabled”。
    双击这个值,在数值数据中,输入“1”。

调整IIS加密套件顺序

1.    Windows 2008在命令提示符下,键入 gpedit.msc,并按 Enter 键来启动“本地组策略编辑器”。
2.    依次展开“计算机配置”、“管理模板”、“网络”,然后单击“SSL 配置设置”。
3.    在“SSL 配置设置”下,单击“SSL 密码套件顺序”设置。
4.    在“SSL 密码套件顺序”窗口中,单击“已启用”。
5.    在选项窗格中,双击以突出显示“SSL 密码套件”字段的全部内容,然后使用以下加密套件替换其内容:

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_P256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_P384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA

发表在 windows | windows 7/windows 2008/ Apple / ATS已关闭评论

windows 7/windows 2008/ tls1.2 / .net

Disable RC2 RC4 And SSL 2.0

https://support.microsoft.com/en-us/help/245030/how-to-restrict-the-use-of-certain-cryptographic-algorithms-and-protocols-in-schannel.dll

 Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000

 Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 64/128]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 128/128]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 56/128]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 40/128]
"Enabled"=dword:00000000

Protocol

KEA

SYM (bit)

HSH (bit)

CipherSuite

TLS1.0

RSAKeyX

AES (128)

SHA1 (160)

TLS_RSA_WITH_AES_128_CBC_SHA    

SSL3.0

RSAKeyX

RC4 (128)

SHA1 (160)

SSL_RSA_WITH_RC4_128_SHA

SSL2.0

RSAKeyX

RC4 (128)

MD5 (128)

SSL_CK_RC4_128_WITH_MD5

TLS 1.2 and Microsoft.Net

Now lets focus on using TLS 1.2 in .Net world. We need to make sure that
the web sites are served via TLS 1.2 protocol and client apps which are
consuming the same need to support TLS 1.2. .Net is running on top of
operating system and mostly its windows. If host windows supports TLS
1.2 .Net can also support TLS 1.2 as it relies on schannel.dll1
The first task here is to make sure we are using the right tools and technologies.


TLS 1.2 and .Net Framework 4.5


.Net is also versioned. Versions below 4.5*doesn't know how to
communicate via TLS 1.2.In .Net 4.5 the TLS 1.2 is enabled
by default.
Simply compile our applications in ,Net 4.5 and we will get TLS 1.2
communication for our applications.


How to make .Net 4.0 app talk using TLS 1.2


Technically speaking just recompile existing older application to .Net
4.5 to get TLS 1.2 support. It sounds simple as everybody expecting that
there are no breaking changes in .Net 4.5 and our application will
function as is. But if we are serious about delivering quality software
we also need to test entire app in 4.5 before shipping. It really adds
cost.

Lets see if there are any ways to use TLS 1.2 by .Net 4.0 apps.

System.dll overwrite

When we install .Net 4.5 its basically adding changes on top of .Net
4.0. In other words the System.dll used for 4.0 apps will be overwritten
to 4.5 version of System.dll. So there are possibilities that .Net 4.0
apps will execute 4.5 code when they access functions in System.dll.
Which means if we have .Net 4.5 installed in the machine where our .Net
4.0 is running it can take advantage of TLS1.2. All our solutions below
are depending on this factor.
Below links explains the .Net versioning and overwriting.


1.Code change in 4.0 to use TLS 1.2

Now its the matter of changing the default protocol used by 4.0 to TLS
1.2. This can be done by forcefully changing the  protocol as below.

//SecurityProtocolType.Tls1.2;

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

 

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
| SecurityProtocolType.Tls11 
| SecurityProtocolType.Tls;

// comparable to modern browsers
var request = WebRequest.Create("https://www.howsmyssl.com/a/check");
var response = request.GetResponse(); 
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();


If we look at the SecurityProtocolType enum for .Net 4.0, we will not be able to see the TLS1.2. But in 4.5 we can see that. So .Net 4.0 will not compile if we use TLS1.2 enum value. But if we use the TLS1.2 enum number it will compile and at runtime since the .Net 4.0's System.dll is replaced with 4.5 the cast will work. 

 
Please note that this will fail if we are running the same app in a machine which don't have 4.5 installed. Recommended only for servers where its easy to manage the .Net version.


2.Registry change to force .Net 4.0 to use TLS 1.2

If we inspect the .Net 4.5 ServicePointManager source code we can see that the default protocol is depending on the below registry entry.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
    SchUseStrongCrypto to DWORD 1

The default value will be 0. Simply change this to 1 to get .Net 4.5
System.dll use TLS 1.2. Since our 4.0 application uses 4.5 System.dll
4.0 gets TLS 1.2 support.

http://stackoverflow.com/questions/28286086/default-securityprotocol-in-net-4-5


References

https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet#Client_.28Browser.29_Configuration
https://www.simple-talk.com/dotnet/.net-framework/tlsssl-and-.net-framework-4.0/
https://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx
https://istlsfastyet.com/
http://blogs.msdn.com/b/benjaminperkins/archive/2014/11/04/using-tls-1-2-with-wcf.aspx
http://blogs.msdn.com/b/benjaminperkins/archive/2011/10/07/secure-channel-compatibility-support-with-ssl-and-tls.aspx
http://www.dotnetnoob.com/2013/10/hardening-windows-server-20082012-and.html

TLS Cipher Suites in Windows 7
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767780%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 8
https://msdn.microsoft.com/en-us/library/windows/desktop/mt762882%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 8.1
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767781%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 10 v1507
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767769%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 10 v1511
https://msdn.microsoft.com/en-us/library/windows/desktop/mt767768%28v=vs.85%29.aspx
TLS Cipher Suites in Windows 10 v1567
https://msdn.microsoft.com/en-us/library/windows/desktop/mt490158%28v=vs.85%29.aspx

Tools

for .net framework 4.5
SSLTLSCheck.zip

点击查看原图

发表在 .net | windows 7/windows 2008/ tls1.2 / .net已关闭评论

nuget


下载地址:

命令行: http://nuget.codeplex.com/downloads/get/669083
命令行: http://nuget.org/downloads
图形窗: https://github.com/NuGetPackageExplorer

*.nuspec

Folder Description Action upon package install
tools Powershell scripts and programs accessible from the Package Manager Console Contents are copied to the project folder, and the tools folder is added to the PATH environment variable.
lib Assembly(.dll) files (.dll), documentation (.xml) files, and symbol (.pdb) files Assemblies are added as references; .xml and .pdb copied into project folders.
content Arbitrary files Contents are copied to the project root
build MSBuild .targets and .props files Automatically inserted into the project file (NuGet 2.x) or project.json.lock (NuGet 3.x).
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<!-- The identifier that must be unique within the hosting gallery -->
<id>Contoso.Utility.UsefulStuff</id>
<!-- The package version number that is used when resolving dependencies -->
<version>1.8.3.331</version>
<!-- Authors contain text that appears directly on the gallery -->
<authors>Dejana Tesic, Rajeev Dey</authors>
<!-- Owners are typically nuget.org identities that allow gallery
users to earily find other packages by the same owners.  -->
<owners>dejanatc, rjdey</owners>
<!-- License and project URLs provide links for the gallery -->
<licenseUrl>http://opensource.org/licenses/MS-PL</licenseUrl>
<projectUrl>http://github.com/contoso/UsefulStuff</projectUrl>
<!-- The icon is used in Visual Studio's package manager UI -->
<iconUrl>http://github.com/contoso/UsefulStuff/nuget_icon.png</iconUrl>
<!-- If true, this value prompts the user to accept the license when
installing the package. -->
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<!-- Any details about this particular release -->
<releaseNotes>Bug fixes and performance improvements</releaseNotes>
<!-- The description can be used in package manager UI. Note that the
nuget.org gallery uses information you add in the portal. -->
<description>Core utility functions for web applications</description>
<!-- Copyright information -->
<copyright>Copyright ©2016 Contoso Corporation</copyright>
<!-- Tags appear in the gallery and can be used for tag searches -->
<tags>web utility http json url parsing</tags>
<!-- Dependencies are automatically installed when the package is installed -->
<dependencies>
<dependency id="Newtonsoft.Json" version="9.0" />
</dependencies>
</metadata>
<!-- A readme.txt will be displayed when the package is installed -->
<files>
<file src="readme.txt" target="" />
</files>
</package>


命令:

nuget spec
nuget pack ClassLibrary2.csproj -Build -Properties Configuration=Release
nuget push *.nupkg -s http://127.0.0.1 apikey

iis6:
需要添加通配符程序
点击查看原图
点击查看原图
注意64bit/32bit
点击查看原图

发表在 .net | nuget已关闭评论

ASP.NET URL

Browser Request 的網址相關的屬性與用法:

網址:http://localhost:1897/News/Press/Content.aspx/123?id=1#toc
Request.ApplicationPath /
Request.PhysicalPath D:\Projects\Solution\web\News\Press\Content.aspx
System.IO.Path.GetDirectoryName(Request.PhysicalPath) D:\Projects\Solution\web\News\Press
Request.PhysicalApplicationPath D:\Projects\Solution\web\
System.IO.Path.GetFileName(Request.PhysicalPath) Content.aspx
Request.CurrentExecutionFilePath /News/Press/Content.aspx
Request.FilePath /News/Press/Content.aspx
Request.Path /News/Press/Content.aspx/123
Request.RawUrl /News/Press/Content.aspx/123?id=1
Request.Url.AbsolutePath /News/Press/Content.aspx/123
Request.Url.AbsoluteUri http://localhost:1897/News/Press/Content.aspx/123?id=1
Request.Url.Scheme http
Request.Url.Host localhost
Request.Url.Port 1897
Request.Url.Authority localhost:1897
Request.Url.LocalPath /News/Press/Content.aspx/123
Request.PathInfo /123
Request.Url.PathAndQuery /News/Press/Content.aspx/123?id=1
Request.Url.Query ?id=1
Request.Url.Fragment  
Request.Url.Segments /
News/
Press/
Content.aspx/
123

.

发表在 .net | ASP.NET URL已关闭评论

sql injection scans

测试SQL注入的工具:通过精度选择还是向量覆盖率选择?

为了回答这个问题,我们使用了sectoolmarket.com网站提供的标准测试结果,我们先假设候选的扫描程序的测试精度和向量覆盖率有相同的重要
性。我们将GET。POST,HTTP Cookie和HTTP
Headers作为应该被支持的输入向量。当所有的参数都被支持时,这个扫描器的覆盖范围的比率为100%(4/4)。

我们建议使用下面的算术方程式,也就是说对于漏洞扫描器的得分求一个平均值。

然后从得到的检测准确率的百分比中,我们列出前14名的扫描器:

Rank Vulnerability Scanner Vendor Detection Rate Input Vector Coverage Average Score
1 Arachni Tasos Laskos 100.00% 100% 100.00%
2 Sqlmap sqlmap developers 97.06% 100% 98,53%
3 IBM AppScan IBM Security Sys Division 93.38% 100% 96,69%
4 Acunetix WVS Acunetix 89.71% 100% 94,85%
5 NTOSpider NT OBJECTives 85.29% 100% 92,64%
6 Nessus Tenable Network Security 82.35% 100% 91,17%
7 WebInspect HP Apps Security Center 75.74% 100% 87,87%
8 Burp Suite Pro PortSwigger 72.06% 100% 86,03%
9 Cenzic Pro Cenzic 63.24% 100% 81,62%
10 SkipFish Michal Zalewski – Google 50.74% 100% 75,37%
11 Wapiti OWASP 100.00% 50% 75.00%
12 Netsparker Mavituna Security 98.00% 50% 74.00%
13 Paros Pro MileSCAN Technologies 93.38% 50% 71,69%
14 ZAP OWASP 77,21% 50% 63,60%

我们可以通过对扫描器的扫描漏洞的精度和向量覆盖率取到的平均值,做出下面一个图表。

点击查看原图

下表来源:https://msdn.microsoft.com/en-us/library/ms161953%28SQL.105%29.aspx

When you can, reject input that contains the following characters.

Input character

Meaning in Transact-SQL

;

Query delimiter.

'

Character data string delimiter.

--

Comment delimiter.

/* ... */

Comment delimiters. Text between /* and */ is not evaluated by the server.

xp_

Used at the start of the name of catalog-extended stored procedures, such as xp_cmdshell.

发表在 article | sql injection scans已关闭评论

China Unicom PING AWS

China unicom ping aws
位于北京-使用联通网络ping AWS 服务
2017/03/01

美国东部 (弗吉尼亚北部)
C:\Users\Administrator>ping console.aws.amazon.com

正在 Ping us-east-1.console.aws.amazon.com [54.239.31.83] 具有 32 字节的数据:
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224
来自 54.239.31.83 的回复: 字节=32 时间=281ms TTL=224

美国东部 (俄亥俄)
C:\Users\Administrator>ping us-east-2.console.aws.amazon.com

正在 Ping console.us-east-2.amazonaws.com [52.95.20.79] 具有 32 字节的数据:
来自 52.95.20.79 的回复: 字节=32 时间=219ms TTL=230
来自 52.95.20.79 的回复: 字节=32 时间=219ms TTL=230
来自 52.95.20.79 的回复: 字节=32 时间=223ms TTL=230
来自 52.95.20.79 的回复: 字节=32 时间=218ms TTL=230

美国西部 (加利福尼亚北部)
C:\Users\Administrator>ping us-west-1.console.aws.amazon.com

正在 Ping us-west-1.console.aws.amazon.com [176.32.112.45] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。

美国西部 (俄勒冈)
C:\Users\Administrator>ping us-west-2.console.aws.amazon.com

正在 Ping us-west-2.console.aws.amazon.com [54.240.254.239] 具有 32 字节的数据:
来自 54.240.254.239 的回复: 字节=32 时间=236ms TTL=233
来自 54.240.254.239 的回复: 字节=32 时间=237ms TTL=233
来自 54.240.254.239 的回复: 字节=32 时间=235ms TTL=233
来自 54.240.254.239 的回复: 字节=32 时间=236ms TTL=233

加拿大 (中部)
C:\Users\Administrator>ping ca-central-1.console.aws.amazon.com

正在 Ping console.ca-central-1.amazonaws.com [52.94.96.127] 具有 32 字节的数据:
来自 52.94.96.127 的回复: 字节=32 时间=242ms TTL=229
来自 52.94.96.127 的回复: 字节=32 时间=238ms TTL=229
来自 52.94.96.127 的回复: 字节=32 时间=238ms TTL=229
来自 52.94.96.127 的回复: 字节=32 时间=237ms TTL=229

欧洲 (爱尔兰)
C:\Users\Administrator>ping eu-west-1.console.aws.amazon.com

正在 Ping eu-west-1.console.aws.amazon.com [54.239.38.117] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。

欧洲 (法兰克福)
C:\Users\Administrator>ping eu-central-1.console.aws.amazon.com

正在 Ping console.eu-central-1.amazonaws.com [54.239.54.102] 具有 32 字节的数据:

来自 54.239.54.102 的回复: 字节=32 时间=413ms TTL=234
来自 54.239.54.102 的回复: 字节=32 时间=412ms TTL=234
来自 54.239.54.102 的回复: 字节=32 时间=413ms TTL=234
来自 54.239.54.102 的回复: 字节=32 时间=413ms TTL=234

欧洲 (伦敦)
C:\Users\Administrator>ping eu-west-2.console.aws.amazon.com

正在 Ping console.eu-west-2.amazonaws.com [52.94.56.93] 具有 32 字节的数据:
来自 52.94.56.93 的回复: 字节=32 时间=363ms TTL=234
来自 52.94.56.93 的回复: 字节=32 时间=354ms TTL=234
来自 52.94.56.93 的回复: 字节=32 时间=359ms TTL=234
来自 52.94.56.93 的回复: 字节=32 时间=366ms TTL=234

亚太区域 (新加坡)
C:\Users\Administrator>ping ap-southeast-1.console.aws.amazon.com

正在 Ping ap-southeast-1.console.aws.amazon.com [54.240.226.142] 具有 32 字节的
数据:
来自 54.240.226.142 的回复: 字节=32 时间=146ms TTL=238
来自 54.240.226.142 的回复: 字节=32 时间=146ms TTL=238
来自 54.240.226.142 的回复: 字节=32 时间=148ms TTL=238
来自 54.240.226.142 的回复: 字节=32 时间=146ms TTL=238

亚太区域 (悉尼)
C:\Users\Administrator>ping ap-southeast-2.console.aws.amazon.com

正在 Ping ap-southeast-2.console.aws.amazon.com [54.240.195.68] 具有 32 字节的数
据:
来自 54.240.195.68 的回复: 字节=32 时间=231ms TTL=237
请求超时。
来自 54.240.195.68 的回复: 字节=32 时间=233ms TTL=237
来自 54.240.195.68 的回复: 字节=32 时间=231ms TTL=237

亚太区域 (首尔)
C:\Users\Administrator>ping ap-northeast-2.console.aws.amazon.com

正在 Ping ap-northeast-2.console.aws.amazon.com [52.95.193.28] 具有 32 字节的数
据:
来自 52.95.193.28 的回复: 字节=32 时间=138ms TTL=236
来自 52.95.193.28 的回复: 字节=32 时间=135ms TTL=236
来自 52.95.193.28 的回复: 字节=32 时间=142ms TTL=236
来自 52.95.193.28 的回复: 字节=32 时间=138ms TTL=236

亚太区域 (东京)
C:\Users\Administrator>ping ap-northeast-1.console.aws.amazon.com

正在 Ping ap-northeast-1.console.aws.amazon.com [54.239.96.82] 具有 32 字节的数
据:
来自 54.239.96.82 的回复: 字节=32 时间=89ms TTL=235
来自 54.239.96.82 的回复: 字节=32 时间=88ms TTL=235
来自 54.239.96.82 的回复: 字节=32 时间=89ms TTL=235
来自 54.239.96.82 的回复: 字节=32 时间=91ms TTL=235

亚太区域 (孟买)
C:\Users\Administrator>ping ap-south-1.console.aws.amazon.com

正在 Ping console.ap-south-1.amazonaws.com [52.95.88.43] 具有 32 字节的数据:
请求超时。
来自 52.95.88.43 的回复: 字节=32 时间=336ms TTL=229
来自 52.95.88.43 的回复: 字节=32 时间=336ms TTL=229
来自 52.95.88.43 的回复: 字节=32 时间=336ms TTL=229

南美洲 (圣保罗)
C:\Users\Administrator>ping sa-east-1.console.aws.amazon.com

正在 Ping sa-east-1.console.aws.amazon.com [177.72.244.68] 具有 32 字节的数据:
请求超时。
来自 177.72.244.68 的回复: 字节=32 时间=487ms TTL=239
请求超时。

来自 177.72.244.68 的回复: 字节=32 时间=499ms TTL=239

 

BAT 1:

@echo off

echo 美国东部 (弗吉尼亚北部)
ping console.aws.amazon.com

echo 美国东部 (俄亥俄)
ping us-east-2.console.aws.amazon.com

echo 美国西部 (加利福尼亚北部)
ping us-west-1.console.aws.amazon.com

echo 美国西部 (俄勒冈)
ping us-west-2.console.aws.amazon.com

echo 加拿大 (中部)
ping ca-central-1.console.aws.amazon.com

echo 欧洲 (爱尔兰)
ping eu-west-1.console.aws.amazon.com

echo 欧洲 (法兰克福)
ping eu-central-1.console.aws.amazon.com

echo 欧洲 (伦敦)
ping eu-west-2.console.aws.amazon.com

echo 亚太区域 (新加坡)
ping ap-southeast-1.console.aws.amazon.com

echo 亚太区域 (悉尼)
ping ap-southeast-2.console.aws.amazon.com

echo 亚太区域 (首尔)
ping ap-northeast-2.console.aws.amazon.com

echo 亚太区域 (东京)
ping ap-northeast-1.console.aws.amazon.com

echo 亚太区域 (孟买)
ping ap-south-1.console.aws.amazon.com

echo 南美洲 (圣保罗)
ping sa-east-1.console.aws.amazon.com

pause

BAT 2:

@echo off

ping console.aws.amazon.com

ping us-east-2.console.aws.amazon.com

ping us-west-1.console.aws.amazon.com

ping us-west-2.console.aws.amazon.com

ping ca-central-1.console.aws.amazon.com

ping eu-west-1.console.aws.amazon.com

ping eu-central-1.console.aws.amazon.com

ping eu-west-2.console.aws.amazon.com

ping ap-southeast-1.console.aws.amazon.com

ping ap-southeast-2.console.aws.amazon.com

ping ap-northeast-2.console.aws.amazon.com

ping ap-northeast-1.console.aws.amazon.com

ping ap-south-1.console.aws.amazon.com

ping sa-east-1.console.aws.amazon.com

pause

 

 

 

发表在 article | China Unicom PING AWS已关闭评论

Int64/Long

Int64.Max        9223372036854775807
UInt64.Max        18446744073709551615

每分钟1亿条:

100000000 * 60 * 24

day =144000000000

9223372036854775807 / 144000000000 / 365

year = 175482

每分钟10亿条:

1000000000 * 60 * 24

day =1440000000000

9223372036854775807 / 1440000000000 / 365

year = 17548

每分钟100亿条:

10000000000 * 60 * 24

day =14400000000000

9223372036854775807 / 14400000000000 / 365

year = 1754

 

发表在 article | Int64/Long已关闭评论

基于lucene实现自己的推荐引擎

  采用基于数据挖掘的算法来实现推荐引擎是各大电子商务网站、SNS社区最为常用的方
法,推荐引擎常用的Content-Based推荐算法及协同过滤算法(Item-Based
、User-based)在电子商务推荐系统入门v2.0 、电子商务推荐系统入门基础 中已经有所阐述。但从实际应用来看,对于大部分中小型企业来说,
要在电子商务系统完整采用以上算法有很大的难度。

1、常用推荐引擎算法问题

1)、相对成熟、完整、现成的开源解决方案较少

粗略分来,目前与数据挖掘及推荐引擎相关的开源项目主要有如下几类:

数据挖掘相关:主要包括WekaR-ProjectKnimeRapidMinerOrange 等

文本挖掘相关:主要包括OpenNLPLingPipeFreeLingGATE 、Carrot2 等,具体可以参考LingPipe’s Competition

推荐引擎相关:主要包括Apache MahoutDuine frameworkSingular Value Decomposition (SVD) ,其他包可以参考Open Source Collaborative Filtering Written in Java

搜索引擎相关:Lucene、Solr、Sphinx、Hibernate Search等

2)、常用推荐引擎算法相对复杂,入门门槛较低

3)、常用推荐引擎算法性能较低,并不适合海量数据挖掘

以上这些包或算法,除了Lucene/Sor相对成熟外,大部分都还处于学术研究使用,并不能直接应用于互联网大规模的数据挖掘及推荐引擎引擎使用。

2、采用Lucene实现推荐引擎的优势

对很多众多的中小型网站而言,由于开发能力有限,如果有能够集成了搜索、推荐一体化的解决方案,这样的方案肯定大受欢迎。采用Lucene来实现推荐引擎具有如下优势:

1)、Lucene 入门门槛较低,大部分网站的站内搜索都采用了Lucene

2)、相对于协同过滤算法,Lucene性能较高

3)、Lucene对Text Mining、相似度计算等相关算法有很多现成方案

在开源的项目中,Mahout或者Duine Framework用于推荐引擎是相对完整的方案,尤其是Mahout
核心利用了Lucene,因此其架构很值得借鉴。只不过Mahout目前功能还不是很完整,直接用其实现电子商务网站的推荐引擎尚不是很成熟。只不过从
Mahout实现可以看出采用Lucene实现推荐引擎是一种可行方案。

3、采用Lucene实现推荐引擎需要解决的核心问题

Lucene擅长Text Mining较为擅长,Lucene在contrib包中提供了MoreLikeThis功能,可以较为容易实现Content-Based的推荐,但对于涉及用户协同过滤行为的结果(所谓的Relevance Feedback),Lucene目前并没有好的解决方案。需要在Lucene中内容相似算法中加入用户协同过滤行为对因素,将用户协同过滤行为结果转化为Lucene所支持的模型。

4、推荐引擎的数据源

电子商务网站与推荐引擎相关典型的行为:

  • 购买本商品的顾客还买过
  • 浏览本商品的顾客还看过
  • 浏览更多类似商品
  • 喜欢此商品的人还喜欢
  • 用户对此商品的平均打分

因此基于Lucene实现推荐引擎主要要处理如下两大类的数据

1)、内容相似度

例如:商品名称、作者/译者/制造商、商品类别、简介、评论、用户标签、系统标签

2)、用户协同行为相似度

例如:打标签、购买商品、点击流、搜索、推荐、收藏、打分、写评论、问答、页面停留时间、所在群组等等

5、实现方案

5.1、内容相似度

基于Lucene MoreLikeThis实现即可。

5.1、对用户协同行为的处理

1)、用户每一次协同行为都使用lucene来进行索引,每次行为一条记录

2)、索引记录中包含如下重要信息:

商品名、商品id、商品类别、商品简介、标签等重要特征值、用户关联行为的其他商品的特征元素、商品缩略图地址、协同行为类型(购买、点击、收藏、评分等)、Boost值(各协同行为在setBoost时候的权重值)

3)、对评分、收藏、点击等协同行为以商品特征值(标签、标题、概要信息)来表征

4)、不同的协同行为类型(例如购买、评分、点击)设置不同的值setBoost

5)、搜索时候采用Lucene MoreLikeThis算法,将用户协同转化为内容相似度

以上方案只是基于Lucene来实现推荐引擎最为简单的实现方案,方案的准确度及细化方案以后再细说。

更为精细的实现,可以参考Mahout的算法实现来优化。

文章来源:http://www.yeeach.com/2010/10/01/%E5%9F%BA%E4%BA%8Elucene%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E6%8E%A8%E8%8D%90%E5%BC%95%E6%93%8E/

更为精细的实现,可以参考Mahout的算法实现来优化。

发表在 search | 标签为 , | 基于lucene实现自己的推荐引擎已关闭评论

Ceph

打造高性能高可靠块存储系统

UnitedStack块存储系统

分布式存储有出色的性能,可以扛很多故障,能够轻松扩展,所以我们UnitedStack使用Ceph构建了高性能、高可靠的块存储系统,并使用它支撑UnitedStack公有云和托管云的云主机、云硬盘服务。

由于使用分布式块存储系统,避免了复制镜像的过程,所以云主机的创建时间可以缩短到10秒以内,而且云主机还能快速热迁移,方便了运维人员对物理服务器上硬件和软件的维护。

用户对于块存储系统最直观的感受来源于云硬盘服务,现在我们的云硬盘的特点是:

  • 每个云硬盘最大支持 6000 IOPS和170 MB/s的吞吐率,95%的4K随机写操作的延迟小于2ms 。
  • 所有数据都是三副本,强一致性,持久性高达10个9。
  • 创建、删除、挂载、卸载都是秒级操作。
  • 实时快照。
  • 提供两种云硬盘类型,性能型和容量型。

软硬件配置

经过多轮的选型和测试,并踩过无数的坑之后,我们选择了合适我们的软件和硬件。

软件

点击查看原图

硬件

  • 从SATA磁盘到SSD,为了提高IOPS和降低Latency。
  • 从消费级SSD到企业级SSD,为了提高可靠性。
  • 从RAID卡到HBA卡,为了提高IOPS和降低Latency。

 

最小部署架构

随着软硬件的升级,需求的调整, 我们的部署架构也不断在演进,力求在成本、性能、可靠性上达到最佳平衡点。

点击查看原图

最小规模部署中有12个节点,每个节点上有3块SSD。节点上有2个万兆口和1个千兆口,虚拟机网络和存储网络使用万兆口,管理网络使用千兆口。每个集群中都有3个Ceph Monitor节点。

轻松扩展

云计算的好处是极强的扩展性,作为云计算的底层架构,也需要有快速的Scale-out能力。在块存储系统的部署架构中,可以以12台节点为单位进行扩展。

点击查看原图

 

改造OpenStack

原生的OpenStack并不支持统一存储,云主机服务Nova、镜像服务Glance、云硬盘服务Cinder的后端存储各不相同,造成了严重的内耗。我们把这三大服务的后端统一起来,进行高效管理,解决了虚拟机创建时间长和镜像风暴等问题,还能让虚拟机随便漂移。

原生的OpenStack

点击查看原图

改造后的OpenStack

点击查看原图

使用原生的OpenStack创建虚拟机需要1~3分钟,而使用改造后的OpenStack仅需要不到10秒钟时间。这是因为nova-compute不再需要通过HTTP下载整个镜像,虚拟机可以通过直接读取Ceph中的镜像数据进行启动。

我们还增加两个OpenStack没有的功能: QoS 和 共享云硬盘。云计算的另外一个好处是租户资源隔离,所以必备QoS。共享云硬盘可以挂载给多台云主机,适用于数据处理的场景。

我们还使用了OpenStack的multi-backend功能,支持多种云硬盘类型,现在我们的云硬盘类型有性能型、容量型,可以满足数据库和大文件应用。

 

高性能

高可靠性

自动化运维

 未来

发表在 storage | 标签为 | Ceph已关闭评论

ALPHA,BETA,GAMMA,GA,RC,LTS 常见版本/version

常见版本号:

Alpha:

软件或系统的内部测试版本,仅内部人员使用。一般不向外部发布,通常会有很多Bug,除非你也是测试人员,否则不建议使用,alpha 就是α,是希腊字母的第一位,表示最初级的版本,beta 就是β,alpha 版就是比beta还早的测试版,一般都是内部测试的版本。

Beta:

公开测试版。β是希腊字母的第二个,顾名思义,这一版本通常是在Alpha版本后,该版本相对于Alpha版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。这个阶段的版本会一直加入新的功能。

Gamma:

软件或系统接近于成熟的版本,只需要做一些小的改进就能发行。是beta版做过一些修改,成为正式发布的候选版本。

RC:

RC(Release Candidate),发行候选版本。和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错。RC版本是最终发放给用户的最接近正式版的版本,发行后改正bug就是正式版了,就是正式版之前的最后一个测试版。

GA:

GA(General Available), 正式发布的版本,这个版本就是正式的版本。欧美常用GA来说明release版本的。 比如:MySQL Community Server 5.7.21 GA 这是MySQL Community Server 5.7 第21个发行稳定的版本,GA意味着General Available,也就是官方开始推荐广泛使用了。

Release:

这个版本通常就是所谓的“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本,该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号(R)。

Stable:

稳定版。在开源软件中,都有stable版,这个就是开源软件的最终发行版,用户可以放心大胆的用了。这一版本基于Beta版,已知Bug都被修复,一般情况下,更新比较慢。

微软常用版本号:

RTM(Release to Manufacture):

给工厂大量生产的压片版本,与正式版内容一样。

OEM(Original Entrusted Manufacture):

给计算机厂商的出场销售版本,不零售只预装

RVL:

号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的

EVAL:

而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别

RTL(Retail):

零售版是真正的正式版,正式上架零售版

苹果常用版本号:

GM(Gold Master):

正式版前最后一个测试版,其实也就是正式版。


其它版本:

软件版本里的Final、Beta、Pro、Build.

Beta版:产品(驱动、BIOS)发布之前的测试版本,也叫做β版,与此对应的还有α版(Alpha版)。α版通常是软件开发商内部自行测试的版本,而β版则是公开发布让用户来进行测试的版本。

版本号里面的Build说明这个版本是第几次编译的结果,比如:
V1.79 Build210 比V1.79Build200 的版本要新。

Alpha: 内部测试版
Beta: 公开测试版
Cardware: 属共享软件的一种,只要给作者回复一封电邮或明信片即可。目前这种形式已不多见。
CHT: 繁体中文版
CN/SPC: 简体中文版
EN: 英文版
Corporation / Enterprise: 企业版
Deluxe: 豪华版
Demo: 演示版
Dev: 开发专用版,程序员版本。
Enhance: 增强版 / 加强版
Express&Special: 特别版
Final: 最终版
Free: 免费版
Full: 完全版
Green: 绿色版/破解版
Mini: 迷你版/精简版,只有最基本的功能,占用资源较少
Multi-language: 多语言版
Plus: 属增强版,不过大部分是在程序界面及功能上增强。
Preview --预览版
Professional: 专业版
Registered: 已注册版
Release: 发行版
Retail/RTM: 零售版
Shareware: 共享版
Stable: 稳定版
Standard: 标准版
Ultimate: 旗舰版
Upgrade: 升级版

版本进程:

工作进程:

工作进程:

...

 

发表在 technologys | 标签为 , , , , , | ALPHA,BETA,GAMMA,GA,RC,LTS 常见版本/version已关闭评论