網絡數據包發送接收全過程

      你們都知道ISO七層協議從下往上依次爲:服務器

物理層--》》數據鏈路層-》》網絡層-》》傳輸層-》》會話層-》》表示層-》》應用層網絡

各層之間是怎樣工做的呢?爲了加深理解,下面以一個具體的數據包來解釋一下。數據結構

發送:socket

  1. 應用程序調用系統調用,將數據發送給socket。tcp

  2. socket檢查數據類型,調用相應的send函數。函數

  3. send函數檢查socket狀態、協議類型,傳給傳輸層。大數據

  4. tcp/udp(傳輸層協議)爲這些數據建立數據結構,加入協議頭部,好比端口號、檢驗和,傳給下層(網絡層)。google

  5. ip(網絡層協議)添加ip頭,好比ip地址、檢驗和,若是數據包大小超過了mtu(最大數據包大小),則分片;ip將這些數據包傳給鏈路層鏈路層寫到網卡隊列,網卡調用響應中斷驅動程序,發送到網絡。spa


接收:orm

  1. 數據包從網絡到達網卡,網卡接收幀,放入網卡buffer,在向系統發送中斷請求。

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

  3. 中斷處理函數從網卡讀入內存,交給鏈路層。

  4. 鏈路層將包放入本身的隊列,置軟中斷標誌位。

  5. 進程調度器看到了標誌位,調度相應進程。

  6. 該進程將包從隊列取出,與相應協議匹配,通常爲ip協議,再將包傳遞給該協議接收函數。

  7. ip層對包進行錯誤檢測,無錯,路由結果,packet被轉發或者繼續向上層傳遞,若是發往本機,進入鏈路層
    鏈路層再進行錯誤偵測,查找相應端口關聯socket,包被放入相應socket接收隊列

  8. socket喚醒擁有該socket的進程,進程從系統調用read中返回,將數據拷貝到本身的buffer,返回用戶態。


以上是一個客戶端發起一個完整的數據包的所有流程,下面說明在底層的DNS轉換和使用的一些主要協議:

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地址。

  6. NAT==>在一個網絡內部,自定義合法的ip地址。內網各主機經過內網通信;與外網經過NAT轉換,變成外網合法ip。這樣,將內網與外網隔離,各個網絡有本身的ip,既能夠重疊,又能夠經過少數幾個ip與外網通信,在ip大量缺少的現代,節省了不少。

相關文章
相關標籤/搜索