IP协议详解---Linux学习笔记
網絡層概述:
IP服務的特點:
IP協議為上層協議提供無狀態、無連接、不可靠的服務。
無狀態:IP通訊雙方不同步傳輸狀態的信息,因此所有IP數據報發送、傳輸、接收都是相互獨立的,沒有上下文關系。這樣同時也暴露了IP協議的缺點:無法處理亂序和重復的IP數據報
優點:簡單、高效,因為不需要為保持通訊的狀態而分配內核數據結構,也就是說沒有必要為每次傳輸數據都攜帶狀態信息,在網絡協議中無狀態是非常常見的,比如UDP協議和HTTP協議都是無狀態的協議,我們在瀏覽器中連續兩次瀏覽網頁,它們之間是沒有任何聯系的,這兩次請求都會被web服務器獨立處理。
無連接:是指IP通訊雙方都不長久的維持對方的任何信息。這樣上層協議每次發送數據的時候都必須明確指定對方的IP地址。 是面向連接的協議而言的,比如說TCP協議,他能夠自己處理亂序、重復的報文段,提交給上層協議的內容絕對是有序的、正確的。
不可靠:是指IP協議不能保證IP數據報準確的到達接收端,只是盡力而為。在網絡環境中很多情況都會導致IP數據報發送失敗,比如:接收端發現接收到的IP數據報不正確,該IP數據報就會被丟棄,同時返回給上層一個ICMP錯誤消息。但是IP協議并不會試圖重傳錯誤的數據報,因此使用IP協議的上層協議都需要自己實現超時重傳、數據確認等機制,最終來達到可靠傳輸的目的。
IPv4的頭部結構:
4位版本號:指定IP協議的版本,對于IPv4來說它的值為4。
4位頭部長度:標識了該IP頭部有多少個4字節。
8位服務類型:其中包括3位的優先權字段(現在已經基本忽略掉了)、4位的TOS字段、1位保留字段。4位的TOS字段分別表示是最小延時、最大吞吐量、最高可靠性和最小費用。從這里發現IP服務是一種可彈性的服務(這四種服務中可以任選一種服務),應用程序可以根據實際需要來選擇這些服務,比如:應用層的Telnet協議(遠程登錄協議)需要的是最小延時的服務、FTP協議(文件傳輸協議)需要的是最大吞吐量的服務。
16位總長度:指的是整個IP數據包的長度。以字節為單位。
下邊一行的三個字段:表示的是如何實現IP的分片。
16位標識:唯一的標識主機發送的每一個數據報,初始值由系統隨機生成,沒發送一個數據報,它的值就加1。同時該值在數據報分片時被復制到每一個分片中,因此同一個數據報的所有分片都具有相同的標識值。
3位標志:第1位是有保留的、第2位表示禁止分片(如果設置了這1位,IP數據報將不會對數據進行分片,在這種情況下,如果IP數據報的長度超過MTU的話,IP模塊就會丟棄這個數據報,并返回一個ICMP差錯報文)、第3位標識更多分片(除了數據報的最后一個分片外,其他分片都把它設置為1)。
13位片偏移:是分片相對原始IP數據報開始處的偏移
8位生存時間:是數據報到達目的地之前所允許經過的路由器跳數,是被發送端設置的。數據報再轉發工程中沒經過一個路由,該值就會被路由器減1,當值為0時,路由器將丟棄這個數據報,并向原端發送一個ICMP差錯報文,這個數據就可以防止數據陷入路由循環。
8位協議:是用來區分上層協議的,ICMP是1,TCP是6,UDP是17。
16位頭部校驗和:是由發送端填充,接收端對其利用CRC校驗算法來檢驗IP數據報的頭部數據在傳輸過程中是否被損壞。
32位原端IP地址和32位目的端IP地址:用來標識數據報的發送端和接收端,一般情況下這兩個數據在整個IP數據報發送過程中保持不變,無論中間經過多少個中轉路由器。
選項:是可變長的可選信息,最多包含40個字節,可選IP選項包括:
1.記錄路由(告訴數據報途經的所有路由器都將自己的IP地址填入IP頭部的選項部分,這樣就可以跟蹤數據報的傳輸路徑)
2.時間戳(告訴我們一個路由器都將數據報被轉發的時間填入IP頭部的選項部分,這樣就可以測量途經路由之間的數據報的傳輸時間)
3.松散源路由選擇(指定一個路由器IP地址列表,數據報發送過程中必須經過其中所有的路由器)
4.嚴格源路由選擇(和尚一個選項類似,不過數據報只能經過被指定的路由器)
網絡層作用:
IP的分片:
IP數據報的長度超過幀的MTU時,將會被分片傳輸。
分片可能發生在發送端,也可能發生在中轉路由器上。而且可能在傳輸過程中被多次分片,但只有在最終的目標機器上這些分片才會被內核中的IP模塊重新組裝
IP頭部中的三個字段給IP分片和重組提供了足夠的信息:數據報標識、標識和片偏移。
一個IP數據報的每個分片都有自己的IP頭部,它們就有相同的標識值,但具有不同的片偏移,并且除了最后一個分片外,其他的分片都將設置MF標志,同時每個分片IP頭部的總長度字段都會被設置為該分片的長度,我們知道以太網幀的MTU是1500字節,因此它攜帶的IP數據報數據部分最大為1480字節,因為IP頭部占用了20個字節。加入用IP數據報封裝長度為1481字節的ICMP報文,那么數據報在使用以太網幀傳輸過程中就會被分片。如下圖:
上圖中,是長度為1481字節的ICMP報文被分為兩個分片。
第一個IP分片為1500字節,第二個IP分片位21字節。
同時每個IP分片都包含了自己的IP頭部,原始IP數據報中的ICMP頭部內容被完整的復制到了第一個IP分片中。
第二個IP分片不包含ICMP頭部信息,因為IP模塊重組該IP報文的時候,只需要一分ICMP頭部信息就可以了。
實例演示IP分片的過程:
第一個終端:使用ping命令向百度發送數據,并指定每次發送1473字節的數據
這里指定發送1473字節的數據的原因是為了強制IP數據報分片(如上圖中發送的數據量一致)。
第二個終端:使用tcpdump抓取ping命令中交換的icmp數據報
上圖是使用tcpdump命令抓取到的icmp數據報。
紅色方塊中的內容是一條icmp數據報,原因是id都是9730,說明是同一個IP數據報的分片。
“offset 0”、“offset 1480”:這里的0和1480表示的是偏移值為0和1480。實際上很顯然的說明第二個中的1480的偏移值實際上就是第一個IP分片的長度。
“flags[+]”:+設置的是MF標志,以表示后續還有分片。
“flags[none]”:none表示的是這條IP數據報后續沒有分片了。
”length 1500“:表示第一個IP分片的長度是1500個字節。
”length 21“:表示第二個IP分片的長度是21個字節。
IP路由選擇機制:
路由選擇是IP協議的一個核心的任務,它決定了發送數據報到目標機器的途經。
IP路由選擇的過程:
1. 查找完全匹配的主機IP地址(如果找到就使用該路由項,如果沒有找到就進入第二個步驟)
2. 查找路由表中與目標IP地址具有相同網絡ID的網絡IP地址(如果找到就是用這一個路由項,如果沒有找到就進入第三個步驟)
3. 選擇默認路由項(通常這意味這數據包的下一跳路由是網關)
IP轉發
前邊也提到如果不是發送給本機的IP數據報就會被由數據報轉發子模塊來處理,路由器都能執行數據報的轉發過程,而主機一般只發送和接受數據報。
對于允許IP數據報轉發的系統,數據報轉發模塊對數據報執行如下的操作:
實例演示路由表更新的過程:
route #查看當前主機下的路由表信息 route add -host 192.168.1.111 dev eth0 #添加主機(192.168.1.111)對應的路由項 route del -net 192.168.15.0 netmask 255.255.255.0 #刪除網絡(192.168.15.0)對應的路由項上圖中的第一條(defalut ….)是此系統下的默認路由。
ICMP協議詳解
ICMP報文格式:
上圖中的8位的類型和8位的代碼一起決定了IMCP報文的類型。
類型為8,代碼為0時:表示回顯請求
類型為0,代碼為0時:表示回顯應答
類型為11,代碼為0時:表示超時
ICMP報文具體分為查詢報文和差錯報文兩大類。
ICMP查詢報文:
ICMP查詢報文的大小為40個字節。
查詢報文共有4種:
回送請求和應答報文
回送請求報文是由主機或路由器向一個特定的目的主機發送的詢問。收到此報文的機器必須給源主機發送ICMP回應應答報文。這種詢問報文用來測試目標主機是否可達以及了解其他狀態時間戳請求和回答報文
它允許系統向另一個系統查詢當前的時間,該ICMP報文的好處是它提供了毫秒級的的分辨率。而利用其他方法從別的主機獲得的時間只能提供秒級的分辨率。請求端填寫發起時間然后發送報文,應答系統收到請求報文時填寫接收時間戳,再發送應答報文時填寫發送時間戳。- 掩碼地址請求和回答
主機使用ICMP地址掩碼請求報文可以向子網掩碼服務器得到某個接口的地址掩碼,系統廣播它的ICMP請求報文,ICMP報文中的標識符和序列號字段有發送端任意選擇設定,這些值在應答中都會被返回,這樣發送端就可以把應答和請求進行匹配。 - 路由器詢問和通過
主機使用ICMP路由器詢問和通過報文可了解鏈接在本網絡上的路由器是否正常工作。主機將路由器詢問報文進行廣播,收到詢問報文的一個或多個路由器就使用路由器通過報文廣播其路由選擇信息。eg:ping命令
ping命令的實現機制:
在Linux中實現ping命令是把ICMP的標識字段標志成發送進程的ID號,這樣同一臺主機上同時運行多個ping命令時,ping命令也可以識別出返回信息,而且一般序列號是從0開始,沒發送一個新的回響請求就加1,ping程序打印出返回的每一個分組的序列號,這樣就允許我們查看是否有分組丟失、失去或者重復的現象。同時通過在ICMP報文中存放發送請求的時間值來計算往返時間,當應答返回時,用當前時間減去存放在ICMP報文中的時間值,就是兩個主機之間的往返時間值。
ICMP差錯報告報文共有5種:
- 終點不可達
終點不可達分為:網絡不可達、主機不可達、協議不可達、端口不可達以及源路由失敗這六種情況。代碼字段分別為0~5。 - 源站抑制
當路由器或主機由于擁塞而丟棄數據包時,就向源站發送源站抑制報文,是源站知道應當將數據報的發送速度放慢。 - 時間超時
當路由器收到生存時間為0數據報時,除丟棄該數據報外,還要向源站發送時間超時報文。當目的站在預先規定時間之內不能夠接收到一個數據報的全部數據,就將已收到的數據報分片都丟棄,并且向源站發送時間超時報文。 - 參數問題
當路由器目的主機收到的數據報中的首部字段的值不正確時,就丟棄該數據報,同時向源站發送參數問題報文。 - 改變路由(重定向)
路由器將改變路由報文發送給主機,讓主機知道下一次應該將數據包發送給另外的路由器。
重定向報文的詳細信息:
ICMP重定向報文的格式:
ICMP重定向報文的類型值為5。
代碼字段有四個可選項,用來區分不同的重定向類型。1:表示主機重定向。主機重定向的詳細內容:ICMP重定向報文給接收方提供了兩個信息,第一個是引起重定向的IP數據報的原端IP地址,第二個是應該使用的路由器IP地址。那么接收主機根據這兩個信息就可以斷定引起IP重定向的IP數據報應該使用哪個路由器來進行轉發,并且以此來更新路由表。
這里有一個思考問題:如果我們想知道從主機A發送到主機B的數據包在網絡中經過了哪些路由器的時候,我們該怎么辦?
解決方法:
我們知道當IP數據報在路由中出錯時,路由器會向原端發送一個ICMP錯誤報文,發送端從該ICMP報文中可以得到該路由的IP。
我們就可以利用以上的原理,要得到從主機A到主機B之間的所有路由器的IP,我們就必須讓IP數據包在每個路由器中都出錯一次。這里我們知道TTL值在經過每個路由器時都會減1,所以我們可以利用TTL的超時信息,讓TTL的值變為0這種情況在每個路由器中都發生一次,這樣我們就可以得到從主機A到主機B之間的所有的路由的IP。
問題:怎樣判斷數據包正確到達了目標主機B?
解決方法:
我們知道數據包正確到達了目標主機B,就不會發送TTL超時錯誤,而且在目標主機B中沒有相對應的應用程序,因此將沒有程序回應我們發送的數據包,那么我們將如何知道IP數據包正確到達了目標主機呢?
其實我們可以為目標主機分配一個目標主機幾乎不可能監聽的端口,從而當IP數據包到達目標主機后,目標主機會恢復相應的端口不可達的ICMP錯誤信息,從而我們可以確認IP數據包已經到達了目標主機。
總結
以上是生活随笔為你收集整理的IP协议详解---Linux学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FTP客户端的基本使用---Linux学
- 下一篇: TCP/IP协议基本概括+ARP协议详解