Linux網路編程(第2版)

Linux網路編程(第2版)

《Linux網路編程(第2版)》是清華大學出版社出版的圖書,作者是宋敬彬。

內容介紹

Linux網路編程(第2版) Linux網路編程(第2版)

《Linux網路編程(第2版)》是獲得大量讀者好評的“Linux典藏大系”中的《Linux網路編程》的第2版。《Linux網路編程(第2版)》第1版出版後獲得了讀者的高度評價。《Linux網路編程(第2版)》循序漸進,從套用層到Linux核心,從基本知識點到綜合案例,全面、系統地向讀者介紹了如何在Linux下進行網路程式設計。《Linux網路編程(第2版)》涉及面廣,從基本的編程工具介紹和編程環境搭建,到高級技術和核心原理,再到項目實戰,幾乎涉及Linux網路編程的所有重要知識。

《Linux網路編程(第2版)》共分4篇。

第1篇介紹Linux作業系統概述、Linux編程環境、檔案系統簡介、程式、進程和執行緒;

第2篇介紹TCP/IP協定族簡介、套用層網路服務程式簡介、TCP網路編程基礎、伺服器和客戶端信息的獲取、數據的IO和復用、基於UDP協定的接收和傳送、高級套接字、套接字選項、原始套接字、伺服器模型選擇,以及IPv6的簡介;

第3篇介紹Linux核心中網路部分結構,以及分布和netfilter框架內報文處理;

第4篇介紹三個網路編程的實例:Web伺服器的例子SHTTPD、網路協定棧的例子SIP、防火牆的例子SIPFW。

目錄

第1篇 Linux網路開發基礎

第1章 Linux作業系統概述2
1.1 Linux發展歷史2
1.1.1 Linux的誕生和發展2
1.1.2 Linux名稱的由來3
1.2 Linux的發展要素3
1.2.1 UNIX作業系統3
1.2.2 Minix作業系統4
1.2.3 POSIX 標準4
1.3 Linux與UNIX的異同5
1.4 作業系統類型選擇和核心版本的選擇5
1.4.1 常見的不同公司發行的Linux異同5
1.4.2 核心版本的選擇6
1.5 Linux的系統架構7 1.5.1 Linux核心的主要模組7
1.5.2 Linux的檔案結構8
1.6 GNU通用公共許可證9
1.6.1 GPL許可證的歷史9
1.6.2 GPL的自由理念10
1.6.3 GPL的基本條款11
1.6.4 關於GPL許可證的爭議12
1.7 Linux軟體開發的可借鑑之處12
1.8 小結13
第2章 Linux編程環境14
2.1 Linux環境下的編輯器14
2.1.1 Vim使用簡介14
2.1.2 使用Vim建立檔案15
2.1.3 使用Vim編輯文本16
2.1.4 Vim的格式設定18
2.1.5 Vim配置檔案.vimrc18
2.1.6 使用其他編輯器19
2.2 Linux下的GCC編譯器工具集19
2.2.1 GCC簡介19
2.2.2 編譯程式的基本知識21
2.2.3 單個檔案編譯成執行檔案21
2.2.4 編譯生成目標檔案22
2.2.5 多檔案編譯22
2.2.6 預處理24
2.2.7 編譯成彙編語言24
2.2.8 生成和使用靜態程式庫25
2.2.9 生成動態程式庫26
2.2.10 動態載入庫29
2.2.11 GCC常用選項31
2.2.12 編譯環境的搭建33
2.3 Makefile檔案簡介33
2.3.1 一個多檔案的工程例子33
2.3.2 多檔案工程的編譯35
2.3.3 Makefile的規則37
2.3.4 Makefile中使用變數39
2.3.5 搜尋路徑42
2.3.6 自動推導規則43
2.3.7 遞歸make44
2.3.8 Makefile中的函式46
2.4 用GDB調試程式47
2.4.1 編譯可調試程式48
2.4.2 使用GDB調試程式49
2.4.3 GDB常用命令52
2.4.4 其他的GDB59
2.5 小結60
第3章 檔案系統簡介61
3.1 Linux下的檔案系統61
3.1.1 Linux下檔案的內涵61
3.1.2 檔案系統的創建62
3.1.3 掛接檔案系統65
3.1.4 索引節點inode65
3.1.5 普通檔案66
3.1.6 設備檔案66
3.1.7 虛擬檔案系統VFS68
3.2 檔案的通用操作方法72
3.2.1 檔案描述符72
3.2.2 打開創建檔案open()函式、create()函式73
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.3 socket檔案類型93
3.4 小結93
第4章 程式、進程和執行緒94
4.1 程式、進程和執行緒的概念94
4.1.1 程式和進程的差別94
4.1.2 Linux環境下的進程95
4.1.3 進程和執行緒96
4.2 進程產生的方式96
4.2.1 進程號96
4.2.2 進程複製fork()函式97
4.2.3 system()函式方式98
4.2.4 進程執行exec()函式系列99
4.2.5 所有用戶態進程的產生進程init100
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.4 Linux下的執行緒127
4.4.1 多執行緒編程實例127
4.4.2 Linux下執行緒創建函式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.1 OSI網路分層介紹138
5.1.1 OSI網路分層結構138
5.1.2 OSI的7層網路結構139
5.1.3 OSI參考模型中的數據傳輸140
5.2 TCP/IP協定棧141
5.2.1 TCP/IP協定棧參考模型141
5.2.2 主機到網路層協定143
5.2.3 IP協定144
5.2.4 網際控制報文協定(ICMP)146
5.2.5 傳輸控制協定(TCP)150
5.2.6 用戶數據報文協定(UDP)154
5.2.7 地址解析協定(ARP)156
5.3 IP位址分類與TCP/UDP連線埠158
5.3.1 網際網路中IP位址的分類159
5.3.2 子網掩碼(subnet mask address)161
5.3.3 IP位址的配置162
5.3.4 連線埠163
5.4 主機位元組序和網路位元組序163
5.4.1 位元組序的含義163
5.4.2 網路位元組序的轉換164
5.5 小結166
第6章 套用層網路服務程式簡介167
6.1 HTTP協定和服務167
6.1.1 HTTP協定概述167
6.1.2 HTTP協定的基本過程168
6.2 FTP協定和服務170
6.2.1 FTP協定概述170
6.2.2 FTP協定的工作模式172
6.2.3 FTP協定的傳輸方式172
6.2.4 一個簡單的FTP過程173
6.2.5 常用的FTP工具173
6.3 TELNET協定和服務173
6.3.1 遠程登錄的基本概念174
6.3.2 使用TELNET協定進行遠程登錄的工作過程174
6.3.3 TELNET協定174

6.4 NFS協定和服務175
6.4.1 安裝NFS伺服器和客戶端175
6.4.2 伺服器端的設定176
6.4.3 客戶端的操作176
6.4.4 showmount命令177
6.5 自定義網路服務177
6.5.1 xinetd/inetd177
6.5.2 xinetd服務配置178
6.5.3 自定義網路服務179
6.6 小結180
第7章 TCP網路編程基礎181
7.1 套接字編程基礎知識181
7.1.1 套接字地址結構181
7.1.2 用戶層和核心層互動過程183
7.2 TCP網路編程流程184
7.2.1 TCP網路編程架構184
7.2.2 創建網路插口函式socket()186
7.2.3 綁定一個地址連線埠對函式bind()189
7.2.4 監聽本地連線埠listen192
7.2.5 接受一個網路請求函式accept()194
7.2.6 連線目標網路伺服器函式connect()199
7.2.7 寫入數據函式write()200
7.2.8 讀取數據函式read()201
7.2.9 關閉套接字函式202
7.3 伺服器/客戶端的簡單例子202
7.3.1 例子功能描述202
7.3.2 伺服器網路程式202
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 信號SIGPIPE207
7.4.3 信號SIGINT208
7.5 小結208
第8章 伺服器和客戶端信息的獲取209
8.1 位元組序209
8.1.1 大端位元組序和小端位元組序209
8.1.2 位元組序轉換函式211
8.1.3 一個位元組序轉換的例子213
8.2 字元串IP位址和二進制IP位址的轉換216
8.2.1 inet_xxx()函式216
8.2.2 inet_pton()和inet_ntop()函式218
8.2.3 使用8.2.1節地址轉換函式的例子219
8.2.4 使用函式inet_pton()和函式inet_ntop()的例子221
8.3 套接字描述符判定函式issockettype()222
8.3.1 進行檔案描述符判定的函式issockettype()222
8.3.2 main()函式223
8.4 IP位址與域名之間的相互轉換223
8.4.1 DNS原理223
8.4.2 獲取主機信息的函式224
8.4.3 使用主機名獲取主機信息的例子227
8.4.4 函式gethostbyname()不可重入的例子229
8.5 協定名稱處理函式230
8.5.1 xxxprotoxxx()函式231
8.5.2 使用協定族函式的例子232
8.6 小結235
第9章 數據的IO和復用236
9.1 IO函式236
9.1.1 使用recv()函式接收數據236
9.1.2 使用send()函式傳送數據238
9.1.3 使用readv()函式接收數據239
9.1.4 使用writev()函式傳送數據239
9.1.5 使用recvmsg()函式接收數據241
9.1.6 使用sendmsg()函式傳送數據243
9.1.7 IO函式的比較245
9.2 使用IO函式的例子245
9.2.1 客戶端處理框架的例子245
9.2.2 伺服器端程式框架247
9.2.3 使用recv()和send()函式248
9.2.4 使用readv()和write()函式250
9.2.5 使用recvmsg()和sendmsg()函式252
9.3 IO模型255
9.3.1 阻塞IO模型255
9.3.2 非阻塞IO模型255
9.3.3 IO復用256
9.3.4 信號驅動IO模型256
9.3.5 異步IO模型257

9.4 select()函式和pselect()函式258
9.4.1 select()函式258
9.4.2 pselect()函式260
9.5 poll()函式和ppoll()函式261
9.5.1 poll()函式261
9.5.2 ppoll()函式262
9.6 非阻塞編程263
9.6.1 非阻塞方式程式設計介紹263
9.6.2 非阻塞程式設計的例子263
9.7 小結264
第10章 基於UDP協定的接收和傳送265
10.1 UDP編程框架265
10.1.1 UDP編程框圖265
10.1.2 UDP伺服器編程框架267
10.1.3 UDP客戶端編程框架267
10.2 UDP協定程式設計的常用函式267
10.2.1 建立套接字socket()和綁定套接字bind()268
10.2.2 接收數據recvfrom()/recv()268
10.2.3 傳送數據sendto()/send()273
10.3 UDP接收和傳送數據的例子277
10.3.1 UDP伺服器端277
10.3.2 UDP伺服器端數據處理278
10.3.3 UDP客戶端279
10.3.4 UDP客戶端數據處理279
10.3.5 測試UDP程式280
10.4 UDP協定程式設計中的幾個問題280
10.4.1 UDP報文丟失數據280
10.4.2 UDP數據傳送中的亂序282
10.4.3 UDP協定中的connect()函式284
10.4.4 UDP缺乏流量控制285
10.4.5 UDP協定中的外出網路接口287
10.4.6 UDP協定中的數據報文截斷288
10.5 小結289
第11章 高級套接字290
11.1 UNIX域函式290
11.1.1 UNIX域函式的地址結構290
11.1.2 套接字函式291
11.1.3 使用UNIX域函式進行套接字編程291
11.1.4 傳遞檔案描述符293
11.1.5 socketpair()函式294
11.1.6 傳遞檔案描述符的例子295
11.2 廣播299
11.2.1 廣播的IP位址300
11.2.2 廣播與單播的比較300
11.2.3 廣播的示例301
11.3 多播307
11.3.1 多播的概念308
11.3.2 廣域網的多播308
11.3.3 多播的編程308
11.3.4 核心中的多播310
11.3.5 一個多播例子的伺服器端313
11.3.6 一個多播例子的客戶端315
11.4 數據鏈路層訪問317
11.4.1 SOCK_PACKET類型317
11.4.2 設定套接口以捕獲鏈路幀的編程方法317
11.4.3 從套接口讀取鏈路幀的編程方法318
11.4.4 定位IP包頭的編程方法319
11.4.5 定位TCP報頭的編程方法321
11.4.6 定位UDP報頭的編程方法322
11.4.7 定位套用層報文數據的編程方法323
11.4.8 使用SOCK_PACKET編寫ARP請求程式的例子323
11.5 小結326
第12章 套接字選項328
12.1 獲取和設定套接字選項getsocketopt()/setsocketopt()328
12.1.1 getsockopt()函式和setsocketopt()函式的介紹328
12.1.2 套接字選項329
12.1.3 套接字選項簡單示例330
12.2 SOL_SOCKET協定族選項334
12.2.1 SO_BROADCAST廣播選項334
12.2.2 SO_DEBUG調試選項335
12.2.3 SO_DONTROUTE不經過路由選項335
12.2.4 SO_ERROR錯誤選項335
12.2.5 SO_KEEPALIVE保持連線選項336
12.2.6 SO_LINGER緩衝區處理方式選項337
12.2.7 SO_OOBINLINE帶外數據處理方式選項339
12.2.8 SO_RCVBUF和SO_SNDBUF緩衝區大小選項340
12.2.9 SO_RCVLOWAT和SO_SNDLOWAT緩衝區下限選項340
12.2.10 SO_RCVTIMEO和SO_SNDTIMEO收發逾時選項341
12.2.11 SO_REUSERADDR地址重用選項341
12.2.12 SO_EXCLUSIVEADDRUSE連線埠獨占選項342
12.2.13 SO_TYPE套接字類型選項342
12.2.14 SO_BSDCOMPAT與BSD套接字兼容選項342
12.2.15 SO_BINDTODEVICE套接字網路接口綁定選項343
12.2.16 SO_PRIORITY套接字優先權選項344
12.3 IPPROTO_IP選項344
12.3.1 IP_HDRINCL選項344
12.3.2 IP_OPTNIOS選項344
12.3.3 IP_TOS選項344
12.3.4 IP_TTL選項345
12.4 IPPROTO_TCP選項345
12.4.1 TCP_KEEPALIVE選項345
12.4.2 TCP_MAXRT選項346
12.4.3 TCP_MAXSEG選項346
12.4.4 TCP_NODELAY和TCP_CORK選項346
12.5 使用套接字選項348
12.5.1 設定和獲取緩衝區大小348
12.5.2 獲取套接字類型的例子353
12.5.3 使用套接字選項的綜合例子353
12.6 ioctl()函式358
12.6.1 ioctl()函式的命令選項358
12.6.2 ioctl()函式的IO請求360
12.6.3 ioctl()函式的檔案請求362
12.6.4 ioctl()函式的網路接口請求362
12.6.5 使用ioctl()函式對ARP高速快取操作369
12.6.6 使用ioctl()函式傳送路由表請求371
12.7 fcntl()函式371
12.7.1 fcntl()函式的選項372
12.7.2 使用fcntl()函式修改套接字非阻塞屬性372
12.7.3 使用fcntl()函式設定信號屬主372
12.8 小結373
第13章 原始套接字374
13.1 概述374
13.2 原始套接字的創建375
13.2.1 SOCK_RAW選項375
13.2.2 IP_HDRINCL套接字選項376
13.2.3 不需要bind()函式376
13.3 原始套接字傳送報文376
13.4 原始套接字接收報文377
13.5 原始套接字報文處理時的結構377
13.5.1 IP頭部的結構377
13.5.2 ICMP頭部結構378
13.5.3 UDP頭部結構381
13.5.4 TCP頭部結構382
13.6 ping的例子384
13.6.1 協定格式384
13.6.2 校驗和函式385
13.6.3 設定ICMP傳送報文的頭部386
13.6.4 剝離ICMP接受報文的頭部387
13.6.5 計算時間差388
13.6.6 傳送報文389
13.6.7 接收報文390
13.6.8 主函式過程391
13.6.9 主函式main()393
13.6.10 編譯測試396
13.7 洪水攻擊396
13.8 ICMP洪水攻擊397
13.8.1 ICMP洪水攻擊的原理397
13.8.2 ICMP洪水攻擊的例子397
13.9 UDP洪水攻擊401
13.10 SYN洪水攻擊405
13.10.1 SYN洪水攻擊的原理405
13.10.2 SYN洪水攻擊的例子405
13.11 小結409
第14章 伺服器模型選擇410
14.1 循環伺服器410
14.1.1 UDP循環伺服器410
14.1.2 TCP循環伺服器413
14.2 簡單並發伺服器415
14.2.1 並發伺服器的模型416
14.2.2 UDP並發伺服器416
14.2.3 TCP並發伺服器419
14.3 TCP的高級並發伺服器模型421
14.3.1 單客戶端單進程,統一accept()422
14.3.2 單客戶端單執行緒,統一accept()425
14.3.3 單客戶端單執行緒,各執行緒獨自accept(),使用互斥鎖427
14.4 IO復用循環伺服器431
14.4.1 IO復用循環伺服器模型介紹431
14.4.2 IO復用循環伺服器模型的例子432
14.5 小結436

第15章 IPv6簡介437
15.1 IPv4的缺陷437
15.2 IPv6的特點438
15.3 IPv6的地址439
15.3.1 IPv6的單播地址439
15.3.2 可聚集全球單播地址439
15.3.3 本地使用單播地址440
15.3.4 兼容性地址441
15.3.5 IPv6多播地址441
15.3.6 IPv6任播地址442
15.3.7 主機的多個IPv6地址442
15.4 IPv6的頭部443
15.4.1 IPv6頭部格式443
15.4.2 與IPv4頭部的對比444
15.4.3 IPv6的TCP頭部444
15.4.4 IPv6的UDP頭部444
15.4.5 IPv6的ICMP頭部445
15.5 IPv6運行環境447
15.5.1 載入IPv6模組447
15.5.2 查看是否支持IPv6447
15.6 IPv6的結構定義448
15.6.1 IPv6的地址族和協定族448
15.6.2 套接字地址結構448
15.6.3 地址兼容考慮450
15.6.4 IPv6通用地址450
15.7 IPv6的套接字函式451
15.7.1 socket()函式451
15.7.2 沒有發生改變的函式451
15.7.3 發生改變的函式452
15.8 IPv6的套接字選項452
15.8.1 IPv6的套接字選項452
15.8.2 單播跳限IPV6_UNICAST_HOPS453
15.8.3 傳送和接收多播包454
15.8.4 IPv6中獲得時間戳的ioctl命令455
15.9 IPv6的庫函式455
15.9.1 地址轉換函式的差異455
15.9.2 域名解析函式的差異455
15.9.3 測試宏458
15.10 IPv6的編程的一個簡單例子458
15.10.1 伺服器程式458
15.10.2 客戶端程式460
15.10.3 編譯調試461
15.11 小結462

第3篇 Linux核心網路編程

第16章 Linux核心中網路部分結構以及分布464
16.1 概述464
16.1.1 代碼目錄分布464
16.1.2 核心中網路部分流程簡介466
16.1.3 系統提供修改網路流程點468
16.1.4 sk_buff結構469
16.1.5 網路協定數據結構inet_protosw471
16.2 軟中斷CPU報文佇列及其處理473
16.2.1 Linux核心網路協定層的層間傳遞手段——軟中斷473
16.2.2 網路收發處理軟中斷的實現機制475
16.3 socket數據如何在核心中接收和傳送476
16.3.1 socket()的初始化476
16.3.2 接收網路數據recv()476
16.3.3 傳送網路數據send()477
16.4 小結477
第17章 netfilter框架內報文處理478
17.1 netfilter478
17.1.1 netfilter簡介478
17.1.2 netfilter框架479
17.1.3 netfilter檢查時的表格480
17.1.4 netfilter的規則480
17.2 iptables和netfilter481
17.2.1 iptables簡介481
17.2.2 iptables的表和鏈481
17.2.3 使用iptables設定過濾規則483
17.3 核心模組編程485
17.3.1 核心“Hello World!”程式485
17.3.2 核心模組的基本架構487
17.3.3 核心模組載入和卸載過程489
17.3.4 核心模組初始化和清理函式490
17.3.5 核心模組初始化和清理過程的容錯處理490
17.3.6 核心模組編譯所需的Makefile491
17.4 5個鉤子點492
17.4.1 netfilter的5個鉤子點492
17.4.2 NF_HOOK宏493
17.4.3 鉤子的處理規則494
17.5 註冊/註銷鉤子494
17.5.1 結構nf_hook_ops494
17.5.2 註冊鉤子495
17.5.3 註銷鉤子496
17.5.4 註冊註銷函式497
17.6 鉤子的簡單處理例子498
17.6.1 功能描述498
17.6.2 需求分析498
17.6.3 ping回顯禁止實現498
17.6.4 禁止向目的IP位址傳送數據的實現499
17.6.5 連線埠關閉實現499
17.6.6 動態配置實現499
17.6.7 可載入核心實現代碼501
17.6.8 套用層測試代碼實現508
17.6.9 編譯運行508
17.7 一點多個鉤子的優先權508
17.8 校驗和問題509
17.9 小結510

第4篇 綜合案例

第18章 一個簡單Web伺服器的例子SHTTPD512
18.1 SHTTPD的需求分析512
18.1.1 SHTTPD啟動參數可動態配置的需求513
18.1.2 SHTTPD的多客戶端支持的需求515
18.1.3 SHTTPD支持方法的需求515
18.1.4 SHTTPD支持的HTTP協定版本的需求516
18.1.5 SHTTPD支持頭部的需求517
18.1.6 SHTTPD定位URI的需求517
18.1.7 SHTTPD支持CGI的需求518
18.1.8 SHTTPD錯誤代碼的需求519
18.2 SHTTPD的模組分析和設計519
18.2.1 SHTTPD的主函式520
18.2.2 SHTTPD命令行解析的分析設計521
18.2.3 SHTTPD配置檔案解析的分析設計523
18.2.4 SHTTPD的多客戶端支持的分析設計523
18.2.5 SHTTPD頭部解析的分析設計526
18.2.6 SHTTPD對URI的分析設計526
18.2.7 SHTTPD支持方法的分析設計527
18.2.8 SHTTPD支持CGI的分析設計527
18.2.9 SHTTPD錯誤處理的分析設計530
18.3 SHTTPD各模組的實現532
18.3.1 SHTTPD命令行解析的實現532
18.3.2 SHTTPD檔案配置解析的實現535
18.3.3 SHTTPD的多客戶端支持的實現536
18.3.4 SHTTPD所請求URI解析的實現540
18.3.5 SHTTPD方法解析的實現541
18.3.6 SHTTPD回響方法的實現541
18.3.7 SHTTPD支持CGI的實現545
18.3.8 SHTTPD支持HTTP協定版本的實現548
18.3.9 SHTTPD內容類型的實現548
18.3.10 SHTTPD錯誤處理的實現550
18.3.11 SHTTPD生成目錄下檔案列表檔案的實現552
18.3.12 SHTTPD主函式的實現554
18.4 SHTTPD的編譯、調試和測試555
18.4.1 建立源檔案555
18.4.2 製作Makefile555
18.4.3 製作執行檔案555
18.4.4 使用不同的瀏覽器測試伺服器程式556
18.5 小結557
第19章 一個簡單網路協定棧的例子SIP558
19.1 SIP網路協定棧的功能描述558
19.1.1 SIP網路協定棧的基本功能描述558
19.1.2 SIP網路協定棧的分層功能描述559
19.1.3 SIP網路協定棧的用戶接口功能描述559
19.2 SIP網路協定棧的架構560
19.3 SIP網路協定棧的存儲區快取561
19.3.1 SIP存儲緩衝的結構定義561
19.3.2 SIP存儲緩衝的處理函式565
19.4 SIP網路協定棧的網路接口層567
19.4.1 SIP網路接口層的架構568
19.4.2 SIP網路接口層的數據結構568
19.4.3 SIP網路接口層的初始化函式570
19.4.4 SIP網路接口層的輸入函式571
19.4.5 SIP網路接口層的輸出函式574
19.5 SIP網路協定棧的ARP層577
19.5.1 SIP位址解析層的架構577
19.5.2 SIP位址解析層的數據結構577
19.5.3 SIP位址解析層的映射表579
19.5.4 SIP位址解析層的ARP映射表維護函式580
19.5.5 SIP位址解析層的ARP網路報文構建函式581
19.5.6 SIP位址解析層的ARP網路報文收發處理函式583
19.6 SIP網路協定棧的IP層586
19.6.1 SIP網際協定層的架構586
19.6.2 SIP網際協定層的數據結構587
19.6.3 SIP網際協定層的輸入函式589
19.6.4 SIP網際協定層的輸出函式593
19.6.5 SIP網際協定層的分片函式594
19.6.6 SIP網際協定層的分片組裝函式595
19.7 SIP網路協定棧的ICMP層599
19.7.1 SIP控制報文協定的數據結構599
19.7.2 SIP控制報文協定的協定支持600
19.7.3 SIP控制報文協定的輸入函式601
19.7.4 SIP控制報文協定的回顯應答函式602
19.8 SIP網路協定棧的UDP層603
19.8.1 SIP數據報文層的數據結構603
19.8.2 SIP數據報文層的控制單元603
19.8.3 SIP數據報文層的輸入函式605
19.8.4 SIP數據報文層的輸出函式606
19.8.5 SIP數據報文層的建立函式606
19.8.6 SIP數據報文層的釋放函式607
19.8.7 SIP數據報文層的綁定函式607
19.8.8 SIP數據報文層的傳送數據函式608
19.8.9 SIP數據報文層的校驗和計算609
19.9 SIP網路協定棧的協定無關層610
19.9.1 SIP協定無關層的系統架構611
19.9.2 SIP協定無關層的函式形式611
19.9.3 SIP協定無關層的接收數據函式612
19.10 SIP網路協定棧的BSD接口層613
19.10.1 SIP用戶接口層的架構613
19.10.2 SIP用戶接口層的套接字建立函式613
19.10.3 SIP用戶接口層的套接字關閉函式614
19.10.4 SIP用戶接口層的套接字綁定函式614
19.10.5 SIP用戶接口層的套接字連線函式615
19.10.6 SIP用戶接口層的套接字接收數據函式615
19.10.7 SIP用戶接口層的傳送數據函式616
19.11 SIP網路協定棧的編譯617
19.11.1 SIP的檔案結構617
19.11.2 SIP的Makefile618
19.11.3 SIP的編譯運行618
19.12 小結618
第20章 一個簡單防火牆的例子SIPFW620
20.1 SIPFW防火牆的功能描述620
20.1.1 SIPFW防火牆對主機進行網路數據過濾的功能描述620
20.1.2 SIPFW防火牆用戶設定防火牆規則的功能描述621
20.1.3 SIPFW防火牆配置檔案等附加功能的功能描述621
20.2 SIPFW需求分析621
20.2.1 SIPFW防火牆條件和動作621
20.2.2 SIPFW防火牆支持過濾的類型和內容622
20.2.3 SIPFW防火牆過濾的方式和動作625
20.2.4 SIPFW防火牆的配置檔案626
20.2.5 SIPFW防火牆命令行配置格式627
20.2.6 SIPFW防火牆的規則檔案格式628
20.2.7 SIPFW防火牆的日誌檔案數據格式630
20.2.8 SIPFW防火牆構建所採用的技術方案630
20.3 使用netlink進行用戶空間和核心空間數據互動631
20.3.1 netlink的用戶空間程式設計632
20.3.2 netlink的核心空間API635
20.4 使用proc進行記憶體數據用戶空間映射637
20.4.1 proc虛擬檔案系統的結構637
20.4.2 創建proc虛擬檔案638
20.4.3 刪除proc虛擬檔案639
20.4.4 proc檔案的寫函式639
20.4.5 proc檔案的讀函式640
20.5 核心空間的檔案操作函式641
20.5.1 核心空間的檔案結構641
20.5.2 核心空間的檔案建立操作641
20.5.3 核心空間的檔案讀寫操作642
20.5.4 核心空間的檔案關閉操作643
20.6 SIPFW防火牆的模組分析和設計644
20.6.1 SIPFW防火牆的總體架構644
20.6.2 SIPFW防火牆的用戶命令解析645
20.6.3 SIPFW用戶空間與核心空間的互動649
20.6.4 SIPFW防火牆核心鏈上的規則處理651
20.6.5 SIPFW防火牆的PROC虛擬檔案系統654
20.6.6 SIPFW防火牆的配置檔案和日誌檔案處理655
20.6.7 SIPFW防火牆的過濾模組設計657

20.7 SIPFW防火牆各功能模組的實現660
20.7.1 SIPFW防火牆的命令解析代碼660
20.7.2 SIPFW防火牆的過濾規則解析模組代碼664
20.7.3 SIPFW防火牆的網路數據攔截模組代碼666
20.7.4 SIPFW防火牆的PROC虛擬檔案系統668
20.7.5 SIPFW防火牆對配置檔案的解析670
20.7.6 SIPFW防火牆核心模組初始化和退出671
20.7.7 用戶空間處理主函式672
20.8 編譯、調試和測試673
20.8.1 用戶程式和核心程式的Makefile673
20.8.2 編譯及運行674
20.8.3 下發過濾規則,測試過濾結果674
20.9 小結676

相關詞條

熱門詞條

聯絡我們