關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)教程
全書(shū)共分12章, 主要內(nèi)容包括: 實(shí)驗(yàn)基礎(chǔ)、雙絞線(xiàn)、交換機(jī)技術(shù)、路由技術(shù)、訪問(wèn)控制列表、IPv6 技術(shù)、NAT地址轉(zhuǎn)換、VPN技術(shù)、網(wǎng)絡(luò)嗅探與協(xié)議分析、網(wǎng)絡(luò)編程、網(wǎng)絡(luò)安全、綜合實(shí)驗(yàn)。
本書(shū)重點(diǎn)突出,結(jié)構(gòu)層次清晰,語(yǔ)言通俗易懂。有許多的典型應(yīng)用實(shí)例。實(shí)例采用引導(dǎo)型模式,主要環(huán)節(jié)均留出思考空間。每個(gè)實(shí)例針對(duì)性很強(qiáng),敘述和分析透徹,它包括網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、實(shí)驗(yàn)環(huán)境說(shuō)明、實(shí)驗(yàn)?zāi)康暮鸵、配置步驟、測(cè)試結(jié)果等,每章都配有相關(guān)實(shí)驗(yàn)習(xí)題,具有可讀性、可操作性和實(shí)用性強(qiáng)的特點(diǎn),特別適合于課堂教學(xué)。
作者在本書(shū)第1版的基礎(chǔ)上,對(duì)原內(nèi)容做了一些調(diào)整。原第1章不變,但內(nèi)容有刪減。原第9~11章調(diào)整為第2~4章,原第2~8章調(diào)整為第5~11章,并增加了新的第12章無(wú)線(xiàn)網(wǎng)絡(luò),原綜合實(shí)驗(yàn)調(diào)整為第13章。
本書(shū)第1版大部分內(nèi)容的操作系統(tǒng)是基于Windows XP的,第2版修改了不適用于Windows 10的部分。交換機(jī)與路由器的端口也從百兆升級(jí)為千兆端口,以銳捷的S5750、RSR20為參考設(shè)備,但實(shí)際上對(duì)于網(wǎng)絡(luò)設(shè)備的配置管理命令并沒(méi)有太大改變。書(shū)中交換機(jī)與路由器等網(wǎng)絡(luò)設(shè)備的配置實(shí)驗(yàn),對(duì)于不具備硬件實(shí)驗(yàn)環(huán)境的可以采用第1章實(shí)驗(yàn)基礎(chǔ)所介紹的Cisco仿真軟件模擬實(shí)現(xiàn)。針對(duì)目前無(wú)線(xiàn)網(wǎng)絡(luò)比較流行的情況,本版增加了相關(guān)內(nèi)容,供讀者學(xué)習(xí)參考。本書(shū)內(nèi)容覆蓋較為廣泛,將網(wǎng)絡(luò)知識(shí)和技術(shù)融于網(wǎng)絡(luò)配置實(shí)驗(yàn)中,每章均配有用于鞏固所講授內(nèi)容的思考與練習(xí)題和上機(jī)實(shí)驗(yàn)題,本版還增加了一些有挑戰(zhàn)性的實(shí)驗(yàn)。本書(shū)可作為計(jì)算機(jī)網(wǎng)絡(luò)專(zhuān)業(yè)應(yīng)用本科的實(shí)驗(yàn)教材,也可作為網(wǎng)絡(luò)專(zhuān)業(yè)從業(yè)人員的自學(xué)教材。
全書(shū)共有13章,主要內(nèi)容包括實(shí)驗(yàn)基礎(chǔ)(第1章)、網(wǎng)絡(luò)嗅探與協(xié)議分析(第2章)、網(wǎng)絡(luò)編程(第3章)、網(wǎng)絡(luò)安全(第4章)、雙絞線(xiàn)實(shí)驗(yàn)(第5章)、交換機(jī)技術(shù)(第6章)、路由技術(shù)(第7章)、訪問(wèn)控制列表(第8章)、網(wǎng)絡(luò)地址轉(zhuǎn)換(第9章)、VPN技術(shù)(第10章)、IPv6技術(shù)(第11章)、無(wú)線(xiàn)技術(shù)(第12章)、綜合實(shí)驗(yàn)(第13章)。
本書(shū)重點(diǎn)突出,結(jié)構(gòu)層次清晰,語(yǔ)言通俗易懂,有眾多的網(wǎng)絡(luò)實(shí)驗(yàn),每個(gè)實(shí)驗(yàn)針對(duì)性很強(qiáng),敘述和分析透徹,包括網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、實(shí)驗(yàn)環(huán)境說(shuō)明、實(shí)驗(yàn)?zāi)康暮鸵、配置步驟、測(cè)試結(jié)果等,具有可讀性、可操作性和實(shí)用性強(qiáng)的特點(diǎn)。本書(shū)十分重視實(shí)驗(yàn)前后的驗(yàn)證,同時(shí)在實(shí)驗(yàn)中插入了許多思考和討論環(huán)節(jié)。
在本書(shū)的編寫(xiě)過(guò)程中,參考了大量銳捷網(wǎng)絡(luò)的技術(shù)資料和培訓(xùn)教材,借鑒了許多網(wǎng)絡(luò)工程和網(wǎng)絡(luò)同仁的寶貴經(jīng)驗(yàn),在此表示誠(chéng)摯的謝意。由于作者水平有限,書(shū)中的不妥和錯(cuò)誤在所難免,誠(chéng)請(qǐng)各位專(zhuān)家和讀者批評(píng)指正。
編者
2017年2月
王盛邦, 碩士、高工,主要從事軟件開(kāi)發(fā)和計(jì)算機(jī)類(lèi)課程教學(xué)工作,研究方向是計(jì)算機(jī)網(wǎng)絡(luò)、信息安全。曾講授的課程有“計(jì)算機(jī)網(wǎng)絡(luò)及應(yīng)用”、“計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)”、“計(jì)算機(jī)網(wǎng)絡(luò)與信息安全基礎(chǔ)”、“網(wǎng)絡(luò)安全原理與技術(shù)實(shí)驗(yàn)”、“信息安全綜合實(shí)踐”等。
曾任全國(guó)大學(xué)生嵌入式大賽中山大學(xué)參賽小組指導(dǎo)老師、全國(guó)大學(xué)生信息安全競(jìng)賽中大參賽隊(duì)的指導(dǎo)老師、中山大學(xué)信息安全競(jìng)賽校際選拔賽評(píng)委、全國(guó)大學(xué)生信息安全競(jìng)賽網(wǎng)評(píng)專(zhuān)家。
曾主持校級(jí)實(shí)驗(yàn)室開(kāi)放基金項(xiàng)目“計(jì)算機(jī)網(wǎng)絡(luò)創(chuàng)新實(shí)驗(yàn)”、“EMC教學(xué)實(shí)驗(yàn)案例的設(shè)計(jì)與開(kāi)發(fā)”、“計(jì)算機(jī)網(wǎng)絡(luò)實(shí)踐課程改革與實(shí)驗(yàn)教材建設(shè)”、“計(jì)算機(jī)網(wǎng)絡(luò)實(shí)踐課程自主創(chuàng)新本科教學(xué)體系建設(shè)”、““計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)”精品課程建設(shè)”、“信息安全專(zhuān)業(yè)綜合實(shí)踐實(shí)驗(yàn)改革與設(shè)計(jì)”、“信息安全綜合實(shí)踐課程建設(shè)”、“教材建設(shè)-網(wǎng)絡(luò)與信息安全綜合實(shí)踐”等。
所編寫(xiě)廣東省本科高校教學(xué)質(zhì)量與教學(xué)改革工程立項(xiàng)建設(shè)項(xiàng)目《網(wǎng)絡(luò)與信息安全綜合實(shí)踐》被全國(guó)多所高校采用。
第1章實(shí)驗(yàn)基礎(chǔ)1
1.1常用網(wǎng)絡(luò)命令1
1.1.1ping命令1
1.1.2tracert命令5
1.1.3ipconfig命令7
1.1.4netstat命令8
1.1.5arp命令10
1.1.6net命令11
1.1.7netsh命令13
1.2IPv4地址基礎(chǔ)16
1.2.1IPv4地址表示16
1.2.2IPv4地址結(jié)構(gòu)16
1.2.3IPv4地址分類(lèi)17
1.2.4網(wǎng)絡(luò)掩碼17
1.2.5子網(wǎng)掩碼與子網(wǎng)劃分18
1.2.6子網(wǎng)劃分實(shí)例18
1.3網(wǎng)絡(luò)包分析工具Wireshark20
1.3.1Wireshark20
1.3.2Wireshark常用功能21
1.3.3Wireshark的過(guò)濾規(guī)則25
1.3.4Wireshark命令行抓包26
1.3.5Wireshark數(shù)據(jù)包捕獲實(shí)例26
1.4網(wǎng)絡(luò)模擬軟件Packet Tracer29
1.4.1Packet Tracer界面29
1.4.2設(shè)備管理33
1.4.3通過(guò)Packet Tracer分析協(xié)議35
1.4.4Packet Tracer使用實(shí)驗(yàn)38
1.5繪制網(wǎng)絡(luò)拓?fù)鋱D40
1.5.1網(wǎng)絡(luò)設(shè)備圖例40
1.5.2拓?fù)鋱D繪制工具41
1.6實(shí)驗(yàn)與實(shí)驗(yàn)測(cè)試44
1.6.1實(shí)驗(yàn)前后的對(duì)比44
1.6.2對(duì)實(shí)驗(yàn)過(guò)程進(jìn)行監(jiān)控44
1.6.3實(shí)驗(yàn)截圖44
1.6.4撰寫(xiě)實(shí)驗(yàn)報(bào)告45
習(xí)題145第2章網(wǎng)絡(luò)嗅探與協(xié)議分析50
2.1網(wǎng)絡(luò)嗅探50
實(shí)驗(yàn)2.1嗅探實(shí)驗(yàn)51
2.2協(xié)議分析51
2.3TCP/IP協(xié)議52
2.3.1IP協(xié)議52
2.3.2TCP協(xié)議54
實(shí)驗(yàn)2.2TCP/IP協(xié)議分析58
2.4HTTP協(xié)議60
實(shí)驗(yàn)2.3HTTP協(xié)議分析實(shí)驗(yàn)62
2.5FTP協(xié)議64
2.5.1FTP客戶(hù)/服務(wù)器64
2.5.2數(shù)據(jù)連接主動(dòng)方式/被動(dòng)方式65
2.5.3用戶(hù)名和口令的明文傳輸65
2.5.4FileZilla66
實(shí)驗(yàn)2.4FTP協(xié)議分析66
2.6Telnet協(xié)議69
2.6.1Telnet的基本服務(wù)69
2.6.2選項(xiàng)協(xié)商70
2.6.3Telnet客戶(hù)機(jī)和服務(wù)器71
實(shí)驗(yàn)2.5Telnet協(xié)議分析71
2.7DNS協(xié)議73
實(shí)驗(yàn)2.6DNS協(xié)議分析76
2.8ARP協(xié)議78
實(shí)驗(yàn)2.7ARP協(xié)議分析80
2.9QQ協(xié)議82
實(shí)驗(yàn)2.8QQ協(xié)議分析83
2.10迅雷下載協(xié)議85
實(shí)驗(yàn)2.9迅雷協(xié)議分析86
習(xí)題287第3章網(wǎng)絡(luò)編程91
3.1利用套接字建立邏輯信道92
3.2Client/Server工作模式分類(lèi)93
3.3面向連接的Client/Server模式93
3.3.1面向連接的服務(wù)器工作流程93
3.3.2面向連接的客戶(hù)端工作流程95
3.4無(wú)連接的Client/Server模式97
3.5編程實(shí)驗(yàn)97
實(shí)驗(yàn)3.1TCP通信程序設(shè)計(jì)102
實(shí)驗(yàn)3.2UDP通信程序設(shè)計(jì)103
實(shí)驗(yàn)3.3網(wǎng)絡(luò)嗅探器設(shè)計(jì)104
實(shí)驗(yàn)3.4停等協(xié)議通信106
實(shí)驗(yàn)3.5GBN協(xié)議編程107
實(shí)驗(yàn)3.6IPv4組播通信108
實(shí)驗(yàn)3.7應(yīng)用層組播113
習(xí)題3115第4章網(wǎng)絡(luò)安全117
4.1Linux防火墻配置117
4.1.1netfilter/iptables118
4.1.2建立規(guī)則和鏈119
4.1.3其他NAT配置123
實(shí)驗(yàn)4.1Linux防火墻設(shè)計(jì)123
4.2ARP欺騙126
4.2.1同一網(wǎng)段的ARP欺騙126
4.2.2不同網(wǎng)段的ARP欺騙127
4.2.3ARP欺騙的防御129
實(shí)驗(yàn)4.2ARP測(cè)試與防御129
4.3盜鏈與反盜鏈技術(shù)131
4.3.1盜鏈原理131
4.3.2反盜鏈技術(shù)131
實(shí)驗(yàn)4.3分析某下載軟件的盜鏈行為132
4.4蜜罐技術(shù)133
實(shí)驗(yàn)4.4簡(jiǎn)單蜜罐陷阱的配置134
4.5入侵檢測(cè)技術(shù)136
實(shí)驗(yàn)4.5入侵檢測(cè)實(shí)驗(yàn)137
習(xí)題4138第5章雙絞線(xiàn)實(shí)驗(yàn)142
5.1雙絞線(xiàn)142
5.2RJ.45連接器145
5.3雙絞線(xiàn)跳線(xiàn)的制作標(biāo)準(zhǔn)和跳線(xiàn)類(lèi)型147
5.3.1T568.A標(biāo)準(zhǔn)與T568.B標(biāo)準(zhǔn)147
5.3.2跳線(xiàn)線(xiàn)序148
5.3.3直連線(xiàn)和交叉線(xiàn)148
實(shí)驗(yàn)5.1雙絞線(xiàn)跳線(xiàn)的制作和測(cè)試149
5.4信息模塊152
實(shí)驗(yàn)5.2信息模塊的壓制和測(cè)試154
習(xí)題5156第6章交換機(jī)技術(shù)157
6.1交換機(jī)技術(shù)基礎(chǔ)157
6.1.1以太網(wǎng)交換機(jī)157
6.1.2交換機(jī)的工作原理157
6.1.3交換機(jī)的基本功能159
6.1.4交換機(jī)的交換方式159
6.1.5交換機(jī)的分類(lèi)160
6.1.6交換機(jī)的接口與連接線(xiàn)纜160
6.1.7交換機(jī)配置基礎(chǔ)161
6.1.8交換機(jī)的命令模式162
6.2VLAN技術(shù)163
6.2.1基本概念163
6.2.2VLAN的分類(lèi)164
6.2.3VLAN數(shù)據(jù)幀的標(biāo)識(shí)165
6.2.4VLAN中的端口165
6.2.5VLAN的基本配置166
實(shí)驗(yàn)6.1單交換機(jī)實(shí)現(xiàn)VLAN169
實(shí)驗(yàn)6.2跨交換機(jī)實(shí)現(xiàn)VLAN172
6.2.6三層交換機(jī)VLAN間路由174
實(shí)驗(yàn)6.3通過(guò)三層交換機(jī)實(shí)現(xiàn)VLAN間路由177
6.2.7單臂路由實(shí)現(xiàn)VLAN間路由179
實(shí)驗(yàn)6.4單臂路由實(shí)現(xiàn)VLAN間路由180
6.3端口聚合183
6.3.1基本概念183
6.3.2端口匯聚配置命令184
6.3.3配置Aggregate Port的流量平衡185
實(shí)驗(yàn)6.5端口聚合配置實(shí)驗(yàn)187
6.4端口鏡像190
6.4.1基本概念190
6.4.2本地端口鏡像190
實(shí)驗(yàn)6.6交換機(jī)端口鏡像配置192
6.4.3基于VLAN的鏡像194
6.4.4遠(yuǎn)程端口鏡像195
實(shí)驗(yàn)6.7交換機(jī)端口遠(yuǎn)程鏡像197
6.4.5基于流的遠(yuǎn)程端口鏡像配置199
6.5生成樹(shù)協(xié)議199
6.5.1基本概念199
6.5.2生成樹(shù)協(xié)議的定義203
6.5.3快速生成樹(shù)協(xié)議204
實(shí)驗(yàn)6.8快速生成樹(shù)協(xié)議配置204
6.5.4多生成樹(shù)協(xié)議208
實(shí)驗(yàn)6.9多生成樹(shù)協(xié)議配置208
6.5.5生成樹(shù)協(xié)議小結(jié)215
6.6交換技術(shù)的發(fā)展前景215
習(xí)題6216第7章路由技術(shù)223
7.1路由器技術(shù)基礎(chǔ)223
7.1.1路由的基本概念223
7.1.2路由器的功能225
7.1.3路由器的分類(lèi)226
7.1.4路由的分類(lèi)226
7.1.5路由器的接口和線(xiàn)纜227
7.1.6路由器配置228
7.1.7路由器端口配置原則229
7.1.8路由器的常見(jiàn)命令模式230
7.2靜態(tài)路由230
7.2.1靜態(tài)路由230
7.2.2靜態(tài)路由配置步驟232
7.2.3靜態(tài)路由配置主要命令232
實(shí)驗(yàn)7.1靜態(tài)路由233
7.3RIP路由235
7.3.1RIP概述235
7.3.2路由環(huán)路236
7.3.3有類(lèi)路由與無(wú)類(lèi)路由239
7.3.4RIP的工作過(guò)程239
7.3.5路由匯總240
7.3.6RIP配置步驟242
實(shí)驗(yàn)7.2RIP路由協(xié)議243
7.4OSPF路由246
7.4.1OSPF概述246
7.4.2Loopback地址247
7.4.3OSPF數(shù)據(jù)包類(lèi)型247
7.4.4OSPF協(xié)議工作過(guò)程249
7.4.5OSPF區(qū)域250
7.4.6OSPF配置步驟251
實(shí)驗(yàn)7.3OSPF單區(qū)域252
實(shí)驗(yàn)7.4OSPF多區(qū)域255
7.4.7OSPF虛連接258
7.4.8OSPF的認(rèn)證259
實(shí)驗(yàn)7.5OSPF虛鏈路260
7.4.9路由重發(fā)布263
實(shí)驗(yàn)7.6路由重發(fā)布266
7.5動(dòng)態(tài)路由協(xié)議小結(jié)269
習(xí)題7269第8章訪問(wèn)控制列表279
8.1基本概念279
8.2ACL匹配性檢查280
8.2.1ACL的匹配過(guò)程280
第3章網(wǎng) 絡(luò) 編 程 本章主要介紹網(wǎng)絡(luò)編程的一些主要方法,并配有編程實(shí)驗(yàn)。一些實(shí)驗(yàn)只提出要求,程序編寫(xiě)過(guò)程需要讀者自行完成。 如果應(yīng)用程序涉及本地與遠(yuǎn)程之間的通信,就需要采用網(wǎng)絡(luò)編程。網(wǎng)絡(luò)編程*主要的工作就是在發(fā)送端把信息通過(guò)規(guī)定好的協(xié)議進(jìn)行包的組裝,在接收端按照規(guī)定好的協(xié)議把包進(jìn)行解析并提取出對(duì)應(yīng)的信息,從而達(dá)到通信的目的。中間*主要的就是數(shù)據(jù)包的組裝、過(guò)濾、捕獲和分析以及其他處理。 通過(guò)使用套接字達(dá)到進(jìn)程間通信目的的編程就是網(wǎng)絡(luò)編程。套接字即Socket,應(yīng)用程序通常通過(guò)套接字向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求,實(shí)際上是網(wǎng)絡(luò)應(yīng)用程序接口(API)。套接字是由傳輸層提供的應(yīng)用程序(進(jìn)程)和網(wǎng)絡(luò)之間的接入點(diǎn),如圖3.1所示。應(yīng)用程序(進(jìn)程)可以通過(guò)套接字訪問(wèn)網(wǎng)絡(luò),套接字利用主機(jī)的網(wǎng)絡(luò)層地址和端口號(hào)為兩個(gè)進(jìn)程建立邏輯連接。 圖3.1Socket是應(yīng)用層與傳輸層之間的橋梁 套接字可以用于多種協(xié)議,包括TCP/IP協(xié)議。常用的端口號(hào)如表3.1所示。表3.1TCP/IP常用端口號(hào)協(xié)議NNTPFTP(數(shù)據(jù))FTP(控制)TelnetSTMPHTTPPOP3端口號(hào)192021232580110為了方便網(wǎng)絡(luò)編程,20世紀(jì)90年代初,Microsoft聯(lián)合其他幾家公司共同制定了一套Windows下的網(wǎng)絡(luò)編程接口,即Windows Sockets規(guī)范。它不是一種網(wǎng)絡(luò)協(xié)議,而是一套開(kāi)放的、支持多種協(xié)議的Windows下的網(wǎng)絡(luò)編程接口,F(xiàn)在的Winsock已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無(wú)關(guān),可以使用Winsock調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Socket實(shí)際上是在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過(guò)這個(gè)端口與任何一個(gè)具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過(guò)這個(gè)Socket接口實(shí)現(xiàn)。 Socket是TCP/IP網(wǎng)絡(luò)的API,Socket接口提供了很多的函數(shù),可以用于開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序。Socket數(shù)據(jù)傳輸是一種特殊的I/O,同時(shí)Socket也是一種文件描述符。Socket的使用主要有Socket建立、配置、建立連接、數(shù)據(jù)傳輸和結(jié)束傳輸?shù)冗^(guò)程。 3。1利用套接字建立邏輯信道 一般發(fā)起通信請(qǐng)求的程序被稱(chēng)為客戶(hù)端,用戶(hù)一般是通過(guò)客戶(hù)端軟件訪問(wèn)某種服務(wù)?蛻(hù)端應(yīng)用程序通過(guò)與服務(wù)器建立連接和發(fā)送請(qǐng)求,然后接收服務(wù)器返回的內(nèi)容。服務(wù)器則一般是等待并處理客戶(hù)端請(qǐng)求的應(yīng)用程序。服務(wù)器通常由系統(tǒng)執(zhí)行,在系統(tǒng)生存期間一直存在和等待客戶(hù)端的請(qǐng)求,并且在接收到客戶(hù)端的請(qǐng)求后,根據(jù)請(qǐng)求向客戶(hù)端返回合適的內(nèi)容。 通信的一方(被動(dòng)方,稱(chēng)為服務(wù)器)監(jiān)聽(tīng)某個(gè)端口;通信的另一方(主動(dòng)方,稱(chēng)為客戶(hù)端)如果知道服務(wù)器的IP地址和它所監(jiān)聽(tīng)的端口, 便可以試圖發(fā)送請(qǐng)求建立連接。該連接請(qǐng)求包含: 服務(wù)器IP地址、服務(wù)器端口號(hào)、客戶(hù)IP地址、客戶(hù)端口號(hào)。由于客戶(hù)端口號(hào)由客戶(hù)端的系統(tǒng)(TCP進(jìn)程)自動(dòng)選取一個(gè)當(dāng)前未用的端口,該四元組便可以在因特網(wǎng)中*標(biāo)識(shí)一個(gè)邏輯連接。服務(wù)器收到客戶(hù)端發(fā)來(lái)的連接請(qǐng)求后,便發(fā)出響應(yīng)建立該連接,這樣就建立了一條邏輯信道。 客戶(hù)和服務(wù)器通過(guò)請(qǐng)求響應(yīng)方式可以進(jìn)行雙向數(shù)據(jù)傳輸。當(dāng)結(jié)束數(shù)據(jù)傳輸時(shí),需要關(guān)閉該連接。這種工作模式是有連接的客戶(hù)端/服務(wù)器模式(Client/Server)。 根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過(guò)程可以分為三個(gè)步驟: 服務(wù)器監(jiān)聽(tīng),客戶(hù)端請(qǐng)求,連接確認(rèn)。 (1) 服務(wù)器監(jiān)聽(tīng): 是指服務(wù)器端套接字并不定位具體的客戶(hù)端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。 (2) 客戶(hù)端請(qǐng)求: 是指由客戶(hù)端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶(hù)端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后向服務(wù)器端套接字提出連接請(qǐng)求。 (3) 連接確認(rèn): 是指當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者接收到客戶(hù)端套接字的連接請(qǐng)求,它就響應(yīng)客戶(hù)端套接字的請(qǐng)求,建立一個(gè)新的線(xiàn)程,把服務(wù)器端套接字的描述發(fā)給客戶(hù)端,一旦客戶(hù)端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶(hù)端套接字的連接請(qǐng)求。 這三個(gè)步驟類(lèi)似于三次握手,如圖3.2所示。 圖3.2客戶(hù)端與服務(wù)器端的三次握手3。2Client/Server工作模式分類(lèi) Client/Server工作模式一般按下列分類(lèi): (1) 有狀態(tài)和無(wú)狀態(tài): 服務(wù)器是否記錄客戶(hù)端的當(dāng)前狀態(tài)。 (2) 有連接(TCP)和無(wú)連接(UDP): 客戶(hù)端和服務(wù)器之間是否先建立連接再傳輸數(shù)據(jù)。 (3) 循環(huán)和并發(fā): 服務(wù)器對(duì)多客戶(hù)端請(qǐng)求的服務(wù)是采用循環(huán)方法還是并發(fā)程序方法。 TCP協(xié)議面向連接,使用可靠的字節(jié)流傳送服務(wù);而UDP協(xié)議面向非連接,使用非可靠的數(shù)據(jù)報(bào)服務(wù)。TCP協(xié)議提供高可靠性的傳輸,UDP協(xié)議提供高效的傳輸。它們?cè)趯?shí)際應(yīng)用中有其各自所適應(yīng)的場(chǎng)合。 3。3面向連接的Client/Server模式 在面向連接的Client/Server結(jié)構(gòu)中,操作過(guò)程采取的是主動(dòng)請(qǐng)求方式: 服務(wù)器首先啟動(dòng),并根據(jù)請(qǐng)求提供相應(yīng)服務(wù)。 通過(guò)調(diào)用socket()建立一個(gè)套接口,然后調(diào)用bind()將該套接口和本地網(wǎng)絡(luò)地址聯(lián)系在一起,再調(diào)用listen()使套接口做好偵聽(tīng)的準(zhǔn)備,并規(guī)定它的請(qǐng)求隊(duì)列的長(zhǎng)度,之后調(diào)用accept()接收連接。客戶(hù)端在建立套接口后就可調(diào)用connect()和服務(wù)器建立連接。連接一旦建立,客戶(hù)機(jī)和服務(wù)器之間就可以供對(duì)方讀取或者讀取對(duì)方數(shù)據(jù)。*后在數(shù)據(jù)傳送結(jié)束后,雙方調(diào)用close()關(guān)閉套接口。 3。3。1面向連接的服務(wù)器工作流程 面向連接的服務(wù)器工作流程包括以下幾個(gè)環(huán)節(jié)。 1。 創(chuàng)建套接字 Socket建立是通過(guò)調(diào)用Socket函數(shù)實(shí)現(xiàn)的,該函數(shù)定義如下: SOCKET socket(int domain, int type, int protocol)其中參數(shù): domain: 指明使用的協(xié)議族,如果取值A(chǔ)F_INET,用于網(wǎng)絡(luò)通信;如果取值A(chǔ)F_UNIX,用于單一UNIX系統(tǒng)中進(jìn)程間通信。 type: 指明socket類(lèi)型,如果取值SOCK_STREAM,表示是流式,面向連接的比特流,順序、可靠、雙向,用于TCP通信;如果取值SOCK_DGRAM,表示數(shù)據(jù)報(bào)式、無(wú)連接、定長(zhǎng)、不可靠,用于UDP通信。 protocol: 由于指定了type,一般用0。 函數(shù)返回: 一個(gè)整型的socket描述符,供后面使用。如果調(diào)用失敗,返回一個(gè)INVALID_SOCKET值,錯(cuò)誤信息可以通過(guò)WSAGetLastError函數(shù)返回。 例如,一個(gè)socket可如下建立: int sockfd=socket(AF_INET,SOCK_STREAM,0)2。 將本地IP地址和端口號(hào)綁定到套接字 Socket的建立實(shí)際上是為socket數(shù)據(jù)結(jié)構(gòu)分配了一個(gè)名字空間并返回指針,接著要對(duì)數(shù)據(jù)結(jié)構(gòu)提供數(shù)據(jù)。bind()將一本地地址與一套接口捆綁,它適用于未連接的數(shù)據(jù)報(bào)或流類(lèi)套接口,在connect()或listen()調(diào)用前使用。bind()函數(shù)通過(guò)給一個(gè)未命名套接口分配一個(gè)本地名字為套接口建立本地捆綁(主機(jī)地址/端口號(hào))。 bind()定義如下: int bind(SOCKET socket, struct sockaddr address, int addr_len)其中參數(shù): sockfd: 由socket()調(diào)用返回的套接口文件描述符。 sockaddr: 數(shù)據(jù)結(jié)構(gòu)sockaddr中包括了關(guān)于本地地址、端口和IP地址的信息。 addr_len: 地址長(zhǎng)度,可以設(shè)置成sizeof(structsockaddr)。 通常服務(wù)器在啟動(dòng)時(shí)都會(huì)綁定一個(gè)眾所周知的地址(如IP地址+端口號(hào)),用于提供服務(wù),客戶(hù)端可以通過(guò)它連接服務(wù)器;而客戶(hù)端不用指定,有的系統(tǒng)會(huì)自動(dòng)分配一個(gè)端口號(hào)和自身的IP地址組合。這就是為什么通常服務(wù)器端在listen()之前會(huì)調(diào)用bind(),而客戶(hù)端就不會(huì)調(diào)用,而是在connect()時(shí)由系統(tǒng)隨機(jī)生成一個(gè)。 函數(shù)返回: 如無(wú)錯(cuò)誤發(fā)生,則bind()返回0;否則返回SOCKET_ERROR,應(yīng)用程序可通過(guò)WSAGetLastError()獲取相應(yīng)錯(cuò)誤代碼。 3。 服務(wù)端使用listen()開(kāi)啟監(jiān)聽(tīng) listen()在套接字函數(shù)中表示讓一個(gè)套接字處于監(jiān)聽(tīng)到來(lái)的連接請(qǐng)求的狀態(tài)。從客戶(hù)端發(fā)來(lái)的連接請(qǐng)求將首先進(jìn)入該等待隊(duì)列,等待本進(jìn)程的處理。listen()定義如下: int listen(SOCKET socket, int backlog)其中參數(shù): socket: 一個(gè)已綁定未被連接的套接字描述符。 backlog: 進(jìn)入隊(duì)列中允許的連接的個(gè)數(shù)。進(jìn)入的連接請(qǐng)求在使用系統(tǒng)調(diào)用accept()應(yīng)答之前要在進(jìn)入隊(duì)列中等待。該值是隊(duì)列中*多可以擁有的請(qǐng)求的個(gè)數(shù),大多數(shù)系統(tǒng)的默認(rèn)設(shè)置為20。 函數(shù)返回: 無(wú)錯(cuò)誤返回0;否則返回SOCKET ERROR,可以調(diào)用函數(shù)WSAGetLastError取得錯(cuò)誤代碼。 例如,listen(s,1)表示連接請(qǐng)求隊(duì)列長(zhǎng)度為1,即只允許有一個(gè)請(qǐng)求,若有多個(gè)請(qǐng)求,則出現(xiàn)錯(cuò)誤,給出錯(cuò)誤代碼WSAECONNREFUSED。 4。 接受從客戶(hù)端發(fā)來(lái)的請(qǐng)求 accept()是網(wǎng)絡(luò)編程的重要函數(shù),其作用是在一個(gè)套接口接受一個(gè)連接,其頭文件對(duì)于Windows系統(tǒng)是在#include中,而Linux系統(tǒng)則在#include 中。 accept()從端口的請(qǐng)求連接的等待連接隊(duì)列中抽取*個(gè)連接,創(chuàng)建一個(gè)與此同類(lèi)的新的套接口并返回句柄。如果隊(duì)列中無(wú)等待連接,且套接口為阻塞方式,則accept()阻塞調(diào)用進(jìn)程直至新的連接出現(xiàn)。如果套接口為非阻塞方式且隊(duì)列中無(wú)等待連接,則accept()返回一錯(cuò)誤代碼。已接受連接的套接口不能用于接受新的連接,原套接口仍保持開(kāi)放。accept()定義如下: SOCKETaccept(SOCKET socket, struct sockaddr address, int addr_len)其中參數(shù): Socket: 正在監(jiān)聽(tīng)端口的套接口文件描述符。 Address: 客戶(hù)端的socket地址。 addr_len: socket地址的長(zhǎng)度。 函數(shù)返回: 如果沒(méi)有錯(cuò)誤產(chǎn)生,則accept()返回一個(gè)描述所接收包的SOCKET類(lèi)型的值;否則返回INVALID_SOCKET錯(cuò)誤,應(yīng)用程序可通過(guò)調(diào)用WSAGetLastError()獲得特定的錯(cuò)誤代碼。 5。 發(fā)送和接收數(shù)據(jù) 建立連接后,客戶(hù)端和服務(wù)器端就可以進(jìn)行數(shù)據(jù)傳輸了,通過(guò)使用send()發(fā)送數(shù)據(jù),使用recv()接收數(shù)據(jù)。int send(SOCKETsocket, char message, int msg_len,int flags)其中參數(shù): socket: 發(fā)送數(shù)據(jù)的套接口文件描述符。它可以通過(guò)socket()系統(tǒng)調(diào)用返回,也可以通過(guò)accept()系統(tǒng)調(diào)用得到。 message: 指向要發(fā)送的數(shù)據(jù)的指針。 msg_len: 要發(fā)送數(shù)據(jù)的字節(jié)長(zhǎng)度。 flags: 標(biāo)志,一般設(shè)置為0。 函數(shù)返回: 無(wú)錯(cuò)時(shí)返回實(shí)際發(fā)送的字節(jié)數(shù),否則返回SOCKET_ERROR。int recv(SOCKETsocket, char message, int msg_len,int flags)其中參數(shù): socket: 要讀取的套接口文件描述符。 message: 保存讀入信息的緩沖區(qū)起始地址。 msg_len: 緩沖區(qū)的*大長(zhǎng)度。 flags: 標(biāo)志,一般設(shè)置為0。 函數(shù)返回: 無(wú)錯(cuò)時(shí)返回實(shí)際接收的字節(jié)數(shù),否則返回SOCKET_ERROR。 6。 關(guān)閉連接套接字 使用close()調(diào)用關(guān)閉連接的套接口文件描述符: int closesocket(SOCKETsocket);之后就不能再對(duì)此套接口做任何的讀/寫(xiě)操作。 7。 轉(zhuǎn)4或結(jié)束 3。3。2面向連接的客戶(hù)端工作流程 1。 創(chuàng)建套接字SOCKETsocket(int domain, int type, int protocol) 2。 發(fā)出連接請(qǐng)求 connect()用于建立與指定socket的連接。對(duì)于流類(lèi)套接口(SOCK_STREAM類(lèi)型),利用名字與一個(gè)遠(yuǎn)程主機(jī)建立連接,一旦套接口調(diào)用成功返回,它就能收發(fā)數(shù)據(jù)了。對(duì)于數(shù)據(jù)報(bào)類(lèi)套接口(SOCK_DGRAM類(lèi)型),則設(shè)置成一個(gè)默認(rèn)的目的地址,并用它進(jìn)行后續(xù)的send()與recv()調(diào)用。int connect(SOCKET socket, struct sockaddr address, int addr_len)其中參數(shù): Socket: 由系統(tǒng)調(diào)用socket()返回的套接口文件描述符。 Address: 指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針,其中包括目的(即服務(wù)器)端口和IP地址。 addr_len: 地址長(zhǎng)度,可以使用sizeof(struct sockaddr)獲得。 函數(shù)返回: 若無(wú)錯(cuò)誤發(fā)生,則connect()返回0;否則返回SOCKET_ERROR錯(cuò)誤,可通過(guò)WSAGetLastError()獲取相應(yīng)錯(cuò)誤代碼。 3。 發(fā)送和接收數(shù)據(jù) 4。 關(guān)閉此連接的套接字 其工作過(guò)程如圖3.3所示。 圖3.3基本TCP客戶(hù).服務(wù)器工作過(guò)程 3。4無(wú)連接的Client/Server模式 在無(wú)連接的Client/Server結(jié)構(gòu)中,服務(wù)器使用socket()和bind()函數(shù)調(diào)用建立和連接Socket。由于此時(shí)的Socket是無(wú)連接的,服務(wù)器使用recvfrom()函數(shù)從Socket接收數(shù)據(jù)?蛻(hù)端也只調(diào)用bind()函數(shù)而不調(diào)用connect()函數(shù)。注意: 無(wú)連接的協(xié)議不在兩個(gè)端口之間建立點(diǎn)對(duì)點(diǎn)的連接,因此sendto()函數(shù)要求程序在一個(gè)參數(shù)中指明目的地址。recvfrom()函數(shù)不需要建立連接,它對(duì)到達(dá)相連協(xié)議端口的任何數(shù)據(jù)作出響應(yīng)。當(dāng)recvfrom()函數(shù)從Socket收到一個(gè)數(shù)據(jù)報(bào)時(shí),它將保存發(fā)送此數(shù)據(jù)包的進(jìn)程的網(wǎng)絡(luò)地址以及數(shù)據(jù)包本身。程序(服務(wù)器和客戶(hù))用保存的地址去確定發(fā)送(客戶(hù))進(jìn)程。在必要的條件下,服務(wù)器將其應(yīng)答數(shù)據(jù)報(bào)送到從recvfrom()函數(shù)調(diào)用中所得到的網(wǎng)絡(luò)地址中去。其工作過(guò)程如圖3.4所示。 圖3.4基本UDP客戶(hù).服務(wù)器工作過(guò)程 一般而言,大多數(shù)TCP服務(wù)器是并發(fā)的,而大多數(shù)UDP服務(wù)器是迭代的。多數(shù)TCP服務(wù)器是與調(diào)用fork處理每個(gè)客戶(hù)連接的服務(wù)器并發(fā)執(zhí)行的。迭代服務(wù)器沒(méi)有對(duì)fork的調(diào)用,所以單一服務(wù)器進(jìn)程就處理了所有客戶(hù)。 3。5編 程 實(shí) 驗(yàn) 在Visual C++中進(jìn)行Winsock的API編程開(kāi)發(fā)時(shí),需要在項(xiàng)目中使用下面3個(gè)文件,否則會(huì)出現(xiàn)編譯錯(cuò)誤。 (1) winsock。h: Winsock API的頭文件,需要包含在項(xiàng)目中。 (2) wsock32。lib: Winsock API連接庫(kù)文件。在使用中,一定要把它作為項(xiàng)目的非默認(rèn)的連接庫(kù)包含到項(xiàng)目文件中。 (3) winsock。dll: Winsock的動(dòng)態(tài)連接庫(kù),位于Windows的安裝目錄下。 【例3.1】下面是一個(gè)有連接的編程實(shí)例。程序分兩部分: 服務(wù)器端程序和客戶(hù)端程序。 (1) 服務(wù)器端程序。//TCPdtd_server。cpp - main, TCPdaytimed #include #include #include #include void errexit(const char ,…); void TCPdaytimed(SOCKET); SOCKET passiveTCP(const char , int); #define QLEN5 #defineWSVERSMAKEWORD(2, 0) ……
你還可能感興趣
我要評(píng)論
|