標籤:

如何去分析開源的代碼,例如tomcat?


Tomcat 已經不是「一段代碼」了。
先了解他的原理吧,再從小做起。

比如說 Tomcat,這樣一步步來學習:
(1)Tomcat 是什麼?HTTP 應用伺服器。
那麼,先去看一下簡單的 HTTP 伺服器如何實現。
網上有很多這樣的小程序,它真的很小,一個很簡單很簡單的 HTTP 伺服器,代碼 100 - 200 行就足夠。
原理:創建Socket。根據請求 URL,映射到文件系統的某個路徑,然後按照一定格式返回。

(2)這個簡單的伺服器,不支持並發,會造成資源浪費。
那麼學習下Java NIO機制(select/poll)。
如果可以的話,順便了解下 Linux 下的 epoll 機制、Windows 下的 IOCP 機制。這些都是非同步通訊的一些基礎知識。

(3)Cookie、Session、Request、Response
Tomcat 通過一個 Hash 表來維護 Session,Hash Key 是 Cookie 中 JSESSIONID 這個欄位。
明白這個道理後,自己就可以簡單的實現這個部分。
Request、Response 的構造和傳遞,從AprConnector、Catalina Engine、Context、Filter、再 Dispatch 到對應的 Servlet。
理清結構,才容易看懂代碼。

(4)然後,再次基礎上,支持動態解析。
Tomcat 是一個 Java 應用伺服器,可以將 Servlet Class 的執行結果返回給客戶端。
那麼如果去動態映射請求呢?Tomcat 是用 web.xml,檢查 URL Pattern 來實現。比如 *.jsp 全部映射到 JspServlet 去執行。

(5)高級特性
比如配置文件、AJP協議、Tomcat集群原理,Sticky Session機制,Session 持久化,連接池,JNDI,SSO 等等。
這些相對來說比較獨立。
沒關係,先搞清楚原理,再研究代碼,會容易很多。

先說這麼多吧。這是個龐大的工程,先打好理論基礎,再閱讀代碼。加油。


1.盡量最快速度找一個可運行的系統,如互聯網已經運的,或linux 自帶安裝版本運行,盡量記下運行日誌。配置文件等。
2.自己編譯一下開源系統
3.使用源代碼分析工具。C/C++的方向用SourceInight (可惜只有Windows版),如果在其它平台可以用vim加一些插件夠用了。


補充開源代碼Bug分析的一部分,Coverity 有一個Cloud Scan項目:http://scan.coverity.com
Tomcat系列的一大批項目都在上面每天做代碼分析。包括我們前兩天剛發現的Roller 0day漏洞
http://netsecurity.51cto.com/art/201603/507418.htm?from=timelineisappinstalled=0


推薦閱讀:

RPC框架和簡單的request - reponse的web框架有什麼區別?
JVM 常量池中存儲的是對象還是引用呢?
jvm內存回收詭異現象,求解?
JVM的JIT優化所帶來的性能提升與C++之類比較那個好?
想做軟體開發,學哪種語言比較好?

TAG:Java | 代碼分析 |