內容簡介
linux是目前最流行的開源作業系統,網路功能在linux下占有核心的地位。本書循序漸進地從套用層到linux核心、從基本知識點到綜合案例,向讀者介紹如何在linux下進行網路程式設計。本書內容分為4個部分:linux程式設計基礎部分、linux用戶空間網路編程部分、linux核心網路編程部分以及綜合案例部分。內容包含linux系統概述、linux編程環境、linux檔案系統簡介、linux下的進程和執行緒、tcp/ip協定族、套用層網路服務程式、tcp編程、主機信息獲取、數據io復用、udp編程、高級套接字、套接字選項、原始套接字、伺服器模型、ipv6、linux 核心網路部分結構及分布、netfilter框架內報文處理。
為了方便讀者學習,本書最後一個部分介紹了3個綜合案例,包括套用層的web伺服器例子、簡單的套用層網路協定站例子和核心層網防火牆的例子。.
本書適合廣大的linux平台下的網路程式設計人員和大中專院校學生閱讀,尤其是有一定linux基礎知識的編程技術人員。
作者簡介
宋敬彬 海信集團國家重點實驗室高級工程師。海信數字家庭原型系統的主要設計及實現人員。有十多年的Linux編程經驗,對Linux核心和網路協定棧十分熟悉。長期從事嵌入式Linux設備、機頂盒產品、IGRS設備互聯的研究和開發工作。目前主要從事數字家庭系統的設計和實現。曾經在技術期刊上發表過多篇技術論文。曾經參加過國家863高性能集群伺服器、電子發展基金的IPv6等項目。.
目錄
第1篇Linux網路開發基礎
第1章Linux作業系統概述 2
1.1Linux發展歷史 2
1.1.1Linux的誕生和發展 2
1.1.2Linux名稱的由來 3
1.2Linux的發展要素 3
1.2.1UNIX作業系統 4
1.2.2Minix作業系統 4
1.2.3POSIX標準 4
1.3Linux與UNIX的異同 5
1.4作業系統類型選擇和核心版本的選擇 5
1.4.1常見的不同公司發行的Linux異同 6
1.4.2核心版本的選擇 6
1.5Linux的系統架構 7
1.5.1Linux核心的主要模組 7
1.5.2Linux的檔案結構 9
1.6GNU通用公共許可證 10
1.6.1GPL許可證的歷史 10
1.6.2GPL的自由理念 10
1.6.3GPL的基本條款 11
1.6.4關於GPL許可證的爭議 12
1.7Linux軟體開發的可借鑑之處 12
1.8小結 13
第2章Linux編程環境 14
2.1Linux環境下的編輯器 14
2.1.1vim使用簡介 14
2.1.2使用vim建立檔案 15
2.1.3使用vim編輯文本 16
2.1.4vim的格式設定 18
2.1.5vim配置檔案.vimrc 19
2.1.6使用其他編輯器 19
2.2Linux下的GCC編譯器工具集 19
2.2.1GCC簡介 19
2.2.2編譯程式的基本知識 21
2.2.3單個檔案編譯成執行檔案 22
2.2.4編譯生成目標檔案 22
2.2.5多檔案編譯 23
2.2.6預處理 24
2.2.7編譯成彙編語言 24
2.2.8生成和使用靜態程式庫 25
2.2.9生成動態程式庫 26
2.2.10動態載入庫 29
2.2.11GCC常用選項 31
2.2.12編譯環境的搭建 33
2.3Makefile檔案簡介 34
2.3.1一個多檔案的工程例子 34
2.3.2多檔案工程的編譯 36
2.3.3Makefile的規則 37
2.3.4Makefile中使用變數 39
2.3.5搜尋路徑 43
2.3.6自動推導規則 44
2.3.7遞歸make 44
2.3.8Makefile中的函式 46
2.4用GDB調試程式 47
2.4.1編譯可調試程式 48
2.4.2使用GDB調試程式 49
2.4.3GDB常用命令 52
2.4.4其他的GDB 59
2.5小結 60
第3章檔案系統簡介 61
3.1Linux下的檔案系統 61
3.1.1Linux下檔案的內涵 61
3.1.2檔案系統的創建 62
3.1.3掛接檔案系統 64
3.1.4索引節點inode 65
3.1.5普通檔案 66
3.1.6設備檔案 66
3.1.7虛擬檔案系統VFS 68
3.2檔案的通用操作方法 72
3.2.1檔案描述符 72
3.2.2打開創建檔案open()、create()函式 72
3.2.3關閉檔案close()函式 76
3.2.4讀取檔案read()函式 77
3.2.5寫檔案write()函式 79
3.2.6檔案偏移lseek()函式 80
3.2.7獲得檔案狀態fstat()函式 83
3.2.8檔案空間映射mmap()函式 85
3.2.9檔案屬性fcntl()函式 88
3.2.10檔案輸入輸出控制ioctl()函式 92
3.3socket檔案類型 93
3.4小結 93
第4章程式、進程和執行緒 94
4.1程式、進程和執行緒的概念 94
4.1.1程式和進程的差別 94
4.1.2Linux環境下的進程 95
4.1.3進程和執行緒 96
4.2進程產生的方式 96
4.2.1進程號 96
4.2.2進程複製fork() 97
4.2.3system()方式 98
4.2.4進程執行exec()函式系列 99
4.2.5所有用戶態進程的產生進程init 100
4.3進程間通信和同步 101
4.3.1半雙工管道 101
4.3.2命名管道 107
4.3.3訊息佇列 108
4.3.4訊息佇列的一個例子 114
4.3.5信號量 116
4.3.6共享記憶體 121
4.3.7信號 124
4.4Linux下的執行緒 127
4.4.1多執行緒編程實例 127
4.4.2Linux下執行緒創建函式pthread_create() 129
4.4.3執行緒的結束函式pthread_join()和pthread_exit() 129
4.4.4執行緒的屬性 130
4.4.5執行緒間的互斥 132
4.4.6執行緒中使用信號量 133
4.5小結 136
第2篇Linux用戶層網路編程
第5章TCP/IP協定族簡介 138
5.1OSI網路分層介紹 138
5.1.1OSI網路分層結構 138
5.1.2OSI的7層網路結構 139
5.1.3OSI參考模型中的數據傳輸 140
5.2TCP/IP協定棧 141
5.2.1TCP/IP協定棧參考模型 141
5.2.2主機到網路層協定 143
5.2.3IP協定 144
5.2.4網際控制報文協定(ICMP) 146
5.2.5傳輸控制協定(TCP) 150
5.2.6用戶數據報文協定(UDP) 154
5.2.7地址解析協定(ARP) 156
5.3IP位址分類與TCP/UDP連線埠 158
5.3.1網際網路中IP位址的分類 159
5.3.2子網掩碼(subnetmaskaddress) 161
5.3.3IP位址的配置 162
5.3.4連線埠 163
5.4主機位元組序和網路位元組序 163
5.4.1位元組序的含義 164
5.4.2網路位元組序的轉換 164
5.5小結 166
第6章套用層網路服務程式簡介 167
6.1HTTP協定和服務 167
6.1.1HTTP協定概述 167
6.1.2HTTP協定的基本過程 168
6.2FTP協定和服務 170
6.2.1FTP協定概述 170
6.2.2FTP協定的工作模式 172
6.2.3FTP協定的傳輸方式 172
6.2.4一個簡單的FTP過程 173
6.2.5常用的FTP工具 173
6.3TELNET協定和服務 174
6.3.1遠程登錄的基本概念 174
6.3.2使用TELNET協定進行遠程登錄的工作過程 174
6.3.3TELNET協定 174
6.4NFS協定和服務 176
6.4.1安裝NFS伺服器和客戶端 176
6.4.2伺服器端的設定 176
6.4.3客戶端的操作 177
6.4.4showmount命令 177
6.5自定義網路服務 177
6.5.1xinetd/inetd 178
6.5.2xinetd服務配置 178
6.5.3自定義網路服務 179
6.6小結 180
第7章TCP網路編程基礎 181
7.1套接字編程基礎知識 181
7.1.1套接字地址結構 181
7.1.2用戶層和核心層互動過程 183
7.2TCP網路編程流程 184
7.2.1TCP網路編程架構 184
7.2.2創建網路插口函式socket() 186
7.2.3綁定一個地址連線埠對bind() 189
7.2.4監聽本地連線埠listen 192
7.2.5接受一個網路請求accept() 194
7.2.6連線目標網路伺服器connect() 199
7.2.7寫入數據函式write() 200
7.2.8讀取數據函式read() 201
7.2.9關閉套接字函式close() 201
7.3伺服器/客戶端的簡單例子 202
7.3.1例子功能描述 202
7.3.2伺服器網路程式 203
7.3.3伺服器讀取和顯示字元串 205
7.3.4客戶端的網路程式 205
7.3.5客戶端讀取和顯示字元串 206
7.3.6編譯運行程式 206
7.4截取信號的例子 207
7.4.1信號處理 207
7.4.2信號SIGPIPE 208
7.4.3信號SIGINT 208
7.5小結 208
第8章伺服器和客戶端信息的獲取 210
8.1位元組序 210
8.1.1大端位元組序和小端位元組序 210
8.1.2位元組序轉換函式 212
8.1.3一個位元組序轉換的例子 214
8.2字元串IP位址和二進制IP位址的轉換 217
8.2.1inet_xxx()函式 217
8.2.2inet_pton()和inet_ntop()函式 219
8.2.3使用8.2.1節地址轉換函式的例子 220
8.2.4使用函式inet_pton()和函式inet_ntop()的例子 223
8.3套接字描述符判定函式issockettype() 223
8.3.1進行檔案描述符判定的函式issockettype() 224
8.3.2main()函式 224
8.4IP位址與域名之間的相互轉換 225
8.4.1DNS原理 225
8.4.2獲取主機信息的函式 226
8.4.3使用主機名獲取主機信息的例子 228
8.4.4函式gethostbyname()不可重入的例子 230
8.5協定名稱處理函式 232
8.5.1xxxprotoxxx()函式 232
8.5.2使用協定族函式的例子 233
8.6小結 236
第9章數據的IO和復用 237
9.1IO函式 237
9.1.1使用recv()函式接收數據 237
9.1.2使用send()函式傳送數據 239
9.1.3使用readv()函式接收數據 240
9.1.4使用writev()函式傳送數據 240
9.1.5使用recvmsg()函式接收數據 242
9.1.6使用sendmsg()函式傳送數據 244
9.1.7IO函式的比較 246
9.2使用IO函式的例子 246
9.2.1客戶端處理框架的例子 246
9.2.2伺服器端程式框架 248
9.2.3使用recv()和send()函式 249
9.2.4使用readv()和write()函式 251
9.2.5使用recvmsg()和sendmsg()函式 253
9.3IO模型 256
9.3.1阻塞IO模型 256
9.3.2非阻塞IO模型 257
9.3.3IO復用 257
9.3.4信號驅動IO模型 258
9.3.5異步IO模型 258
9.4select()函式和pselect()函式 259
9.4.1select()函式 259
9.4.2pselect()函式 261
9.5poll()函式和ppoll()函式 262
9.5.1poll()函式 263
9.5.2ppoll()函式 264
9.6非阻塞編程 264
9.6.1非阻塞方式程式設計介紹 264
9.6.2非阻塞程式設計的例子 264
9.7小結 266
第10章基於UDP協定的接收和傳送 267
10.1UDP編程框架 267
10.1.1UDP編程框圖 267
10.1.2UDP伺服器編程框架 269
10.1.3UDP客戶端編程框架 269
10.2UDP協定程式設計的常用函式 270
10.2.1建立套接字socket()和綁定套接字bind() 270
10.2.2接收數據recvfrom()/recv() 270
10.2.3傳送數據sendto()/send() 275
10.3UDP接收和傳送數據的例子 279
10.3.1UDP伺服器端 279
10.3.2UDP伺服器端數據處理 280
10.3.3UDP客戶端 281
10.3.4UDP客戶端數據處理 281
10.3.5測試UDP程式 282
10.4UDP協定程式設計中的幾個問題 282
10.4.1UDP報文丟失數據 282
10.4.2UDP數據傳送中的亂序 284
10.4.3UDP協定中的connect()函式 287
10.4.4UDP缺乏流量控制 287
10.4.5UDP協定中的外出網路接口 289
10.4.6UDP協定中的數據報文截斷 290
10.5小結 291
第11章高級套接字 292
11.1UNIX域函式 292
11.1.1UNIX域函式的地址結構 292
11.1.2套接字函式 293
11.1.3使用UNIX域函式進行套接字編程 293
11.1.4傳遞檔案描述符 296
11.1.5socketpair()函式 296
11.1.6傳遞檔案描述符的例子 297
11.2廣播 302
11.2.1廣播的IP位址 302
11.2.2廣播與單播的比較 303
11.2.3廣播的示例 304
11.3多播 310
11.3.1多播的概念 310
11.3.2廣域網的多播 311
11.3.3多播的編程 311
11.3.4核心中的多播 313
11.3.5一個多播例子的伺服器端 317
11.3.6一個多播例子的客戶端 318
11.4數據鏈路層訪問 319
11.4.1SOCK_PACKET類型 319
11.4.2設定套接口以捕獲鏈路幀的編程方法 320
11.4.3從套接口讀取鏈路幀的編程方法 321
11.4.4定位IP包頭的編程方法 322
11.4.5定位TCP報頭的編程方法 323
11.4.6定位UDP報頭的編程方法 325
11.4.7定位套用層報文數據的編程方法 326
11.4.8使用SOCK_PACKET編寫ARP請求程式的例子 326
11.5小結 329
第12章套接字選項 330
12.1獲取和設定套接字選項getsocketopt()/setsocketopt() 330
12.1.1getsockopt()函式和setsocketopt()函式的介紹 330
12.1.2套接字選項 331
12.1.3套接字選項簡單示例 332
12.2SOL_SOCKET協定族選項 336
12.2.1SO_BROADCAST廣播選項 336
12.2.2SO_DEBUG調試選項 337
12.2.3SO_DONTROUTE不經過路由選項 337
12.2.4SO_ERROR錯誤選項 338
12.2.5SO_KEEPALIVE保持連線選項 338
12.2.6SO_LINGER緩衝區處理方式選項 339
12.2.7SO_OOBINLINE帶外數據處理方式選項 342
12.2.8SO_RCVBUF和SO_SNDBUF緩衝區大小選項 342
12.2.9SO_RCVLOWAT和SO_SNDLOWAT緩衝區下限選項 343
12.2.10SO_RCVTIMEO和SO_SNDTIMEO收發逾時選項 343
12.2.11SO_REUSERADDR地址重用選項 344
12.2.12SO_EXCLUSIVEADDRUSE連線埠獨占選項 344
12.2.13SO_TYPE套接字類型選項 345
12.2.14SO_BSDCOMPAT與BSD套接字兼容選項 345
12.2.15SO_BINDTODEVICE套接字網路接口綁定選項 345
12.2.16SO_PRIORITY套接字優先權選項 346
12.3IPPROTO_IP選項 347
12.3.1IP_HDRINCL選項 347
12.3.2IP_OPTNIOS選項 347
12.3.3IP_TOS選項 347
12.3.4IP_TTL選項 347
12.4IPPROTO_TCP選項 348
12.4.1TCP_KEEPALIVE選項 348
12.4.2TCP_MAXRT選項 348
12.4.3TCP_MAXSEG選項 349
12.4.4TCP_NODELAY和TCP_CORK選項 349
12.5使用套接字選項 351
12.5.1設定和獲取緩衝區大小 351
12.5.2獲取套接字類型的例子 355
12.5.3使用套接字選項的綜合例子 356
12.6ioctl()函式 361
12.6.1ioctl()函式的命令選項 361
12.6.2ioctl()函式的IO請求 363
12.6.3ioctl()函式的檔案請求 365
12.6.4ioctl()函式的網路接口請求 365
12.6.5使用ioctl()函式對ARP高速快取操作 372
12.6.6使用ioctl()函式傳送路由表請求 374
12.7fcntl()函式 374
12.7.1fcntl()函式的選項 375
12.7.2使用fcntl()函式修改套接字非阻塞屬性 375
12.7.3使用fcntl()函式設定信號屬主 376
12.8小結 376
第13章原始套接字 377
13.1概述 377
13.2原始套接字的創建 379
13.2.1SOCK_RAW選項 379
13.2.2IP_HDRINCL套接字選項 379
13.2.3不需要bind()函式 380
13.3原始套接字傳送報文 380
13.4原始套接字接收報文 380
13.5原始套接字報文處理時的結構 381
13.5.1IP頭部的結構 381
13.5.2ICMP頭部結構 382
13.5.3UDP頭部結構 384
13.5.4TCP頭部結構 386
13.6ping的例子 387
13.6.1協定格式 388
13.6.2校驗和函式 389
13.6.3設定ICMP傳送報文的頭部 390
13.6.4剝離ICMP接受報文的頭部 391
13.6.5計算時間差 392
13.6.6傳送報文 393
13.6.7接收報文 394
13.6.8主函式過程 395
13.6.9主函式main() 397
13.6.10編譯測試 400
13.7洪水攻擊 400
13.8ICMP洪水攻擊 401
13.8.1ICMP洪水攻擊的原理 401
13.8.2ICMP洪水攻擊的例子 401
13.9UDP洪水攻擊 405
13.10SYN洪水攻擊 409
13.10.1SYN洪水攻擊的原理 409
13.10.2SYN洪水攻擊的例子 409
13.11小結 413
第14章伺服器模型選擇 414
14.1循環伺服器 414
14.1.1UDP循環伺服器 414
14.1.2TCP循環伺服器 417
14.2簡單並發伺服器 420
14.2.1並發伺服器的模型 420
14.2.2UDP並發伺服器 420
14.2.3TCP並發伺服器 423
14.3TCP的高級並發伺服器模型 426
14.3.1單客戶端單進程,統一accept() 426
14.3.2單客戶端單執行緒,統一accept() 429
14.3.3單客戶端單執行緒,各執行緒獨自accept(),使用互斥鎖 431
14.4IO復用循環伺服器 435
14.4.1IO復用循環伺服器模型介紹 435
14.4.2IO復用循環伺服器模型的例子 436
14.5小結 440
第15章IPv6簡介 441
15.1IPv4的缺陷 441
15.2IPv6的特點 442
15.3IPv6的地址 443
15.3.1IPv6的單播地址 443
15.3.2可聚集全球單播地址 443
15.3.3本地使用單播地址 444
15.3.4兼容性地址 445
15.3.5IPv6多播地址 446
15.3.6IPv6任播地址 446
15.3.7主機的多個IPv6地址 447
15.4IPv6的頭部 447
15.4.1IPv6頭部格式 447
15.4.2與IPv4頭部的對比 448
15.4.3IPv6的TCP頭部 449
15.4.4IPv6的UDP頭部 449
15.4.5IPv6的ICMP頭部 449
15.5IPv6運行環境 451
15.5.1載入IPv6模組 451
15.5.2查看是否支持IPv6 452
15.6IPv6的結構定義 453
15.6.1IPv6的地址族和協定族 453
15.6.2套接字地址結構 453
15.6.3地址兼容考慮 455
15.6.4IPv6通用地址 455
15.7IPv6的套接字函式 456
15.7.1socket()函式 456
15.7.2沒有發生改變的函式 456
15.7.3發生改變的函式 457
15.8IPv6的套接字選項 457
15.8.1IPv6的套接字選項 457
15.8.2單播跳限IPV6_UNICAST_HOPS 459
15.8.3傳送和接收多播包 459
15.8.4IPv6中獲得時間戳的ioctl命令 460
15.9IPv6的庫函式 460
15.9.1地址轉換函式的差異 460
15.9.2域名解析函式的差異 461
15.9.3測試宏 463
15.10IPv6的編程的一個簡單例子 463
15.10.1伺服器程式 464
15.10.2客戶端程式 465
15.10.3編譯調試 467
15.11小結 467
第3篇Linux核心網路編程
第16章Linux核心中網路部分結構以及分布 470
16.1概述 470
16.1.1代碼目錄分布 470
16.1.2核心中網路部分流程簡介 472
16.1.3系統提供修改網路流程點 474
16.1.4sk_buff結構 475
16.1.5網路協定數據結構inet_protosw 478
16.2軟中斷CPU報文佇列及其處理 479
16.2.1Linux核心網路協定層的層間傳遞手段——軟中斷 479
16.2.2網路收發處理軟中斷的實現機制 481
16.3socket數據如何在核心中接收和傳送 482
16.3.1socket()的初始化 482
16.3.2接收網路數據recv() 482
16.3.3傳送網路數據send() 483
16.4小結 484
第17章netfilter框架內報文處理 485
17.1netfilter 485
17.1.1netfilter簡介 485
17.1.2netfilter框架 486
17.1.3netfilter檢查時的表格 487
17.1.4netfilter的規則 487
17.2iptables和netfilter 488
17.2.1iptables簡介 488
17.2.2iptables的表和鏈 488
17.2.3使用iptables設定過濾規則 489
17.3核心模組編程 492
17.3.1核心“Hello,World!”程式 492
17.3.2核心模組的基本架構 494
17.3.3核心模組載入和卸載過程 496
17.3.4核心模組初始化和清理函式 497
17.3.5核心模組初始化和清理過程的容錯處理 497
17.3.6核心模組編譯所需的Makefile 498
17.45個鉤子點 499
17.4.1netfilter的5個鉤子點 499
17.4.2NF_HOOK宏 500
17.4.3鉤子的處理規則 501
17.5註冊/註銷鉤子 502
17.5.1結構nf_hook_ops 502
17.5.2註冊鉤子 503
17.5.3註銷鉤子 504
17.5.4註冊註銷函式 504
17.6鉤子的簡單處理例子 505
17.6.1功能描述 505
17.6.2需求分析 506
17.6.3ping回顯禁止實現 506
17.6.4禁止向目的IP位址傳送數據的實現 506
17.6.5連線埠關閉實現 506
17.6.6動態配置實現 508
17.6.7可載入核心實現代碼 509
17.6.8套用層測試代碼實現 516
17.6.9編譯運行 516
17.7一點多個鉤子的優先權 517
17.8校驗和問題 518
17.9小結 518
第4篇綜合案例
第18章一個簡單Web伺服器的例子SHTTPD 522
18.1SHTTPD的需求分析 522
18.1.1SHTTPD啟動參數可動態配置的需求 523
18.1.2SHTTPD的多客戶端支持的需求 524
18.1.3SHTTPD支持方法的需求 525
18.1.4SHTTPD支持的HTTP協定版本的需求 526
18.1.5SHTTPD支持頭部的需求 527
18.1.6SHTTPD定位URI的需求 527
18.1.7SHTTPD支持CGI的需求 528
18.1.8SHTTPD錯誤代碼的需求 529
18.2SHTTPD的模組分析和設計 530
18.2.1SHTTPD的主函式 530
18.2.2SHTTPD命令行解析的分析設計 531
18.2.3SHTTPD配置檔案解析的分析設計 532
18.2.4SHTTPD的多客戶端支持的分析設計 534
18.2.5SHTTPD頭部解析的分析設計 536
18.2.6SHTTPD對URI的分析設計 537
18.2.7SHTTPD支持方法的分析設計 537
18.2.8SHTTPD支持CGI的分析設計 538
18.2.9SHTTPD錯誤處理的分析設計 540
18.3SHTTPD各模組的實現 542
18.3.1SHTTPD命令行解析的實現 543
18.3.2SHTTPD檔案配置解析的實現 545
18.3.3SHTTPD的多客戶端支持的實現 547
18.3.4SHTTPD所請求URI解析的實現 551
18.3.5SHTTPD方法解析的實現 552
18.3.6SHTTPD回響方法的實現 552
18.3.7SHTTPD支持CGI的實現 556
18.3.8SHTTPD支持HTTP協定版本的實現 559
18.3.9SHTTPD內容類型的實現 559
18.3.10SHTTPD錯誤處理的實現 561
18.3.11SHTTPD生成目錄下檔案列表檔案的實現 563
18.3.12SHTTPD主函式的實現 565
18.4SHTTPD的編譯、調試和測試 566
18.4.1建立源檔案 566
18.4.2製作Makefile 566
18.4.3製作執行檔案 567
18.4.4使用不同的瀏覽器測試伺服器程式 567
18.5小結 568
第19章一個簡單網路協定棧的例子SIP 569
19.1SIP網路協定棧的功能描述 569
19.1.1SIP網路協定棧的基本功能描述 570
19.1.2SIP網路協定棧的分層功能描述 570
19.1.3SIP網路協定棧的用戶接口功能描述 571
19.2SIP網路協定棧的架構 571
19.3SIP網路協定棧的存儲區快取 572
19.3.1SIP存儲緩衝的結構定義 573
19.3.2SIP存儲緩衝的處理函式 577
19.4SIP網路協定棧的網路接口層 579
19.4.1SIP網路接口層的架構 579
19.4.2SIP網路接口層的數據結構 580
19.4.3SIP網路接口層的初始化函式 581
19.4.4SIP網路接口層的輸入函式 583
19.4.5SIP網路接口層的輸出函式 586
19.5SIP網路協定棧的ARP層 588
19.5.1SIP位址解析層的架構 588
19.5.2SIP位址解析層的數據結構 588
19.5.3SIP位址解析層的映射表 590
19.5.4SIP位址解析層的ARP映射表維護函式 591
19.5.5SIP位址解析層的ARP網路報文構建函式 593
19.5.6SIP位址解析層的ARP網路報文收發處理函式 595
19.6SIP網路協定棧的IP層 598
19.6.1SIP網際協定層的架構 598
19.6.2SIP網際協定層的數據結構 599
19.6.3SIP網際協定層的輸入函式 601
19.6.4SIP網際協定層的輸出函式 605
19.6.5SIP網際協定層的分片函式 606
19.6.6SIP網際協定層的分片組裝函式 607
19.7SIP網路協定棧的ICMP層 611
19.7.1SIP控制報文協定的數據結構 611
19.7.2SIP控制報文協定的協定支持 612
19.7.3SIP控制報文協定的輸入函式 613
19.7.4SIP控制報文協定的回顯應答函式 614
19.8SIP網路協定棧的UDP層 615
19.8.1SIP數據報文層的數據結構 615
19.8.2SIP數據報文層的控制單元 615
19.8.3SIP數據報文層的輸入函式 617
19.8.4SIP數據報文層的輸出函式 618
19.8.5SIP數據報文層的建立函式 618
19.8.6SIP數據報文層的釋放函式 619
19.8.7SIP數據報文層的綁定函式 620
19.8.8SIP數據報文層的傳送數據函式 621
19.8.9SIP數據報文層的校驗和計算 622
19.9SIP網路協定棧的協定無關層 623
19.9.1SIP協定無關層的系統架構 623
19.9.2SIP協定無關層的函式形式 624
19.9.3SIP協定無關層的接收數據函式 624
19.10SIP網路協定棧的BSD接口層 625
19.10.1SIP用戶接口層的架構 625
19.10.2SIP用戶接口層的套接字建立函式 626
19.10.3SIP用戶接口層的套接字關閉函式 627
19.10.4SIP用戶接口層的套接字綁定函式 627
19.10.5SIP用戶接口層的套接字連線函式 628
19.10.6SIP用戶接口層的套接字接收數據函式 628
19.10.7SIP用戶接口層的傳送數據函式 629
19.11SIP網路協定棧的編譯 630
19.11.1SIP的檔案結構 630
19.11.2SIP的Makefile 631
19.11.3SIP的編譯運行 631
19.12小結 631
第20章一個簡單防火牆的例子SIPFW 633
20.1SIPFW防火牆的功能描述 633
20.1.1SIPFW防火牆對主機進行網路數據過濾的功能描述 633
20.1.2SIPFW防火牆用戶設定防火牆規則的功能描述 634
20.1.3SIPFW防火牆配置檔案等附加功能的功能描述 634
20.2SIPFW需求分析 634
20.2.1SIPFW防火牆條件和動作 635
20.2.2SIPFW防火牆支持過濾的類型和內容 635
20.2.3SIPFW防火牆過濾的方式和動作 638
20.2.4SIPFW防火牆的配置檔案 640
20.2.5SIPFW防火牆命令行配置格式 640
20.2.6SIPFW防火牆的規則檔案格式 642
20.2.7SIPFW防火牆的日誌檔案數據格式 643
20.2.8SIPFW防火牆構建所採用的技術方案 644
20.3使用netlink進行用戶空間和核心空間數據互動 645
20.3.1netlink的用戶空間程式設計 645
20.3.2netlink的核心空間API 648
20.4使用proc進行記憶體數據用戶空間映射 650
20.4.1proc虛擬檔案系統的結構 650
20.4.2創建proc虛擬檔案 651
20.4.3刪除proc虛擬檔案 652
20.4.4proc檔案的寫函式 652
20.4.5proc檔案的讀函式 653
20.5核心空間的檔案操作函式 654
20.5.1核心空間的檔案結構 654
20.5.2核心空間的檔案建立操作 655
20.5.3核心空間的檔案讀寫操作 656
20.5.4核心空間的檔案關閉操作 657
20.6SIPFW防火牆的模組分析和設計 657
20.6.1SIPFW防火牆的總體架構 657
20.6.2SIPFW防火牆的用戶命令解析 660
20.6.3SIPFW用戶空間與核心空間的互動 663
20.6.4SIPFW防火牆核心鏈上的規則處理 666
20.6.5SIPFW防火牆的PROC虛擬檔案系統 668
20.6.6SIPFW防火牆的配置檔案和日誌檔案處理 669
20.6.7SIPFW防火牆的過濾模組設計 671
20.7SIPFW防火牆各功能模組的實現 673
20.7.1SIPFW防火牆的命令解析代碼 674
20.7.2SIPFW防火牆的過濾規則解析模組代碼 678
20.7.3SIPFW防火牆的網路數據攔截模組代碼 680
20.7.4SIPFW防火牆的PROC虛擬檔案系統 681
20.7.5SIPFW防火牆對配置檔案的解析 683
20.7.6SIPFW防火牆核心模組初始化和退出 684
20.7.7用戶空間處理主函式 685
20.8編譯、調試和測試 686
20.8.1用戶程式和核心程式的Makefile 686
20.8.2編譯及運行 687
20.8.3下發過濾規則,測試過濾結果 688
20.9小結 690