電動及電動輔助自行車 新北10/12起禁行人車共用人行道

新北市交通局指出,自10月12日起電動自行車和電動輔助自行車禁行設有人車共道標誌的人行道,違者將依道路交通管理處罰條例可處以新臺幣300元以上、600元以下罰款。交通安全科技正林祥煙說,依照道路交通安全規則,電動自行車和電動輔助自FB行銷行車及腳踏自行車均屬於銷售文案慢車,除設有行人及自行車共道標誌(以下簡稱人車共道標誌)外,不得行駛於人行道。

林祥煙表示,近年日益風行以電動自行車和電動輔助自行車作為代步交通工具,考量到電動自行車和電動輔助自行車最台北網頁設計高時速可達25公里,比起行人和腳踏自行車的速度快很多,如果在有限的人行空間同時容許如何寫文案較高速的交通工具,將會嚴重影響行人安全。

新北市因此決定公告自10月12日起,設有人租車車共道標誌的人行道,一律禁行電動台北網頁設計和電動輔助自行車,警察局iphone維修亦將配合加強勸導和執法取締。交網頁設計公司通局提醒,違規者貨運將依道路交通管理處網頁設計罰條例第73條第1項第2款規定,處新臺幣300元以上、600元以下罰款。

交通局也提醒電動自行車騎士,依現行法規規定騎乘電動自行車須配戴安全帽,且不得附載網頁設計坐人,更不得擅自改裝,並應騎乘包裝行銷於慢車道或靠右路側,遵守相關交通法規,維護自己和他人安全。

出席桃園眷村文化節 林右昌期許北北基桃共榮共好

已邁入第20屆的桃園眷村文化節,今年首度跨出桃園,與基隆市、台北市、新北市攜手串連,基隆市長林右昌6日與桃園市長鄭文燦、台北市長柯文哲及新北市長侯友宜一同出席活動記者會,期許4個城市攜手合作共榮共好。

林市長在啟動記者會中指出,不管大家是從大江南北來台北網頁設計到台灣,都是台灣的一分子,也是台灣生命共同體的一部分,眷村文化也是大家記憶中重要的一環,基隆市租車是一個港口城市,很多人都是在基隆港下船,對台灣的第一印象都是基隆,也因此基隆有很多眷村,加上基隆過去是要塞城市,有很多海軍跟陸軍的駐軍。

林右昌強調,這次北北基包裝行銷桃4個城市的市長一起參與眷村文化節,代表大家對於iphone維修眷村文化的重視,也是台灣人民向前行的重要力量,未來不管北北基如何寫文案桃都會繼續FB行銷把這個活動擴大辦理下去,大台北都會就是1千萬人口的生活圈,有非常多的跨域治理工作可以一起努力。

林右昌也不忘藉這個機會宣傳台北網頁設計即將在基隆舉辦的國慶晚會,他說今年的國慶口罩代表多元的聲音,設計來源是網頁設計公司聲波跳動,不同的顏色跟跳動的圖紋,代表台灣人民包容合作的精神,桃園市長鄭文燦舉辦這個活動把大家拉在一起,在此時此刻的台灣特別有意義,希望讓4個城市共好共榮。

桃園市文化局表示,桃園眷村文化銷售文案節今年邁入第20屆,是首次與台北市眷遊記(10/9-10/25)、新北市眷村貨運文化節(10/1-10/3)、基隆市攜手串連網頁設計,舉辦「集合啦!眷村守護軍團」線上集章活動,透過線上集章,邀請全國民眾一同到北北基桃眷村文化園區旅遊,見證眷村文化的保存成果

Gogoro進軍巴黎,拓展歐洲共享服務版圖

結合智慧能源與智慧交通的新創科技領導品牌睿能創意股份有限公司Gogoro 於18 日宣布將與策略夥伴德國博世集團(BOSCH)子公司Coup 拓展電動機車共享服務的全球版圖,預計在今夏進駐巴黎,首輪將於巴黎街頭部署600 台智慧雙輪。Coup 於2016 年8 月即與Gogoro 合作,於柏林推出200 台電動機車共享服務,於今年3 月並擴充服務車隊,陸續引進1,000 台智慧雙輪。

Gogoro 創辦人暨執行長陸學森表示:「Gogoro 和Coup 的合作專注於創新科技與永續交通之經營,希望鼓勵消費者利用Gogoro 智慧雙輪做為都會通勤的最佳選擇。Coup 電動機車共享服務在柏林推出後獲得熱烈迴響,我們非常期待今年夏天將此商業模式引進巴黎時,也能成功帶動巴黎電動機車共享服務的熱潮。」

巴黎是歐洲交通最壅塞的城市之一,都會通勤族一直飽受交通問題所擾。巴黎同時也是全球機車最多的城市之一,在繁忙的市區空間,6 秒鐘即時更換電池自然成為Coup 在巴黎推廣電動機車共享服務的最佳解決方案。陸學森接續指出:「Gogoro 是一家結合創新與永續能源的科技公司,我們專注於創造全新商業模式、產品與服務,希望能點燃都會居民與政府的熱情,一起擁抱永續能源以及航向未來的新燃料。」

「柏林的電動機車共享計畫自2016 年8 月推出以來佳評如潮。騎著時尚的Gogoro 智慧雙輪快速且輕鬆靈活地穿梭於城市之中,成功地在柏林引領一股電動機車的通勤熱潮。柏林的成功經驗也使得我們更有信心將這個永續的都會通勤共享服務介紹到其他歐洲城市,因此我們決定將在今年夏天,於巴黎推出這項服務。Gogoro 與Coup 合作至今,持續以領先的科技不斷改善Coup 創新的共享服務,提高使用者操作的便利性,我們相信巴黎市民一定會愛上這項方便的服務以及整體的使用者經驗。」

Coup Mobility GmbH 執行長Mat Schubert 表示。Coup 服務將先於巴黎市中心的指定區域推出,顧客可將智慧雙輪停放在Coup 服務範圍內的指定停車區。任何達法定年齡並持有小型車駕駛執照(Class B)或國際駕照者,均可使用Coup 服務。顧客可輕鬆透過Coup 應用程式找到並預約離自己最近的智慧雙輪,該應用程式將在7 月於法國開放使用,有iOS 和Android 兩種版本,巴黎的定價模型將比照柏林,採取簡單而且便於使用者計算的方式,以30 分鐘為基本單位進型計價。

(合作媒體:。圖片出處:Gogoro)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

和通用競爭,Ford推首全電動車CUV

目前福特所販售的電動車皆為「合規車(compliance cars)」,也就是各大車廠為了符合美國州政府零排放規定而以一般汽車為基底改造而成的電動車。近日,福特技術長Raj Nair 表示他們將於2020 年推出首款全電動車,這款電動車將進行量產且定價相對低廉。

福特進入電動車市場的時間點明顯晚於其主要競爭對手—通用汽車。通用汽車已推出價格優惠又續航力充足的Chevy Bolt 電動車,而福特將「以量取勝」。Nair 在Business Insider 的訪問中強調,「這將是一款大眾化的電動車,我們必須同時達成高續航力與價格實惠的目標,否則這只會是一款瞄準小眾市場的奢侈品。」

這款交叉型(CUV)全電動車將於2020 年推出,Nair 保證福特的全電動車將以充電一次行駛超過480 公里的續航力以及交叉型車款的多功能特性來取得市場青睞。在交叉型與小型SUV 車款方面,Tesla 將於2019 至2020 年間推出Model Y。

除了這款全電動車之外,福特也承認他們正計畫推出其他類似的車款,但多半為油電混合車。這款電動車將於福特Flat Rock 工廠進行生產,並在2020 年於北美、歐洲與亞洲推出。

(合作媒體:。圖片出處:Ford Europe)

 

首圖來源:Ford Europe)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

江申中國廠獲Tesla訂單,營收增新動能

裕隆集團汽車零組件廠江申雖因國內景氣不佳,大型商用車、巴士需求平緩,致營收缺乏動能,但在中國大陸轉投資廠接單風光下,公司去年繳出稅後淨利大增2成的好成績,EPS 7.21元則改寫歷史新高紀錄;而今年第1季,雖然營收、獲利大致持平,但江申總經理麥少保表示,福州福享、廣州NTN和襄陽NTN今年均接單暢旺,尤其,廣州NTN還正式出貨美國電動車大廠特斯拉(Tesla) Model 3的轉動軸訂單,襄陽NTN也開始交瀋陽華晨寶馬,而福享也接到寧德能源的電動車電池盒訂單,將成為挹注今年業外成長的動能。

江申為裕隆集團旗下汽車零組件廠商,是台灣最大的大貨車架、巴士車架、以及小貨車車架、木床的供應商,公司18日參加集團法說會,由總經理麥少保說明今年度業績展望,其中,廣州NTN接獲特斯拉訂單成為法說會中的焦點。

由於江申營收僅反映台灣廠業績,但台灣廠的獲利佔比卻不及1成,逾9成的獲利主要來自轉投資大陸廠的收益,包括廣州NTN、襄陽NTN、福州福享、廈門金龍江申等;其中,光廣州NTN的獲利佔比在第1季達75%,是主要獲利重心,因此,法人在觀察江申展望時,多聚焦大陸廠接單情形。

江申第1季營收2.62億元、年增1.55%,毛利率9.48%、年減0.86個百分點,營業淨利98萬元、年減76.27%,業外淨利則為1.29億元、年增0.78%,稅前盈餘1.3億元、年減1.52%,稅後淨利1.33億元、年增1.53%,EPS 1.82元,優於去年同期的1.79元。

從江申的財報觀察,江申台灣廠第1季幾乎損平,獲利遭匯兌侵蝕;而廣州NTN貢獻9790萬元,年增23.89%;襄陽NTN貢獻2103萬元,年增36.74%;福享貢獻1452萬元,年減47.03%;廈門金龍江申則虧損428萬元,較去年同期的淨利230萬由盈轉虧。

麥少保說明,第1季來台的陸客減少,導致大巴士需求下滑,但江申營收有持平表現,是因為大客戶國瑞新導入日本Hino的底盤公車,並接獲新店客戶、桃園、新竹客運等訂單,對江申來說形成營收支撐;今年營收將平穩。

至於大陸轉投資部份,福州福享今年首季獲利衰退,主因去年有馬瑞利的模具收入,拉高獲利基期,若扣除該一次性收入來看,福享的本業獲利實際是成長的。

麥少保進一步表示,福州福享受惠於東南汽車推出SUV車的策略符合市場需求,DX7、DX3熱賣,接單明顯成長;再加上該廠也接福建奔馳訂單,在該品牌推出VS20廂型車款後賣得不錯,也成為今年動能。

值得留意的是,福州福享新接獲香港投資的電動車鋰電池大廠寧德新能源的電池盒訂單,麥少保預估,該業務將成為福享未來營運很重要的一環。該客戶訂單今年第1季佔比是5%,全年預估會佔5~10%。

最受關注的廣州NTN,麥少保則說,該廠的產能已達到40萬支/月的高峰,接單也不錯,主因東風日產的天籟、奇駿、SANTRA都賣得不錯,並持續有日產外銷訂單,雖然該廠有北京瑞韓現代訂單下滑影響,但由於外銷接單成長,因此該廠仍能維持成長。

他也首度證實,廣州NTN今年開始出貨Tesla Model 3傳動軸零件訂單,目前1個月訂單約為2萬個,並透露,只要是外銷訂單通常獲利都不錯。

而成長最大的襄陽NTN,則是因應廣州NTN產能不足而設,目前產能15萬支/月,年底目標18萬支/月。麥少保表示,4月起該廠正式交貨瀋陽華晨寶馬(BMW),同時也交廣州NTN交貨不足的天籟、奇駿車款,業績隨著擴產而有較大的動能。

不過,受到電動車騙補事件影響,廈門金龍今年首季繳出虧損成績單,麥少保也直言,大陸電動車很多人做,但今年普遍業績不好,今年該廠的業績將較去年差。

法人則預期,江申今年台灣廠營收將與過去2年相當,動能不強,但轉投資中國大陸在廣州NTN有訂單加入,襄陽NTN也因擴產、接單擴量,再加上福州福享有東南汽車DX7、DX3熱賣,可望使營運逐季增溫,下半年更優於上半年。

法人估,江申台灣營收將持穩,但大陸獲利成長下,全年獲利有機會較去年成長1成,EPS則有機會向8元扣關,再次創下史上最佳紀錄。

(本文內容由授權使用。圖片出處:Tesla)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

WireShark——IP協議包分析(Ping分析IP協議包)

   互聯網協議 IP 是 Internet Protocol 的縮寫,中文縮寫為“網協”。IP 協議是位於 OSI 模型中第三層的協議,其主要目的就是使得網絡間能夠互聯通信。前面介紹了 ARP 協議, 該協議用在第二層處理單一網絡中的通信。與其類似,第三層則負責跨網絡通信的地址。在 這層上工作的不止一個協議,但是最普遍的就是互聯網協議(IP)

1. IP協議介紹

   互聯網協議地址(Internet Protocol Address,又譯為網際協議地址),縮寫為 IP 地址(IP Address)。在上一章介紹了 ARP 協議,通過分析包可以發現它是依靠 MAC 地址發送數據 的。但是,這樣做有一個重大的缺點。當 ARP 以廣播方式發送數據包時,需要確保所有設 備都要接收到該數據包。這樣,不僅傳輸效率低,而且局限在發送者所在的子網絡。也就是 說,如果兩台計算機不在同一個子網絡,廣播是傳不過去的。這種設計是合理的,否則互聯 網上每一台計算機都會受到所有包,將會導致網絡受到危害。 互聯網是無數子網共同組成的一個巨型網絡。

 

   圖中就是一個簡單的互聯網環境,這裏列出了兩個子網絡。如果想要所有電腦都在同 一個子網絡內,這幾乎是不可能的。所以,需要找一種方法來區分那些 MAC 地址屬於同一 個子網絡,那些不是。如果是同一個子網絡,就採用廣播方式發送。否則就採用路由發 送。這也是在 OSI 七層模型中網絡層產生的原因。

   它的作用就是引進一套新的地址,使得用戶能夠區分不同的計算機是否屬於同一個子網 絡。這套地址就叫做網絡地址,簡稱網址。但是,人們一般叫做是 IP 地址。這樣 每台計算機就有了兩種地址,一種是是 MAC 地址,另一種是網絡地址(IP 地址)。但是, 這兩種地址之間沒有任何聯繫,MAC 地址是綁定在網卡上的,網絡地址是管理員分配的, 它們只是隨機組合在一起。

2. IP地址

   IP 地址是 IP 協議提供的一種統一的地址格式。它為互聯網上的每一個網絡和每一台主 機分配一個邏輯地址,以此來屏蔽物理地址的差異。IP 地址分為 IPv4IP 協議的第四版) 和 IPv6IP 協議第六版)兩大類。目前,最廣泛使用的是 IPv4。在該版本中規定,該地址 是由 32 個二進制位組成,用來標識連接到網絡的設備。由於讓用戶記住一串 32 位長的 01 字符確實比較困難,所以 IP 地址採用點分四組的表示法。

   在點分四組表示法中,以 ABCD 的形式構成 IP 地址的四組 1 0。它們分別轉 換為十進制 0 255 之間的數,如圖 3.2 所示。

 

    3.2 显示了 IPv4 地址 11000000.10101000.00000000.00000001,進行了點分四組的表 示法。從圖 3.2 中,可以看到這樣一串 32 位長的数字很不容易記住或者表示。但是採用點 分四組的表示法,就可以將以上一個很長的字符串表示為 192.168.0.1。這樣,用戶就比較容 易記住。

3. IP地址的構成

   IP 地址之所以會被分成四個單獨的部分,是因為每個 IP 地址都包含兩個部分,分別是 網絡地址和主機地址。網絡地址用來標識設備所連接到的局域網,而主機地址則標識這個網 絡中的設備本身。例如,IP 地址 172.16.254.1 是一個 32 位的地址。假設它的網絡部分是前 24 位(192.168.254),那麼主機部分就是后 8 位(1)。處於同一個子網絡的計算機,它們 IP 地址的網絡部分必定是相同的。也就是說 172.16.254.2 應該與 172.16.254.1 處在同一個子 網絡。

   但是,只查看 IP 地址是無法判斷網絡部分的。這時候就需要使用另一個參數子網掩 碼來判斷。所謂的子網掩碼就是表示子網絡特徵的一個參數。它在形式上等同於 IP 地址,也是一個 32 位二進制数字。它的網絡部分全部為 1,主機部分全部為 0

   下面以IP地址10.10.1.22為例,其二進制形式為00001010.00001010.00000001.00010110。 為了能夠區分出 IP 地址的每一個部分,將使用子網掩碼來表示。在本例中,10.10.1.22 的子 網掩碼是 11111111.11111111.00000000.00000000。這就意味着 IP 地址的前一半(10.10 或者 00001010.00001010)是網絡地址,而後一半(1.22 或者 00000001.00010110)表示是該網絡 上的主機,如圖 3.3 所示。

 

    11111111.11111111.0000000.000000,可以被寫成 255.255.0.0

   IP 地址和子網掩碼為簡便起見,通常會被些成無類型域間選路(Classless Inter Domain RoutingCIDR)的形式。在這種形式下,一個完整的 IP 地址後面會有一個左斜杠(/), 以及一個用來表示 IP 地址中網絡部分位數的数字。例如,IP 地址 10.10.1.22 和網絡掩碼 255.255.0.0,在 CIDR 表示法下就會被寫成 10.10.1.22/16 的形式。

4. 捕獲IP數據包

1)什麼是 IP 數據報

   TCP/IP 協議定義了一個在因特網上傳輸的包,稱為 IP 數據報(IP Datagram)。IP 數據 報是一個與硬件無關的虛擬包,由首部(header)和數據兩部分組成。首部部分主要包括版 本、長度、IP 地址等信息。數據部分一般用來傳送其它的協議,如 TCP、UDP、ICMP 等。

  IP 數據報的“首部”部分的長度為 20 到 60 個字節,整個數據報的總長度最大為 65535 字節。因此,理論上一個數據報的“數據”部分,最長為 65515 字節。由於以太網數據報的 “數據”部分,最長只有 1500 字節。因此如果 IP 數據報超過了 1500 字節,就需要分割成 幾個以太網數據報分開發送了。

2)TTL

   捕獲 IP 協議包和其它包有點區別,因為在 IP 協議中涉及到一個 TTLtime-to-live,生 存時間)值問題。TTL 值指定數據包被路由器丟棄之前允許通過的網段數量。當數據包每 經過一個路由器,其 TTL 值將會減一。關於 TTL 的詳細信息,在後面進行介紹。下面將介 紹捕獲 IP 協議包,Wireshark 的位置。

   為了證明 TTL 值的變化,本例中選擇使用三個路由器來捕獲數據包。捕獲 IP 協議數據 包的實驗環境,如圖 3.4 所示。

 

   從圖中,可以看到使用兩個路由器,將三台主機分割成兩個網段。這三台主機的 IP 地址,在圖 3.4 中已經標出。在本例中,Wireshark 可以在 PC1 PC2 任意一台主機上運行。 但是,不可以在 PC3 上運行。因為,在後面將會分別分析同網段和不同網段中 IP 協議包。 如果在 PC3 上捕獲數據包,只能捕獲同網段的 IP 數據包。

3) 捕獲數據包

① 訪問一個網頁

   打開瀏覽器,訪問 http://www.baidu.com 網站,將捕獲到如圖所示的界面。

 

   從該界面的 Protocol 列,可以看到捕獲到有 DNSTCPHTTP 等協議的包。在這些包 中,都包含由 IP 頭部的詳細信息。但是,這樣可能會影響對 IP 協議包的分析。

② 執行 ping 命令

   為了不受很多協議的影響,這裏通過執行 ping 命令僅捕獲 ICMP 協議的數據包。此時 在主機 PC1 上執行 ping 命令,分別 pingPC2 PC3。執行命令如下所示:

C:\Users\Administrator>ping 192.168.5.4 C:\Users\Administrator>ping 192.168.6.103

   執行以上命令后,捕獲到的數據包如圖所示。

 

  捕獲到的 IP 協議包

   從該界面的 Protocol 列,可以看到都是 ICMP 協議的包,而且每個包的顏色也都是相同 的。雖然從該界面看到捕獲到的數據包很多,但是只需要分析其中兩個包,就可以很清楚的 理解 IP 協議包格式。此時,用戶還可以使用 IP 的显示過濾器對數據包進行過濾。如過濾僅 显示主機 PC3192.168.6.103)的數據包,輸入過濾器 ip.addr==192.168.6.103,显示界面如圖所示。

 

   從該界面可以看到,以上數據包都是發送/來自 192.168.6.103 的數據包。

4) 捕獲 IP 分片數據包

   在上面提到說,如果一個數據包超過 1500 個字節時,就需要將該包進行分片發送。通 常情況下,是不會出現這種情況的。但是為了幫助用戶更清晰的理解 IP 協議,下面通過使 用 ICMP 包,來產生 IP 分片數據包。本節將介紹如何捕獲到 IP 分片數據包。

   使用 ICMP 包進行測試時,如果不指定包的大小可能無法查看到被分片的數據包。由於 IP 首部佔用 20 個字節,ICMP 首部占 8 個字節,所以捕獲到 ICMP 包大小最大為 1472 字節。 但是一般情況下,ping 命令默認的大小都不會超過 1472 個字節。這樣,發送的 ICMP 報文 就可以順利通過,不需要經過分片后再傳輸。如果想要捕獲到 IP 分片包,需要指定發送的 ICMP 包必須大於 1472 字節。

   捕獲 IP 分片的數據包。具體操作步驟如下所示:

     1)啟動 Wireshark 捕獲工具。  

     2)在 Wireshark 主界面的菜單欄中依次選擇 Capture|Options,或者單擊工具欄中的 (显示捕獲選項)圖標打開 Wireshark 捕獲選項窗口,如圖所示。

 

捕獲選項界面

   3)在該界面設置捕獲接口、捕獲過濾器及捕獲文件的位置。這裏將捕獲的數據保存 到 ip-fragment.pcapng 捕獲文件中,如圖 3.10 所示。以上信息配置完后,單擊 Start 按鈕開始 捕獲數據包,如圖 所示。

 

開始捕獲數據包

   此時在主機 PC1 上執行 ping 命令,以產生 ICMP 數據包。執行命令如下所示:

C:\Users\lyw>ping 192.168.5.4 -l 3000

   在該命令中,使用-l 選項指定捕獲包的大小為 3000 字節。執行以上命令后,將显示如 下所示的信息:

正在 Ping 192.168.5.4 具有 3000 字節的數據:

來自 192.168.5.4 的回復: 字節=3000 時間=5ms TTL=64

來自 192.168.5.4 的回復: 字節=3000 時間=5ms TTL=64

來自 192.168.5.4 的回復: 字節=3000 時間=5ms TTL=64

來自 192.168.5.4 的回復: 字節=3000 時間=5ms TTL=64

   從以上輸出信息中,可以看到捕獲到每個包的大小都為 3000 字節。這時候,返回到 Wireshark 界面停止捕獲數據,將显示如圖所示的界面。

 

    IP 分片數據包

   從該界面可以很清楚的看到,和前面捕獲到的數據包不同。在該界面 Protocol 列,显示 了 IPv4 協議的包。這是因為發送的數據包過大,所以經過了分片后發送的。

5、IP數據報首部格式

    IP 地址和目的 IP 地址都是 IPv4 數據報首部最重要的組成部分。但是,在首部固定 部分的後面還有一些可選字段,並且其長度是可變的。下面將詳細介紹 IP 數據報首部格式, 如表 3-1 所示。

3-1  IP數據報首部格式  

IP協議

偏移位

03

47

815

1618

1931

0

版本

首部長度

服務類型

總長度

32

標識符

標記

分段偏移

64

存活時間

1

首部校驗和

 

96

IP地址

128

目的IP地址

160

選項

160192+

數據

在表 3-1 中,每個字段代表的含義如下所示:

   · 版本號:指 IP 協議所使用的版本。通信雙方使用的 IP 協議版本必須一致。目前廣 泛使用的 IP 協議版本號為 4,即 IPv4

   · 首部長度:IP 的首部長度,可表示的最大十進制數值是 15。注意,該字段所表示 的單位是 32 位字長(4 個字節)。因此,當 IP 首部長度為 1111(即十進制的 15) 時,首部長度就達到 60 字節。當 IP 分組的首部長度不是 4 字節的整數倍時,必須利用最後的填充字段加以填充。

   · 服務類型:優先級標誌位和服務類型標誌位,被路由器用來進行流量的優先排序。

   · 總長度:指 IP 首部和數據報中數據之後的長度,單位為字節。總長度字段為 16 位, 因此數據報的最大長度為 216-1=65535 字節。

   · 標識符:一個唯一的標識数字,用來識別一個數據報或者被分片數據包的次序。

   · 標識:用來標識一個數據報是否是一組分片數據報的一部分。標誌字段中的最低位 記為 MFMore Fragment)。MF=1 即表示後面還有分片的數據報。MF=0 表 示這已是若干數據包分片中的最後一個。標誌字段中間的一位記為 DFDon’t Fragment),意思是不能分片。只有當 DF=0 時,才允許分片。

   · 分片偏移:一個數據報是一個分片,這個域中的值就會被用來將數據報以正確的順 序重新組裝。

   · 存活時間:用來定義數據報的生存周期,以經過路由器的條數/秒數進行描述。

   · 協議:用來識別在數據包序列中上層協議數據報的類型。如,ICMP則協議值為1,TCP協議值為6,UDP協議值為17;更多的請自行百度

   · 首部校驗和:一個錯誤檢測機制,用來確認 IP 首部的內容有沒有被損壞或者篡改。

   · IP 地址:發出數據報的主機的 IP 地址。

   · 目的 IP 地址:數據報目的地的 IP 地址。

   · 選項:保留作額外的 IP 選項。它包含着源站選路和時間戳的一些選項。

   · 數據:使用 IP 傳遞的實際數據

1)存活時間 TTL

   存活時間(TTL)值定義了在該數據報被丟棄之前,所能經歷的時間,或者能夠經過的 最大路由數目。TTL 在數據報被創建時就會被定義,而且通常在每次被發往一個路由器的 時候減 1。

   例如,如果一個數據報的存活時間是 2,那麼當它到達第一個路由器的時候,其 TTL 會被減為 1,並會被發向第二個路由。這個路由接着會將 TTL 減為 0。這時,如果這個數據 報的最終目的地不在這個網絡中,那麼這個數據報就會被丟棄,如圖 3.13 所示。

    3.13就是數據報經過路由器后,TTL 值的變化。由於 TTL 的值在技術上還是基於時間的,一個非常繁忙的路由器可能會將 TTL 的值減去不止 1。但是通常情況下,還是可以 認為一個路由器設備在多數情況下只會將 TTL 的值減去 1

   了解 TTL 值的變化是非常重要的。一般用戶通常所關心的一個數據報的生存周期,只 是其從源前往目的地所花去的時間。但是考慮到一個數據報想要通過互聯網發往一台主機需 要經過數十個路由器。在這個數據報的路徑上,它可能會碰到被錯誤配置的路由器,而失去 其到達最終目的地的路徑。在這種情況下,這個路由器可能會做很多事情,其中一件就是將 數據報發向一個網絡,而產生一個死循環。如果出現死循環這種情況,可能導致一個程序或 者整個操作系統崩潰。同樣的,如果數據報在網絡上傳輸時,數據報可能會在路由器直接持 續循環,隨着循環數據報的增多,網絡中可用的帶寬將會減少,直至拒絕服務(DoS)的情 況出現。IP 首部中的 TTL 域,就是為了防止出現這種潛在的問題。

2)IP分片

   數據報分片是將一個數據流分為更小的片段,是 IP 用於解決跨越不同類型網絡時可靠 傳輸的一個特性。一個數據報的分片主要是基於第二層數據鏈路層所使用的最大傳輸單元 (Maximum Transmission UnitMTU)的大小,以及使用這些二層協議的設備配置情況。 在多數情況下,第二層所使用的數據鏈路協議是以太網,以太網的 MTU 1500。也就是說, 以太網的網絡上能傳輸的最大數據報大小是 1500 字節(不包括 14 字節的以太網頭本身)。

   當一個設備準備傳輸一個 IP 數據報時,它將會比較這個數據報的大小,以及將要把這 個數據報傳送出去的網絡接口 MTU,用於決定是否需要將這個數據報分片。如果數據報的 大小大於 MTU,那麼這個數據報就會被分片。將一個數據報分片包括下列幾個步驟,如下 所示:

      1)設備將數據分為若干個可成功進行傳輸的數據報。

      2)每個 IP 首部的總長度域會被設置為每個分片的片段長度。

      3)更多分片標誌將會在數據流的所有數據報中設置為 1,除了最後一個數據報。

      4IP 頭中分片部分的分片偏移將會被設置。

      5)數據報被發送出去

6、分析 IP 數據包

   通過前面對 IP 協議的詳細介紹及數據包的捕獲,現在就可以來分析 IP 數據包了。

1)分析IP首部

這裏以捕獲文件的第一幀為例,介紹 IP 數據包首部,如圖 3.14 所示。

 

   在該圖中從 Packet Details 面板中,可以看到有 IPv4 協議的包。這裏就詳細介紹在該包 中的詳細信息,如下所示:

Frame 1: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on interface 0

   以上信息表示是第一幀信息,其大小為 74 個字節。

Ethernet II, Src: Elitegro_3f:c3:e5 (00:19:21:3f:c3:e5), Dst: Giga-Byt_eb:46:8d (50:e5:49:eb:46:8d)

   以上信息表示是以太網幀頭部信息。其中,源 MAC 地址為 00:19:21:3f:c3:e5,目標 MAC 地址為 50:e5:49:eb:46:8d

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)

   以上信息表示IPv4包頭部信息。其中源IP地址為192.168.5.2,目標IP地址為192.168.5.4。 在該包首部中還有很多其它字段的信息,下面將介紹該包中展開的所有信息。如下所示:

 

   以上信息包括 IP 包首部的所有字段,對應到包首部格式中,如表 3-2 所示。

    3-2  IP包首部格式

IP協議

偏移位

03

47

815

1618

1931

0

4

20

0x00

60

32

0x050e

0x00

0

64

64

ICMP(1)

0xea5c

96

192.168.5.2

128

192.168.5.4

160

 

160192+

 

   在該包中最後一行信息如下所示:

Internet Control Message Protocol

以上信息表示 ICMP 協議包信息。關於該協議的分析,在後面進行介紹。

2)分析IP數據包中TTL的變化

   前面介紹過 TTL 值是經過路由器后才發送變化。也就是說如果在同一網段中傳輸數據 包時,TTL 值是不變的。只有與非同網段的主機進行通信時,該數據包的 TTL 值才會發生 變化。下面通過分析捕獲文件,來確定 TTL 值是否是這樣變化的。

① 分析同網段中數據包的 TTL 值

   這裏同樣以捕獲文件為例,分析同網段 TTL 值的變化。在 ip.pcapng 捕獲文 件中,1~8 幀都是主機 PC1192.168.5.2)和 PC2192.168.5.4)之間的通信。這八幀可以 說是 4 個完整的數據包,也就是通過 ICMP 協議的發送和響應包。這裏以 ip.pcapng 捕獲文 件中的 34 幀為例,分析這兩個包中的 TTL 值。其中,34 幀的信息如圖 3.15 所示。

 

   從該界面的 Packet List 面板中,Info 列可以看到 34 幀包信息分別是 Echopingrequest (請求)和 Echopingreply(響應)。也就是說 192.168.5.2PC1)發給 192.168.5.4 的 包是一個請求包,192.168.5.4PC2)的包是一個響應包。其中,這兩台主機是在同一個網 絡中,所以這兩個包的 TTL 值應該相同。下面分別來看這兩個包中 IP 包首部的相信信息。

    第三幀的 IP 包首部信息如下所示:

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)                   

   Version: 4          #IP 協議版本號

   Header length: 20 bytes       #首部長度

   Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))            #服務標識符     

   Total Length: 60         #總長度    

   Identification: 0x050f (1295)      #標識符    

   Flags: 0x00         #標誌        

       0… …. = Reserved bit: Not set     #保留位        

       .0.. …. = Don’t fragment: Not set     #不進行分片        

       ..0. …. = More fragments: Not set     #更多分片     

   Fragment offset: 0        #分片偏移     

   Time to live: 64         #生存期     

   Protocol: ICMP (1)        #協議    

   Header checksum: 0xea5b [validation disabled]   #首部校驗和     

   Source: 192.168.5.2 (192.168.5.2)     #IP 地址     

   Destination: 192.168.5.4 (192.168.5.4)    #目標 IP 地址     

   [Source GeoIP: Unknown]       #IP 地理位置    

   [Destination GeoIP: Unknown]      #目標 IP 地理位置

   以上信息是第三針中 IPv4 首部的詳細信息。從中可以看到,該包中的 TTL 值是 64。 第四幀的 IP 包首部信息如下所示

Internet Protocol Version 4, Src: 192.168.5.4 (192.168.5.4), Dst: 192.168.5.2 (192.168.5.2)     

   Version: 4          #IP 協議版本號     

   Header length: 20 bytes       #首部長度     

   Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))            #服務標識符     

   Total Length: 60         #總長度     

   Identification: 0xc71d (50973)      #標識符     

   Flags: 0x00         #標誌         

      0… …. = Reserved bit: Not set     #保留位         

      .0.. …. = Don’t fragment: Not set     #不進行分片         

      ..0. …. = More fragments: Not set     #更多分片     

   Fragment offset: 0        #分片偏移     

   Time to live: 64         #生存期     

   Protocol: ICMP (1)        #協議     

   Header checksum: 0x284d [validation disabled]   #首部校驗和         

      [Good: False]         

      [Bad: False]     

   Source: 192.168.5.4 (192.168.5.4)     #IP 地址     

   Destination: 192.168.5.2 (192.168.5.2)    #目標 IP 地址     

   [Source GeoIP: Unknown]       #IP 地理位置     

   [Destination GeoIP: Unknown]      #目標 IP 地理位置

   從以上信息中,可以看到每個字段的信息都和第三幀 IP 包首部的信息都相同。這兩個 包中的生存期(TTL),沒有發生變化。這是因為,主機 PC1 PC2 在同一個網段內,它 們之間傳輸的數據不需要經過路由器。

② 分析不同網段中數據包的 TTL 值

   下面以捕獲文件為例,分析不同網段 TTL 值的變化。在 ip.pcapng 捕獲文件 中,9-16 幀是兩台(PC1 PC3)不同網段主機之間通信的數據包,如圖 3.16 所示。

   在該界面显示的包同樣是四個完整的 ICMP 包,一個是請求包,一個是響應包。這裏分 析 910 幀中 IPv4 首部的詳細信息,如下所示。

    9 IPv4 首部信息,如下所示:

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.6.103 (192.168.6.103)

   Version: 4          #IP 協議版本號     

   Header length: 20 bytes       #首部長度     

   Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))            #服務標識符     

   Total Length: 60         #總長度     

   Identification: 0x0512 (1298)     #標識符     

   Flags: 0x00         #標誌         

      0… …. = Reserved bit: Not set     #保留位         

      .0.. …. = Don’t fragment: Not set     #不進行分片         

      ..0. …. = More fragments: Not set     #更多分片     

   Fragment offset: 0        #分片偏移     

   Time to live: 64         #生存期     

   Protocol: ICMP (1)        #協議     

   Header checksum: 0xe8f5 [validation disabled]     #首部校驗和         

      [Good: False]         

      [Bad: False]     

   Source: 192.168.5.2 (192.168.5.2)   #IP 地址     

   Destination: 192.168.6.103 (192.168.6.103)    #目標 IP 地址     

   [Source GeoIP: Unknown]       #IP 地理位置     

   [Destination GeoIP: Unknown]      #目標 IP 地理位置

   以上包信息,是主機 PC1 發送給 PC3 IP 包首部信息。其中,TTL 值為 64

    10 IPv4 首部信息,如下所示:

Internet Protocol Version 4, Src: 192.168.6.103 (192.168.6.103), Dst: 192.168.5.2 (192.168.5.2)

   Version: 4          #IP 協議版本號     

   Header length: 20 bytes       #首部長度     

   Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))            #服務標識符     

   Total Length: 60         #總長度     

   Identification: 0xa206 (41478)      #標識符     

   Flags: 0x00         #標誌         

      0… …. = Reserved bit: Not set     #保留位         

      .0.. …. = Don’t fragment: Not set     #不進行分片         

      ..0. …. = More fragments: Not set     #更多分片     

   Fragment offset: 0        #分片偏移     

   Time to live: 63         #生存期     

   Protocol: ICMP (1)        #協議     

   Header checksum: 0x4d01 [validation disabled]    #首部校驗和         

      [Good: False]         

      [Bad: False]     

   Source: 192.168.6.103 (192.168.6.103)    #IP 地址     

   Destination: 192.168.5.2 (192.168.5.2)    #目標 IP 地址     

   [Source GeoIP: Unknown]       #IP 地理位置     

   [Destination GeoIP: Unknown]      #目標 IP 地理位置

   以上包信息,是主機 PC3 發送給 PC1 IP 包首部信息。從以上信息中,可以看到該 IPv4 首部中 TTL 值為 63。由此可以說明,PC3 發送回 PC1 的數據包經過了一個路由器。

③ IP 分片數據包分析

   下面以捕獲文件為例,詳細分析 IP 分片。打開 ip-fragment.pcapng 捕獲文件,显示界面如圖 3.17 所示。

 

   在該捕獲文件中,也是捕獲了四個 ping 包。1~6 幀是一個完整的 ping 包,其中 1~3 幀 是 ping 請求包,4~6 幀是 ping 響應包。也就是說,將第一個 ping 請求包,分為了 1~3 個數 據包。下面將詳細分析 1~3 幀的詳細信息。

1 幀數據包

    1 幀數據包詳細信息如圖 3.18 所示。

 

   從該界面的 Packet Details 面板中,可以看到有四行信息。分別如下所示:

Frame 1: 1514 bytes on wire (12112 bits), 1514 bytes captured (12112 bits) on interface 0

   以上信息表示第 1 幀數據包的信息,其大小為 1514 字節。

Ethernet II, Src: Elitegro_3f:c3:e5 (00:19:21:3f:c3:e5), Dst: Giga-Byt_eb:46:8d (50:e5:49:eb:46:8d)

   以上信息表示以太網幀頭部信息。其中源 MAC 地址為 00:19:21:3f:c3:e5,目標 MAC 地 址為 50:e5:49:eb:46:8d

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)

   以上信息表示 IPv4 頭部信息。在該頭部包括了具體的詳細信息。展開該行信息,內容 如下所示:

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)     

   Version: 4         #IP 協議版本     

   Header length: 20 bytes      #首部長度     

   Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))           #服務標識符         

      0000 00.. = Differentiated Services Codepoint: Default (0x00)         

      …. ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)     

   Total Length: 1500       #總長度    

   Identification: 0x05a3 (1443)     #標識符     

   Flags: 0x01 (More Fragments)     #標誌         

      0… …. = Reserved bit: Not set    #保留位         

      .0.. …. = Don’t fragment: Not set    #不能分片。這裏的值為 0,表示可以進行 分片         

      ..1. …. = More fragments: Set    #更多分片。這裏的值為 1,表示還有分片 的數據包     

   Fragment offset: 0       #分片偏移     

   Time to live: 64        #生存期     

   Protocol: ICMP (1)       #協議     

   Header checksum: 0xc427 [validation disabled]  #首部校驗和         

      [Good: False]         

      [Bad: False]     

   Source: 192.168.5.2 (192.168.5.2)    #IP 地址    

   Destination: 192.168.5.4 (192.168.5.4)   #目標 IP 地址   

   [Source GeoIP: Unknown]      #IP 地理位置    

   [Destination GeoIP: Unknown]     #目標 IP 地理位置     

   Reassembled IPv4 in frame: 3     #重組 IPv4

Data (1480 bytes)        #數據     

   Data: 0800cfd0000100016162636465666768696a6b6c6d6e6f70…     

   [Length: 1480]        #長度為 1480 字節

   以上信息是第 1 IPv4 首部的詳細信息。從以上更多分片和分片偏移域部分,可以判定該數據包是分片數據包的一部分。這是后被分片的數據包,就會有一個大於 0 的分片偏移 或者就是設定了更多標誌為。從以上信息,可以看到更多分片標誌位被設定,也就是接收設 備應該等待接收序列中的另一個數據包。分片偏移為 0,表示這個數據包是這一系列分片中 的第一個包。所以,後面至少還有一個包。接下來看第二幀包信息。以上信息對應的 IPv4 首部格式中,显示結果如表 3-3 所示

 

⑵ 第 2 幀數據包

    2 幀數據包詳細信息如圖 3.19 所示。

 

    Wireshark Packet Details 面板中,可以看到有四行詳細信息。而且包大小,和第一 個數據包的大小相同。下面將分析該包的詳細信息,如下所示。

Frame 2: 1514 bytes on wire (12112 bits), 1514 bytes captured (12112 bits) on interface 0

   以上信息表示,這是第 2 幀的詳細信息。其中,該包的大小為 1514 個字節。

Ethernet II, Src: Elitegro_3f:c3:e5 (00:19:21:3f:c3:e5), Dst: Giga-Byt_eb:46:8d (50:e5:49:eb:46:8d)

   以上信息表示以太網幀頭部信息。其中,源 MAC 地址為 00:19:21:3f:c3:e5,目標 MAC 地址為 50:e5:49:eb:46:8d

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)

以上信息表示 IPv4 首部的詳細信息。下面將詳細分析該包中每個字段的值,如下所示:

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)     

   Version: 4         #IP 協議版本     

   Header length: 20 bytes      #首部長度     

   Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))           #服務標識符         

      0000 00.. = Differentiated Services Codepoint: Default (0x00)         

      …. ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)     

   Total Length: 1500       #總長度    

   Identification: 0x05a3 (1443)     #標識符     

   Flags: 0x01 (More Fragments)     #標誌         

      0… …. = Reserved bit: Not set    #保留位         

      .0.. …. = Don’t fragment: Not set    #不能分片。這裏的值為 0,表示可以進行 分片         

      ..1. …. = More fragments: Set    #更多分片。這裏的值為 1,表示還有分片 的數據包     

   Fragment offset: 1480       #分片偏移    

   Time to live: 64        #生存期     

   Protocol: ICMP (1)       #協議     

   Header checksum: 0xc36e [validation disabled]  #首部校驗和         

      [Good: False]         

      [Bad: False]     

   Source: 192.168.5.2 (192.168.5.2)    #IP 地址    

   Destination: 192.168.5.4 (192.168.5.4)   #目標 IP 地址   

   [Source GeoIP: Unknown]      #IP 地理位置    

   [Destination GeoIP: Unknown]     #目標 IP 地理位置     

   Reassembled IPv4 in frame: 3     #重組 IPv4

Data (1480 bytes)        #數據     

   Data:  6162636465666768696a6b6c6d6e6f707172737475767761…     

   [Length: 1480]        #長度為 1480 字節

   根據以上信息介紹,可以看到在該包的 IPv4 首部也設定了更多分片的標誌為。而且可 以看到,這裏的分片偏移值為 1480。該值是由最大傳輸單元(MTU1500,減去 IP 首部的 20 個字節得到的。以上信息對應到 IPv4 首部格式中,显示信息如表 3-4 所示。

IP協議

偏移位

03

47

815

1618

1931

0

4

20

0x00

1500

32

0x05a3

0x01

1480

64

64

ICMP(1)

0xc36e

96

192.168.5.2

128

192.168.5.4

160

 

160192+

1480

⑶ 第 3 幀數據包

    3 幀數據包詳細信息如圖 3.20 所示。

 

    Wireshark Packet Details 界面可以看到,該包中显示了四行信息,並且該包的協議 為 ICMP。下面將詳細分析該包中的信息。

Frame 3: 82 bytes on wire (656 bits), 82 bytes captured (656 bits) on interface 0

   以上信息表示這是第 3 幀的詳細信息,其中包大小為 82 個字節。

Ethernet II, Src: Elitegro_3f:c3:e5 (00:19:21:3f:c3:e5), Dst: Giga-Byt_eb:46:8d (50:e5:49:eb:46:8d)

   以上信息表示以太網幀頭部的詳細信息。其中,源 MAC 地址為 00:19:21:3f:c3:e5,目 標 MAC 地址為 50:e5:49:eb:46:8d

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)

   以上信息表示 IPv4 首部信息,這裏着重分析該部分的詳細信息。如下所示:

Internet Protocol Version 4, Src: 192.168.5.2 (192.168.5.2), Dst: 192.168.5.4 (192.168.5.4)     

   Version: 4         #IP 協議版本     

   Header length: 20 bytes      #首部長度     

   Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))           #服務標識符         

      0000 00.. = Differentiated Services Codepoint: Default (0x00)         

      …. ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)     

   Total Length: 68   #總長度    

   Identification: 0x05a3 (1443)     #標識符     

   Flags: 0x01 (More Fragments)     #標誌         

      0… …. = Reserved bit: Not set    #保留位         

      .0.. …. = Don’t fragment: Not set    #不能分片。       

        ..0. …. = More fragments: Not set     #更多分片。  

   Fragment offset: 2960        #分片偏移    

   Time to live: 64        #生存期     

   Protocol: ICMP (1)       #協議     

   Header checksum: 0xe84d [validation disabled]  #首部校驗和         

      [Good: False]         

      [Bad: False]     

   Source: 192.168.5.2 (192.168.5.2)    #IP 地址    

   Destination: 192.168.5.4 (192.168.5.4)   #目標 IP 地址   

   [Source GeoIP: Unknown]      #IP 地理位置    

   [Destination GeoIP: Unknown]     #目標 IP 地理位置     

   [3 IPv4 Fragments (3008 bytes): #1(1480), #2(1480), #3(48)] #三個 IPv4 分片,共 3000 個字 節         

      [Frame: 1, payload: 0-1479 (1480 bytes)]    #1 幀加載了 1480 個字節         

      [Frame: 2, payload: 1480-2959 (1480 bytes)]   #2 幀加載了 1480 個字節        

      [Frame: 3, payload: 2960-3007 (48 bytes)]    #3 幀加載了 48 個字節         

      [Fragment count: 3]        #分片數為 3        

      [Reassembled IPv4 length: 3008]     #重組 IPv4 長度為 3008         

      [Reassembled IPv4 data: 0800cfd0000100016162636465666768696a6b6c6d6e6f70…]              #重組 IPv4 數據

   根據以上信息的描述,可以看到該數據包沒有設定更多分片標誌位,也就表示該數據包 是整個數據流中的最後一個分片。並且其分片偏移設定為 2960,是由 1480+(1500-20)得出 的結果。這些分片可以被認為是同一個數據序列的一部分,因為它們 IP 首部中的標誌位於 擁有相同的值。以上信息對應到 IP 首部格式,如表 3-5 所示

IP協議

偏移位

03

47

815

1618

1931

0

4

20

0x00

68

32

0x05a3

0x00

2960

64

64

ICMP(1)

0xe84d

96

192.168.5.2

128

192.168.5.4

160

 

160192+

 

在該包中最後一行信息如下所示:

Internet Control Message Protocol

以上信息表示 ICMP 協議包信息。 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

打個總結:Web性能優化

前段時間優化一個公司歷史老項目的Web性能,卻引出了一系列的問題,讓我反思良多。
我通過Chrome的Lighthouse工具可以看出一些性能參數和問題反饋,我逐一對其進行優化。
根據資源請求的不同,大致可以分為前端資源性能和後端程序性能兩個方面。
先分析一下前端資源吧:

  1. Defer offscreen images。

Chrome給出的建議是:

Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. Learn more.

意思是可以考慮延遲加載一些圖片或者隱藏一些圖片在所有關鍵資源完成加載后再考慮加載,通過延遲加載來降低交互時間。
lazy-load的實現方法很多,開源框架推薦:lazysizes。
當然也可以使用npm方式安裝:

npm install lazysizes
使用方式很簡單,先引入lazysize到需要的頁面:

<script src="lazysizes.min.js" async=""></script>

然後給需要被lazyload的img標籤上加新的屬性,如下:

<img
    data-sizes="auto"
    data-src="image2.jpg"
    data-srcset="image1.jpg 300w,
    image2.jpg 600w,
    image3.jpg 900w" class="lazyload" />

特別要注意,有時候太多background方式加載的圖片也會影響性能,lazysizes也可以處理這樣的圖片。方法如下,使用data-bg屬性即可:

<div class="lazyload" data-bg="/path/to/image.jpg"></div>
  1. Reduce JavaScript execution time

解決這個問題方法很多,第一個想到的就是壓縮資源。
比如壓縮js和css文件,可以考慮使用webpack工具或者gulp來壓縮大資源文件,合併一些文件資源請求。
還可以通過預加載來提高響應速度,可以在最重要的js資源文件的引入上加入預加載,代碼如下:

<link rel="preload" as="style" href="css/style.css">

通過增加preload
最後還可以異步加載資源,異步不會阻塞主進程,代碼調整也很小:

<script src="xxx" async></script>

除此之外JavaScript的執行時間過長還有可能是有大量邏輯運算,有很多頁面把一些邏輯判斷和計算都交給前端去計算,這樣也不利於渲染,建議還是把複雜邏輯和計算盡可能交給後端去處理,讓前端渲染更加“輕量”。
3. Backend response
數據接口返回有時候也很拖累響應時間,因為一些前端結構需要根據返回的數據進行組裝新的頁面結構。
這裏可以考慮找到性能真正的瓶頸,到底是數據庫查詢導致的慢,還是業務邏輯不清晰導致的冗餘,或者其他原因。
我遇到的是因為老項目的數據庫操作類不是單例,會每次產生一個數據庫連接句柄,且該頁面複雜又多的sql查詢。
我勇敢地修改着10多年歷史的代碼,編寫了單例模式的操作類,然後增加了必要的緩存機制。
然而後面我遇到了問題,首先單例類在一些特殊情形下不滿足之前的代碼需求,導致奇特的數據庫報錯,而async屬性導致一些js文件無法同步加載到位,而有一些依賴這些資源的php文件執行報錯。
最終在同事的幫助下,恢復了服務,我也再一次體會到了任何一種性能提升都要謹慎,特別是對一個古老的項目。
前人不敢動的代碼,可能是深淵。

PS:我的公眾號 成都有娃兒會同步發布該文章,也可以關注哦!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

設計模式入門

最近想學設計模式,網上說 HeadFirst 設計模式書挺好的,我來此再鞏固一篇。

故事是這樣的:小明是一個剛畢業的小伙子,他來到了一個遊戲公司實習,項目經理分配了一個實習任務給小明:

設計一個遊戲角色,角色屬性包括(攻擊力,防禦力,敏捷度…等等),以及兩個召喚師技能(閃現和引燃)。

小明想這麼簡單的嗎,如是他用了一天的時間寫好了如下代碼

public class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    
    public void flash_move() {
        System.out.println("指定方向瞬移一段距離");
    }
    
    public void ignite() {
        System.out.println("使其處於燃燒狀態 5 s");
    }
}

項目經理看到小明這麼快就完成了任務,表揚了一下小明,小明心裏樂開了花。然後項目經理又布置了一項任務給小明:
再設計兩個角色,他們的召喚師技能分別為(閃現,治療),(閃現,傳送)。

小明心想這難不倒我,然後他仍然只花了一天的時間就寫好了如下代碼:

public class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    
    public void flash_move() {
        System.out.println("指定方向瞬移一段距離");
    }
    
    public void ignite() {
        System.out.println("使附近100碼內隊友恢復30%的血量");
    }
}

public class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    
    public void flash_move() {
        System.out.println("指定方向瞬移一段距離");
    }
    
    public void ignite() {
        System.out.println("傳送至己方非英雄單位位置處");
    }
}

小明興高采烈的跑去給項目經理看了,項目經理看到小明過來了,心裏覺得這小伙子不錯麻,這麼快就做完了。

然後項目經理便看了他的代碼,這不看不要緊,一看便指着小明罵道:你真是一個糟糕的程序員!!!然後便讓小明改代碼去了。

小明此時還不太明白,我功能都實現了啊,沒啥毛病阿,然後小明不明所以的便問了辦公室的職員,職員告訴他,你代碼冗餘度太高了。

小明一看發現果然如此,然後便花了一天的時間改成如下代碼:

public abstract class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
  
  // 省略 Getter and Setter method
public void flash_move() { System.out.println("指定方向瞬移一段距離"); } public abstract void skill(); }
public class Role_One extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使其處於燃燒狀態 5 s"); } }
public class Role_Two extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使附近100碼內隊友恢復30%的血量"); } }
public class Role_Three extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("傳送至己方非英雄單位位置處"); } }

這次小明覺得冗餘度確實降低了,然後便給項目經理看,項目經理看后覺得確實還行,便又分配了一個任務:
(遊戲用戶希望能自由選擇召喚師技能就好了),所以任務是召喚師技能任意搭配。

小明心想:我寫的這種代碼似乎不用改耶,可以交差了,於是小明便偷懶了两天,然後便上報給項目經理了。

項目經理一看,這代碼沒有變化啊,便問小明,你代碼就這?小明回答是的,然後小明又被罵的狗血淋頭。

不明所以的小明又去問問辦公室的職員,你仔細想想,如果有100個(閃現,引燃),100個(閃現,治療),100個(傳送,治療)呢?

小明突然恍然大悟,那還是有好高的冗餘度啊,經過三天思考後,小明想出了最終答案:

public abstract class GameRole {
private int atk; // 攻擊力 private int def; // 防禦力 private int dex; // 敏捷度 private Skills skill_One; private Skills skill_Two;
  // 省略 Getter and Setter method
} public class Role_Demo extends GameRole { }
public interface Skills {
    public void skill();
}

public class Flush_Move implements Skills {
    @Override
    public void skill() {
        // TODO Auto-generated method stub
        System.out.println("指定方向瞬移一段距離");
    }
}

public class Ignite implements Skills {
    @Override
    public void skill() {
        // TODO Auto-generated method stub
        System.out.println("使其處於燃燒狀態 5 s");
    }
}

public class Treat implements Skills {

    @Override
    public void skill() {
        // TODO Auto-generated method stub
        System.out.println("使附近100碼內隊友恢復30%的血量");
    }
}
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Role_Demo role = new Role_Demo();
        role.setSkill_One(new Flush_Move());
        role.setSkill_Two(new Ignite());
        role.getSkill_One().skill();
        role.getSkill_Two().skill();
    }
}

小明寫完了,這次小明怕又被罵,便去問問職員小花了,小花說寫的不錯嗎,於是小明膽戰心驚的去交差了。

項目經理看到小明過來,看着小明的囧樣,內心是想笑的,然後看了看代碼發現這回沒啥問題了,便放心的交給它最後一個任務:

給每個英雄添加四個不相同的技能:

小明經過幾次寫代碼的經歷后,一天便寫出來了:

public abstract class GameRole {
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    private Skills skill_One;
    private Skills skill_Two;
    
    // 省略 Getter and Setter method
    
    public abstract void Skill_One();
    public abstract void Skill_Two();
    public abstract void Skill_Three();
    public abstract void Skill_Four();
}

public class Role_Demo extends GameRole {

    @Override
    public void Skill_One() {
        // TODO Auto-generated method stub
    }

    @Override
    public void Skill_Two() {
        // TODO Auto-generated method stub    
    }

    @Override
    public void Skill_Three() {
        // TODO Auto-generated method stub    
    }

    @Override
    public void Skill_Four() {
        // TODO Auto-generated method stub    
    }
}

經過這幾次任務,小明感覺寫的代碼更漂亮,更優雅了,腰也不酸了,背也不疼了。小明上交任務后,項目經理也露出了滿意的笑容!

最後,小明成功通過了實習,然而項目經理給他分配了下一項任務……

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

巴西海岸漏油原因仍是謎 成千上萬志工「挖黑泥」

摘錄自2019年10月21日自由時報報導

巴西日前發生大規模漏油事件後,對當地北部約2100公里、橫跨數州的海岸線造成嚴重破壞,雖已進入調查,但至今漏油原因尚未查明,而當地政府因未積極採取行動,遭當地環保團體抨擊;所幸,已有成千上萬的志工在受污染區域「挖黑泥」,將遍布海灘的「油污」慢慢除去,而這些志工僅在伯南布哥州(Pernambuco)就已經清出30噸油污。

油污從9月2日開始出現,而這些污染物質經檢驗,已證實為石油原油。海洋學家阿勞霍(Maria Christina Araujo)指出,「此次漏油對受污染區域當地生物的破壞可能將無法彌補,需要數年才能逐漸恢復當地生態系統。」而巴西環境與可再生資源研究所(Ibama)也證實,有15隻海龜和2隻鳥被油污殺死,且有照片佐證這些生物遭黑色油污覆蓋致死,而巴西享譽世界的的珊瑚礁也受到油污的破壞。

照片來源:Kleber from Burgos / WWF-Brasil

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

【案例演示】JVM之強引用、軟引用、弱引用、虛引用

1.背景

想要理解對象什麼時候回收,就要理解到對象引用這個概念,於是有了下文

2.java中引用對象結構圖

3.引用詳解

3.1.什麼是強引用

a.當內存不足,JVM開始垃圾回收,對於強引用的對象,就算是出現了00M也不會對該對象進行回收,死都不收。

b.強引用是我們最常見的普通對象引用,只要還有強引用指向一個對象,就能表明對象還“活着”,垃圾收集器不會碰這種對象。

在Java中最常見的就是強引用,把一個對象賦給一個引用變量,這個引用變量就是一個強引用。

當一個對象被強引用變量引用時,它處於可達狀態,它是不可能被垃圾回收機制回收的,即使該對象以後永遠都不會被用到JVM也不會回收。

因此強引用是造成Java內存泄漏的主要原因之一

c.對於一個普通的對象,如果沒有其他的引用關係,只要超過了引用的作用域或者顯式地將相應(強)引用賦值為null,一般認為就是可以被垃圾收集的了〈當然具體回收時機還是要看垃圾收集策略)。

案例:

package com.wfd360.demo03GC.referDemo;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 12:12
 * @description
 */
public class StrongRefer {
    /**
     * 強引用的理解
     *
     * @param args
     */
    public static void main(String[] args) {
        Object obj1 = new Object();
        // 建立強引用
        Object obj2 = obj1;
        // 觀察obj1 和 obj2 的各種內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("obj2=" + obj2);
        // obj1創建可以回收的條件
        obj1 = null;
        // gc回收
        System.gc();
        // 觀察各對象情況
        System.out.println("obj1=" + obj1);
        System.out.println("obj2=" + obj2);
    }
}

View Code

 從測試結果課程看出,obj1的實際對象別沒有回收;

3.2.什麼是軟引用

a.軟引用是用來描述一些還有用但並非必需的對象,需要用java.lang.ref.SoftReference類來實現。

b.對於軟引用關聯着的對象,在系統將要發生內存溢出異常之前,將會把這些對象列進回收範圍之中進行第二次回收。如果這次回收還沒有足夠的內存,才會拋出內存溢出異常。在JDK1.2之後,提供了Soft Reference類來實現軟引用。

c.軟引用通常用在對內存敏感的程序中,比如高速緩存就有用到軟引用,內存夠用的時候就保留,不夠用就回收!

案例:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.SoftReference;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 12:12
 * @description
 */
public class SoftRefer {

    /**
     * 軟引用的理解
     * 通過設置jvm參數,在不同的條件下觀察
     *
     * @param -Xms5m -Xmx5m -XX:+PrintGCDetails
     * @param args
     */
    public static void main(String[] args) {
        // 測試內存充足(不回收軟引用)
        //testSoftReferNOGc();
        // 測試內存不充足(回收軟引用)
        testSoftReferGc();
    }

    /**
     * 模擬內存充足的情況
     */
    public static void testSoftReferNOGc() {
        Object obj1 = new Object();
        // 建立軟引用
        SoftReference softRefer = new SoftReference<>(obj1);
        // 觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
        // obj1創建可以回收的條件
        obj1 = null;
        // gc回收
        System.gc();
        // 再次觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
    }

    /**
     * 模擬內存不足
     * 1.設置較小的堆內存
     * 2.創建大對象
     * 3.jvm參
     * -Xms5m -Xmx5m -XX:+PrintGCDetails
     */
    public static void testSoftReferGc() {
        Object obj1 = new Object();
        // 建立軟引用
        SoftReference softRefer = new SoftReference<>(obj1);
        // 觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
        // obj1創建可以回收的條件
        obj1 = null;
        try {
            byte[] bytes = new byte[6 * 1024 * 1024];
        } catch (Throwable e) {
            System.out.println("===============>error:" + e.getMessage());
        } finally {
            // 再次觀察內存地址
            System.out.println("obj1=" + obj1);
            System.out.println("softRefer=" + softRefer.get());
        }
    }
}

View Code

內存充足測試結果:

 內存不充足測試結果:

 實際案例

假如有一個應用需要讀取大量的本地數據(圖片、通訊率、臨時文件等):

如果每次讀取數據都從硬盤讀取則會嚴重影響性能,

如果一次性全部加載到內存中又可能造成內存溢出。

此時使用軟引用可以解決這個問題。

設計思路是:用一個HashMap來保存數據的路徑和相應數據對象關聯的軟引用之間的映射關係,在內存不足時,

JVM會自動回收這些緩存數據對象所佔用的空間,從而有效地避免了00M的問題。

Map<String,SoftReference>imageCache=new HashMap<String,SoftReference>();

 3.3.什麼是弱引用

a.弱引用也是用來描述非必需對象的,但是它的強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前。

b..當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。在JDK1.2之後,提供廣Weak Reference類來實現弱引用。

c.弱引用需要用Java.lang.ref.WeakReference類來實現,它比軟引用的生存期更短.

案例:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.WeakReference;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 12:12
 * @description
 */
public class WeakRefer {

    /**
     * 弱引用的理解
     *
     * @param args
     */
    public static void main(String[] args) {
        Object obj1 = new Object();
        // 建立弱引用
        WeakReference softRefer = new WeakReference<>(obj1);
        // 觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
        // obj1創建可以回收的條件
        obj1 = null;
        // gc回收
        System.gc();
        // 再次觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
    }

}

View Code

 擴展知識-WeakHashMap

查看API介紹:

 測試代碼:

package com.wfd360.demo03GC.referDemo;

import java.util.HashMap;
import java.util.WeakHashMap;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 5:10
 * @description <p>
 * 弱引用引用之:WeakHashMap
 * 以弱鍵 實現的基於哈希表的 Map。在 WeakHashMap 中,當某個鍵不再正常使用時,將自動移除其條目。
 * 更精確地說,對於一個給定的鍵,其映射的存在並不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,
 * 然後被回收。丟棄某個鍵時,其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實現有所不同。
 * </p>
 */
public class WeakReferMap {
    /**
     * 測試 HashMap 與 WeakHashMap 區別
     * 測試邏輯:
     * 1.創建不同的map
     * 2.創建key  value值
     * 3.放入各自的map,並打印結果
     * 4.將key設置為null,並打印結果
     * 5.手動GC,並打印結果
     *
     * @param args
     */
    public static void main(String[] args) {
        hashMapMethod();
        System.out.println("--------華麗的分割線--------");
        weakHashMapMethod();
    }

    /**
     * HashMap測試(強引用)
     */
    private static void hashMapMethod() {
        HashMap<String, String> map = new HashMap<>();
        String key = "key1";
        String value = "HashMap-value";

        map.put(key, value);
        System.out.println(map);

        key = null;
        System.out.println(map);

        System.gc();
        System.out.println(map);
    }

    /**
     * 若引用(WeakHashMap測試)
     */
    private static void weakHashMapMethod() {
        WeakHashMap<String, String> map = new WeakHashMap<>();
        // 注意這裏的new一個字符串與直接寫key="key2"對測試結果是有區別的,詳細原因可以看之前講的內存分配
        String key = new String("key2");
        String value = "WeakHashMap-value";

        map.put(key, value);
        System.out.println(map);

        key = null;
        System.out.println(map);

        System.gc();
        System.out.println(map);

    }

}

View Code

測試結果:

 從測試結果可以看出:弱引用的map數據已經被回收。

 擴展知識-ReferenceQueue引用隊列

 代碼:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 7:23
 * @description
 */
public class QueueRefer {
    /**
     * 測試弱引用回收前,把數據放入隊列中
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
        // 當GC釋放對象內存的時候,會將引用加入到引用隊列
        WeakReference<Object> weakReference = new WeakReference<>(obj1, referenceQueue);

        System.out.println(obj1);
        System.out.println(weakReference.get());
        System.out.println(referenceQueue.poll());

        System.out.println("--------華麗的分割線--------");
        obj1 = null;
        System.gc();
        Thread.sleep(500);

        System.out.println(obj1);
        System.out.println(weakReference.get());
        System.out.println(referenceQueue.poll());
    }

}

View Code

採用弱引用的方式測試結果:

從測試結果可以看出,需要回收的對象已經進入隊列。

 採用軟引用的方式測試結果:

 從測試結果可以看出,軟引用,沒有到達回收的條件,並沒有進行回收,也不會進入隊列;

3.4.什麼是虛引用

1.虛引用需要java.lang.ref.PhantomReference類來實現。

2.與其他幾種引用都不同,虛引用並不會決定對象的生命周期。如果一個對象僅持有

虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收,它不能單獨使用也不能通過它訪

問對象,虛引用必須和引用隊列(ReferenceQueue)聯合使用。

3.虛引用的主要作用是跟蹤對象被垃圾回收的狀態。僅僅是提供了一種確保對象被finalize以後,做某些事情的

機制。PhantomReference的get方法總是返回null,因此無法訪問對應的引用對象。其意義在於說明一個對象己

經進入俑finalization階段,可以被gc回收,用來實現比finalization機制更靈活的回收操作。

4.設置虛引用關聯的唯一目的,就是在這個對象被收集器回收的時候收到一個系統通知或者後續添加

進一步的處理。Java技術允許使用finalize()方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。

代碼:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 7:44
 * @description
 */
public class PhantomRefer {
    /**
     * 虛引用測試
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj1,referenceQueue);

        System.out.println(obj1);
        System.out.println(phantomReference.get());
        System.out.println(referenceQueue.poll());

        System.out.println("--------華麗的分割線--------");

        obj1 = null;
        System.gc();
        Thread.sleep(500);

        System.out.println(obj1);
        System.out.println(phantomReference.get());
        System.out.println(referenceQueue.poll());
    }

}

View Code

測試結果:

4.重要總結

對象是否存活判斷流程:

1.可達性分析,看是否有GC Roots的引用鏈,如果沒有將做第一次標記;

2.檢查是否需要執行finalize()方法,

如果沒必要(之前執行過了),直接回收內存;

如果要執行finalize()方法,這個時候對象如果再次建立引用鏈(唯一自救機會),對象不會被回收,否則直接回收;

總結:

1.對象回收滿足兩個條件:

a.沒有引用鏈。

b.回收前會執行finalize()方法,如果執行finalize(),沒有再次建立連接(如果重新與引用鏈上的任意對象建立連接,例如給對象賦值,該對象都不會被回收)

2.在gc回收前會執行finalize()方法,只執行一次,並且是異步執行不保證執行成功,線程優先級低

代碼演示:

package com.wfd360.demo03GC.referDemo;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 8:34
 * @description
 */
public class FinalizeGC {
    public static FinalizeGC obj1 = null;

    /**
     * 重寫finalize方法
     * @throws Throwable
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("執行finalize方法");
        // 自救,在回收時建立引用鏈
        FinalizeGC.obj1 = this;
    }

    public static void main(String[] args) throws InterruptedException {
        obj1  = new FinalizeGC();

        obj1 = null;
        System.gc();
        Thread.sleep(600);
        System.out.println("第一次自救成功:"+obj1);

        obj1 = null;
        System.gc();
        Thread.sleep(600);
        System.out.println("第二次自救失敗,不會再次執行finalize方法:"+obj1);
    }
}

View Code

測試結果:

 完美!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心