天天看點

Linux 高性能伺服器程式設計——TCP/IP協定族

1 TCP/IP協定族體系結構

Linux 高性能伺服器程式設計——TCP/IP協定族

資料鍊路層:

    職責:實作網卡接口的網絡驅動程式,一處理資料在實體媒介(如以太網、令牌環等)上的傳輸。

    常用協定:ARP協定(位址解析協定),RARP協定(逆位址解析協定)——實作了IP位址和機器實體位址之間的互相轉換。

    尋址:使用實體位址(MAC位址)尋址一台機器。是以網絡層必須先将目标機器的IP位址轉化成其實體位址,才能使用資料鍊路層提供的服務。

網絡層:

    職責:資料包的選路和轉發。選路:确定兩台主機之間的通信路徑,對上層協定隐藏了網絡拓撲的細節。

    協定:IP協定(網際網路協定)——根據資料包的目的IP位址來決定如何投遞它,使用逐跳的方式确定通信路徑。

               ICMP協定(網際網路控制封包協定)——IP協定的補充,用于檢測網絡連接配接。封包格式如下:

Linux 高性能伺服器程式設計——TCP/IP協定族

               8位封包類型:(1) 差錯封包,用于回應網絡錯誤(如目标不可到達和重定向);(2) 查詢封包,查詢網絡資訊(如ping程式使用CIMP封包檢視目标是否可到達)

               校驗:循環備援校驗碼

               注意:ICMP并非嚴格意義上的網絡層協定,因為它使用處于同一層的IP協定提供服務,而一般來說應該是上層協定使用下層協定提供的服務。

傳輸層:

    職責:為兩台主機上的一個應用程式提供端到端的通信,隻關心通信的起始端和目的端,為應用程式封裝了一條端到端的邏輯通信鍊路,它負責資料的收發,鍊路的逾時重連等。

    協定:

  •     TCP協定(傳輸控制協定):為應用層提供可靠的,面向連結和基于流的服務。使用逾時重傳,資料确認方式確定可靠的連接配接。沒有邊界限制。
  •     UDP協定(使用者資料報協定):不可靠,無連接配接和基于資料報的服務。資料報有一個長度作為讀寫的最小機關。
  •     SCTP協定(流控制傳輸協定):相對較新的傳輸層協定,為了在網際網路上傳輸電話信号而設計的。

應用層:

    職責:處理應用程式的邏輯。下面三層負責處理網絡通信細節,在核心空間中實作,穩定又高效。應用層則在使用者空間實作,因為它負責處理衆多邏輯。

    協定:telnet協定(遠端登陸協定),OSPF(開放最短路徑優先協定),DNS(域名服務協定)

2 封裝

目的:讓上層協定可以使用下層協定提供的服務。

實作:應用程式資料在發送到實體網絡上之前,将沿着協定棧從上往下一次傳遞,每層協定都将在上層資料的基礎上加上子集的頭部資訊,以實作該層的功能。這個過程就叫做封裝。如下圖所示:

Linux 高性能伺服器程式設計——TCP/IP協定族

經過TCP封裝後的資料稱為TCP封包段,或者簡稱TCP段。

  •  TCP封包由TCP頭部資訊和TCP核心緩沖區資料構成。當要向TCP連接配接寫入發送資料時,核心中的TCP子產品首先把這些資料複制到與該連接配接對應的TCP核心發送緩沖區中,然後TCP子產品調用IP子產品提供的服務,傳遞的參數包括TCP頭部資訊和TCP發送緩沖區中的資料,即TCP封包段。

經過UDP封裝後的資料稱為UDP資料報。

  • 需要注意的一點是,TCP是發送資料後,依然在緩沖區中儲存有副本,但是UDP發送完之後,直接丢棄緩沖區中的資料。

經過IP封裝後的資料稱為IP資料報。

  •  IP資料報也包括頭部資訊和資料部分,其中資料部分就是一個TCP封包段、UDP資料報或者ICMP封包。

經過資料鍊路層封裝後的資料稱為幀。

  • 傳輸媒介不同,幀的類型也不同。比如:以太網上傳輸的是以太網幀,而令牌環網絡上傳輸的則是令牌環幀。

幀的最大傳輸單元MTU,即指最多能攜帶多少上層協定資料,通常以太網幀的MTU是1500位元組。幀才是最終在實體網絡上傳送的位元組序列。

3 分用

分用:當幀達到目的主機時,将沿着協定棧自底向上依次傳遞,各層協定依次處理幀中本層負責的頭部資料,以擷取所需的資訊,并最終将處理後的幀交給目标應用程式。這個過程成為分用。

Linux 高性能伺服器程式設計——TCP/IP協定族

類型:如果類型字段的值為0x800,則幀的資料部分為IP資料包;如果類型字段的值為0x806,則幀的資料部分為ARP請求或應答封包。

  • 因為ICMP、TCP、UDP都使用IP協定,是以IP資料標頭部使用16位的協定字段區分它們。
  • TCP封包段和UDP資料包則通過其頭部的16位端口号字段來區分上層應用程式。

在頂層目标服務來看,封裝和分用似乎并沒有發生過。

4 測試網絡

測試環境設定:

5 ARP協定工作原理

工作内容:實作任意網絡層位址到任意實體位址的轉換

工作原理:主機向子集所在的網絡廣播一個ARP請求,該請求包含目标機器的網絡位址,此網絡上的其他機器都會收到這個請求,但隻有被請求的目标機器會回應一個ARP應答,其中包含自己的實體位址。

封包詳解:長度分布:221126464

Linux 高性能伺服器程式設計——TCP/IP協定族

        28位元組:ARP請求/應答封包的長度;

        28+18位元組:一個攜帶ARP請求/應帶封包的以太網幀長度為46位元組

        46+18位元組:有的實作要求以太網幀資料部分長度至少為46(是以這裡的46和上面的48+18=46沒什麼關系),在這種情況下,一個攜帶ARP請求/應答封包的以太網幀長度為64位元組。

檢視和修改指令:

Linux 高性能伺服器程式設計——TCP/IP協定族

        第一項描述另一台測試機器Kongming20

        第二項描述的是路由器

        删除和添加ARP緩存項指令為:

Linux 高性能伺服器程式設計——TCP/IP協定族

 資料包範例分析:

    下面的兩個包是用tcpdump抓取的遠端登陸一個機器過程中,在tcp連接配接履歷之前,查詢MAC位址的兩個ARP資料包(形式上是以太網幀)。

Linux 高性能伺服器程式設計——TCP/IP協定族

第一個資料包:

  • 源實體位址: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位址的映射

封包詳解:

Linux 高性能伺服器程式設計——TCP/IP協定族

        16位辨別字段:标記一對DNS查詢和應答,以此查區分一個DNS應答i哪個DNS查詢的回應。

        16位标志:用于協商具體的通信方式和回報通信狀态

        接下來的4個字段:對查詢而言,一般查詢問題個數為1,其他三個為0;應答封包應答資源記錄數至少為1,授權資源記錄數和額外資源記錄數可為0或非0

        查詢問題格式:(具體不再細說,很容易查到各個字段的含義)

Linux 高性能伺服器程式設計——TCP/IP協定族

        應答,授權和額外資訊格式(都使用資源記錄格式):

Linux 高性能伺服器程式設計——TCP/IP協定族

Linux下通路DNS服務

    要通路DNS服務,必須先知道DNS伺服器的IP位址,存放位址:/etc/resolv.conf,内容如下:

Linux 高性能伺服器程式設計——TCP/IP協定族

7 socket和TCP/IP協定族的關系

資料鍊路層、網絡層、傳輸層協定是在核心中實作的,是以作業系統需要實作一組系統調用,使得應用程式能夠通路這些協定提供的服務。socket就是實作這組系統調用的API。

socket有兩個功能:

  • 将應用程式從使用者緩沖區中複制到TCP/UDP核心發送緩沖區,以傳遞核心來發送資料。如,從核心TCP/UDP接收緩沖區中複制資料到使用者緩沖區,以讀取資料;
  • 應用程式可以通過它們來修改核心中各層協定的某些頭部資訊或其他資料結構,進而精細地控制底層通信的行為。
上一篇: 堆排序

繼續閱讀