原文連結: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大量缺乏的現代,節省了很多。