天天看點

網絡資料包發送接收詳細過程

原文連結:http://blog.csdn.net/hilyoo/article/details/4455031

 Linux的網絡接口分為四部分:網絡裝置接口,網絡接口核心,網絡協定族,網絡接口socket層。

可參考:

http://lxr.linux.no/linux+v2.6.30.4/net/

  網絡裝置接口部分主要負責從實體媒體接收和發送資料,實作的檔案在linu/driver/net目錄下面。

  網絡接口核心部分是整個網絡接口的關鍵部位,它為網絡協定提供統一的發送接口,屏蔽各種各樣的實體媒體,同時有負責把來自下層的包向合适的協定配送。它是網絡接口的中樞部份。它的主要實作檔案在linux/net/core目錄下,其中linux/net/core/dev.c為主要管理檔案。

  網絡協定族部分是各種具體協定實作的部份。Linux支援TCP/IP,IPX,X.25,AppleTalk等的協定,各種具體協定實作的源碼在linux/net/目錄下相應的名稱。在這裡主要讨論TCP/IP(IPv4)協定,實作的源碼在linux/net/ipv4,其中linux/net/ipv4/af_inet.c是主要的管理檔案。

  網絡接口Socket層為使用者提供的網絡服務的程式設計接口,主要的源碼在linux/net/socket.c

發送:

應用程式調用系統調用,将資料發送給socket

socket檢查資料類型,調用相應的send函數

send函數檢查socket狀态、協定類型,傳給傳輸層

tcp/udp(傳輸層協定)為這些資料建立資料結構,加入協定頭部,比如端口号、檢驗和,傳給下層(網絡層)

ip(網絡層協定)添加ip頭,比如ip位址、檢驗和

如果資料包大小超過了mtu(最大資料包大小),則分片;ip将這些資料包傳給鍊路層

鍊路層寫到網卡隊列

網卡調用響應中斷驅動程式,發送到網絡

接收:

資料包從網絡到達網卡,網卡接收幀,放入網卡buffer,在向系統發送中斷請求

cpu調用相應中斷函數,這些中斷處理程式在網卡驅動中

中斷處理函數從網卡讀入記憶體,交給鍊路層

鍊路層将包放入自己的隊列,置軟中斷标志位

程序排程器看到了标志位,排程相應程序

該程序将包從隊列取出,與相應協定比對,一般為ip協定,再将包傳遞給該協定接收函數

ip層對包進行錯誤檢測,無錯,路由

路由結果,packet被轉發或者繼續向上層傳遞

如果發往本機,進傳入連結路層

鍊路層再進行錯誤偵測,查找相應端口關聯socket,包被放入相應socket接收隊列

socket喚醒擁有該socket的程序,程序從系統調用read中傳回,将資料拷貝到自己的buffer,傳回使用者态。

DNS請求流程

1、PC1要通路www.google.com,需要先知道對應IP位址。

域名隻起助記作用,網際網路通路通過IP進行。

比方,DNS是公民身份資訊庫,ip是身份證号,域名是該身份證号對應的人名。

當然,這個比方不是很恰當,域名也必須唯一的,與ip對應。

2、于是,PC1需要像DNS請求,查找www.google.com對應的ip,即發送dns請求:

PC1查找dns,發現不在同一個網絡,不同網段需要網關轉發。

但是,PC1需要先發送給網關,就需要先知道網關ip。

網關用于連接配接不同網絡,并且有自己的IP,PC1需要知道網關ip。于是,通過ARP請求,像内網廣播網關ip,網關回複mac位址。

PC1得到了網關的mac位址,将ip包封裝到以太網幀,發送給網關。

3、網關收到該以太網幀,需要轉交給dns伺服器。

同樣,網關可能需要發送ARP請求,得到dns的mac位址。

4、dns伺服器收到請求,将www.google.com的ip發送給網關,網關再根據NAT會話表項,将目的ip轉換成PC1的,再發送給PC1(此過程可能同樣需要ARP請求)。

5、PC1收到了目的ip,再可以通過類似上面的方式發送請求(目的ip再可以直接填上擷取的ip)。

其中:

ARP==>将ip廣播,目的主機響應,回報mac位址。

NAT==>在一個網絡内部,自定義合法的ip位址。内網各主機通過内網通訊;與外網通過NAT轉換,變成外網合法ip。這樣,将内網與外網隔離,各個網絡有自己的ip,既可以重疊,又可以通過少數幾個ip與外網通訊,在ip大量缺乏的現代,節省了很多。

繼續閱讀