你們都知道ISO七層協議從下往上依次爲:服務器
物理層--》》數據鏈路層-》》網絡層-》》傳輸層-》》會話層-》》表示層-》》應用層網絡
各層之間是怎樣工做的呢?爲了加深理解,下面以一個具體的數據包來解釋一下。數據結構
發送:socket
應用程序調用系統調用,將數據發送給socket。tcp
socket檢查數據類型,調用相應的send函數。函數
send函數檢查socket狀態、協議類型,傳給傳輸層。大數據
tcp/udp(傳輸層協議)爲這些數據建立數據結構,加入協議頭部,好比端口號、檢驗和,傳給下層(網絡層)。google
ip(網絡層協議)添加ip頭,好比ip地址、檢驗和,若是數據包大小超過了mtu(最大數據包大小),則分片;ip將這些數據包傳給鏈路層鏈路層寫到網卡隊列,網卡調用響應中斷驅動程序,發送到網絡。spa
接收:orm
數據包從網絡到達網卡,網卡接收幀,放入網卡buffer,在向系統發送中斷請求。
cpu調用相應中斷函數,這些中斷處理程序在網卡驅動中。
中斷處理函數從網卡讀入內存,交給鏈路層。
鏈路層將包放入本身的隊列,置軟中斷標誌位。
進程調度器看到了標誌位,調度相應進程。
該進程將包從隊列取出,與相應協議匹配,通常爲ip協議,再將包傳遞給該協議接收函數。
ip層對包進行錯誤檢測,無錯,路由結果,packet被轉發或者繼續向上層傳遞,若是發往本機,進入鏈路層
鏈路層再進行錯誤偵測,查找相應端口關聯socket,包被放入相應socket接收隊列
socket喚醒擁有該socket的進程,進程從系統調用read中返回,將數據拷貝到本身的buffer,返回用戶態。
以上是一個客戶端發起一個完整的數據包的所有流程,下面說明在底層的DNS轉換和使用的一些主要協議:
DNS請求流程
PC1要訪問www.google.com,須要先知道對應IP地址。
域名只起助記做用,互聯網訪問經過IP進行。
比方,DNS是公民身份信息庫,ip是身份證號,域名是該身份證號對應的人名。
固然,這個比方不是很恰當,域名也必須惟一的,與ip對應。
因而,PC1須要像DNS請求,查找www.google.com對應的ip,即發送dns請求:
PC1查找dns,發現不在同一個網絡,不一樣網段須要網關轉發。
可是,PC1須要先發送給網關,就須要先知道網關ip。
網關用於鏈接不一樣網絡,而且有本身的IP,PC1須要知道網關ip。因而,經過ARP請求,像內網廣播網關ip,網關回復mac地址。
PC1獲得了網關的mac地址,將ip包封裝到以太網幀,發送給網關。
網關收到該以太網幀,須要轉交給dns服務器。一樣,網關可能須要發送ARP請求,獲得dns的mac地址。
dns服務器收到請求,將www.google.com的ip發送給網關,網關再根據NAT會話表項,將目的ip轉換成PC1的,再發送給PC1(此過程可能一樣須要ARP請求)。
PC1收到了目的ip,再能夠經過相似上面的方式發送請求(目的ip再能夠直接填上獲取的ip)。
其中:
ARP==>將ip廣播,目的主機響應,反饋mac地址。
NAT==>在一個網絡內部,自定義合法的ip地址。內網各主機經過內網通信;與外網經過NAT轉換,變成外網合法ip。這樣,將內網與外網隔離,各個網絡有本身的ip,既能夠重疊,又能夠經過少數幾個ip與外網通信,在ip大量缺少的現代,節省了不少。