基本信息
原書名:Effective TCP/IP Programming: 44 Tips to Improve Your Network Programs
原出版社: Addison-Wesley Professional
作者:(美)Jon C. Snader
譯者:陳涓趙振平
叢書名: 圖靈程式設計叢書
出版社:人民郵電出版社
ISBN:9787115249371
出版日期:2011 年4月
開本:16開
頁碼:268
編輯推薦
歷久彌新的經典著作,揭示健壯網路程式的秘密,網路編程人員必備
內容簡介
《tcp/ip高效編程:改善網路程式的44個技巧》是tcp/ip 領域的經典著作,對tcp/ip 網路編程中存在的各種問題進行了全面解析,旨在幫助讀者深入透徹地理解tcp/ip 網路編程。本書組織方式比較特別,正文部分包括4 章,將網路編程中存在的常見問題組織成44 個技巧,探討問題的過程中構建並運行了多個程式,並且指出了代碼的源地址,便於讀者查看。全書以技巧的形式解答了日常工作中遇到的經典問題,將本書作為手冊使用,極其方便。
《tcp/ip高效編程:改善網路程式的44個技巧》主要面向有一定經驗的初學者或中級網路程式設計師,也可作為計算機相關專業人士的參考讀物。
作譯者
Jon C.Snader:TCP/IP專家,Paradigm 4的資深軟體工程師。他的工作領域包括通信、網路、編譯器開發、作業系統以及無線網路控制器等。最近主要從事公共安全市場的報文交換系統方面的工作。
陳涓 1997年畢業於南京通信工程學院,獲得通信與信息系統方向碩士學位。留校任教至今,從事網路套用方面的工作。
趙振平 1998年畢業於南京大學計算機科學系,獲得作業系統和網路方向碩士學位。目前任職於南京信風軟體有限公司,從事網路安全和多媒體方面的工作。
目錄
《tcp/ip高效編程:改善網路程式的44個技巧》
第1章 概述 1
1.1 幾個約定 1
1.2 本書其餘部分的內容介紹 2
1.3 客戶端—伺服器結構 4
1.4 對基本套接字api的回顧 5
1.5 小結 12
第2章 基本概念 13
2.1 技巧1:理解面向連線和無連線協定之間的區別 13
2.2 技巧2:理解子網和cidr的概念 18
2.2.1 分類編址 18
2.2.2 子網劃分 21
2.2.3 cidr 26
2.2.4 子網劃分和cidr的狀態 27
2.2.5 小結 27
2.3 技巧3:理解私有地址和nat 28
2.4 技巧4:開發並使用應用程式“框架” 30
2.4.1 tcp伺服器框架 31
2.4.2 tcp客戶端框架 36
2.4.3 udp伺服器框架 38
.2.4.4 udp客戶端框架 39
2.4.5 小結 41
2.5 技巧5:套接字接口比xti/TLI更好用 41
2.6 技巧6:記住,tcp是一種流協定 43
2.7 技巧7:不要低估tcp的性能 50
2.7.1 udp源程式與接收程式 52
2.7.2 tcp源程式及接收程式 53
2.7.3 小結 59
2.8 技巧8:避免重新編寫tcp 59
2.9 技巧9:要認識到tcp是一個可靠的,但並不絕對可靠的協定 61
2.9.1 可靠性——是什麼,不是什麼 61
2.9.2 故障模式 63
2.9.3 網路中斷 63
2.9.4 對等實體崩潰 64
2.9.5 對等實體的主機崩潰 68
2.9.6 小結 69
2.10 技巧10:記住,tcp/ip不是輪詢的 69
2.10.1 保持活躍 70
2.10.2 心跳信號 71
2.10.3 另一個例子 76
2.10.4 小結 81
2.11 技巧11:提防對等實體的不友好動作 81
2.11.1 檢測客戶端的終止 82
2.11.2 檢測無效輸入 84
2.11.3 小結 88
2.12 技巧12:成功的lan策略不一定能推廣到wan中去 88
2.12.1 性能問題舉例 88
2.12.2 隱含錯誤舉例 89
2.12.3 小結 93
2.13 技巧13:了解協定是怎樣工作的 93
2.14 技巧14:不要把osi七層參考模型太當回事 94
2.14.1 osi模型 95
2.14.2 tcp/ip模型 96
2.14.3 小結 98
第3章 構建高效且健壯的網路程式 99
3.1 技巧15:理解tcp的寫操作 99
3.1.1 從應用程式的角度看寫操作 99
3.1.2 從tcp角度看寫操作 100
3.1.3 小結 103
3.2 技巧16:理解tcp的有序釋放操作 103
3.2.1 shutdown調用 104
3.2.2 有序釋放 106
3.2.3 小結 110
3.3 技巧17:考慮用inetd來裝載應用程式 111
3.3.1 tcp伺服器 111
3.3.2 udp伺服器 114
3.3.3 小結 118
3.4 技巧18:考慮用tcpmux為伺服器“分配”知名連線埠 118
3.5 技巧19:考慮使用兩條tcp連線 126
3.5.1 單連線結構 127
3.5.2 雙連線架構 128
3.5.3 小結 133
3.6 技巧20:使應用程式成為事件驅動的(1) 133
3.7 技巧21:使應用程式成為事件驅動的(2) 140
3.8 技巧22:不要用time-wait暗殺來關閉一條連線 147
3.8.1 它是什麼 147
3.8.2 為什麼要使用它 149
3.8.3 time-wait暗殺 150
3.8.4 小結 151
3.9 技巧23:伺服器應該設定SO_REUSEADDR選項 151
3.10 技巧24:可能的話,使用一個大規模的寫操作,而不是多個小規模的寫操作 155
3.10.1 禁用Nagle算法 158
3.10.2 將寫操作合併起來 159
3.10.3 小結 161
3.11 技巧25:理解如何使connect調用逾時 162
3.11.1 使用告警 162
3.11.2 使用select 164
3.11.3 小結 167
3.12 技巧26:避免數據複製 167
3.12.1 共享記憶體緩衝區 168
3.12.2 一個共享記憶體緩衝區系統 169
3.12.3 一個unix實現 171
3.12.4 一個windows實現 175
3.12.5 小結 179
3.13 技巧27:使用前將結構sockadddr_in清零 179
3.14 技巧28:不要忘記位元組的性別 180
3.15 技巧29:不要將ip地址或連線埠號硬編入應用程式中 182
3.16 技巧30:理解已連線的udp套接字 187
3.17 技巧31:記住,並不是所有程式都是用c編寫的 190
3.18 技巧32:理解緩衝區長度帶來的影響 195
第4章 工具和資源 199
4.1 技巧33:熟悉ping實用工具 199
4.2 技巧34:學習使用tcpdump或類似的工具 201
4.2.1 tcpdump是如何工作的 202
4.2.2 使用tcpdump 205
4.2.3 tcpdump的輸出 206
4.2.4 小結 210
4.3 技巧35:學習使用traceroute 210
4.3.1 traceroute是如何工作的 212
4.3.2 windows tracert 214
4.3.3 小結 215
4.4 技巧36:學習使用ttcp 215
4.5 技巧37:學習使用lsof 219
4.6 技巧38:學習使用netstat 221
4.6.1 活動套接字 221
4.6.2 接口 223
4.6.3 路由表 223
4.6.4 協定統計 225
4.6.5 windows版的netstat 227
4.6.6 小結 227
4.7 技巧39:學習使用系統中的調用追蹤工具 227
4.7.1 過早終止 227
4.7.2 ttcp性能問題 231
4.7.3 小結 232
4.8 技巧40:構建並使用捕獲icmp報文的工具 233
4.8.1 讀取icmp報文 233
4.8.2 列印icmp報文 234
4.8.3 小結 239
4.9 技巧41:讀stevens的書 240
4.9.1 《tcp/ip詳解》叢書 240
4.9.2 《UNIX網路編程》叢書 241
4.10 技巧42:閱讀代碼 242
4.11 技巧43:訪問rfc編輯者的頁面 243
4.12 技巧44:經常訪問新聞組 244
附錄a 各種unix代碼 247
附錄b 各種windows代碼 250
參考書目 253
索引 257
譯者序
網路已經無處不在,和我們的生活息息相關,絕大部分有趣和有用的程式都需要進行網路訪問。
TCP/IP是網際網路的核心協定,它最流行的編程接口是套接字。應用程式通過套接字可以很容易地進行網路通信。然而,實際的程式在運行時,常會碰到各種各樣的性能和連通性方面的問題。如果對網路協定的底層運作細節沒有深入的了解,就會被這些問題所困擾,難以開發出高效和穩健的應用程式。
Jon C. Snader的這本書是深入學習TCP/IP網路編程的必備書籍。通過一個個獨立的技巧,本書對網路編程中可能碰到的各種微妙問題一一進行了深入的分析和闡釋,並提供了很多可以方便擴展的實例代碼。有些複雜的問題還在多個技巧中反覆提起,從多種角度幫助讀者加深理解。本書還對解決聯網問題的常用工具進行了精要的介紹,幫助讀者利用工具提高分析和解決聯網問題的能力。
如今的編程工作除了靠埋頭苦幹,還要充分利用網路帶來的便利,學習和利用世界上其他編程人員的優秀成果,避免毫無意義的重複勞動,切不可閉門造車或重蹈覆轍。本書最後的閱讀代碼技巧中,對網路和作業系統方面的可以公開獲得的優秀書籍和開源項目進行了梳理,旨在幫助讀者找到適宜的學習目標,從而少走彎路,加快學習和成長的速度。
本書適用讀者範圍廣泛,對有一定網路編程基礎和經驗豐富的工程師都具有很高的參考價值。我自身雖然具有多年網路編程教學和產品開發方面的實踐經驗,但在翻譯本書的過程中也學習和完善了很多知識。
IT技術發展迅猛,許多書籍很快就會過時。而本書的英文原版雖然出版於2000年,但它是作者長期分析實踐總結出的真知灼見,如今看來,它不但沒有過時,還將會伴隨TCP/IP體系的進一步發展,產生深遠的影響。
陳涓
2011年1月
前言
簡介
網際網路、無線通信以及聯網技術總體上的爆炸性發展,使得編寫聯網應用程式的程式設計師和工程師的數量也在激增。TCP/IP編程看起來很容易,因而很有誘惑力。API(Application Programming Interface,套用編程接口)也很易懂,即使是超級新手也可以把客戶端或伺服器模板充實為能夠工作的應用程式。
但是,在最初的生產率激增之後,新手們往往會陷入細節的泥沼之中,並發現自己的應用程式飽受性能及健壯性問題的困擾。網路編程過程中的黑暗角落和易誤解的地方比比皆是。本書就像一盞明燈照亮了這些角落,並通過對TCP/IP編程中一些微妙問題的解釋來幫助大家糾正了很多錯誤的理解。
看完本書之後,你會透徹地理解網路編程中的許多問題。書中討論了很多看起來好像與一個網路程式設計師所需掌握的核心知識只有一些外圍聯繫的內容。但我們會看到,理解了這些細節問題,就可以幫助我們更好地理解網路協定的內部運作機制是怎樣與應用程式進行互動的。有了這種洞察力,原來看起來讓人困惑的程式行為就會變得很好理解,怎么解決問題也就很明顯了。
本書的組織方式有些與眾不同,我們將一些常見問題組織成一系列的技巧,每個技巧討論一個問題。在討論特定問題的過程中,通常會對TCP/IP編程的某些方面進行深入的研究。完成對特定問題的討論之後,我們不僅能夠掌握這些常見問題的特點和解決方案,還會對TCP/IP協定是怎樣工作的,以及它如何與我們編寫的應用程式進行互動有相當全面的理解。
將內容以技巧的形式組織起來會顯得不夠連貫,為了便於理解,第1章提供了相應的內容介紹,對每章涵蓋的技巧以及這些技巧之間的聯繫進行了說明。目錄中列出了每一個技巧,可以從中看出正文的組織結構。每個技巧的標題都是祈使句,因此也可以把目錄當作網路編程的規則來用。
從另一方面來看,將內容以技巧的形式組織起來,使本書更像一本實用而又方便查閱的手冊。在日常工作中遇到問題時,可以很方便地去重溫其中的技巧,加深對特定問題的理解。你會發現很多話題都會在多個技巧中提到,有時只是換個角度來討論。這種重複有助於鞏固概念,讓你對它們達成更自然的理解。
讀者對象
本書主要是面向有一定經驗的初學者或中級網路程式設計師,但經驗更豐富的讀者會發現本書也是很有用的。我們假設讀者熟悉聯網知識,以及基本的套接字API,但第1章也對基本的套接字調用進行了複習,並用它們構建了初級的客戶端和伺服器。技巧4更詳細地介紹了各種客戶端和伺服器模型。因此,哪怕只具有少量背景知識的讀者也能理解本書,並從中獲益。
由於所有的示例基本上都是用C語言編寫的,因此要看懂本書的程式,至少需要有基本的C語言編程經驗。技巧31展示了一些用Perl編寫的例子,但並不需要讀者掌握Perl的知識。類似地,還有幾個小的shell程式示例,理解它們同樣也不需要有shell編程的經驗。
本書所有示例和內容都爭取做到獨立於平台。除了少數幾個例子之外,其他示例都可以在任何UNIX或Win32系統中編譯並運行。即使那些沒有工作在UNIX或Windows系統下的程式設計師,要把這些例子移植到他們所使用的平台上去也應該不會有什麼問題。
排版約定
在探討技巧的過程中,我們會構建並運行很多小程式,設計這些小程式是為了從不同方面來說明問題。在顯示互動式輸入輸出時,會使用下列約定:
輸入的文本被設定為粗體的Courier;
系統輸出的文本被設定為標準的Courier;
非實際輸入或輸出的注釋內容,用楷體表示。
下面是技巧9中的一個例子。
bsd: $ tcprw localhost 9000
hello
received message 1 延遲5秒之後列印此訊息
媒體評論
“本書從程式設計師的角度剖析了TCP/IP的基本原理,沒有任何照本宣科式的說教,而是採用了大量實用的建議、技巧,一定會讓每一位網路編程人員愛不釋手、受益匪淺。”
─—Uri Raz,TCP/IP專家、資深網路工程師
“本書可以跟Stevens的書互為補充。書中的內容可以用言簡意賅來形容,作者在如此少的篇幅中討論了那么多TCP/IP開發的知識點,真是令人驚嘆不已。它特別適合偶爾做做相關開發,而不願意啃大部頭著作的程式設計師。”
─—亞馬遜讀者評論
“謝天謝地,本書幫我解決了在一個大型公司級網路編程項目中遇到的所有難題!它不僅教會了我使用各種網路編程工具,而且更重要的是讓我以前那些模糊的認識都得到了澄清。好書,快看,馬上學以致用吧!”
─—W. J. Vovil “Wayne”,程式設計師