個人檔案爬行的蜗牛相片部落格清單 工具 說明
30/5/2006

手机罢工,请使用心电感应联系

 
手机罢工,在我学会如何修理之前,请使用心电感应联系!
 
 
保护生态自然,拒绝电磁污染
 
世界环保日的来历

1972年联合国在瑞典的斯德哥尔摩召开了有113个国家参加的联合国人类环境会议。会议讨论了保护全
 
球环境的行动计划,通过了《人类环境宣言》。并将6月5日定为世界环境日。以后,每逢世界环境日,
 
世界各国都开展群众性的环境保护宣传纪念活动,唤起全界人民都来注意保护人类赖以生存的环境,自
 
觉采取行动参与环境保护的共同努力,同时要求各国政府和联合国系统为推进保护进程做出贡献。
29/5/2006

兄弟,朋友

『 GuoLing's 』 兄弟是先天的朋友,朋友是后天的兄弟

云海苍苍天之穹

蝶影纷纷火寻踪

杀诫朱厌莲佛心

封禅剑雪恨相逢

黑莲轮回 悼剑雪无名


雪中飞舞的剑,善与恶的剑。

雪中飘零的梅,喜与悲的梅。

剑雪无名,一位善恶莫测的剑客,一株迷茫的雪中红梅。

常望梅颜,傲骨冰寒。爱梅之邪。

“不管一剑封禅变成怎样,剑雪无名依然是剑雪无名!”他说,说的那么坚定,那么无奈,那么……悲哀。

剑出,血溅,梅陨。

是吞佛童子还是一剑封禅,他明了,他自剑出的那一刹那便已明了。他永远也见不到一剑封禅了,但是,对他来说,吞佛

童子与一剑封禅有什么不同?没有什么不同!都是那个自千万年前开始一只常望梅颜之人。

吞佛童子就是一剑封禅。没有一剑封禅就没有吞佛童子,没有吞佛童子就没有一剑封禅。为什么,为什么他没有发现,为

什么到现在才明白?

眼前的世界渐渐被染上刺眼的血红。剑伤的痛与汩汩的鲜血滴滴落入千疮百孔的心中。在最后一刻,剑雪无名自问:为什

么不论怎么做,结果都是错错错!

“不要让他动摇你的决心,不要让他影响你的判断。你够坚决,才能救得了你与他。”破戒僧的话又一次响起。够坚定?他

难以坚定!不是没有能力,不是不想,不是无法下决心,只是太累,只是不舍,只是……害怕。只是,无数的只是,所以他

选择离去,离开这漫天纷飞的红梅。

没想到的结果,或者也是唯一的结局,吞佛童子也许永远也无法忘记那个伫立在漫天冷梅中的人,那个名为剑雪无名的剑

客。这一场雪也将永远在他心中飘扬。


『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』
『 GuoLing's 』 关于这个传说-双邪

剑雪无名,前世为桀骜之魔——鸠盘神子,遇佛门高僧一莲托生渡化,寂灭後化为九峰莲
滫上的黑莲魔胎。一莲托生死後黑莲开放,所出即为没有记忆的新生命——剑邪。後遇人
邪一剑封禅,剑邪自称天不容故而无名,一剑封禅便为他取名“剑雪无名”,更称自己就
是剑雪的天,他为剑雪吹奏鹊桥仙,剑雪也学会了用叶笛和鸣。剑雪为自己的过去是一片
空白而苦恼,一心追求过去。与一剑封禅偕伴同行的日子,是他人生中最有自我也最轻松
的时候。

吞佛童子,异度魔界上层守关者,为打开被封印的赦道使异度魔界再临苦境(尘世),携
魔剑朱猒进入苦境,欲寻魔胎取血开赦道。来到苦境後遇一莲托生,因一莲托生自称为魔
破戒而好奇。一莲托生察觉吞佛童子内心还有潜藏的善念,赌上毕生功力铸造圣剑杀诫,
使计以功力全失之态与吞佛换剑。杀诫的佛气压制了吞佛的人格,引出了他人性的一面,
凝聚成“人邪”一剑封禅。一剑封禅认定唯有杀死记忆中的仇人“吞佛童子”才有自己的
未来,却完全不知自己就是吞佛童子。

剑雪跟一剑封禅相遇後便偕伴同行,两人路经崇佛的“圆教村”时相约换剑欣赏。不料剑
雪所持正是一莲托生临死时带回九峰莲滫的朱猒剑。朱猒邪气引动吞佛人格破封而出,尽
灭圆教村,剑雪也几乎被他所杀。幸而当时钜锋里的酸儒太瘦生路经此地,爆发一掌将未
及防备的吞佛打得朱猒脱手,人邪的人格恢复。剑雪立刻带著朱猒离开,从此避不见一剑
封禅,也再不肯拔出朱猒剑。

多年後“吞佛童子”之名因北嵎出现了一莲托生的遗作《一莲托生品》(伪)而再受关注
。一剑封禅在北嵎三王爷北辰胤的帮忙下找到了剑雪无名,此时剑雪为了封禅主动担下吞
佛童子的身份,一剑封禅却表示决不相信剑雪就是自己的仇人吞佛童子。

因《一莲托生品》言“人邪剑邪破金银”,中原正道请托人邪对抗“出手金银”邓九五,
剑雪也随同来到琉璃仙境。虽打退邓九五,但一剑封禅对剑雪宁可受伤也不肯拔剑的举动
十分不谅解。五人组为邓九五欲杀双邪,激战中剑雪再次因不肯出剑而遭地理司重创。心
焦的封禅眼见剑雪重伤情绪失控,陡然化身吞佛击败东方鼎立等人,但清醒後完全不记得
自己变身之事。封禅质问剑雪为何被人打得这么凄惨也不拔剑,剑雪有苦难言,一再劝他
放弃追查吞佛童子一同退隐,然而一剑封禅完全听不进去,反问他既可轻言退隐为何仍在
江湖,剑雪回答不退江湖是因为你还在。

封禅将剑雪留在六丑废人处疗伤,约定三日後来领人。六丑发现剑雪身带阴邪魔气,又有
莲香佛圣之气,且有别於小三界之妖邪魔,剑雪则坚持自己乃是佛门中人,绝无可能。你
真正了解自己的身世吗,还是你从来都活在自己编织的一场迷梦?究竟是佛是魔,六丑建
议他去鸿莲寺寻找答案。

鸿莲寺外,面对两名持棍僧一番似是而非的奇妙问题,剑雪言已选定了自己的道路,不想
成佛,不愿成魔,中间之路,由人悟吧。持棍僧说若想求得一莲托生之事,那么真相就在
你的原点等你。

初生原点,九峰莲滫,莲僧遗骸,剑邪佛魔,剑雪轻叹自己的过去现在都是由人说。神秘
出现在九峰莲滫的破戒僧道,离开你徘徊的原点,自然会有答案。破戒僧带著剑雪慢慢回
溯过去的旅程,告诉了他黑莲魔胎的故事以及杀诫引起吞佛童子人格变化的由来。

一个人的脚步可以不受感情的羁绊,而你,杀与救,同一个人,你要如何两全?被问题绑
死的,究竟是他还是你?

落梅吹雪的行程终点,剑雪放下了一直陪伴他的朱猒,解下故物,故缘已尽。破戒僧向剑
雪讨下朱猒,作为回报赠他佛剑“莲谳”。朱猒不出,是今生永远不想与一剑封禅为敌。
如今放下朱猒改握莲谳,乃是有了挥剑相向的觉悟。舍不下朱猒是舍不下曾有的过往;留
恋过往,便是自欺欺人地在已经破灭的旧梦中寻找慰藉,然而现在是该醒的时候到了。


剑邪,不可让他影响你的判断,不可让他左右你的决定,你够坚定,才救得了你与他。


山僧如是说。

吾明白。

剑雪如是回。

另一边,将剑雪托付给六丑的封禅为完成北辰胤的请托铆上圣踪,交手後追踪未果导致情
绪再次失控,吞佛破出,修罗再临。杀诫的佛圣之气因染上太多杀戮血腥而日渐黯淡,已
无法再压制吞佛的人格。初醒的吞佛毫不迟疑地开始执行自己被延迟的任务,杀磋峨佛子
,毁圆教村、鎏法天宫佛脉。定禅天内,吞佛童子冷冷杀上,剑雪虽及时赶到但仍无法阻
止吞佛毁去三佛脉最後一处。刀剑相向,无法说出口的痛苦,冷酷的魔因天放光明、吞佛
人格消失而败。剑雪无奈将人邪功力封住,囚禁於九峰莲滫。叶笛声声中,剑雪告知封禅
其实他自己才是吞佛童子。封禅大怒,认为剑雪背叛了他们的情义,剑雪默然。

你是吞佛童子,而我是魔胎,我们的过去与未来尽是一片举目皆非。一口叶笛,留住过往
,悠长时间,无法阻止,你我都是该醒的时候到了。

觊觎异度魔界秽百刺的黑暗之间抓走了功力被封的人邪,剑雪大怒飙去踢馆,救出一剑封
禅後请蝴蝶君公孙月送他到鸿莲寺接受佛意。不料一去即成永诀,鸿莲寺中吞佛的人格被
佛法激怒彻底破封而出,主动找上黑暗之间达成合作协议。吞佛来到九峰莲滫,冷问破戒
僧魔胎在何处。当知晓自己与剑雪无名这个魔胎是以命换命的交情,他心里究竟作何感想
,不得而知。

最终的最终,不约而同,吞佛、剑雪回到了最初之地,圆教村。

故事,该落幕了……剑雪低语。

说不出口的遗憾,说不出口的悲哀。闭目,是最後的犹豫挣扎;再开眼,已是决杀的眼神
。吞佛不断喊只有封禅能叫的名字“剑雪”来激怒他,逼问他既要杀吞佛童子,又要救一
剑封禅,同一个人,两种感情,要如何两全。激战中佛气尽灭的杀诫折断,吞佛落入败势
,被莲谳一剑刺中。就在这时吞佛竟变为一剑封禅,并抓住剑雪的手用力将剑刺穿己身。
剑雪悲痛欲绝,但心存一线希望,以为封禅已经归来,以为可以救回他,以为他们还有未
来。谁知前一刻还温言安慰的封禅突然反手拔出莲谳一剑刺入剑雪体内,转眼已变成吞佛
童子。

我骗你的,傻剑雪!

残忍地拔剑,喷涌而出的魔胎之血化为赦道,吞佛童子毫不留恋,追逐魔血赦道而去。


当断则断,舍不下永远无得,不可让他动摇你的决心,不可让他影响你的判断,你够坚定
,才能救得了你与他。

山僧言犹在耳,闭上的双眼追随著远去的血红身影,是担忧,是遗憾,是挂念。曾说明白
,然而纵然明白,却是舍不下,勘不破,情由心生,问世间谁能舍得下心,断得了意,勘
得破这世情。

黑莲已然凋落,新的花苞悄然生出,等待下一段命数的开启。

每一回的凋落,必有每一回的新生,从哪里来,回哪里去。剑邪,剑雪,你已拥有不可追
的过去,可期待的未来,将在你自己的掌上。

若有来世……

若有来世……


文中主要相关人物简介:

人邪(一剑封禅):北域三大刀剑传说之一。剑艺可问武林顶峰。一生都在寻找的一
个仇人--吞佛童子,最后居然是自己。身背圣剑“杀诫”。最后一刻,变身吞佛童子,用
计杀死剑邪,打开赦道,开启可怕的异度新魔界。
诗号:“杀诫半邪影,剑风不留人” 剑邪(剑雪无名):同为北域三大刀剑传说之一。身背魔剑“朱厌”。前世为魔胎,
其鲜血是开启赦道的关键之一。幸遇佛门高僧渡化。唯一的朋友:一剑封禅。
诗号:“不退江湖,因为你(指一剑封禅)还在。”

吞佛童子:异度新魔界的上层守关者。在魔界中地位崇高,素有“战神”称号。手持
朱厌剑,实力高深莫测,智勇双全。千年以前,魔界被封印。受命来中原苦境开启赦道。
遇到一莲托生大师,后被引出人性的一面-—一剑封禅。于是发生了后来的很多故事,构成
了《霹雳剑踪》一部的主要剧情。

邓九五:俗称:“出手金银邓王爷”,一身金银双绝掌(受此掌法攻击之人,无一不
被金封)在北域无人不知。北域“五人组”之首。野心勃勃,但最终为至爱之人红叶夫人
而退隐江湖。据《一莲托生品》记载:“人邪剑邪破金银”。

东方鼎立:北域“五人组”老三。手持神秘的邪刀“长日狂阳”(后证实是异度新魔
界之魔君配刀,在上古之时侵略中原苦境时遗落)。其刀法狂惨,造诣极高,对自身实力
绝对自信。最后亡于手持传说中的神刀天泣的羽人非獍(剑踪之后戡魔的重要人物)。
诗号:“天无二日,唯吾广照,东方不落,鼎立不摇。”

圣踪:北域“五人组”老二。潜伏中原正道多时。因练“双极心源”武功而拥有两个
灵魂与躯体。故与地理司实为同一人。设计吸收了自上古时就产生的神秘的无边黑暗力量
——邪兵卫。最后双极合体,圣踪身上的邪兵卫与地理司吸收的至阳纯刚之力量——龙气
互相冲突而自爆而亡。
诗号:不染天下不染尘,半分形迹半分踪, 圣贤不过笼中影,身游潇洒文武风。

『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』
25/5/2006

回来了!

『 GuoLing's 』 回来了!

一个月的需求分析,一个月的概要设计和模块分析,几次评审答辩,整个项目的架构脉络已经十分清楚了
项目已经进行到一半多,刚刚把基础版本编译通过,还没有进行链接,算算剩下的时间,真的叫屈指可数,隐隐约约能够感觉到什么叫工作压力,有压力才有动力啊,谁让我就是个程序员啊!

连续几个星期下来,事情不是一般的多,虽然是并行的处理方式,严格的进度安排,还是没能全部都圆满,有些遗憾啊,看来我的处理能力还需要进一步升级,就怕脑子越转越快,功耗越来越大,有一天会烧出毛病来。

竟然感觉有点累了!?!?!?!?!?!?


书看的越多,越是觉得可怕,自己知道的原来这么少,自己要学的原来还有这么多,,才发现原来知道的越少越幸福,简简单单的幸福,只是已经知道的,很难能忘记,更何况已经不想什么事情都被人瞒着,这个脑子已经希望自己能够完全的掌控自己,好像大家把这个叫做自由,也许--有时候没有自由也是不错的选择。

『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』

OpenVPN协议分析

『 GuoLing's 』 OpenVPN Protocol
OpenVPN Protocol, taken from ssl.h in OpenVPN source code.

TCP/UDP Packet: This represents the top-level encapsulation.

TCP/UDP packet format:

Packet length (16 bits, unsigned) -- TCP only, always sent as
plaintext. Since TCP is a stream protocol, the packet
length words define the packetization of the stream.

Packet opcode/key_id (8 bits) -- TLS only, not used in
pre-shared secret mode.
packet message type, a P_* constant (high 5 bits)
key_id (low 3 bits, see key_id in struct tls_session
below for comment). The key_id refers to an
already negotiated TLS session. OpenVPN seamlessly
renegotiates the TLS session by using a new key_id
for the new session. Overlap (controlled by
user definable parameters) between old and new TLS
sessions is allowed, providing a seamless transition
during tunnel operation.

Payload (n bytes), which may be a P_CONTROL, P_ACK, or P_DATA
message.

消息类型:

P_CONTROL_HARD_RESET_CLIENT_V1 -- Key method 1,清楚先前会话
从客户端获取初始KEY

P_CONTROL_HARD_RESET_SERVER_V1 -- Key method 2,清楚先前会话
从服务器端获取初始KEY

P_CONTROL_SOFT_RESET_V1 -- New key, with a graceful transition
from old to new key in the sense that a transition window
exists where both the old or new key_id can be used. OpenVPN
uses two different forms of key_id. The first form is 64 bits
and is used for all P_CONTROL messages. P_DATA messages on the
other hand use a shortened key_id of 3 bits for efficiency
reasons since the vast majority of OpenVPN packets in an
active tunnel will be P_DATA messages. The 64 bit form
is referred to as a session_id, while the 3 bit form is
referred to as a key_id.

P_CONTROL_V1 -- Control channel packet (usually TLS ciphertext).

P_ACK_V1 -- Acknowledgement for P_CONTROL packets received.

P_DATA_V1 -- Data channel packet containing actual tunnel data
ciphertext.

P_CONTROL_HARD_RESET_CLIENT_V2 -- Key method 2, initial key from
client, forget previous state.

P_CONTROL_HARD_RESET_SERVER_V2 -- Key method 2, initial key from
server, forget previous state.

P_CONTROL* and P_ACK Payload: The P_CONTROL message type
indicates a TLS ciphertext packet which has been encapsulated
inside of a reliability layer. The reliability layer is
implemented as a straightforward ACK and retransmit model.

P_CONTROL message format:

local session_id (random 64 bit value to identify TLS session).
HMAC signature of entire encapsulation header for integrity
check if --tls-auth is specified (usually 16 or 20 bytes).
packet-id for replay protection (4 or 8 bytes, includes
sequence number and optional time_t timestamp).
P_ACK packet_id array length (1 byte).
P_ACK packet-id array (if length > 0).
P_ACK remote session_id (if length > 0).
message packet-id (4 bytes).
TLS payload ciphertext (n bytes) (only for P_CONTROL).

Once the TLS session has been initialized and authenticated,
the TLS channel is used to exchange random key material for
bidirectional cipher and HMAC keys which will be
used to secure actual tunnel packets. OpenVPN currently
implements two key methods. Key method 1 directly
derives keys using random bits obtained from the RAND_bytes
OpenSSL function. Key method 2 mixes random key material
from both sides of the connection using the TLS PRF mixing
function. Key method 2 is the preferred method and is the default
for OpenVPN 2.0.

TLS plaintext content:

TLS plaintext packet (if key_method == 1):

Cipher key length in bytes (1 byte).
Cipher key (n bytes).
HMAC key length in bytes (1 byte).
HMAC key (n bytes).
Options string (n bytes, null terminated, client/server options
string should match).

TLS plaintext packet (if key_method == 2):

Literal 0 (4 bytes).
key_method type (1 byte).
key_source structure (pre_master only defined for client ->
server).
options_string_length, including null (2 bytes).
Options string (n bytes, null terminated, client/server options
string must match).
[The username/password data below is optional, record can end
at this point.]
username_string_length, including null (2 bytes).
Username string (n bytes, null terminated).
password_string_length, including null (2 bytes).
Password string (n bytes, null terminated).

The P_DATA payload represents encrypted, encapsulated tunnel
packets which tend to be either IP packets or Ethernet frames.
This is essentially the "payload" of the VPN.

P_DATA message content:
HMAC of ciphertext IV + ciphertext (if not disabled by
--auth none).
Ciphertext IV (size is cipher-dependent, if not disabled by
--no-iv).
Tunnel packet ciphertext.

P_DATA plaintext
packet_id (4 or 8 bytes, if not disabled by --no-replay).
In SSL/TLS mode, 4 bytes are used because the implementation
can force a TLS renegotation before 2^32 packets are sent.
In pre-shared key mode, 8 bytes are used (sequence number
and time_t value) to allow long-term key usage without
packet_id collisions.
User plaintext (n bytes).

Notes:
(1) ACK messages can be encoded in either the dedicated
P_ACK record or they can be prepended to a P_CONTROL message.
(2) P_DATA and P_CONTROL/P_ACK use independent packet-id
sequences because P_DATA is an unreliable channel while
P_CONTROL/P_ACK is a reliable channel. Each use their
own independent HMAC keys.
(3) Note that when --tls-auth is used, all message types are
protected with an HMAC signature, even the initial packets
of the TLS handshake. This makes it easy for OpenVPN to
throw away bogus packets quickly, without wasting resources
on attempting a TLS handshake which will ultimately fail.

『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』
20/5/2006

生活

『 GuoLing's 』 图画生活
FROM:牛
同有感

----------------------------------------------------------------------------------------------------
『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』
18/5/2006

OPENVPN+OPENSSL数据流程分析

『 GuoLing's 』 OPENVPN+OPENSSL数据流程分析
严格来说,OpenVPN调用了Openssl函数库,Openssl对于OpenVPN而言仅仅是一套函数,我在这里所说的应该是OpenVPN的数据流程才对,但实际上OpenVPN不像其他简单的VPN程序将SSL协议过程完全交由Openssl控制,OpenVPN介入了对SSL报文的分析处理,将Openssl的状态机引入到自身的状态机中。

OpenSSL的BIO概念,抽象了输入输出通道,基本的使用方式是将程序置于OpenSSL之上,对于Openssl而言,BIO的输入便是网络,通过 readsocket(#define readsocket(s,b,n) recv((s),(b),(n),0))进行网络读取,底层的数据流动完全由OpenSSL控制,对于应用层程序而言,就像在原有的TCP、IP协议栈的网络层和应用层之间添加了一个安全层,数据的收发加密解密对于上层应用而言是透明的,这也是符合网络分层概念的。此时数据的走向是
Internet=>Openssl=>Program=>Openssl=> Internet。

同样,由于BIO的抽象,它并不固定输入输出目的地,因此为了能够完全控制数据流,OpenVPN将自身定义为openssl的BIO的输入端,从而完全掌握了报文,此时数据的走向是Internet=> OpenVPN9(1) =>Openssl=>OpenVPN(2)=>Openssl=> OpenVPN(1) => Internet。
其中在OpenVPN(1)阶段,OpenVPN的主要工作在于对报文做预处理;而在在OpenVPN(2)阶段,OpenVPN的主要工作在于实现功能。

由于OpenSSL中存在大量的指针函数操作,给程序流程的分析带来了麻烦,为了能够进行堆栈调试,我们在OpenVP和OpenSSL的源代码中引入了一个宏定义
#ifdef _DEBUG_DATA_FLOW_
#define DEBUG_STACKWALK(fun_name)\
do{\
if(0)\
printf("%s\r\n",fun_name);\
}while(0);
#else
#define DEBUG_STACKWALK(fun_name) ;
#endif
并将该定义添加到各个函数中,以便可以在各个操作系统上都能够打印函数执行过程。

环境
代码版本:OpenVPN-2.0.5以及OpenSSL 0.97i
操作系统版本Windows XP SP2
OpenVPN配置
客户端
clientdev tapproto tcp-clientremote 10.23.15.28 17909resolv-retry infinitenobindmute-replay-warningsca ca.crtcert CLIENT.crt #这里改成每个客户端相应的证书key CLIENT.key #这里改成每个客户端相应的证书keepalive 20 180comp-noadaptverb 1status openvpn-status.loglog openvpn.log
服务器端
port 17909proto tcp-serverdev tapserver 192.168.10.0 255.255.255.0keepalive 20 180ca ca.crtcert SERVER.crtkey SERVER.keydh dh1024.pempush "redirect-gateway def1"push "dhcp-option DNS 192.168.10.1"push "keepalive 5 180"user openvpngroup openvpnmode servertls-serverstatus openvpn-status.loglog openvpn.logclient-to-clientcomp-noadaptverb 1


编译
WINDOWS:选择DEV CPP的GCC编译器,首先用DEV CPP建立工程,将所有的源代码添加到工程中,添加工程的include目录,需要添加的有LZO库的include目录,OpenSSL的Include目录,之后添加工程所需的LIB库,包括
-L"C:/openvpn-2.0.5/lzo-1.08/lzo.lib" -L"C:/openvpn-2.0.5/ openssl-0.97i /out32dll/ ssleay32.lib" -L"C:/openvpn-2.0.5/openssl-0.97i/ out32dll/ libeay32.lib" -lcrypt32 -lws2_32 -lgdi32 -liphlpapi -lwinmm -lgmon,可以使用绝对路径取代这些简写,比如 -llzo 等价于-L"C:/openvpn-2.0.5/lzo-1.08/lzo.lib"。添加完这些即可编译运行。

分析
在Linux下和Windows下对OpenVPN进行线程观察,发现OpenVPN的确是单进程单线程在运行,而在这个过程中并不发生用户登陆的阻塞。
OpenVPN进行时间调度interval_earliest_wakeup,调用相关函数io_wait-> io_wait_dowork->socket_set-> stream_buf_read_setup->link_socket_connection_oriented-> link_socket_proto_connection_oriented-> stream_buf_read_setup_dowork-> stream_buf_set_next
socket_recv_queue-> stream_buf_get_next-> socket_event_handle->socket_read_residual
由于TCP是基于流的读取,为了区别每个报文,OpenVPN为每个报文添加了一个长度字段,
因此OpenVPN形成的TCP报文流是如下样式的:
长度:2+数据+长度:2+数据+长度:2+数据+长度:2+数据…….
当读取到一个完整的报文(长度:2+数据)时,查看代码可以发现OpenVPN通过link_socket_read_tcp读取网络数据,并缓存于sock->stream_buf中。
取得的数据经过tls_multi_process确定客户端实例,转交tls_process,进入OpenVPN的状态机,如果处于握手协商阶段,OpenVPN首先将报文拆解开,读取操作码,同时读取SSL数据,通过key_state_write_plaintext 调用bio_write 写入到openssl的BIO通道,在写入过程中,因为BIO_Write调用到了ssl3_read_bytes(OpenVPN仅仅支持TLS1.0,TLS1.0的握手状态与SSL3是一致的),在该函数的执行过程中handshake的函数指针被赋值为ssl3_connect。此时openssl状态机运行,处理相应的状态,并将结果bio_write回OpenVPN,OpenVPN获取到openssl的返回,继续tls_process的过程
如果是转发的数据报文,则不再需要openssl状态机的维护,OpenVPN直接调用openssl的加密解密函数,处理报文然后发送到对应的socket上即可。


关于BIO-抽象的IO接口

其实包含了很多种接口,用通用的函数接口,主要控制在BIO_METHOD中的不通实现函数控制,
我初步估计了一下,大概有14种,包括6种filter型和8种source/sink型。

BIO是在底层覆盖了许多类型I/O接口细节的一种应用接口,如果你在程序中使用BIO,那么就可以和SSL连接、非加密的网络连接以及文件IO进行透明的连接。
有两种不通的BIO接口,一种是source/sink型,一种是fileter型的。
顾名思义,source/sink类型的BIO是数据源或数据目标(我不知道sink该怎么翻译,据水木liaojzh说,一般是destination(目标、宿)的同义词,大家自己理解吧,呵呵),例如,sokect BIO和文件BIO。
而filter BIO就是把数据从一个BIO转换到另外一个BIO或应用接口,在转换过程中,这些数据可以不修改(如信息摘要BIO),也可以进行转换。例如在加密BIO中,如果写操作,数据就会被加密,如果是读操作,数据就会被解密。

BIO可以连接在一起成为一个BIO链(单个的BIO就是一个环节的BIO链的特例),如下是BIO的结构定义,可以看到它有上下环节的:
struct bio_st
{
BIO_METHOD *method;
/* bio, mode, argp, argi, argl, ret */
long (*callback)(struct bio_st *,int,const char *,int, long,long);
char *cb_arg; /* first argument for the callback */
int init;
int shutdown;
int flags; /* extra storage */
int retry_reason;
int num;
void *ptr;
struct bio_st *next_bio; /* used by filter BIOs */BIO下联
struct bio_st *prev_bio; /* used by filter BIOs */BIO上联
int references;
unsigned long num_read;
unsigned long num_write;
CRYPTO_EX_DATA ex_data;
};
一个BIO链通常包括一个source BIO和一个或多个filter BIO,数据从第一个BIO读出或写入,然后经过一系列BIO变化到输出(通常是一个source/sink BIO)。
BIO的结构定义和相关项解析如下:
(包含在bio.h文件中,其主文件为bio_lib.c)
typedef struct bio_st BIO;

struct bio_st
{
BIO_METHOD *method;//BIO方法结构,是决定BIO类型和行为的重要参数,各种BIO的不同之处主要也正在于此项。
/* bio, mode, argp, argi, argl, ret */
long (*callback)(struct bio_st *,int,const char *,int, long,long);//BIO回调函数
char *cb_arg; /* first argument for the callback *//回调函数的第一个参量

int init;//初始化标志,初始化了为1,否则为0
int shutdown;//BIO开关标志,如果为1,则处于关闭状态,如果为0,则处于打开的状态。
int flags; /* extra storage */
int retry_reason;
int num;
void *ptr;
struct bio_st *next_bio; /* used by filter BIOs */BIO下联
struct bio_st *prev_bio; /* used by filter BIOs */BIO上联
int references;
unsigned long num_read;//读出的数据长度
unsigned long num_write;//写入的数据长度

CRYPTO_EX_DATA ex_data;
};
在BIO的所用成员中,method可以说是最关键的一个成员,它决定了BIO的类型,可以看到,在声明一个新的BIO结构时,总是使用下面的声明:
BIO* BIO_new(BIO_METHOD *type);
在源代码可以看出,BIO_new函数除了给一些初始变量赋值外,主要就是把type中的各个变量赋值给BIO结构中的method成员。
一般来说,上述type参数是以一个类型生成函数的形式提供的,如生成一个mem型的BIO结构,就使用下面的语句:
BIO *mem = BIO_new(BIO_s_mem());
这样的函数有以下一些:
【source/sink型】
BIO_s_accept():是一个封装了类似TCP/IP socket Accept规则的接口,并且使TCP/IP操作对于BIO接口是透明的。
BIO_s_bio():封装了一个BIO对,数据从其中一个BIO写入,从另外一个BIO读出
BIO_s_connect():是一个封装了类似TCP/IP socket Connect规则的接口,并且使TCP/IP操作对于BIO接口是透明的
BIO_s_fd():是一个封装了文件描述符的BIO接口,提供类似文件读写操作的功能
BIO_s_file():封装了标准的文件接口的BIO,包括标志的输入输出设备如stdin等
BIO_s_mem():封装了内存操作的BIO接口,包括了对内存的读写操作
BIO_s_null():返回空的sink型BIO接口,写入这种接口的所有数据读被丢弃,读的时候总是返回EOF
BIO_s_socket():封装了socket接口的BIO类型
【filter型】
BIO_f_base64():封装了base64编码方法的BIO,写的时候进行编码,读的时候解码
BIO_f_buffer():封装了缓冲区操作的BIO,写入该接口的数据一般是准备传入下一个BIO接口的,从该接口读出的数据一般也是从另一个BIO传过来的。
BIO_f_cipher():封装了加解密方法的BIO,写的时候加密,读的时候解密
BIO_f_md():封装了信息摘要方法的BIO,通过该接口读写的数据都是已经经过摘要的。
BIO_f_null():一个不作任何事情的BIO,对它的操作都简单传到下一个BIO去了,相当于不存在。
BIO_f_ssl():封装了openssl 的SSL协议的BIO类型,也就是为SSL协议增加了一些BIO操作方法。
上述各种类型的函数正是构成BIO强大功能的基本单元,所以,要了解BIO的各种结构和功能,也就应该了解这些函数类型相关的操作函数。
所有这些源文件,都基本上包含于/crypto/bio/目录下的同名.c文件(大部分是同名的)中。
在BIO_METHOD里面,定义了一组行为函数,上述不通类型的BIO_METHOD行为函数的定义是不同的,其结构如下(以非16位系统为例):
typedef struct bio_method_st
{
int type;
const char *name;
int (*bwrite)(BIO *, const char *, int);
int (*bread)(BIO *, char *, int);
int (*bputs)(BIO *, const char *);
int (*bgets)(BIO *, char *, int);
long (*ctrl)(BIO *, int, long, void *);
int (*create)(BIO *);
int (*destroy)(BIO *);
long (*callback_ctrl)(BIO *, int, bio_info_cb *);
} BIO_METHOD;

在BIO的成员中,callback也是比较重要的,它能够用于程序调试用或者自定义改变BIO的行为。详细会在以后相关的部分介绍。
BIO的很多操作,都是BIO_ctrl系列函数根据不通参数组成的宏定义来完成的。所以要了解BIO的行为,了解BIO_ctrl系列函数以及其各个参数的意义也是很重要的。

【BIO目录文件的简要说明】
bio.h:主定义的头文件,包括了很多通用的宏的定义。
bio_lib.c主要的BIO操作定义文件,是比较上层的函数了。
bss_*系列:是soruce/sink型BIO具体的操作实现文件
bf_*系列:是filter型BIO具体的操作实现文件
bio_err.c:是错误信息处理文件
bio_cb.c:是callback函数的相关文件
b_print.c:是信息输出的处理函数文件
b_socket.c:是Socket连接的一些相关信息处理文件
b_dump.c:是对内存内容的存储操作处理
在BIO的基本操作系列函数中,他们用来BIO分配和释放操作,包括:
BIO_new, BIO_set, BIO_free, BIO_vfree, BIO_free_all
他们的声明在openssl/bio.h文件中,其声明形式如下:
BIO * BIO_new(BIO_METHOD *type);
int BIO_set(BIO *a,BIO_METHOD *type);
int BIO_free(BIO *a);
void BIO_vfree(BIO *a);
void BIO_free_all(BIO *a);
下面分别对这些函数进行解释.
【BIO_new】
这个函数创建并返回一个相应的新的BIO,并根据给定的BIO_METHOD类型调用下述的BIO_set()函数给BIO结构的method成员赋值,如果创建或给method赋值失败,则返回NULL。创建一个Memory类型的BIO例子如下:
BIO* mem=BIO_new(BIO_s_mem());
有些类型的BIO使用BIO_new()函数之后就可以直接使用了,如memory类型的BIO;而有些BIO创建之后还需要一些初始化工作,如文件BIO,一般来说,也提供了这样的一些函数来创建和初始化这种类型的BIO。
这是什么意思呢,举个简单的例子大家就明白了:
比如创建一个文件BIO,使用下面的代码:
BIO* in=NULL;
in=BIO_new(BIO_s_file());
BIO_read_filename(in,"rsa512.pem");
这样,BIO in才能使用,而如果是创建一个memory类型的BIO,则只需要如下一句代码:
BIO* mem=BIO_new(BIO_s_mem());
然后就可以对该BIO mem进行操作了。
另外,需要补充的是(这个大家从前面两篇文章可能已经认识到了),对于source/sink类型的BIO,其类型创建函数一般为BIO_s_*的形式,对于filter型的函数,其类型创建函数一般为BIO_f_*的形式。


【BIO_set】
该函数功能比较简单,就是对一个已经存在的BIO设置新的BIO_METHOD类型。其实就是简单的对BIO的各个成员进行初始化,并将参数type赋值给该BIO。其实,BIO_new函数在使用OPENSSL_malloc给BIO分配了内存之后,就简单调用了BIO_set函数进行初始化工作。所以一般来说,除非你要重新设置你已经存在的BIO,否则是不需要直接调用这个函数的。成功操作返回1,否则返回0。
【BIO_free】
该函数释放单个BIO的内存和资源,成功操作返回1,失败返回0。BIO的操作不仅仅是释放BIO结构所占用的资源,也会释放其下层的I/O资源,比如关闭释放相关的文件符等,这对不同类型的BIO是不一样的,详细的请参看各种类型BIO本身的说明文件和源文件。需要注意的是,BIO_free只释放当前的一个BIO,如果用来释放一个BIO链,就可能会导致内存泄漏,这种情况应该使用下述的BIO_free_all函数。
【BIO_vfree】
该函数功能与BIO_free完全相同,只是没有返回值。事实上,它简单调用了BIO_free函数,但不返回该函数的返回值,所以它的函数实现代码只有一个语句。
【BIO_free_all】
该函数释放这个BIO链,并且即使在这个过程中,如果释放其中一个BIO出错,释放过程也不会停止,会继续释放下面的BIO,这保证了尽量避免内存泄漏的出现。如果你非要调用这个函数释放单个的BIO,那么效果跟BIO_free是一样的。事实上,该函数只是简单的遍历整个BIO链,并调用BIO_free释放各个环节的BIO。

『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』
11/5/2006

[NTZZ]江湖传说之3G论剑

『 GuoLing's 』 华山论剑

有人说这个世上本没有江湖,不过是成年人缺少童话,就成就了所谓的“江湖”。

十年岁月转瞬即逝,GSM早已算不上上乘武功,而CDMA95也只不过是改变下三盘的修炼方法
,依然不能名扬武林,这两门武功现在看来不过是入门级的罢了。

在中原流传着十年一代的说法,最近有人看到几种新的武功惊现江湖:WCDMA(据说修炼至
上乘足以称雄武林)、CDMA2000(练的人太少在中原难受青睐)、TD-SCDMA(可惜只有半
卷也不能成就绝世之功)。所以,十年后的今日,群雄大多修炼WCDMA以实现称霸中原的梦
想,针对武林盟主的位置将展开一场惨烈的搏杀。 中原就是江湖里的家园或者王者之地,这
次的争霸,我们不妨称之为3G论剑(行动代号而
已)。

谈到群雄逐鹿,先想起了十年前的十三路诸侯决战中原,也是同样的血雨腥风,当年有十
三个武士参加中原GSM论剑(在中原的江湖中没有东洋武士的位置):JP(金鹏)、DX(东信
)、JL(巨龙)、DT(大唐)、HW(华为)、ZX(中兴)、LC(Lucent)、MT(Motorola)、NT(Nortel
)、AC(Alcatel)、SM(Siemens)、EC(Ericsson)和NK(Nokia)。他们以GSM之功征战厮杀以扩
大自己在中原的领地,无数次的血战早已随风飘逝了,有人扬名立腕、有人功败垂成。

就先说说失败的吧,JP和DX首先犯了致命的错误,他们趁MT熟睡的时候先后偷走了MT仅有
的半本GSM秘籍(BSS),本以为自己的功底草草修炼一下,虽不能成为盟主,总还能占
的一席之地为自己安身立命,可惜MT当时根本就没睡,他是故意放了两本外功的册子让他
们偷走,而核心的内功心法早已藏在密处(半本秘籍混江湖的MT自然深知内功的重要)
,他们偷走的不过是花架子,后来,JP和DX先后练功至走火入魔来求救于MT,MT却以换取
他们的领地为条件出手。JP和DX方才醒悟自己做了别人的嫁衣裳,真是机关算尽、反误了
卿卿性命。他们最后都在江湖中消失了,有人说在东南偏远之地曾见过他们,已是毫无英
雄之气,落到武功尽失无家可归的田地了。

而JL的下场也没好到哪去,在西北闭门修炼GSM多时,一直不能得其要领,虽有自己的04内
功心法,无奈悟性太差,所以,虽然比起偷武功的倒还算个英雄,但连行走江湖的本事都
不够,就更谈不上征战中原了,听说在西北练功的日子里居然不小心被狼咬成重伤,如今
也只是凡夫俗子再无心恋战江湖了。

DT虽然也在西北修炼过,也偷过MT的武学,而且还有一院三所四个练功房,在中原武林第
一个修炼完全套GSM武功,号称M30-G,可谓抢占了先机,但是DT最大的问题是生活条件太
好了,后期就没有专心练功,而是在江湖上到处游荡看热闹,在中原也没有真正的领地,
后来他带的弟兄们也大多投了别门别派,十年后,DT说他得到了那半本绝世秘籍 TD-SCDMA
,准备卷土重来,可这半本秘籍不过是一个传说而已,虽然,DT说一流高手SM也在练而且
很多武林宗师也都说这种武功不能小视,可真正当回事的也寥寥无几,所以这次3G论剑,
DT或可出彩但绝没有做盟主的实力。

当然,除了GSM外,十年前也有很多人推崇CDMA,来自西部的LC就是其中的一个,但与同样
来自西部的MT和NT不同,LC一直不肯练GSM,拿着一本来自贝尔所写的5ESS心法闯荡江湖,
直到在中原屡战屡败之后,才草草修炼几日GSM,总算自己功底深厚,在东北方找到了立脚
点,但是失败的经历早已摧毁了LC当初来中原的雄心壮志,人生最大不幸莫过于失去征战
的勇气和信心,据说他这次很难来中原参加3G论剑了。

所以,经过十年的大浪淘沙,真正在中原得到战略要地的只有八个武士了,他们雄心勃勃
来参加这次3G论剑、一争高下,江湖中传说六个月后将设坛摆擂,决出武林盟主。这次征
战可能决定了今后十年的江湖格局,大家对此不可谓不重视。我们无法预知江湖恩怨的结
局,但听了太多关于这八个高手的故事,或许可以看出谁会是未来的王者。而他们都是过
去十年的英雄,其威名在中原已是路人皆知。

南海剑客:ZX、HW:
==============
初见ZX,总以为他会像DT一样半途而废,可他十年来一直较紧牙关坚持练功,所练武功也
是跨越GSM和CDMA,其ZXT10心法也有独到之处,还包括五花八门的暗器手法(固网、无线
接入、传输、电源和监控),但ZX的弱点是缺少天赋(这是混江湖的致命伤),还好够勤
奋,只可惜所带的弟兄大多武功平平不足以辅佐他成就霸业。ZX一直为此苦恼。七年前他
兵分两路从六安和保定起家,甚至也远赴重洋在孟加拉和南斯拉夫占了一席之地,可惜在
中原却再无多斩获。谈起过去的幽暗岁月,ZX说要不是HW也在南海起兵,我必称霸武林,
自古远交近攻,他日必杀HW而后快。

说到这次3G论剑,ZX说自己内外兼修十年,早已熟知WCDMA和CDMA2000之精要,倘若不能称
霸,也必打他一个大大的疆土。但江湖人士普遍认为ZX的先天不足很可能是他这次决战的
不利因素,须知高手过招,已不在一招一式,外功固然重要,内功才是决胜的关键;同时
,单兵作战已落下风更难保证决战之时众弟兄们能勇猛无敌。难怪ZX时常叹息:人心散了
,队伍不好带了。

相比较而言,HW更重视内功修为,所带弟兄也大多英勇善战,因为他在南海早已抢先一步
网罗大批剑客,每日好酒好菜并严加练功,其集团作战能力实超出ZX一筹,而HW也修炼GS
M多时并自创CC08,在此基础上更推出HONET、ETS等多种拳法,与ZX一样,他也兼修各类暗
器手法,在电源、传输和数据上更是提高很快,在一次暗器比试中又重创千手观音。
HW七年前在内蒙和沧州起兵,并频频使用偷袭战法在中原周围偏僻之处拓展领地,几年下
来站稳了脚跟。

HW十分重视手下弟兄们的忠心,其武林称霸的决心由来已久,为此不惜牺牲大批弟兄征战
南美、中东和非洲,并在中原各地布下眼线,HW的雄心已不只中原武林,其来势汹汹已令
各路高手提防。

为3G论剑也可谓煞费苦心,其WCDMA的修为进展很快,还不时声称R4拳法和HSDPA腿功了得
,江湖人士已很难了解他真正的武功境界,哪一招是实哪一招是虚?与ZX一样,HW也十分
痛恨这个同样在南海建立大本营的对手,早期时也几次痛
下杀手,但在3G论剑中似乎没把ZX放在眼里,因为他将全力挑战其他门派宗师。

说到他们的以往的仇恨,我想他们一定没听过那个老套的故事,故事说很久以前有个人叫
小强,他有一个爱他的人和一个恨他的人,当爱他的人死去的时候,他伤心并失望,眼泪
都流干了;可当恨他的人也死掉的时候,他是开心并绝望,没有眼泪。因为爱是他活着的
目的,但是当恨也消失,他再没有活下去的理由。ZX和HW总有一天会明白,在这个江湖上
,爱和恨都很重要,抓不到爱就别让恨也消失掉。

东部神拳:AC、SM:
==============
这两位英雄同样以拳法著称于世,AC的独家拳谱S1240早期是练功者的经典,AC是80年代来
到中原,各地下设10个香主,号称4000多弟兄,十年来专心研究GSM,在东、西和北部已占
领9块领地,作为很早就在中原征战的资深武士,AC比南海剑客更有先天优势,本可以一朝
功成名就确立霸业,无奈AC精于拳法却弱于腿功(BSS),在一次又一次的优化行动中节节
败退,只得退守一些偏远的领地。

这次在3G再次决战仍然选择拳法作为突破口,企图在R4拳斗中找到退敌之术,目前据江湖
人士分析AC仍然没有绝对优势,况且腿功不好更拉上东洋武士FJS前来助拳,中原人士更加
不看好AC的胜算。而SM也是十年前一套EWSD拳法名扬中原,SM修炼的武功甚多,到处找
人决斗以攻城略地,还在各地设立了40多家合作帮会,手下弟兄号称过万,在GSM功夫时代
考虑到自己腿功不见长,多次与MT并肩战斗,直到推出BS60系列武功才与MT渐行渐远直至
分道扬镳,整整十年征战,SM已在中原确立了自己独霸一方的地位。 本来SM完全能够以数倍强于AC的实力来迎战3G论剑之约,无奈在GSM已成昨日黄花之际SM没
能进一步精进自己的武功,R4拳法没能像固网软交换战术一样运用自如,受制于人之态已
显现,加之与DT一起深信那半卷TD-SCDMA秘籍,虽然中原人士也有人称其为或可成绝世之
作,但对主流WCDMA的放弃则意味着未来称雄武林的志向却难以实现,更令人失望的是也拉
来了东洋的NEC助拳,虽然自己在中原根基深厚,但江湖上争斗已达触一发而动全身的态势
,没有上盘下盘全面的武功以及深厚的内功心法,实难在3G论剑中一战成名。这两个以练
拳著称于世的武士有可能会得到领地,但依然难称霸武林。

西域鞭腿:MT、NT:
==============
一看就知道这两位是以练下三路见长的行家里手,MT在中原有太多的故事,80年代带大批
弟兄来到中原征战,虽然半本GSM武功(BSS)混迹江湖,由于下手早所以占据了大片河
山,而且一向与中原人士交往过密,所以十年前的一战完全是有备而来,在各地设四个分
舵,而且其他初级武士(DX、JP、DT)的征战骗取了很多领地,所以3G会战中也不可小
视,MT同时修炼WCDMA和CDMA2000两本秘籍,号称更擅长后者,尤其是最近与HW经常出入酒
楼密谈共同图霸中原的计划,MT一向腿法变化莫测(跳频、高灵敏度),虽然武功不够全
面且内功日益衰败,但有可能在学到HW的拳法后与诸雄在局部一争高下。

而同样来自西部的NT就聪明得多,十年前GSM之战来中原,不仅修习拳法(DMS100)更重腿
功(率先推出1*3跳频),而且暗器手法多样(传输DWDM、数据PassPort/Shasta、以及固
网Switch),同时兼修WCDMA和CDMA2000,最近听江湖人士称NT也到处讲要闭关修炼那半本
TD-SCDMA,但NT最大的问题是所学过杂难以精进,而且4年前被LC拉去打群架,两人当时由
于学艺不精居然被街头混混Nasdaq一顿老拳欧成重伤,以至这些年来不得不长期修养。NT
虽然十年来所占领地不多,但为3G论剑着实准备多时,NT最近在练功时遇到了问题,由于
功力杂乱一时造成体内多股真气相撞,恐难打通血脉以成正果,而且手下兄弟> 过少,想
在江湖上一战成名也决非易事。


北派宗师:EC、NK:
==============
在这个江湖上,可以称得上武林宗师并不多,EC和NK绝对可以算得上,他们同样来自北方
,一直苦心修炼GSM多时并很少用暗器,十年来确立了自己在中原数一数二的领袖地位。


EC来中原也很长时间了,各地设四个分舵众多香主,并且有合作帮会,手下弟兄也是一呼
千应,一套AXE拳法曾经打遍大江南北,腿功也是功力深厚(率先推出1024载频的BSC和12
载频BTS),长期以来占据了中原大片富泽之地一举成为中原霸主,在中原可谓基础深厚,
在过去十年中,各路英雄几乎找不到EC的薄弱之处,本来江湖人士也认为EC能够在3G论剑
中顺利夺得武林盟主的宝座,而其他英雄只能在各自的领地偏安一方。

但最近又不利消息传出,EC的拳法已不像当年一样无人能出其右,而且近来修炼内家真气
的时候经常岔气(APZ处理器换代),在R4拳谱上的修为也是慢人一步,尚不能杀敌于无形
,并且还拉来了Juniper这种旁门左道武士替其观敌料阵,只是腿功还算不错,依然内功深
厚。但今天的江湖已不像往日,须知:一寸短、一寸险。

众多江湖人士认为EC依然是难得的武林英豪,但是否武林盟主的位置能够一蹴而就,还有
要看近期修练的成果和六个月后真正的决战。说到这里,我们似乎可以看到一种可能性:
3G论剑的结果很可能像十年前一样,EC有可能做了盟主并霸占大部分领地,而其他各路英
雄再决座次。

但是我们忘了还有一个武士,同样来自北方的NK,他是85年来中原征战,也设四个分舵无
数香主,以及2个外功训练厅和3个内功练功房,十年征战虽然没有使NK成为武林盟主,但
还是在中原占领了大片领地,实在是仅屈尊于EC而已,NK的优势在于其GSM修炼得如火纯青
,拳法与腿功齐头并进,最近又加班加点狂练WCDMA,而且为了让自己专心成就霸业,更是
火烧CDMA2000秘籍又把DT送来的TD-SCDMA扔在门外。

很多有识之士都觉得:要想在这个江湖上成为霸主只有两种方式,一是内外兼修并博采众
家之长,也包括暗器之类,HW、SM和NT都有这样的思路,但自古云术业有专攻,没有人真
正能把众多门类的武功融为一体,所以历史证明杂则无法得其深,尤其是3G论剑这种高技
术含量的比斗,这种方式称霸太难;还有一种方式就是专注于WCDMA直到无人能及的地步
。看来NK采取了后一种方式破釜沉舟,江湖上盛传NK已将R4拳法练到九成功力,而且HSDP
A 腿功也几尽完善,同时更率先练成了传说中的HSUPA绝世轻功。江湖人士认为NK有可能会
在3G论剑中力挫群雄技拔头筹,扎实的功力和雄厚的人马会使他得偿所愿吗?

决战的日子就快到了,但我们通过分析似乎可隐约看出未来十年的势力划分。

拔剑:
八个身怀上乘武功的英雄正在最后的关头加紧练功并招兵买马,可最终能成为武林盟主的
只有一个,谁胜谁败,我们拭目以待。
这个江湖平静得太久了,十年的时光消磨了多少英雄气概,现在3G论剑给了大家一个机会
,至少这次决战会使各路英雄重新一显身手,看来“变化”是这个世界最受欢迎的东西,
我们期待着变化、期待着决战巅峰。

有诗云:
风雨江湖刀光处,铿锵武士英雄路;
千军征战几人回,一将功成万骨枯。
气贯长虹似猛虎,轻灵飘逸如狡兔;
斜阳虽陷山岭后,壮志犹在云飞处。

欲知论剑结果,六个月后便见分晓……

『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』

公告

『 GuoLing's 』 骑行上班新纪录58'37''

骑行上班新纪录58'37'' 发文庆贺
  


北京交通大学--东北旺北站,路程15.6公里


时间:2006.05.11 07:15:00--2006.05.11 08:13:37

                                                                                                    
『 ?рēn-Ρlāм ? 』
『 Open-Palm ? 』
 
『 编辑日志 』