本書完整而詳細地介紹了TCP/IP協(xié)議是如何實現(xiàn)的。書中給出了約500個圖例,15000行實際操作的C代碼,采用舉例教學的方法幫助你掌握TCP/IP實現(xiàn)。本書不僅說明了插口API和協(xié)議族的關(guān)系以及主機實現(xiàn)與路由器實現(xiàn)的差別。還介紹了4.4BSD-Lite版的新的特點。本書適用于希望理解TCP/IP協(xié)議如何實現(xiàn)的人,包括編寫網(wǎng)絡(luò)應(yīng)用程序的程序員以及利用TCP/IP維護計算機網(wǎng)絡(luò)的系統(tǒng)管理員。
簡介
本書描述并給出了TCP/IP實現(xiàn)引用的源代碼—加利福尼亞大學伯克利分校的計算機系統(tǒng)研究組(CSRG)的實現(xiàn)。歷史上,它曾以4.x BSD系統(tǒng)(伯克利軟件發(fā)行)發(fā)布。這個實現(xiàn)第一次發(fā)布是在1982年,經(jīng)過了很多重大的改變和改進,并且其中很多特性被引入到其他Unix和非Unix系統(tǒng)中。這不是一個沒有多大意義的實現(xiàn),而是天天在世界上成千上萬個系統(tǒng)上運行的TCP/IP實現(xiàn)的基礎(chǔ)。這個實現(xiàn)還提供路由功能,顯示主機和路由器的TCP/IP實現(xiàn)間的區(qū)別。
我們描述這個實現(xiàn)并給出TCP/IP內(nèi)核實現(xiàn)的完整源代碼,大約15 000行C代碼。在本文中描述的是4.4BSD-Lite版本。這個代碼在1994年4月公開,包含很多增強的聯(lián)網(wǎng)部分,它們被添加到1988年的4.3BSD Tahoe版、1990年的4.3BSD Reno版和1993年的4.4BSD版(附錄B介紹了如何獲得這些源代碼)。4.4BSD版提供最新的TCP/IP特征,如多播和長肥管道支持(用于高寬帶、長時延路徑)。圖1-1提供了伯克利聯(lián)網(wǎng)代碼的各種版本的其他細節(jié)。
本書適用于希望理解TCP/IP的實現(xiàn)細節(jié)的廣大讀者:編寫網(wǎng)絡(luò)應(yīng)用的程序員,負責利用TCP/IP維護計算機系統(tǒng)和網(wǎng)絡(luò)的系統(tǒng)管理員,以及任何想理解大塊的重要代碼是如何滿足一個真實操作系統(tǒng)的程序員。
本書的組織結(jié)構(gòu)
下圖顯示的是所涉及的各種協(xié)議和子系統(tǒng)。每個方框旁的斜體數(shù)字指出方框中的論題在哪一章討論。
我們采用自底向上的方法來討論TCP/IP協(xié)議族,從數(shù)據(jù)鏈路層開始,然后是網(wǎng)絡(luò)層(IP、ICMP、IGMP、IP路由選擇和多播路由選擇),接下來是插口層,最后以運輸層(UDP、TCP和原始IP)結(jié)束。
預(yù)期的讀者
本書假設(shè)讀者對TCP/IP的工作原理有基本的理解。不熟悉TCP/IP的讀者應(yīng)該參考本套書中的第1卷[Stevens 1994],那本書對TCP/IP協(xié)議組進行了全面的描述。在本書中對第1卷的引用均為卷1。本書還假設(shè)讀者對操作系統(tǒng)原理有基本的理解。
我們用數(shù)據(jù)結(jié)構(gòu)方法來描述這個協(xié)議的實現(xiàn)。即,除了給出源代碼外,每章還包括源代碼使用和維護的數(shù)據(jù)結(jié)構(gòu)的圖與說明。我們顯示了這些數(shù)據(jù)結(jié)構(gòu)是如何適用于TCP/IP和內(nèi)核使用的其他數(shù)據(jù)結(jié)構(gòu)的。通篇使用大量的圖表—超過250個圖表。
這種數(shù)據(jù)結(jié)構(gòu)方法允許讀者采用各種方式使用本書。對所有實現(xiàn)細節(jié)感興趣的讀者可以從頭到尾閱讀全書,看完所有的源代碼。可能只想理解協(xié)議的實現(xiàn)細節(jié)的其他讀者,可通過理解所有數(shù)據(jù)結(jié)構(gòu)并閱讀所有文字達到目的,而不必看完所有的源代碼。
我們預(yù)料很多讀者會對書中的特定部分感興趣并且想直接進入那一章。因此,通篇提供了很多向前或向后的引用,沿著完整的索引,允許單獨學習某一章。在各章的結(jié)尾都提供了習題,并在附錄A中給出大多數(shù)習題的答案作為自學的參考,使本書能發(fā)揮最大的作用。
源代碼版權(quán)
本書中出現(xiàn)的所有代碼,除了圖1-2和圖8-27,都是來自4.4BSD-Lite發(fā)行版。這個軟件是公開的,可從很多地方獲得(參見附錄B)。
源代碼的所有部分都包含下列版權(quán)聲明。
Gary R.Wright
米德爾頓,康涅狄格
W. Richard Stevens
圖森,亞利桑那
1994年11月
加里•R. 賴特(Gary R. Wright)研究TCP/IP多年。他是Connix公司的董事長,Connix公司的總部在康涅狄格州,主要提供Internet接入和咨詢服務(wù)。
W. 理查德 史蒂文斯(W. Richard Stevens)(1951—1999)是國際知名的Unix和網(wǎng)絡(luò)專家,備受贊譽的技術(shù)作家。生前著有《TCP/IP 詳解》(三卷本)、《UNIX網(wǎng)絡(luò)編程》(兩卷本)以及《UNIX環(huán)境高級編程》,均為不朽的經(jīng)典著作。
出版者的話
譯者序
前言
第1章 概述1
1.1 引言1
1.2 源代碼表示1
1.2.1 將擁塞窗口設(shè)置為11
1.2.2 印刷約定2
1.3 歷史2
1.4 應(yīng)用編程接口3
1.5 程序示例4
1.6 系統(tǒng)調(diào)用和庫函數(shù)6
1.7 網(wǎng)絡(luò)實現(xiàn)概述6
1.8 描述符7
1.9 mbuf與輸出處理11
1.9.1 包含插口地址結(jié)構(gòu)的mbuf11
1.9.2 包含數(shù)據(jù)的mbuf12
1.9.3 添加IP和UDP首部13
1.9.4 IP輸出14
1.9.5 以太網(wǎng)輸出14
1.9.6 UDP輸出小結(jié)14
1.10 輸入處理15
1.10.1 以太網(wǎng)輸入15
1.10.2 IP輸入15
1.10.3 UDP輸入16
1.10.4 進程輸入17
1.11 網(wǎng)絡(luò)實現(xiàn)概述(續(xù))17
1.12 中斷級別與并發(fā)18
1.13 源代碼組織20
1.14 測試網(wǎng)絡(luò)21
1.15 小結(jié)22
第2章 mbuf:存儲器緩存24
2.1 引言24
2.2 代碼介紹27
2.2.1 全局變量27
2.2.2 統(tǒng)計28
2.2.3 內(nèi)核統(tǒng)計28
2.3 mbuf的定義29
2.4 mbuf結(jié)構(gòu)29
2.5 簡單的mbuf宏和函數(shù)31
2.5.1 m_get函數(shù)32
2.5.2 MGET宏32
2.5.3 m_retry函數(shù)33
2.5.4 mbuf鎖34
2.6 m_devget和m_pullup函數(shù)34
2.6.1 m_devget函數(shù)34
2.6.2 mtod和dtom宏36
2.6.3 m_pullup函數(shù)和連續(xù)的協(xié)議首部36
2.6.4 m_pullup和IP的分片與重組37
2.6.5 TCP重組避免調(diào)用m_pullup39
2.6.6 m_pullup使用總結(jié)40
2.7 mbuf宏和函數(shù)的小結(jié)40
2.8 Net/3聯(lián)網(wǎng)數(shù)據(jù)結(jié)構(gòu)小結(jié)42
2.9 m_copy和簇引用計數(shù)43
2.10 其他選擇47
2.11 小結(jié)47
第3章 接口層49
3.1 引言49
3.2 代碼介紹49
3.2.1 全局變量49
3.2.2 SNMP變量50
3.3 ifnet結(jié)構(gòu)51
3.4 ifaddr結(jié)構(gòu)57
3.5 sockaddr結(jié)構(gòu)58
3.6 ifnet與ifaddr的專用化59
3.7 網(wǎng)絡(luò)初始化概述60
3.8 以太網(wǎng)初始化61
3.9 SLIP初始化64
3.10 環(huán)回初始化65
3.11 if_attach函數(shù)66
3.12 ifinit函數(shù)72
3.13 小結(jié)73
第4章 接口:以太網(wǎng)74
4.1 引言74
4.2 代碼介紹75
4.2.1 全局變量75
4.2.2 統(tǒng)計量75
4.2.3 SNMP變量76
4.3 以太網(wǎng)接口77
4.3.1 leintr函數(shù)79
4.3.2 leread函數(shù)79
4.3.3 ether_input函數(shù)81
4.3.4 ether_output函數(shù)84
4.3.5 lestart函數(shù)87
4.4 ioctl系統(tǒng)調(diào)用89
4.4.1 ifioctl函數(shù)90
4.4.2 ifconf函數(shù)91
4.4.3 舉例94
4.4.4 通用接口ioctl命令95
4.4.5 if_down和if_up函數(shù)96
4.4.6 以太網(wǎng)、SLIP和環(huán)回97
4.5 小結(jié)98
第5章 接口:SLIP和環(huán)回100
5.1 引言100
5.2 代碼介紹100
5.2.1 全局變量100
5.2.2 統(tǒng)計量101
5.3 SLIP接口101
5.3.1 SLIP線路規(guī)程:SLIPDISC101
5.3.2 SLIP初始化:slopen和slinit103
5.3.3 SLIP輸入處理:slinput105
5.3.4 SLIP輸出處理:sloutput109
5.3.5 slstart函數(shù)111
5.3.6 SLIP分組丟失116
5.3.7 SLIP性能考慮117
5.3.8 slclose函數(shù)117
5.3.9 sltioctl函數(shù)118
5.4 環(huán)回接口119
5.5 小結(jié)121
第6章 IP編址123
6.1 引言123
6.1.1 IP地址123
6.1.2 IP地址的印刷規(guī)定123
6.1.3 主機和路由器124
6.2 代碼介紹125
6.3 接口和地址小結(jié)125
6.4 sockaddr_in結(jié)構(gòu)126
6.5 in_ifaddr結(jié)構(gòu)127
6.6 地址指派128
6.6.1 ifioctl函數(shù)130
6.6.2 in_control函數(shù)130
6.6.3 前提條件:SIOCSIFADDR、SIOCSIFNETMASK和SIOCSIFDSTADDR132
6.6.4 地址指派:SIOCSIFADDR133
6.6.5 in_ifinit函數(shù)133
6.6.6 網(wǎng)絡(luò)掩碼指派:SIOCSIFNETMASK136
6.6.7 目的地址指派:SIOCSIFDSTADDR137
6.6.8 獲取接口信息137
6.6.9 每個接口多個IP地址138
6.6.10 附加IP地址:SIOCAIFADDR139
6.6.11 刪除IP地址:SIOCDIFADDR140
6.7 接口ioctl處理141
6.7.1 leioctl函數(shù)141
6.7.2 slioctl函數(shù)142
6.7.3 loioctl函數(shù)143
6.8 Internet實用函數(shù)144
6.9 ifnet實用函數(shù)144
6.10 小結(jié)145
第7章 域和協(xié)議146
7.1 引言146
7.2 代碼介紹146
7.2.1 全局變量147
7.2.2 統(tǒng)計量147
7.3 domain結(jié)構(gòu)147
7.4 protosw結(jié)構(gòu)148
7.5 IP 的domain和protosw結(jié)構(gòu)150
7.6 pffindproto和pffindtype函數(shù)155
7.7 pfctlinput函數(shù)157
7.8 IP初始化157
7.8.1 Internet傳輸分用157
7.8.2 ip_init函數(shù)158
7.9 sysctl系統(tǒng)調(diào)用159
7.10 小結(jié)161
第8章 IP:網(wǎng)際協(xié)議162
8.1 引言162
8.2 代碼介紹163
8.2.1 全局變量163
8.2.2 統(tǒng)計量163
8.2.3 SNMP變量164
8.3 IP分組165
8.4 輸入處理:ipintr函數(shù)167
8.4.1 ipintr概觀167
8.4.2 驗證168
8.4.3 轉(zhuǎn)發(fā)或不轉(zhuǎn)發(fā)171
8.4.4 重裝和分用173
8.5 轉(zhuǎn)發(fā):ip_forward函數(shù)174
8.6 輸出處理:ip_output函數(shù)180
8.6.1 首部初始化181
8.6.2 路由選擇182
8.6.3 源地址選擇和分片184
8.7 Internet檢驗和:in_cksum函數(shù)186
8.8 setsockopt和getsockopt系統(tǒng)調(diào)用190
8.8.1 PRCO_SETOPT的處理192
8.8.2 PRCO_GETOPT的處理193
8.9 ip_sysctl函數(shù)193
8.10