1. 程式人生 > >網路資料包傳送接收全過程

網路資料包傳送接收全過程

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,返回使用者態。

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