服務器編程入門(1)TCP/IP協議族

問題聚焦:
簡單地梳理一下TCP/IP各層的功能和常用協議
詳細瞭解ARP(數據鏈路層)和DNS(應用層)協議的工作原理

1 TCP/IP協議族體系結構

數據鏈路層:
    職責:實現網卡接口的網絡驅動程序,一處理數據在物理媒介(如以太網、令牌環等)上的傳輸。
    常用協議:ARP協議(地址解析協議),RARP協議(逆地址解析協議)——實現了IP地址和機器物理地址之間的相互轉換。
    尋址:使用物理地址(MAC地址)尋址一臺機器。因此網絡層必須先將目標機器的IP地址轉化成其物理地址,才能使用數據鏈路層提供的服務。
網絡層:
    職責:數據包的選路和轉發。選路:確定兩臺主機之間的通信路徑,對上層協議隱藏了網絡拓撲的細節。
    協議:IP協議(因特網協議)——根據數據包的目的IP地址來決定如何投遞它,使用逐跳的方式確定通信路徑。
               ICMP協議(因特網控制報文協議)——IP協議的補充,用於檢測網絡連接。報文格式如下:
               
               報文類型:差錯報文,用於迴應網絡錯誤(如目標不可到達和重定向);查詢報文,查詢網絡信息(如ping程序使用CIMP報文查看目標是否可到達)
               校驗:循環冗餘校驗碼
               注意:ICMP並非嚴格意義上的網絡層協議,因爲它使用處於同一層的IP協議提供服務,而一般來說應該是上層協議使用下層協議提供的服務。
傳輸層:
    職責:爲兩臺主機上的一個應用程序提供端到端的通信,只關心通信的起始端和目的端,爲應用程序封裝了一條端到端的邏輯通信鏈路,它負責數據的收發,鏈路的超時重連等。
    協議:
  •     TCP協議(傳輸控制協議):爲應用層提供可靠的,面向鏈接和基於流的服務。使用超時重傳,數據確認方式確保可靠的連接。沒有邊界限制。
  •     UDP協議(用戶數據報協議):不可靠,無連接和基於數據報的服務。數據報有一個長度作爲讀寫的最小單位。
  •     SCTP協議(流控制傳輸協議):相對較新的傳輸層協議,爲了在因特網上傳輸電話信號而設計的。
應用層:
    職責:處理應用程序的邏輯。下面三層負責處理網絡通信細節,在內核空間中實現,穩定又高效。應用層則在用戶空間實現,因爲它負責處理衆多邏輯。
    協議:telnet協議(遠程登陸協議),OSPF(開放最短路徑優先協議),DNS(域名服務協議)
    

2 封裝
目的:讓上層協議可以使用下層協議提供的服務
實現:應用程序數據在發送到物理網絡上之前,將沿着協議棧從上往下一次傳遞,每層協議都將在上層數據的基礎上加上子集的頭部信息,以實現該層的功能。這個過程就叫做封裝。如下圖所示:
        

TCP報文由TCP頭部信息和TCP內核緩衝區數據構成。當要向TCP連接寫入發送數據時,內核中的TCP模塊首先把這些數據複製到與該連接對應的TCP內核發送緩衝區中,然後TCP模塊調用IP模塊提供的服務,傳遞的參數包括TCP頭部信息和TCP發送緩衝區中的數據,TCP報文段。
需要注意的一點是,TCP是發送數據後,依然在緩衝區中保存有副本,但是UDP發送完之後,直接丟棄緩衝區中的數據。
經過數據鏈路層封裝的數據稱爲幀,不同的傳輸媒介有不同的類型的幀。幀的最大傳輸單元MTU,即指最多能攜帶多少上層協議數據,通常以太網的MTU是1500字節。幀纔是最終在物理網絡上傳送的字節序列。


3 分用
分用:當幀達到目的主機時,將沿着協議棧自底向上依次傳遞,各層協議依次處理幀中本層負責的頭部數據,以獲取所需的信息,並最終將處理後的幀交給目標應用程序。這個過程成爲分用。

類型:如果類型字段的值爲0x800,則幀的數據部分爲IP數據包;如果類型字段的值爲0x806,則幀的數據部分爲ARP請求或應答報文。
ICMP,TCP,UDP使用IP協議,IP數據包頭部使用16位的協議字段區分它們
TCP報文段和UDP數據包則通過其頭部的16位端口號字段來區分上層應用程序
在頂層目標服務來看,封裝和分用似乎並沒有發生過。


4 測試網絡
測試環境設定:



5 ARP協議工作原理
工作內容:實現任意網絡層地址到任意物理地址的轉換
工作原理:主機向子集所在的網絡廣播一個ARP請求,該請求包含目標機器的網絡地址,此網絡上的其他機器都會收到這個請求,但只有被請求的目標機器會迴應一個ARP應答,其中包含自己的物理地址。
報文詳解:長度分佈:221126464
        
        28字節:ARP請求/應答報文的長度;
        28+18字節:一個攜帶ARP請求/應帶報文的以太網幀長度爲46字節
        46+18字節:有的實現要求以太網幀數據部分長度至少爲46(所以這裏的46和上面的48+18=46沒什麼關係),在這種情況下,一個攜帶ARP請求/應答報文的以太網幀長度爲64字節。

查看和修改命令:
        
        第一項描述另一臺測試機器Kongming20
        第二項描述的是路由器
        刪除和添加ARP緩存項命令爲:
        
 數據包範例分析:
    下面的兩個包是用tcpdump抓取的遠程登陸一個機器過程中,在tcp連接簡歷之前,查詢MAC地址的兩個ARP數據包(形式上是以太網幀)。
    
第一個數據包:
  • 源物理地址:00:16:d3:5c:b9:e3
  • 目的物理地址:ff::ff::ff::ff::ff::ff,以太網廣播地址,用以表示整個LAN,該LAN上的所有機器都會收到並處理這樣的幀
  • 類型字段:0x806,表示分用的目標是ARP模塊
  • 以太網幀:42字節,實際是46字節,tcpdump未統計以太網幀尾部的4字節CRC字段,其中數據部分長度28字節
  • Request:表示這是一個ARP請求
  • 查詢:who-has 192.168.1.109 tell 192.168.1.108 表示查詢ip地址爲192.168.1.109的機器的物理地址
第二個數據包的內容類似,只是ARP類型不同,改爲了應答(Reply)

圖解通信過程:

注意:ARP請求和應答應該是從以太網驅動程序發出的,而並非直接從ARP模塊發出,所以用虛線表示;路由器也將接收到以太網幀1,因爲該幀是一個廣播幀。


6 DNS工作原理
工作內容:一套分佈式的域名服務系統,處理域名和IP地址的映射
報文詳解:
         
        16位標識字段:標記一對DNS查詢和應答,以此查區分一個DNS應答i哪個DNS查詢的迴應。
        16位標誌:用於協商具體的通信方式和反饋通信狀態
        接下來的4個字段:對查詢而言,一般查詢問題個數爲1,其他三個爲0;應答報文應答資源記錄數至少爲1,授權資源記錄數和額外資源記錄數可爲0或非0
        查詢問題格式:(具體不再細說,很容易查到各個字段的含義)
        
        應答,授權和額外信息格式(都使用資源記錄格式):
        
Linux下訪問DNS服務
    要訪問DNS服務,必須先知道DNS服務器的IP地址,存放地址:/etc/resolv.conf,內容如下:
    



7 socket和TCP/IP協議族的關係
數據鏈路層、網絡層、傳輸層協議是在內核中實現的,因此操作系統需要實現一組系統調用,使得應用程序能夠訪問這些協議提供的服務。socket就是實現這組系統調用的API。
socket有兩個功能:
  • 將應用程序從用戶緩衝區中複製到TCP/UDP內核發送緩衝區,以交付內核來發送數據。如,從內核TCP/UDP接收緩衝區中複製數據到用戶緩衝區,以讀取數據;
  • 應用程序可以通過它們來修改內核中各層協議的某些頭部信息或其他數據結構,從而精細地控制底層通信的行爲。

參考資料:《Linux高性能服務器編程》


發佈了95 篇原創文章 · 獲贊 45 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章