操作系統網絡__網絡基礎(2)


    這裏要說的東西,還是建立在上一篇的TCP/IP四層模型之上的,主要討論分析協議棧的各個層包頭結構,瞭解TCP/IP數據包頭的組織形式。首先看一張圖,


wKiom1i8GInAQ43_AAHx1ijzafc003.png

    這張圖反應的是數據的整個接收的流程,接下來我們就從下向上,一次說明每個包頭結構。


以太幀頭

wKioL1i8GZSi3CMsAADoN-gdKSI757.png

     這裏的目標地址和源地址都指的的MAC地址,也就是網卡的硬件地址,都是佔6個字節,48位,通常用12個十六進制數表示,如 08:00:20:0A:8C:6D, 這個在網卡出廠是已經固化,具體內容之後會提到。

     幀類型有三種,IP、ARP、RARP。如圖所示,以太幀數據長度範圍爲46~1500字節,其中1500字節叫做以太網的最大傳輸單元MTU,不同網絡類型的MTU值不同。ARP和RARP的數據包長度不足46字節,因此在數據段後面補充18字節作爲填充;當數據包的長度大於MTU時,需要對數據包進行分片,也就是我們常說的IP分片 ,這個操作在網際互聯層(IP層)實現。

     幀末尾是CRC校驗碼,在數據鏈路層廣泛使用了循環冗餘校驗(CRC),關於CRC具體實現,我們暫且不談。我們需要知道的是在數據鏈路層若僅僅使用CRC差錯檢測計數,只能做到對幀的無差錯接收,但我們並沒有要求數據鏈路層向網路層提供“可靠傳輸”的服務。

     兩個字節的類型,就是上層協議的類型,用來判斷交給上層那種協議。


ARP數據報格式

     在網絡通信的過程中,通常源主機都是知道目的主機的IP地址和端口號,來進行通信的。但我們又知道,當在一個局域網內的時候,只有MAC地址才能唯一標識找到某個主機,(MAC地址是硬件物理地址,在網卡設備出廠時就已經寫死 )在同一局域網內的兩臺主機,如果知道MAC地址,可以直接通信。我們發送的數據包,首先都是要被網卡設備接受之後,如果MAC地址匹配,才能向上層傳遞,處理上層協議,但如果MAC地址不符,該數據包將直接被丟棄,因此,在通信之前,我們必須獲得目的主機的MAC地址。ARP協議 就是起這個作用的。

     ARP協議又叫做地址解析協議,是在局域網內的一種協議,可以通過IP地址查詢到MAC地址。首先看ARP數據報格式:


wKiom1i8GgCx5a5BAABALtVWWjk493.png

這個是在上面以太幀的基礎之上的,紅色表示該段的數據大小,單位是字節。


首先對各個段做簡單解釋:

     以太網目的地址和以太網源地址都指的是MAC地址,均爲6字節,各48位;

     幀類型:由於這裏是ARP協議,幀類型爲0806(以太幀頭中有說明)

     硬件類型:鏈路層網絡類型,即硬件接口類型,1表示以太網

     協議類型:高層協議類型,即要轉換的地址類型,0x0800爲IP地址

     硬件地址長度 和 協議地址長度:分別用一個字節來表徵物理地址和Ip地址的長度,以太網的地址長度爲6字節,IPv4的地址長度爲4字節,IPv6的地址長度爲6字節。實現了ARP報文可以在多種硬件和不同網絡協議之間進行傳遞。

     op:1表示ARP請求, 2表示ARP應答。

     由於ARP數據報長度不足46,因此會補充一定的位,ARP數據報是定長28位的,因此不需要單獨設置標誌位指明ARP有效位數。

     ARP協議是工作在網絡接口層的,是一種管理協議,上層無從知曉。

舉個栗子

     現在有兩臺主機,主機A,和主機B,主機A的IP地址爲IP1, MAC地址爲M1;主機B的IP地址爲IP2,MAC地址爲M2。現在主機A想向主機B發送信息,但只知道B主機的IP地址和端口號,已知主機A已經通過路由器找到B主機所在的局域網,接下來通過ARP獲取B主機的MAC地址,實現通信。

     有一點我們需要注意的是,ARP在MAC幀的上層,在ARP的數據包中,沒有保存的上層信息,因此,ARP不需要繼續向上層傳遞任何信,也就是說ARP的整個過程不會被用戶看到,是由操作系統完成的。

 通信過程:

     1、首先主機A發起ARP請求,相對於的ARP數據報格式爲

     FF FF FF FF FF FF   M1  08 06  00 01  08 00  06  04  00 01  M1  IP1  00 00 00 00 00 00  IP2

     首先,由於不知道該數據報要發送給哪個主機,因此採用的是廣播的方式,也就是一開始的以太網目的地址爲 FF FF FF FF FF FF;M1表示主機A的物理地址;0806表示該數據包樹ARP數據報;00 01表示以太網,08 00 表示採用IP協議(IPv4);06 ,04表示的是MAC地址和IP地址長度;00 01表示該ARP數據報是請求信號;之後地址這裏不解釋。

     2、由於主機A是以廣播的形式將該數據報發出,因此,該局域網內的所有主機都可以收到該數據報,接收到數據報之後,由網絡接口層對對以太幀頭進行分析,發現該數據報是一條廣播信息,可能是發給任何一臺主機的,又因爲該幀類型爲0806,表示這是一個ARP數據報,因此網絡接口層解包之後,直接將有效載荷傳遞給上一層ARP,交由ARP來處理該數據報。

     3、ARP發現該數據報的op位是1,表明這是一個請求,(關於類型檢測這裏不關注)然後去後面找該ARP請求的目的IP地址,如果和自己的IP地址不同,則直接將該數據報丟棄;如果相同,ARP會生成一條新的ARP數據作爲應答,並傳遞給下一層封裝,之後完整的ARP數據報爲

     M1  M2  08 06  00 01  08 00  06  04  00 02  M2   IP2   M1  IP1

   和請求的ARP數據報類似,我們需要關心的是,這時op變爲了00 02,表明該數據報是一個應答信號;在以太幀頭部,已經將主機B的MAC地址和主機A的AMC地址封裝,可以直接和主機A進行通信(當然這裏的直接通信並不是局域網內的其他主機不會收到該消息,而是其他主機會由於一開始的目的MAC地址不同,而直接過濾掉該數據報);在該數據報末,封裝了主機A和主機B的MAC地址及IP,這些信息是提供給主機A的。

     4、主機A接收到該數據報之後,進過網絡接口層進行解包,將有效載荷傳遞給上層ARP來處理,主機A僅僅將該數據報做一般的ARP數據報處理,發現op位爲00 02,得到該ARP數據報爲應答信號,在數據報末得到自己的IP,表明這是一條給自己的應答信號,從而和之間發出的ARP請求對應,獲得了主機B的MAC地址,之後就可以直接和主機B進程通信。

     上面詳細說了關於ARP請求如何實現IP地址到AMC地址的轉化,可以發現,ARP是向整個局域網請求。

     同時還要提到的另外一種協議叫做RARP,是用來實現MAC地址到網絡地址的轉化,這個過程相比ARP就顯得更加容易,因爲已經獲得了MAC地址,在局域網內已經可以實現相互通信,這裏不在贅述。

     總而言之,ARP是通過IP發送請求的一種機制,從而間接獲取MAC地址的一種方式。

如果源主機和目的主機不在同一網段,ARP請求無法穿過路由器,源主機如何和目的主機通信?

     答:源主機和目的主機不在同一網段內,說明這裏需要用到路由器,但源主機的ARP請求不能穿過路由器,做法如下:主機A首先將本局域網內的路由器R1的IP地址轉化爲硬件地址M3,以便將IP數據報傳送到路由器R1;之後R1從轉發表找到下一跳的路由器R2,同時使用ARP解析出R2的硬件地址M4;於是IP數據報就按照硬件地址從M3轉發到了路由器R2;R2在轉發IP數據段時,採用類似辦法解析出目的主機的MAC地址M2,是IP數據最終交付給主機B。


IP數據報格式(IPv4)

wKioL1i8GrrzsoGIAABLs-bk4Rw290.png


各字段含義:

     版       本:佔4位。要求通信雙方的版本必須一致,現在以IPv4爲主,IPv4該字段值爲4;

     首部長度:佔4位 。在上圖可以發現,每行32位(4字節),即寬度爲4字節,IP包頭的長度最小爲20字節,因此,首部長度最小爲5。4字節可以表示的最大值爲15,因此IP包頭最大長度爲60字節;

     服務類型:佔8位。一般不使用,只有在區分服務時,該字段才起作用;

     總  長 度:固定20字節+選項+數據的總長度,共16位,因此IP數據報的最大長度爲(2^16-1 )字節

     標      識:佔16位。是IP在存儲器中維護的一個計數器,每產生一個數據報,計數器加1 ,該值並不標識序號。當數據報長度超過MTU時,必須進程IP分片,被分片的所有數據報的標識字段都被賦予了該計數器值,也就是說,該字段相同的數據報,是同一數據報分片得到的,這將是最後重組的依據。

     標      識:佔3位。第一位MF = 1,表示後面沒有後面還有分片的數據報片,MF= 0,表示當前數據報片是分片之後的最後一個;第二位DF = 1,不允許分片,DF= 0,允許分片;第三位沒有意義;

     片  偏 移:佔13位。用來確定被分片的數據片的相對位置,方式片段重組的時候發生混亂;

     生存時間:TTL,佔8位。表徵數據報的壽命,防止無法交付數據報,導致互聯網上存在過多的沒有宿主的遊離態數據報,這裏的生存時間並不是以時間爲單位,而是以經過路由器的跳數,經過一個路由器,TTL值減一,減到0時,生命結束,數據報被丟棄;

     協      議:佔8位。標誌數據報攜帶的數據是何種協議,TCP、UDP、ICMP、IGMP;

     校  驗 和:只校驗數據報首部,不包括數據部分。因爲每經過一個路由器,都需要校驗一次,數據校驗交給更高層協議負責,可以減少工作量。

     整個IP數據報的實現,是採用了位段的方式實現的,

     IPv4由於有可選項存在,因此我們說IPv4在每次傳遞數據的過程中都需要預先進行判斷,IPv6使用的是定傳包頭,這就導致了IPv4 比IPv6的傳輸速度慢。



IP地址與路由


 IP地址的特點:

     1、每一個IP地址都是由網絡號和主機號兩部分組成。IP地址是一種分等級的地址結構,網絡號由ISP分配,而主機號由得到該網絡號的分組自行分配;

     2、IP地址是標誌一個主機(或路由器)和一條鏈路的接口。一個路由器至少應當有兩個不同的IP地址,路由器每一個接口都有一個不同網絡號的IP地址;

     3、一個網絡是指具有相同網絡號的主機的集合,具有不同網絡號的局域網必須使用路由器進行互聯;

     4、在IP地址中,所有分配到網絡號的網絡都是平等的。

    IPv4的IP地址長度爲4字節,採用點分十進制表示法,形如 192.168.0.1 的格式。

     

IP地址可分爲A~E五類:

A類0+7位網絡號+24位主機號0.0.0.0~126.255.255.255
B類10+14位網絡號+16位主機號128.0.0.0~191.255.255.255
C類110+21位網絡號+8位主機號192.0.0.0~223.255.255.255
D類1110+28位224.0.0.0~239.255.255.255多播地址
E類11110+27位240.0.0.0~247.255.255.255保留未使用

127.*網段之後127.0.0.0一個IP地址可用,代表當前主機。

     最早的劃分方式,造成了對P資源的很大浪費,大量的組織申請B類網絡地址,導致B類很快黑申請完,但A類地址被大量浪費。同時對於B類網絡,一個網絡中有大量主機,路由器壓力相當大, 爲解決這些問題,提出了新的劃分方案CIDR(子網劃分)。

     CIDR的劃分方式是建立在子網掩碼的基礎之上的,與之前的ABC類無關,網絡號和主機號的劃分需要用一個額外的子網掩碼來表示,而不能IP地址本身決定。

     使用子網掩碼的方式,對於網絡的擴展是十分方便的。

網絡地址 = IP地址 & 子網掩碼

廣播地址 = 將子網掩碼中0對應的網絡地址全部換成1 (可以簡單理解爲最大的網絡地址)

網絡地址在整個網絡上是唯一的,主機號爲0,表示網絡地址,主機號爲全F,表示廣播地址


舉個栗子

IP地址172.16.1.200
子網掩碼255.255.0.0
網絡號176.16.0.0
子網範圍172.16.0.0 ~ 172.16.255.255
廣播地址176.16.255.255


一些特殊的IP

    如果一個組織內部建立局域網,IP地址只用於局域網內部的通信,不直接連接到Internet上。網絡IP在整個網絡上是唯一的,私有IP是不會出現在公網上的,也就是說,在每個局域網內可能都有一個私有IP是192.168.0.111,但這個IP僅在當前局域網內可見,我們可以使用局域網代理的方式,實現多個相同的私有IP共同存在。

     這些依靠nat技術(網絡地址轉換)/代理服務器實現。

     RFC規定了用於組建局域網的私有IP地址,不會出現在Internet上,有如下:

          10.*                                                                                                                                 

          172.16.*~172.31.*                                                                                                          

          192.168.*                                                                                                                        

這些地址用來當做局域網IP,沒有主機是直接通過這些ip訪問外網的。

    除了上述私有ip外,還有其他特殊的ip地址,如下:

     127.*的IP地址用來本地環回(loop back)測試,通常是127.0.0.1。本地環回測試,數據不會發送到網絡上,而是自己發送自己接收,通過環回設備再發回給上層協議和應用程序,貫穿協議棧,用於本地測試。

wKiom1i8G8Xjw8CjAAU0yQHOee8424.png

     數據報從網絡上抓取到之後,在內存中也會針對該報文創建一系列的數據結構來維護它,一個典型的數據結構叫做sp_buf,定義了一個緩衝區,將所有的數據放到緩衝區中。

     本地環回通常用來進行應用方面的測試!(整個環回過程,除了應用層之外,都是由內核完成的)



路由(route)

     路由是網路信息從信源到信宿的路徑,指路由器從一個接口上收到數據包,根據數據報的目的地址進行定向並轉發到另一個接口的過程。

     路由和橋接相比:橋接是發生在數據鏈路層的,而路由是發生在網絡層的,這就註定了二者在傳遞信息的過程中使用的是不同的信息。

     路由的前提條件是路由表已經建立好,路由表生成算法最終目的是讓我的路由查找是趨向於收斂的。

     路由其實就是查找路由表的過程,路由工作包含兩個基本的動作:

     1、確定最佳路徑(複雜)

     2、通過網絡傳遞信息(相對簡單)


路由重點名詞

    路由結點

     一個具有路由能力的主句或路由器,它維護一張路由表,通過查詢路由表來決定向那個接口發送數據包;

    接口:

     路由結點與某個網絡相連的網卡接口,一個路由器至少有兩個接口;

    路由表

     由很多路由條目組成,每個條目都指明去往某個網絡的數據報應該經過那個接口發送,最後一條是缺省路由條目;

route     # 查看當前主機的路由表

    路由條目

     路由表中的一行,每個條目主要由網絡地址、子網掩碼、下一條地址、發哦少年宮接口四部分組成,如果要發送的數據包的目的網絡地址匹配路由表中的某一行,就按規定的節酷發送到下一跳地址;

    缺省路由條目

     指明信息包的目的地不在路由列表中時的路由。子網掩碼爲0.0.0.0,

當一個數據報發送給路由器之後,路由器可能的三種回覆方式:

    1、知道怎麼走(數據報在哪個網絡)

    2、知道誰知道(其他路由器知道該數據包應該在哪個網路 )

    3、就在這個網絡(該數據報就在我當前網絡)

[muhui@MiWiFi-R1CL-srv ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.31.0    *               255.255.255.0   U     1      0        0 eth0
192.168.56.0    *               255.255.255.0   U     1      0        0 eth1
127.0.0.0       *               255.0.0.0       U     1      0        0 lo
default         192.168.31.1    0.0.0.0         UG    0      0        0 eth0

  Destination:目的網絡地址(和當前路由器直接相連的目標網絡)

     Gateway:下一跳地址

     Genmask:子網掩碼(當前Iface接口對應的子網掩碼)

     Flags:U(表示此條目有效,可以禁用某些標誌);G(此條目下一跳地址爲某路由器,沒有G選項則表明下一跳不是路由器,不需要再經過路由器轉發)

     Use Iface:接口

路由器是如何路由的?

     假設要發送的數據包目的IP爲IP1,IP1的首先跟第一行的子網掩碼做與運算,判斷運算結果是否等於目的網絡地址;

     如果相同,表明該數據包就在該網絡中,則將該數據包從該條目對應的端口發出,不再經過路由器;如果不同,則繼續跟第二行的子網掩碼做與運算,直到倒數第二行也不匹配;

     如果數據包的IP地址所在網絡與之前的都不匹配,則發送到缺省路由條目對應的端口號,由下一個路由表決定下一跳的地址。

注意:

     1、我們使用個人PC機調用route命令時,除了默認條目,這裏僅僅只有一條路由條目,這是因爲我們的筆記本也相當於一個路由器,但是僅僅只有一個端口,但對於路由器而言,至少有 兩個端口。

     2、上面列出的四條路由列表中,第一條是當前路由器所在網絡對應的條目,屬於情況3;第2、3條屬於數據報的網絡地址可以在當前的路由列表中查詢到,也就是和當前路由器相連,屬於情況2;最後一條路由器知道自己不知道,但是缺省路由條目應該知道,屬於情況1。

     3、理論上應該還存在這樣一種路由條目信息,該條目並不屬於缺省路由條目,但是Flags也爲UG,表明,當前路由器知道該IP數據報在這個路由器中可以查到網絡位置。

     站在應用層的上面,IP層是沒有網路差異的,這些工作完全是由下層解決的,因此IP協議是整個互聯網的基礎,實現了不同的網絡直接使用一套協議就可以全方位地工作,是一整套的虛擬化技術。通過軟件方式,屏蔽物理差異。

     任何邏輯和任何差異都可以通過一層軟件來實現,這就是虛擬化技術。




傳輸層協議

     TCP、UDP 通過端口號判斷將有效載荷交給上層哪個進程或作業。(這裏沒有再標誌需要交給哪個協議,因爲傳輸層上層是應用層,應用層協議過多)

     端口是用來表示主機上的唯一進程的。

     不管是UDP還是TCP,將來都是在IP數據報中包裹着的,這些信息在路由過程中不會發生任何變化。

     IP+ 端口:socket,標識互聯網上的唯一進程

常見端口號

     FTP:文件傳輸協議。20->數據傳遞端口;21->命令傳輸端口;

     SSH:安全shell協議。端口號22;

     telnet:遠程登錄協議。端口號23;

     DNS:域名系統。端口號53;

     http:超文本傳輸協議。端口號80;

     https:安全的http協議。端口號443;【瞭解ssl】

     SMTP:簡單郵件傳輸協議。25->發郵件端口號 ;

     POP3:郵局協議。110->收郵件端口號;

     mysql:數據庫。端口號3306 ;

/etc/services     # 列出了所有的well-known的服務端口和對應的傳輸層協議。


UDP


wKiom1i8HJPT3RQoAABOIQ9MaxI157.png   首部長度定長,因此這裏不需要單獨的字節表明首部長度多少位以供分離包頭使用。


TCP

     MAC幀負責在局域網內,將數據從A主機傳到B主機;IP層負責數據報並不安全地從A主機的IP層傳到B主機的的IP層。

     IP層在路由過程中不保證數據傳輸的可靠性,數據包的丟失,數據包的重傳等問題都需要傳輸層處理。IP層負責的是通過路由找到,而傳輸層是負責找到後如果出現問題,該如何處理。

wKiom1i8HLrCY9WvAABLGd4IELU544.png

     源端口和目的端口:這裏不再解釋;

     序列號和確認序列號:保證信息傳輸的可靠性。如果發送端一次性發送了大量數據,接收端只會將最新的一次的確認號返回,表示該數據包之前的所有數據都已經收到;<接收端返回的TCP包頭中的確認序號與發送端發送的TCP包頭中的序號一致>

          IP層的16位標識等信息是用來保證數據分片並重新組合的,對於傳輸層而言,根本不知道分片的整個過程。也就是說,在傳輸層看來,數據一直是完整的,不論是打包交給IP層的時候,還是IP解包之後上傳回來。

          可靠性機制:如果沒有得到響應,就無法知道信息是否被收到,只要收到響應,就可以確定信息被收到;可以通過序號確認是否發生丟包。

          網絡上不存在百分百的可靠性。

     首部長度:和IP包頭一樣,TCP包頭最小20字節;

     如果一次發送多個TCP數據報,會應答最新的數據報序號,表明該序號之前的所有TCP數據報均正確到達。

序號:

      數據丟失,重發;阻塞導致

窗口大小:

     少量丟包時,重傳是十分有效的一種方式;大量丟包,可能是由於網絡環境的問題,乳溝一直重傳,會惡化網絡環境。

    擁塞避免:大面積丟包問題,叫做網絡擁塞。最好的辦法是等待,等待網絡環境改善;慢啓動,快重傳算法實現。

     流量控制:《窗口大小》發送數據過大,但接收方緩存區太小,或發送數據太快,導致大面積丟包,可能使發送方認爲此時網絡環境差,從而使用擁塞避免算法。爲了避免這種情況的產生, 引入了窗口大小的概念。這裏的窗口大小就是上面提到的接收方緩衝區的大小。有了窗口大小的概念,就可以實時報告自己的接收能力,控制發送數據的節奏。


 TCP的可靠性保證有如下幾點:

          超時重傳,請求應答,流量控制,擁塞避免。

    TCP的面向鏈接是提供可靠性的一種前提。TCP內部維護了四種計時器,《TCP/IP羊皮卷》


TCP中的六位標誌位:

    URG:0(16位緊急指針無效),1(緊急指針被觸發,緊急數據不用在接收隊列中排隊);

    ACK:確認序號,大多數情況被設置爲1;

 PSH:爲1時,將緩衝區中排好序的數據直接交付給上層,而不用等待緩衝區寫滿再交付

 RET:1(鏈接恢復 ,斷開並重新連接),還可以用來拒絕非法報文段或拒絕打開鏈接;

 SYN:鏈接建立的時候被置爲1,以後始終被置0,即鏈接請求;【sync】

 FIN:finish,在鏈接斷開時被設置爲1,以後 始終被設置爲0;


------muhuizz整理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章