深入淺出計(jì)算機(jī)間通信原理
兩臺主機(jī)之間的數(shù)據(jù)傳輸結(jié)束了,那就要關(guān)閉連接.當(dāng)一方主動關(guān)閉連接時(shí),它將會發(fā)送FIN 數(shù)據(jù)包來通告對方.對方接收FIN 數(shù)據(jù)包后就會返回FIN_ACK 數(shù)據(jù)包來確認(rèn).(編者注:凡是已經(jīng)主動發(fā)送過FIN 數(shù)據(jù)包的主機(jī)都不能夠再發(fā)送任何數(shù)據(jù),但可以接收數(shù)據(jù))只有雙方都各自都完成了發(fā)送FIN 數(shù)據(jù)包,那么TCP連接也就關(guān)閉了.這就是TCP 的四次握手過程.
發(fā)送數(shù)據(jù)和這些差不多,有興趣的讀者可以看看<
4.小總結(jié):
數(shù)據(jù)包的結(jié)構(gòu)搞亂了?請看看下圖吧..
圖十四 網(wǎng)絡(luò)數(shù)據(jù)包結(jié)構(gòu)
由于我們在以太網(wǎng)下利用以太網(wǎng)協(xié)議發(fā)送數(shù)據(jù),所以我們的要發(fā)送到目的主機(jī)的數(shù)據(jù)就包含在以太網(wǎng)數(shù)據(jù)包的數(shù)據(jù)里面.對于這個(gè)數(shù)據(jù),實(shí)際上是IP 數(shù)據(jù)包,然而IP 數(shù)據(jù)包里面的數(shù)據(jù)其實(shí)是TCP 數(shù)據(jù)包,TCP 數(shù)據(jù)包里面的數(shù)據(jù)就是我們要發(fā)送的信息.所以讀者們結(jié)合上圖來理解網(wǎng)絡(luò)數(shù)據(jù)包結(jié)構(gòu)(右邊)就容易了..
至于左邊的結(jié)構(gòu)圖的意思是網(wǎng)絡(luò)模型,它代表了哪個(gè)協(xié)議所在哪一個(gè)網(wǎng)絡(luò)模型層的級別.
四 網(wǎng)絡(luò)適配器(網(wǎng)卡)原理:
1.什么是網(wǎng)絡(luò)適配器:
網(wǎng)絡(luò)適配器的意義在于協(xié)助計(jì)算機(jī)處理器來實(shí)現(xiàn)數(shù)據(jù)的傳輸.
下面是實(shí)物圖片,這個(gè)網(wǎng)絡(luò)適配器是臺式計(jì)算機(jī)使用的.
圖十五 網(wǎng)絡(luò)適配器實(shí)物圖
由于現(xiàn)代計(jì)算機(jī)發(fā)展迅速,導(dǎo)致網(wǎng)絡(luò)服務(wù)器數(shù)據(jù)傳輸速度有些時(shí)候并不能滿足日益增長的需求.為此,雙端口網(wǎng)絡(luò)適配器誕生了,也即是說同一個(gè)網(wǎng)絡(luò)適配器可以連接兩條網(wǎng)線.如果讀者想更深入了解請到:http://www.doc88.com/p-374664665354.html(HP CN1000E雙端口聚合網(wǎng)絡(luò)適配器 - 產(chǎn)品簡介)
圖十六雙端口聚合網(wǎng)絡(luò)適配器
*網(wǎng)絡(luò)適配器的普通模式和混雜模式:
一般情況下,我們都使用網(wǎng)絡(luò)適配器的普通模式.所謂普通模式,其實(shí)是讓網(wǎng)絡(luò)適配器只接收發(fā)送到自己的數(shù)據(jù)包.但混雜模式卻與此相反,凡是網(wǎng)絡(luò)適配器接收到數(shù)據(jù)包就傳遞給處理器,無論這個(gè)數(shù)據(jù)包是不是發(fā)送該主機(jī)的.
*關(guān)于網(wǎng)絡(luò)適配器的混雜模式
由于數(shù)據(jù)的傳輸都是按照一定的標(biāo)準(zhǔn)的,那么只要有多臺主機(jī)在同一以太網(wǎng)下,其中一臺主機(jī)就可以利用混雜模式來獲取其它計(jì)算機(jī)發(fā)送/接收的數(shù)據(jù)包.(請回顧下:"圖八 總線型數(shù)據(jù)傳輸鏈路",在總線下傳輸?shù)臄?shù)據(jù)各個(gè)主機(jī)都可以接收到)所以這就是局域網(wǎng)下監(jiān)聽其它計(jì)算機(jī)的原理.同樣地,我們也可以利用此原理去盜取用戶帳號和密碼等敏感信息.但在盜取成功之前還需要一個(gè)前提:數(shù)據(jù)的解密.
五 Windows 驅(qū)動層:
1.WinSock 函數(shù)庫:
WinSock 是Windows 自帶的與網(wǎng)絡(luò)交互的運(yùn)行庫.在此,程序員們利用一些相關(guān)的接口就可以實(shí)現(xiàn)端口綁定,TCP 連接,關(guān)閉,發(fā)送,接收數(shù)據(jù)等功能.請注意,WinSock 只是網(wǎng)絡(luò)接口,更準(zhǔn)確地來講就是DLL 文件(Dynamic Link Library ,動態(tài)鏈接庫.它是用來儲存代碼或者資源數(shù)據(jù)的文件,詳情請看:http://baike.baidu.com/view/887.htm?fromId=4373動態(tài)鏈接庫 - 百度百科).所以WinSock 也只是通過調(diào)用驅(qū)動程序(驅(qū)動程序的用意是讓處理器控制外圍硬件)的方式來編寫接口.接下來,你將會看到從網(wǎng)絡(luò)適配器接收的數(shù)據(jù)需要經(jīng)過多少個(gè)驅(qū)動才可以到達(dá)WinSock.DLL .
2.網(wǎng)絡(luò)適配器遞交數(shù)據(jù)需要經(jīng)過的驅(qū)動:
在看內(nèi)核網(wǎng)絡(luò)驅(qū)動程序結(jié)構(gòu)之前,我們首先要知道:
1.WinSock.DLL 其實(shí)是在TDI(Transport Driver Interface ,傳輸驅(qū)動程序接口.它的用意是把從上往下/從下往上 傳遞的驅(qū)動程序I/O 請求數(shù)據(jù)結(jié)構(gòu)逐級搬運(yùn).在數(shù)據(jù)搬運(yùn)的過程中,中間驅(qū)動程序可以對這些數(shù)據(jù)進(jìn)行過濾)層上的.
2.Protocol Driver ,協(xié)議驅(qū)動程序.每個(gè)協(xié)議驅(qū)動程序都代表著不同的網(wǎng)絡(luò)協(xié)議(編者注:Winpcap 和NDISUIO不是網(wǎng)絡(luò)協(xié)議驅(qū)動程序.前者是Windows網(wǎng)絡(luò)底層抓包驅(qū)動程序.后者是控制NDIS 驅(qū)動程序I/O 的驅(qū)動程序)
3.HAL 是硬件抽象層(詳細(xì)請見:http://baike.baidu.com/view/1166796.htmHAL - 百度百科).當(dāng)驅(qū)動程序的I/O 請求數(shù)據(jù)結(jié)構(gòu)傳輸?shù)酱藭r(shí),接下來就是處理器通過總線來控制外圍硬件.
圖十七 Windows 系統(tǒng)內(nèi)核網(wǎng)絡(luò)驅(qū)動程序結(jié)構(gòu)
在普通程序調(diào)用WinSock.DLL 發(fā)送TCP 連接請求時(shí),WinSock.DLL 會自動填寫好該請求數(shù)據(jù)包的IP 及TCP 數(shù)據(jù)包頭部結(jié)構(gòu).然后向下層驅(qū)動程序傳遞,直到TCP/IP 驅(qū)動程序.TCP/IP 驅(qū)動程序再轉(zhuǎn)發(fā)到NDIS(Network Driver Interface Specification ,網(wǎng)絡(luò)適配器驅(qū)動程序),最后通過HAL 實(shí)現(xiàn)把TCP 連接請求數(shù)據(jù)包從處理器發(fā)送到網(wǎng)絡(luò)適配器.接下來網(wǎng)絡(luò)適配器會通過網(wǎng)線發(fā)送到以太網(wǎng).接收數(shù)據(jù)與此相反,略之.
六 在一次瀏覽www.baidu.com 中系統(tǒng)工作的過程
至此,相信讀者們已經(jīng)對于硬件間數(shù)據(jù)傳輸,網(wǎng)絡(luò)協(xié)議,Windows系統(tǒng)內(nèi)核網(wǎng)絡(luò)驅(qū)動程序結(jié)構(gòu) 都有了一定的了解.那LCatro 就和大家分析下瀏覽百度首頁的過程吧.
假設(shè)我們剛剛把電腦啟動完成,然后立即瀏覽百度首頁.(這樣做的用意是提供一個(gè)DNS 緩存表為空的環(huán)境)
圖十八 使用程序?yàn)g覽百度首頁
在我們輸入www.baidu.com (編者注:www.baidu.com 準(zhǔn)備地來說是網(wǎng)站的域名) 使瀏覽器訪問的時(shí)候,它會先把域名轉(zhuǎn)換到IP 地址(即:解析,用gethostbyname() 函數(shù)實(shí)現(xiàn)) .此時(shí)WinSock 會從本地的DNS (用于解析域名和IP 地址的協(xié)議)緩存表(在本機(jī)里面的一張專門存放域名和對應(yīng)的IP 地址的數(shù)據(jù)塊)中尋找www.baidu.com 的IP 地址.由于主機(jī)是剛剛啟動的,所以DNS 緩存表還是一片空白.WinSock 從DNS 緩存表中找不到對應(yīng)的IP 地址,于是就向DNS 服務(wù)器發(fā)送查詢域名請求(即:DNS 指針查詢).DNS 服務(wù)器接收到該請求后會在本地查詢該域名,假如該DNS 服務(wù)器沒有該域名和對應(yīng)的IP 地址的話,那該DNS 服務(wù)器便會向比它更高級的DNS 服務(wù)器提交查詢,一直到查詢結(jié)果得到為止.成功則返回查詢成功數(shù)據(jù)包,如果還是查詢不到的話DNS 服務(wù)器會返回查詢失敗數(shù)據(jù)包. [該過程為域名轉(zhuǎn)換到IP 過程,用專業(yè)的語言來說就是:域名解析過程]
有了IP 地址,瀏覽器就向它發(fā)送TCP 連接請求,接下來就是三次握手過程.連接成功建立后,瀏覽器會向百度的服務(wù)器發(fā)送獲取http://www.baidu.com/index.html(編者注:www.baidu.com/index.html 的意思是百度首頁的index 索引網(wǎng)頁的.HTML 文件(網(wǎng)頁代碼文件))的源代碼.隨后,百度服務(wù)器返回索引網(wǎng)頁的源代碼,并且主動關(guān)閉TCP 連接.最后瀏覽器便根據(jù)這里面的源代碼逐一顯示在程序的網(wǎng)頁瀏覽控件上.
思考題:請你聯(lián)系該文章所講述到的知識認(rèn)真地想一想系統(tǒng)是怎么樣去一步步實(shí)現(xiàn)的呢?
與主題無關(guān)的相關(guān)知識:
*程序啟動過程:
在我們雙擊程序時(shí),Explorer.exe 會調(diào)用CreateProcess()運(yùn)行該程序.CreateProcess() 立即讀取程序文件(即:.EXE 文件) 的PE (PreInstallationEnvironment,預(yù)安裝環(huán)境.這個(gè)是Windows 特有的程序結(jié)構(gòu),它的用意是告訴Windows 系統(tǒng)在運(yùn)行程序之前需要先做哪些東西.詳細(xì)請見:http://baike.baidu.com/view/3326.htm?fromId=8358Windows PE 結(jié)構(gòu) - 百度百科) 結(jié)構(gòu),Windows 系統(tǒng)會根據(jù).EXE 的需求先做一些相關(guān)的工作,比如:程序需要加載到哪一個(gè)內(nèi)存位置?程序代碼的入口點(diǎn)在哪兒?系統(tǒng)加載完成后,就將這個(gè)程序從硬盤中把程序文件映射到內(nèi)存中 (內(nèi)存映射).接下來CreateProcess() 會給該程序分配堆棧,最后再創(chuàng)建線程來執(zhí)行該程序.假如我們運(yùn)行的是.INK 文件(即:快捷方式),Explorer.exe 會解析.INK 文件,從中獲取到目的程序的運(yùn)行路徑.
*VB 程序運(yùn)行細(xì)節(jié):
由于VB 程序在設(shè)計(jì)窗口界面的時(shí)候完全使開發(fā)者避免怎么樣用代碼把控件一個(gè)個(gè)創(chuàng)建.讀者們可以聯(lián)系下Win32 窗口程序的開發(fā).首先,在WinMain() (即:Win32 應(yīng)用程序入口點(diǎn)) 的時(shí)候程序就開始注冊->創(chuàng)建窗口了.在創(chuàng)建窗口完成后(注意,此時(shí)窗口只是空白的!),Windows 系統(tǒng)會向該窗口發(fā)送WM_PRINT 消息通告窗口開始畫控件.
Q:既然說剛剛創(chuàng)建窗口的時(shí)候是空白的,那為什么我們沒有先看到空白的窗口再看到程序一步步在窗口上面畫控件呢?
A:因?yàn)樘幚砥鲌?zhí)行代碼的速度太快了,所以它在繪畫的過程中只使用了非常短的時(shí)間,以至于人類的眼晴不能接收到這些圖像.
*內(nèi)核處理按鍵過程:
在我們輸入完成網(wǎng)址后按下鍵盤的Enter 鍵,鍵盤會主動向處理器引發(fā)中斷事件.由于計(jì)算機(jī)系統(tǒng)中中斷種類太多,而且對于不同的中斷有不同的處理方法,于是人們把各個(gè)不同的中斷處理程序的入口地址儲存在中斷程序入口表.這是鍵盤所引發(fā)的中斷,那處理器接收到這個(gè)中斷的時(shí)候立即跳出當(dāng)前正在運(yùn)行的程序,轉(zhuǎn)而去運(yùn)行鍵盤中斷程序,當(dāng)鍵盤中斷程序執(zhí)行結(jié)束后,處理會繼續(xù)執(zhí)行原先的暫停運(yùn)行的代碼.
這個(gè)被按下的按鍵在處理器里面是用ASCII 碼來保存的,并且它也會從最底層驅(qū)動一直上傳到應(yīng)用程序.應(yīng)用程序是通過系統(tǒng)發(fā)來的WM_KEYDOWN 消息然后來獲取按下的鍵值的.
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論