深入淺出計算機間通信原理
兩臺主機之間的數據傳輸結束了,那就要關閉連接.當一方主動關閉連接時,它將會發送FIN 數據包來通告對方.對方接收FIN 數據包后就會返回FIN_ACK 數據包來確認.(編者注:凡是已經主動發送過FIN 數據包的主機都不能夠再發送任何數據,但可以接收數據)只有雙方都各自都完成了發送FIN 數據包,那么TCP連接也就關閉了.這就是TCP 的四次握手過程.
發送數據和這些差不多,有興趣的讀者可以看看<
4.小總結:
數據包的結構搞亂了?請看看下圖吧..

圖十四 網絡數據包結構
由于我們在以太網下利用以太網協議發送數據,所以我們的要發送到目的主機的數據就包含在以太網數據包的數據里面.對于這個數據,實際上是IP 數據包,然而IP 數據包里面的數據其實是TCP 數據包,TCP 數據包里面的數據就是我們要發送的信息.所以讀者們結合上圖來理解網絡數據包結構(右邊)就容易了..
至于左邊的結構圖的意思是網絡模型,它代表了哪個協議所在哪一個網絡模型層的級別.
四 網絡適配器(網卡)原理:
1.什么是網絡適配器:
網絡適配器的意義在于協助計算機處理器來實現數據的傳輸.
下面是實物圖片,這個網絡適配器是臺式計算機使用的.

圖十五 網絡適配器實物圖
由于現代計算機發展迅速,導致網絡服務器數據傳輸速度有些時候并不能滿足日益增長的需求.為此,雙端口網絡適配器誕生了,也即是說同一個網絡適配器可以連接兩條網線.如果讀者想更深入了解請到:http://www.doc88.com/p-374664665354.html(HP CN1000E雙端口聚合網絡適配器 - 產品簡介)

圖十六雙端口聚合網絡適配器
*網絡適配器的普通模式和混雜模式:
一般情況下,我們都使用網絡適配器的普通模式.所謂普通模式,其實是讓網絡適配器只接收發送到自己的數據包.但混雜模式卻與此相反,凡是網絡適配器接收到數據包就傳遞給處理器,無論這個數據包是不是發送該主機的.
*關于網絡適配器的混雜模式
由于數據的傳輸都是按照一定的標準的,那么只要有多臺主機在同一以太網下,其中一臺主機就可以利用混雜模式來獲取其它計算機發送/接收的數據包.(請回顧下:"圖八 總線型數據傳輸鏈路",在總線下傳輸的數據各個主機都可以接收到)所以這就是局域網下監聽其它計算機的原理.同樣地,我們也可以利用此原理去盜取用戶帳號和密碼等敏感信息.但在盜取成功之前還需要一個前提:數據的解密.
五 Windows 驅動層:
1.WinSock 函數庫:
WinSock 是Windows 自帶的與網絡交互的運行庫.在此,程序員們利用一些相關的接口就可以實現端口綁定,TCP 連接,關閉,發送,接收數據等功能.請注意,WinSock 只是網絡接口,更準確地來講就是DLL 文件(Dynamic Link Library ,動態鏈接庫.它是用來儲存代碼或者資源數據的文件,詳情請看:http://baike.baidu.com/view/887.htm?fromId=4373動態鏈接庫 - 百度百科).所以WinSock 也只是通過調用驅動程序(驅動程序的用意是讓處理器控制外圍硬件)的方式來編寫接口.接下來,你將會看到從網絡適配器接收的數據需要經過多少個驅動才可以到達WinSock.DLL .
2.網絡適配器遞交數據需要經過的驅動:
在看內核網絡驅動程序結構之前,我們首先要知道:
1.WinSock.DLL 其實是在TDI(Transport Driver Interface ,傳輸驅動程序接口.它的用意是把從上往下/從下往上 傳遞的驅動程序I/O 請求數據結構逐級搬運.在數據搬運的過程中,中間驅動程序可以對這些數據進行過濾)層上的.
2.Protocol Driver ,協議驅動程序.每個協議驅動程序都代表著不同的網絡協議(編者注:Winpcap 和NDISUIO不是網絡協議驅動程序.前者是Windows網絡底層抓包驅動程序.后者是控制NDIS 驅動程序I/O 的驅動程序)
3.HAL 是硬件抽象層(詳細請見:http://baike.baidu.com/view/1166796.htmHAL - 百度百科).當驅動程序的I/O 請求數據結構傳輸到此時,接下來就是處理器通過總線來控制外圍硬件.

圖十七 Windows 系統內核網絡驅動程序結構
在普通程序調用WinSock.DLL 發送TCP 連接請求時,WinSock.DLL 會自動填寫好該請求數據包的IP 及TCP 數據包頭部結構.然后向下層驅動程序傳遞,直到TCP/IP 驅動程序.TCP/IP 驅動程序再轉發到NDIS(Network Driver Interface Specification ,網絡適配器驅動程序),最后通過HAL 實現把TCP 連接請求數據包從處理器發送到網絡適配器.接下來網絡適配器會通過網線發送到以太網.接收數據與此相反,略之.
六 在一次瀏覽www.baidu.com 中系統工作的過程
至此,相信讀者們已經對于硬件間數據傳輸,網絡協議,Windows系統內核網絡驅動程序結構 都有了一定的了解.那LCatro 就和大家分析下瀏覽百度首頁的過程吧.
假設我們剛剛把電腦啟動完成,然后立即瀏覽百度首頁.(這樣做的用意是提供一個DNS 緩存表為空的環境)

圖十八 使用程序瀏覽百度首頁
在我們輸入www.baidu.com (編者注:www.baidu.com 準備地來說是網站的域名) 使瀏覽器訪問的時候,它會先把域名轉換到IP 地址(即:解析,用gethostbyname() 函數實現) .此時WinSock 會從本地的DNS (用于解析域名和IP 地址的協議)緩存表(在本機里面的一張專門存放域名和對應的IP 地址的數據塊)中尋找www.baidu.com 的IP 地址.由于主機是剛剛啟動的,所以DNS 緩存表還是一片空白.WinSock 從DNS 緩存表中找不到對應的IP 地址,于是就向DNS 服務器發送查詢域名請求(即:DNS 指針查詢).DNS 服務器接收到該請求后會在本地查詢該域名,假如該DNS 服務器沒有該域名和對應的IP 地址的話,那該DNS 服務器便會向比它更高級的DNS 服務器提交查詢,一直到查詢結果得到為止.成功則返回查詢成功數據包,如果還是查詢不到的話DNS 服務器會返回查詢失敗數據包. [該過程為域名轉換到IP 過程,用專業的語言來說就是:域名解析過程]
有了IP 地址,瀏覽器就向它發送TCP 連接請求,接下來就是三次握手過程.連接成功建立后,瀏覽器會向百度的服務器發送獲取http://www.baidu.com/index.html(編者注:www.baidu.com/index.html 的意思是百度首頁的index 索引網頁的.HTML 文件(網頁代碼文件))的源代碼.隨后,百度服務器返回索引網頁的源代碼,并且主動關閉TCP 連接.最后瀏覽器便根據這里面的源代碼逐一顯示在程序的網頁瀏覽控件上.
思考題:請你聯系該文章所講述到的知識認真地想一想系統是怎么樣去一步步實現的呢?
與主題無關的相關知識:
*程序啟動過程:
在我們雙擊程序時,Explorer.exe 會調用CreateProcess()運行該程序.CreateProcess() 立即讀取程序文件(即:.EXE 文件) 的PE (PreInstallationEnvironment,預安裝環境.這個是Windows 特有的程序結構,它的用意是告訴Windows 系統在運行程序之前需要先做哪些東西.詳細請見:http://baike.baidu.com/view/3326.htm?fromId=8358Windows PE 結構 - 百度百科) 結構,Windows 系統會根據.EXE 的需求先做一些相關的工作,比如:程序需要加載到哪一個內存位置?程序代碼的入口點在哪兒?系統加載完成后,就將這個程序從硬盤中把程序文件映射到內存中 (內存映射).接下來CreateProcess() 會給該程序分配堆棧,最后再創建線程來執行該程序.假如我們運行的是.INK 文件(即:快捷方式),Explorer.exe 會解析.INK 文件,從中獲取到目的程序的運行路徑.
*VB 程序運行細節:
由于VB 程序在設計窗口界面的時候完全使開發者避免怎么樣用代碼把控件一個個創建.讀者們可以聯系下Win32 窗口程序的開發.首先,在WinMain() (即:Win32 應用程序入口點) 的時候程序就開始注冊->創建窗口了.在創建窗口完成后(注意,此時窗口只是空白的!),Windows 系統會向該窗口發送WM_PRINT 消息通告窗口開始畫控件.
Q:既然說剛剛創建窗口的時候是空白的,那為什么我們沒有先看到空白的窗口再看到程序一步步在窗口上面畫控件呢?
A:因為處理器執行代碼的速度太快了,所以它在繪畫的過程中只使用了非常短的時間,以至于人類的眼晴不能接收到這些圖像.
*內核處理按鍵過程:
在我們輸入完成網址后按下鍵盤的Enter 鍵,鍵盤會主動向處理器引發中斷事件.由于計算機系統中中斷種類太多,而且對于不同的中斷有不同的處理方法,于是人們把各個不同的中斷處理程序的入口地址儲存在中斷程序入口表.這是鍵盤所引發的中斷,那處理器接收到這個中斷的時候立即跳出當前正在運行的程序,轉而去運行鍵盤中斷程序,當鍵盤中斷程序執行結束后,處理會繼續執行原先的暫停運行的代碼.
這個被按下的按鍵在處理器里面是用ASCII 碼來保存的,并且它也會從最底層驅動一直上傳到應用程序.應用程序是通過系統發來的WM_KEYDOWN 消息然后來獲取按下的鍵值的.


評論