Windows網(wǎng)絡(luò)編程基礎(chǔ)-習(xí)題解答
Windows 網(wǎng)絡(luò)編程基礎(chǔ)課后習(xí)題作業(yè)軟件1202 羅偉(1205290203)第一章:1. TCP/IP協(xié)議棧的五個層次是什么?在這些層次中,每層的主要任務(wù)是什么?解答:TCP/IP參考模型
Windows 網(wǎng)絡(luò)編程基礎(chǔ)課后習(xí)題作業(yè)
軟件1202 羅偉(1205290203)
第一章:
1. TCP/IP協(xié)議棧的五個層次是什么?在這些層次中,每層的主要任務(wù)是什么?
解答:TCP/IP參考模型分為五個層次:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層和物理層。以下分別介紹各層的主要功能。
應(yīng)用層是網(wǎng)絡(luò)應(yīng)用程序及其應(yīng)用層協(xié)議存留的層次。該層包括了所有與網(wǎng)絡(luò)相關(guān)的高層協(xié)議,如文件傳輸協(xié)議(File Transfer Protocol,F(xiàn)TP )、超文本傳輸協(xié)議(Hypertext Transfer Protocol ,HTTP )、Telent (遠(yuǎn)程終端協(xié)議)、簡單郵件傳送協(xié)議(Simple Mail Transfer Protocol,SMTP )、因特網(wǎng)中繼聊天(Internet Relay Chat ,IRC )、網(wǎng)絡(luò)新聞傳輸協(xié)議(Network News Transfer Protocol,NNTP )等。
傳輸層的功能是使源端主機和目標(biāo)端主機上的對等實體可以進(jìn)行會話。在傳輸層定義了兩種服務(wù)質(zhì)量不同的協(xié)議,即:傳輸控制協(xié)議(Transmission Control Protocol ,TCP )和用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol,UDP )。
網(wǎng)絡(luò)層是整個TCP/IP協(xié)議棧的核心。它的功能是通過路徑選擇把分組發(fā)往目標(biāo)網(wǎng)絡(luò)或主機,進(jìn)行網(wǎng)絡(luò)擁塞控制以及差錯控制。
鏈路層負(fù)責(zé)物理層和網(wǎng)絡(luò)層之間的通信,將網(wǎng)絡(luò)層接收到的數(shù)據(jù)分割成特定的可被物理層傳輸?shù)膸?,并交付物理層進(jìn)行實際的數(shù)據(jù)傳送。
物理層的任務(wù)是將該幀中的一個一個比特從一個節(jié)點移動到下一個節(jié)點。該層中的協(xié)議
,仍然是鏈路相關(guān)的,并且進(jìn)一步與鏈路(如雙絞線、單模光纖)的實際傳輸媒體相關(guān)。對應(yīng)于不同的傳輸媒體,跨越這些鏈路移動一個比特的方式不同。
2. 請分析路由器、鏈路層交換機和主機分別處理TCP/IP協(xié)議棧中的哪些層次?
解答:路由器處理TCP/IP協(xié)議棧的物理層、鏈路層和網(wǎng)絡(luò)層;
鏈路層交換機處理TCP/IP協(xié)議棧的物理層和鏈路層;
主機處理TCP/IP協(xié)議棧的物理層、鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。
3. 請闡述NAT 技術(shù)的主要實現(xiàn)方式,并思考NAT 技術(shù)對網(wǎng)絡(luò)應(yīng)用程序的使用帶來哪些影
響?
解答:網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation,NAT )是接入廣域網(wǎng)(W AN )的一種技術(shù),能夠?qū)⑺接校ūA簦┑刂忿D(zhuǎn)化為合法的IP 地址,它被廣泛應(yīng)用于各種類型Internet 接入方式和各種類型的網(wǎng)絡(luò)中。NA T 的實現(xiàn)方式有三種,即靜態(tài)轉(zhuǎn)換、動態(tài)轉(zhuǎn)換和端口多路復(fù)用。
NA T 有效解決了IP 地址短缺的問題,但是它也帶來了一些新的問題。主要體現(xiàn)在: 處于NAT 后面的主機不能充當(dāng)服務(wù)器直接接收外部主機的連接請求,必須對NAT 設(shè)備進(jìn)行相應(yīng)的配置才能完成外部地址與內(nèi)部服務(wù)器地址的映射;
處于不同NA T 之后的兩臺主機無法建立直接的UDP 或TCP 連接,必須使用中介服務(wù)器來幫助它們完成初始化的工作。
4. 某業(yè)務(wù)要求實現(xiàn)一個局域網(wǎng)上網(wǎng)行為監(jiān)控的軟件,能夠?qū)钟蚓W(wǎng)內(nèi)用戶的上網(wǎng)行為(包
括訪問站點、使用聊天工具、發(fā)布言論等)進(jìn)行截獲和分析,請選擇一個合適的網(wǎng)絡(luò)程序設(shè)計方法,并說明該軟件設(shè)計的主要流程。
解答:選擇使用具有較強數(shù)據(jù)捕獲能力的網(wǎng)絡(luò)編程方法,如WinPcap 編程或WinSock 編程中的原始套接字。局域網(wǎng)上網(wǎng)行為監(jiān)控軟件的主要流程包括:
1) 通過交換機的鏡像端口或分光方式,搭建局域網(wǎng)流量截獲環(huán)境,能夠?qū)⒕钟蚓W(wǎng)上下行的網(wǎng)絡(luò)流量復(fù)制出來進(jìn)行后續(xù)分析;
2)對鏡像出的網(wǎng)絡(luò)流量進(jìn)行捕獲,得到原始數(shù)據(jù);
,3)對原始數(shù)據(jù)進(jìn)行過濾,識別并保留與上網(wǎng)行為監(jiān)控相關(guān)的協(xié)議數(shù)據(jù),如HTTP 、SMTP 、QQ 通信協(xié)議等;
4)提取不同協(xié)議中監(jiān)控者感興趣的信息,如訪問網(wǎng)址、聊天對象、發(fā)布言論等;
5)分析數(shù)據(jù),進(jìn)行重點用戶監(jiān)控和異常行為檢測。
第二章 網(wǎng)絡(luò)程序通信模型
習(xí)題
1. 面向少量客戶持續(xù)請求的服務(wù)器和面向大量客戶短期請求的服務(wù)器在設(shè)計中有哪些區(qū)
別?
解答:面向少量客戶持續(xù)請求的服務(wù)器在單位時間內(nèi)處理的客戶請求數(shù)量是有限的,但服務(wù)器與每個客戶端之間的交互時間和頻率是持續(xù)的。在這種情況下,服務(wù)器一般設(shè)計為并發(fā)服務(wù)器,為每個客戶端分配專門的線程以處理其復(fù)雜的業(yè)務(wù)需求。
面向大量客戶短期請求的服務(wù)器在同一時間可能面臨成百上千個客戶的大量請求,但每個客戶端的請求與響應(yīng)比較簡單。在這種情況下,服務(wù)器需要根據(jù)客戶的具體業(yè)務(wù)需求來設(shè)計。如果是類似于時間服務(wù)的單次查詢-響應(yīng)服務(wù),可選擇循環(huán)服務(wù)器串行響應(yīng)每個客戶端的請求,避免線程膨脹和維護(hù)的復(fù)雜性;如果是類似于Web 訪問較復(fù)雜的服務(wù),可選擇基于完成端口的異步I/O,與線程池聯(lián)合管理多個客戶端的請求。
2. 某業(yè)務(wù)需要實現(xiàn)一個文件服務(wù)器,請給出該文件服務(wù)器的設(shè)計要點。
解答:文件服務(wù)器主要處理文件的上傳與下載業(yè)務(wù),在設(shè)計時需要考慮以下要點:
1) 用戶鑒別與權(quán)限管理。
文件服務(wù)器應(yīng)具備一定的用戶登錄和權(quán)限管理能力,以辨別用戶身份,保護(hù)文件訪問的合法性。
2) 數(shù)據(jù)傳輸可靠性。
,為了確保文件服務(wù)器的傳輸可靠性,在傳輸協(xié)議選擇上,可以使用TCP 協(xié)議自定義文件傳輸過程,完成數(shù)據(jù)傳輸;或者使用FTP 協(xié)議,用控制流進(jìn)行用戶授權(quán)和傳輸管理,用數(shù)據(jù)流具體傳送文件。
3) 數(shù)據(jù)傳輸?shù)男省?/p>
考慮到用戶上傳和下載大數(shù)據(jù)的現(xiàn)實體驗,文件服務(wù)器應(yīng)提供高效的數(shù)據(jù)傳輸能力,比如使用多線程機制提高效率,使用P2P 模型支持多點下載等。
4) 斷點續(xù)傳
文件服務(wù)器應(yīng)提供斷點續(xù)傳能力,確保在用戶下載過程中斷并恢復(fù)后,能夠保存之前的數(shù)據(jù)和狀態(tài)并繼續(xù)后續(xù)的下載任務(wù)。
實驗
1. 結(jié)合Wireshark 網(wǎng)絡(luò)流量分析工具對網(wǎng)頁郵件登錄過程進(jìn)行捕獲和分析,說明其基本的
工作流程。
解答:分析流程具體見《Windows 網(wǎng)絡(luò)編程實驗》。
2. 結(jié)合Wireshark 網(wǎng)絡(luò)流量分析工具對迅雷登錄和文件下載過程進(jìn)行捕獲和分析,說明其
基本的工作流程。
解答:分析流程具體見《Windows 網(wǎng)絡(luò)編程實驗》。
第三章 網(wǎng)絡(luò)數(shù)據(jù)的內(nèi)容與形態(tài)
習(xí)題
1. 假設(shè)應(yīng)用程序使用有符號短整型給端口號賦值,當(dāng)端口號大于32768時,端口號的具體
值為多少?是否合理?
解答:有符號短整型能夠表示的數(shù)據(jù)范圍是-32768~32767,當(dāng)端口號n 大于32768時,短整型最左邊一位為1,端口號的值為負(fù)數(shù),即-(216-n ),這樣表示是不合理的,應(yīng)該選用無符號短整型來描述端口號。
,2. 大端字節(jié)順序和小端字節(jié)順序是CPU 處理多字節(jié)數(shù)的不同方式。例如“漢”字的Unicode
編碼是0x6C49。那么存儲在內(nèi)存中時數(shù)據(jù)是如何存儲呢?請在自己的系統(tǒng)平臺下觀察字節(jié)在內(nèi)存中的具體存儲方式。
解答:在基于X86平臺的PC 機中,漢字的Unicode 編碼是6C49,存儲在內(nèi)存中是小端字節(jié)序的,具體存儲順序如下:
數(shù)值: 0x6c49015小端字節(jié)順序0x490x6c
3. 試考慮一個15字節(jié)的消息結(jié)構(gòu):
struct integerMessage {
uint8_t onebyte;
uint16_t twobytes;
uint32_t fourbytes;
uint64_t eightbytes;
}
請問,該消息結(jié)構(gòu)在內(nèi)存中的實際布置如何?該結(jié)構(gòu)的長度為多少?
解答:由于字節(jié)對齊的原因,該消息結(jié)構(gòu)在內(nèi)存中的實際布置如下:

4. 假設(shè)一個端口掃描應(yīng)用程序被設(shè)計為遞增IP 地址和TCP 端口,并手工構(gòu)造和發(fā)送TCP 掃描包給目標(biāo)方,那么在每次發(fā)送數(shù)據(jù)前,TCP 掃描包的哪些字段需要修改,如何修改?
解答:TCP 端口掃描程序面向給定的目的主機,對指定的端口范圍進(jìn)行掃描,掃描過程一般是向目標(biāo)主機的端口號發(fā)送SYN 請求,并接收對方的應(yīng)答,如果對方反饋了SYN 應(yīng)答包則說明該端口開放,否則認(rèn)為端口不開放。
手工構(gòu)造TCP 掃描包涉及到IP 首部和TCP 首部的構(gòu)造,那么在探測過程中,每次TCP 掃描包需要修改的字段主要有:IP 首部中目的IP 地址、IP 首部的校驗和清零后重新計算、TCP 首部的目標(biāo)端口號、TCP 首部的校驗和清零后重新計算。
5. 請設(shè)計一個遠(yuǎn)程投票系統(tǒng)的消息傳送協(xié)議,具體內(nèi)容包括:
,1)投票協(xié)議標(biāo)識
2)投票消息類型
3)投票候選人標(biāo)識
4)投票結(jié)果
使用文本串和二進(jìn)制兩種方式設(shè)計投票消息以滿足以上需求。
解答:基于文本串的消息描述方式需要定義一些固定含義的文本串來標(biāo)識消息內(nèi)容。比如:“VOT ”指明投票協(xié)議,“TYPE :”指明消息類型,“CANDIDATE :”指明候選人,“RESULT :”指明結(jié)果。則一個具體的消息可以表示為由消息標(biāo)識聲明的文本串,如“VOT TYPE :2;CANDIDATE :peter ;RESULT :true ”,假設(shè)投票消息傳送協(xié)議基于TCP 協(xié)議承載,在具體傳輸過程中,使用一種編碼方式(如:Unicode 編碼)對該文本串進(jìn)行描述,并作為TCP 協(xié)議的數(shù)據(jù)部分傳輸。
基于二進(jìn)制的消息描述方式使用固定大小的數(shù)據(jù)區(qū)域存儲消息內(nèi)容,比如設(shè)計投票消息傳送協(xié)議格式如下:

015
定義:協(xié)議標(biāo)識0x01代表投票協(xié)議
消息類型0x02代表投票消息
候選人標(biāo)識0x05代表候選人“peter ”的唯一標(biāo)識
投票結(jié)果0x01代表投票,0x02代表反對
那么一次對候選人peter 的贊成投票的投票消息為:0x01020501.
假設(shè)投票消息傳送協(xié)議基于TCP 協(xié)議承載,在具體傳輸過程中,二進(jìn)制描述的投票消息可以直接作為TCP 協(xié)議的數(shù)據(jù)部分傳輸。
,第四章 協(xié)議軟件接口
習(xí)題
1. 闡述使用Windows Sockets編程的環(huán)境配置過程。
解答:Windows Sockets實現(xiàn)一般由兩部分組成:開發(fā)組件和運行組件。
開發(fā)組件是供程序員開發(fā)Windows Sockets 應(yīng)用程序使用的,它包括介紹Windows Sockets 實現(xiàn)的文檔、Windows Sockets 應(yīng)用程序接口(API )引入庫和一些頭文件。頭文件winsock.h 、winsock2.h 分別對應(yīng)于WinSock 1.1和WinSock2.2,是Windows Sockets最重要的頭文件,它們包括了Windows Sockets實現(xiàn)所定義的宏、常數(shù)值、數(shù)據(jù)結(jié)構(gòu)和函數(shù)調(diào)用接口原型。
運行組件是Windows Sockets 應(yīng)用程序接口的動態(tài)鏈接庫(DLL ),應(yīng)用程序在執(zhí)行時通過裝入它實現(xiàn)網(wǎng)絡(luò)通信功能。兩個版本的動態(tài)鏈接庫以及與其對應(yīng)的接口引入庫和頭文件如下所示。
表4-1 Windows Sockets 版本中相應(yīng)的動態(tài)鏈接庫

對動態(tài)鏈接的使用,需要在程序編譯前將對應(yīng)的頭文件引入源文件,以便編譯環(huán)境可以找到相應(yīng)函數(shù)和變量的聲明,并在項目中引入靜態(tài)鏈接庫文件,以便在程序編譯通過后,連接時可以找到套接字函數(shù)的執(zhí)行地址。
以Windows Sockets 2.2版本為例,對頭文件的引入使用以下代碼段:
#include “winsock2.h ”
對靜態(tài)鏈接庫的引入使用以下代碼段:
#pragma comment(lib,"ws2_32.lib")
,或者在開發(fā)環(huán)境中的項目菜單中配置增加對“ws2_32.lib”文件的引入,如下圖所示。

2. 考慮一種提供消息傳遞的操作系統(tǒng),闡述如何擴(kuò)展應(yīng)用程序接口使其適用于網(wǎng)絡(luò)通信?
解答:提供消息傳遞的操作系統(tǒng)典型的例子是Windows 操作系統(tǒng),該系統(tǒng)最大的特點是圖形化的操作界面,其圖形化界面是建立在消息處理機制這個基礎(chǔ)之上的。程序不斷等待,等待任何可能的輸入,然后做判斷,根據(jù)不同的消息調(diào)用消息處理函數(shù)進(jìn)行適當(dāng)?shù)奶幚?。這種輸入是操作系統(tǒng)捕捉到后以消息形式(一種數(shù)據(jù)結(jié)構(gòu))進(jìn)入程序之中的。
有了消息機制的推動,套接字接口也可以借助消息機制來通知應(yīng)用程序網(wǎng)絡(luò)事件滿足,具體思路是:首先為應(yīng)用程序創(chuàng)建消息傳遞所需的消息接收窗口和消息隊列;然后定義與網(wǎng)絡(luò)事件相關(guān)聯(lián)的消息;之后通過系統(tǒng)調(diào)用注冊網(wǎng)絡(luò)事件與消息的對應(yīng)關(guān)系;最后,當(dāng)網(wǎng)絡(luò)事件發(fā)生時,系統(tǒng)觸發(fā)消息通知應(yīng)用程序處理。通過以上基本步驟實現(xiàn)了基于消息機制的異步網(wǎng)絡(luò)操作。
3. 闡述程序、套接字、端口和協(xié)議之間的關(guān)系。
解答:程序和套接字的關(guān)系:一個程序可以同時使用多個套接字,不同套接字完成不同的傳輸任務(wù)。多個應(yīng)用程序可以同時使用同一個套接字,不過這種情況并不常見。
套接字和端口的關(guān)系:每個套接字都有一個關(guān)聯(lián)的本地TCP 或UDP 端口,它用于把傳入的分組指引到應(yīng)該接收它們的應(yīng)用程序。一個端口上可能關(guān)聯(lián)多個套接字,流式套接字的
,服務(wù)器上可能同時有監(jiān)聽套接字和連接套接字,它們都與一個TCP 的端口號相關(guān)聯(lián);一個套接字一般只會關(guān)聯(lián)一個唯一的本地端口號。
端口和協(xié)議的關(guān)系:TCP 和UDP 的端口號是獨立使用的。
實驗
1.調(diào)用Windows Sockets的API 函數(shù)獲得本地主機和遠(yuǎn)端域名的IP 地址,如果一個主機名稱對應(yīng)了多個IP 地址,請依次打印。
解答:實現(xiàn)過程具體見《Windows 網(wǎng)絡(luò)編程實驗》。
第五章 流式套接字編程
習(xí)題
1. 思考套接字接口層與TCP 實現(xiàn)之間的關(guān)系,結(jié)合數(shù)據(jù)發(fā)送和接收分析數(shù)據(jù)的傳遞過程
以及兩個層次的具體工作。
解答:對應(yīng)于TCP 數(shù)據(jù)的發(fā)送和接收,套接字實現(xiàn)設(shè)計了兩個獨立的緩沖區(qū),分別用于緩存應(yīng)用程序請求發(fā)送的數(shù)據(jù)和等待接收的數(shù)據(jù)(一般以先進(jìn)先出隊列的形式保存)。
從應(yīng)用程序?qū)崿F(xiàn)、套接口實現(xiàn)和協(xié)議實現(xiàn)三個層次來觀察數(shù)據(jù)發(fā)送的過程,數(shù)據(jù)發(fā)送在實施過程中主要涉及到兩個緩沖區(qū):一個是應(yīng)用程序發(fā)送緩沖區(qū),即調(diào)用send()函數(shù)時由用戶申請并填充的緩沖區(qū),這個緩沖區(qū)保存了用戶即將使用協(xié)議棧發(fā)送的TCP 數(shù)據(jù);另一個是TCP 套接口的發(fā)送緩沖區(qū),在這個緩沖區(qū)中保存了TCP 協(xié)議尚未發(fā)送的數(shù)據(jù)和已發(fā)送但未得到確認(rèn)的數(shù)據(jù)。數(shù)據(jù)發(fā)送涉及到兩個層次的寫操作:從應(yīng)用程序發(fā)送緩沖區(qū)拷貝數(shù)據(jù)到TCP 套接口的發(fā)送緩沖區(qū),和從TCP 套接口的發(fā)送緩存將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中。
數(shù)據(jù)接收在實施過程中主要涉及到另外兩個緩沖區(qū),一個是TCP 套接口的接收緩沖區(qū),在這個緩沖區(qū)中保存了TCP 協(xié)議從網(wǎng)絡(luò)中接收到的與該套接口相關(guān)的數(shù)據(jù);另一個是應(yīng)用程序的接收緩沖區(qū),即調(diào)用recv()函數(shù)時由用戶分配的緩沖區(qū),這個緩沖區(qū)用于保存從TCP
,套接口的接收緩存收到并提交給應(yīng)用程序的網(wǎng)絡(luò)數(shù)據(jù)。數(shù)據(jù)接收也涉及到兩個層次的寫操作:從網(wǎng)絡(luò)上接收數(shù)據(jù)保存到TCP 套接口的接收緩沖區(qū),和從TCP 套接口的接收緩沖區(qū)拷貝數(shù)據(jù)到應(yīng)用程序的接收緩沖區(qū)中。
2. 在基于流式套接字的網(wǎng)絡(luò)應(yīng)用程序設(shè)計中,假設(shè)客戶端以8字節(jié)-12字節(jié)-8字節(jié)-12字
節(jié)的順序交替發(fā)送數(shù)據(jù)給服務(wù)器,請思考,服務(wù)器的接收操作每次能夠接收到多少字節(jié)的數(shù)據(jù)?為什么?
解答:服務(wù)器接收操作每次能夠接收到的數(shù)據(jù)長度是不確定的,這是因為TCP 傳送數(shù)據(jù)的形態(tài)是沒有間隔的字節(jié)流,數(shù)據(jù)接收僅與接收調(diào)用的時間和當(dāng)前主機內(nèi)核緩存中尚未提交應(yīng)用程序的數(shù)據(jù)有關(guān),與發(fā)送端發(fā)送多少次和TCP 如何傳送沒有直接的關(guān)系,我們不能準(zhǔn)確地預(yù)測一個特定的接收操作到底返回多少字節(jié)。
3. 思考使用TCP 進(jìn)行數(shù)據(jù)傳輸?shù)膽?yīng)用程序是否一定不會出現(xiàn)數(shù)據(jù)丟失?應(yīng)用程序應(yīng)在哪
些具體操作上考慮可靠性問題?
解答:使用TCP 進(jìn)行數(shù)據(jù)傳輸?shù)膽?yīng)用程序也可能會出現(xiàn)數(shù)據(jù)丟失,這是因為TCP 是一個端到端的協(xié)議,這意味著通信的雙方只關(guān)心自己提供了一個可靠的傳輸機制,“端”是對等方的TCP 協(xié)議實現(xiàn),而不是對等方的應(yīng)用程序。應(yīng)用程序的可靠性需要應(yīng)用程序自己提供。
導(dǎo)致TCP 傳輸出現(xiàn)失敗的現(xiàn)象有:在正常的TCP 連接上,TCP 確認(rèn)的數(shù)據(jù)實際上有可能不會到達(dá)它的目的應(yīng)用程序,服務(wù)器的TCP 實現(xiàn)不確認(rèn)接收到了數(shù)據(jù),如:發(fā)生永久的或暫時的網(wǎng)絡(luò)紊亂,對等方的應(yīng)用程序崩潰,對等方的應(yīng)用程序運行的主機崩潰等。
網(wǎng)絡(luò)程序設(shè)計人員應(yīng)注意到這些失敗模式對TCP 應(yīng)用程序的影響,在數(shù)據(jù)發(fā)送、接收、連接關(guān)閉等操作上,注意函數(shù)調(diào)用時機,關(guān)注函數(shù)調(diào)用結(jié)果,盡可能全面地處理TCP 傳輸中可能遇到的失敗模式。
實驗
1. 使用流式套接字編程設(shè)計一個并發(fā)的回射服務(wù)器,該服務(wù)器具有并發(fā)處理客戶請求的功
能,當(dāng)多個客戶端同時請求服務(wù)器回射時,服務(wù)器能夠同時接收到多個客戶端的請求并相應(yīng)做出回射響應(yīng)。