网络数据包发送接收全过程
2019獨角獸企業重金招聘Python工程師標準>>>
? ? ? 大家都知道ISO七層協議從下往上依次為:
物理層--》》數據鏈路層-》》網絡層-》》傳輸層-》》會話層-》》表示層-》》應用層
各層之間是怎樣工作的呢?為了加深理解,下面以一個具體的數據包來解釋一下。
發送:
應用程序調用系統調用,將數據發送給socket。
socket檢查數據類型,調用相應的send函數。
send函數檢查socket狀態、協議類型,傳給傳輸層。
tcp/udp(傳輸層協議)為這些數據創建數據結構,加入協議頭部,比如端口號、檢驗和,傳給下層(網絡層)。
ip(網絡層協議)添加ip頭,比如ip地址、檢驗和,如果數據包大小超過了mtu(最大數據包大小),則分片;ip將這些數據包傳給鏈路層鏈路層寫到網卡隊列,網卡調用響應中斷驅動程序,發送到網絡。
接收:
數據包從網絡到達網卡,網卡接收幀,放入網卡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大量缺乏的現代,節省了很多。
轉載于:https://my.oschina.net/u/143244/blog/304306
總結
以上是生活随笔為你收集整理的网络数据包发送接收全过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业运维之域控篇(九)--辅助域强制占用
- 下一篇: 利用sendmail搭建邮件服务器