當(dāng)前位置:首頁(yè) > 技術(shù)學(xué)院 > 技術(shù)前線
[導(dǎo)讀]在Linux內(nèi)核中,網(wǎng)絡(luò)丟包是指由于網(wǎng)絡(luò)傳輸過(guò)程中出現(xiàn)問(wèn)題,導(dǎo)致數(shù)據(jù)包未能成功到達(dá)目的地。這可能由多種原因引起,包括網(wǎng)絡(luò)擁塞、硬件故障、錯(cuò)誤配置等。當(dāng)發(fā)生網(wǎng)絡(luò)丟包時(shí),應(yīng)用程序可能會(huì)受到影響,例如導(dǎo)致數(shù)據(jù)傳輸延遲或失敗。為了解決網(wǎng)絡(luò)丟包問(wèn)題,可以通過(guò)優(yōu)化網(wǎng)絡(luò)配置、增加帶寬、使用負(fù)載均衡等方法來(lái)提高網(wǎng)絡(luò)性能和穩(wěn)定性。

最近工作中遇到某個(gè)服務(wù)器應(yīng)用程序 UDP 丟包,在排查過(guò)程中查閱了很多資料,我在排查過(guò)程中基本都是通過(guò)使用 tcpdump 在出現(xiàn)問(wèn)題的各個(gè)環(huán)節(jié)上進(jìn)行抓包、分析在那個(gè)環(huán)節(jié)出現(xiàn)問(wèn)題、針對(duì)性去排查解決問(wèn)題,對(duì)癥下藥,最后終究能夠解決問(wèn)題。但是這種情況大多是因?yàn)榉?wù)本身的問(wèn)題,如果是環(huán)境問(wèn)題、操作系統(tǒng)、甚至硬件的問(wèn)題,可能從服務(wù)本身出發(fā)不能解決問(wèn)題,但是這篇文章另辟蹊徑,從外部環(huán)境分析可能丟包的原因,看完之后很受用。

一、問(wèn)題引入

在Linux內(nèi)核中,網(wǎng)絡(luò)丟包是指由于網(wǎng)絡(luò)傳輸過(guò)程中出現(xiàn)問(wèn)題,導(dǎo)致數(shù)據(jù)包未能成功到達(dá)目的地。這可能由多種原因引起,包括網(wǎng)絡(luò)擁塞、硬件故障、錯(cuò)誤配置等。當(dāng)發(fā)生網(wǎng)絡(luò)丟包時(shí),應(yīng)用程序可能會(huì)受到影響,例如導(dǎo)致數(shù)據(jù)傳輸延遲或失敗。為了解決網(wǎng)絡(luò)丟包問(wèn)題,可以通過(guò)優(yōu)化網(wǎng)絡(luò)配置、增加帶寬、使用負(fù)載均衡等方法來(lái)提高網(wǎng)絡(luò)性能和穩(wěn)定性。

Linux內(nèi)核網(wǎng)絡(luò)丟包工作原理主要涉及TCP/IP堆棧的管理,包括網(wǎng)絡(luò)設(shè)備接口、緩沖區(qū)管理和丟包決策。

網(wǎng)絡(luò)設(shè)備接口:每個(gè)網(wǎng)絡(luò)設(shè)備都有一個(gè)接收和發(fā)送緩沖區(qū),當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)時(shí),它們被放入接收緩沖區(qū),而當(dāng)需要發(fā)送數(shù)據(jù)包時(shí),從發(fā)送緩沖區(qū)獲取。如果接收或發(fā)送緩沖區(qū)滿(mǎn)了,進(jìn)一步的操作將導(dǎo)致丟包。緩沖區(qū)管理:Linux內(nèi)核為每個(gè)網(wǎng)絡(luò)接口維護(hù)一定大小的緩沖區(qū),用于暫時(shí)存儲(chǔ)數(shù)據(jù)包??梢酝ㄟ^(guò)/proc/sys/net/core/下的參數(shù)調(diào)整這些設(shè)置,例如netdev_max_backlog控制了在接收隊(duì)列滿(mǎn)時(shí),新進(jìn)入的數(shù)據(jù)包將被丟棄的速度。丟包決策:當(dāng)網(wǎng)絡(luò)設(shè)備因?yàn)橘Y源不足(如緩沖區(qū)滿(mǎn))而不能處理更多的數(shù)據(jù)時(shí),內(nèi)核必須采取某種策略來(lái)處理這些數(shù)據(jù)包。這通常涉及到丟棄數(shù)據(jù)包或者重新路由到另一個(gè)設(shè)備。以下是一些與丟包相關(guān)的內(nèi)核參數(shù)和配置:

net.core.netdev_max_backlog: 設(shè)備隊(duì)列的最大長(zhǎng)度,超過(guò)這個(gè)值將丟棄數(shù)據(jù)包。net.ipv4.tcp_drop_syn_data: 當(dāng)SYN數(shù)據(jù)包由于TCP端口不可用而被丟棄時(shí),是否立即響應(yīng)RST。net.core.rmem_default: 默認(rèn)的接收緩沖區(qū)大小。net.core.wmem_default: 默認(rèn)的發(fā)送緩沖區(qū)大小。net.core.rmem_max: 接收緩沖區(qū)的最大大小。net.core.wmem_max: 發(fā)送緩沖區(qū)的最大大小。當(dāng)網(wǎng)絡(luò)設(shè)備因?yàn)橘Y源限制(如網(wǎng)絡(luò)擁塞、硬件錯(cuò)誤或配置不當(dāng))無(wú)法處理所有到達(dá)的數(shù)據(jù)時(shí),可能會(huì)發(fā)生丟包。內(nèi)核通過(guò)多種策略來(lái)處理這些情況,例如通過(guò)NIC的錯(cuò)誤計(jì)數(shù)器監(jiān)控硬件問(wèn)題,通過(guò)調(diào)整TCP窗口大小和重傳策略來(lái)處理網(wǎng)絡(luò)擁塞,以及通過(guò)丟包預(yù)防措施(如TCP擁塞窗口管理)來(lái)減少丟包。

二、丟包原因分析

2.1UDP校驗(yàn)和錯(cuò)誤

(1)UDP校驗(yàn)和概述

UDP(用戶(hù)數(shù)據(jù)報(bào)協(xié)議)校驗(yàn)和是一種用于檢測(cè) UDP 數(shù)據(jù)報(bào)在傳輸過(guò)程中是否出現(xiàn)錯(cuò)誤的機(jī)制。發(fā)送方在構(gòu)建 UDP 數(shù)據(jù)報(bào)時(shí)計(jì)算校驗(yàn)和,并將其包含在數(shù)據(jù)報(bào)頭部。接收方在收到數(shù)據(jù)報(bào)后,重新計(jì)算校驗(yàn)和并與接收到的校驗(yàn)和進(jìn)行比較。如果兩者不匹配,就表明數(shù)據(jù)報(bào)在傳輸過(guò)程中可能出現(xiàn)了錯(cuò)誤,這個(gè) UDP 數(shù)據(jù)報(bào)就可能被丟棄。

UDP校驗(yàn)和錯(cuò)誤主要涉及到數(shù)據(jù)包的完整性和正確性驗(yàn)證。在UDP協(xié)議中,校驗(yàn)和用于確保數(shù)據(jù)的完整性,防止數(shù)據(jù)在傳輸過(guò)程中被修改或損壞。如果數(shù)據(jù)包的校驗(yàn)和計(jì)算結(jié)果與接收端計(jì)算的結(jié)果不匹配,接收端會(huì)認(rèn)為該數(shù)據(jù)包已損壞,因此可能會(huì)選擇丟棄該數(shù)據(jù)包,從而導(dǎo)致丟包現(xiàn)象。這種情況通常發(fā)生在以下幾種情況中:

?數(shù)據(jù)包在傳輸過(guò)程中被修改?:由于網(wǎng)絡(luò)不穩(wěn)定或其他原因,數(shù)據(jù)包在傳輸過(guò)程中可能被第三方修改,導(dǎo)致其內(nèi)容與原始數(shù)據(jù)不一致,進(jìn)而導(dǎo)致校驗(yàn)和不匹配。?網(wǎng)絡(luò)設(shè)備故障?:網(wǎng)絡(luò)設(shè)備(如路由器、交換機(jī)等)在處理數(shù)據(jù)包時(shí)可能出現(xiàn)故障,導(dǎo)致數(shù)據(jù)包的內(nèi)容被錯(cuò)誤地修改或損壞,從而影響校驗(yàn)和的計(jì)算結(jié)果。?發(fā)送端計(jì)算錯(cuò)誤?:在發(fā)送端計(jì)算校驗(yàn)和時(shí),如果計(jì)算過(guò)程出現(xiàn)錯(cuò)誤,也會(huì)導(dǎo)致接收端校驗(yàn)和不匹配,從而被認(rèn)為是錯(cuò)誤的數(shù)據(jù)包并被丟棄。解決UDP校驗(yàn)和錯(cuò)誤導(dǎo)致的丟包問(wèn)題,可以從以下幾個(gè)方面入手:

?檢查網(wǎng)絡(luò)設(shè)備?:確保網(wǎng)絡(luò)設(shè)備正常運(yùn)行,沒(méi)有故障或配置錯(cuò)誤,以減少數(shù)據(jù)包在傳輸過(guò)程中的損壞。?優(yōu)化網(wǎng)絡(luò)環(huán)境?:改善網(wǎng)絡(luò)條件,減少數(shù)據(jù)傳輸過(guò)程中的不穩(wěn)定因素,如使用更穩(wěn)定的網(wǎng)絡(luò)連接或增加冗余連接。?更新和修復(fù)軟件?:確保發(fā)送端和接收端的軟件都是最新版本,并且沒(méi)有已知的與校驗(yàn)和計(jì)算相關(guān)的錯(cuò)誤。?增加冗余校驗(yàn)?:在關(guān)鍵應(yīng)用中,可以考慮增加額外的校驗(yàn)機(jī)制,如使用奇偶校驗(yàn)或循環(huán)冗余校驗(yàn)(CRC),以提高數(shù)據(jù)的可靠性。通過(guò)上述措施,可以有效地減少因UDP校驗(yàn)和錯(cuò)誤導(dǎo)致的丟包現(xiàn)象,確保數(shù)據(jù)的完整性和正確性?

(2)案例場(chǎng)景

①網(wǎng)絡(luò)設(shè)備不兼容(案例詳情)

在一個(gè)混合網(wǎng)絡(luò)環(huán)境中,包含了多種不同品牌和型號(hào)的網(wǎng)絡(luò)設(shè)備,如路由器、交換機(jī)等。有一臺(tái) Linux 服務(wù)器通過(guò)這個(gè)網(wǎng)絡(luò)向多個(gè)客戶(hù)端發(fā)送 UDP 數(shù)據(jù)包。其中,部分較舊型號(hào)的路由器在轉(zhuǎn)發(fā) UDP 數(shù)據(jù)包時(shí),對(duì)校驗(yàn)和的處理存在兼容性問(wèn)題。

服務(wù)器發(fā)送的 UDP 數(shù)據(jù)包的校驗(yàn)和是按照標(biāo)準(zhǔn)算法計(jì)算的,但這些舊路由器在轉(zhuǎn)發(fā)過(guò)程中可能會(huì)修改數(shù)據(jù)包的某些字段(例如 IP 頭部的某些可選字段),而沒(méi)有正確更新 UDP 校驗(yàn)和。當(dāng)數(shù)據(jù)包到達(dá)客戶(hù)端時(shí),客戶(hù)端按照標(biāo)準(zhǔn)流程重新計(jì)算校驗(yàn)和,發(fā)現(xiàn)與接收到的校驗(yàn)和不匹配。

丟包現(xiàn)象及影響:客戶(hù)端會(huì)將這些校驗(yàn)和錯(cuò)誤的 UDP 數(shù)據(jù)包丟棄。對(duì)于依賴(lài) UDP 進(jìn)行數(shù)據(jù)傳輸?shù)膽?yīng)用程序,如某些實(shí)時(shí)監(jiān)控系統(tǒng)(通過(guò) UDP 發(fā)送監(jiān)控?cái)?shù)據(jù)),這會(huì)導(dǎo)致監(jiān)控?cái)?shù)據(jù)丟失,影響系統(tǒng)對(duì)被監(jiān)控對(duì)象狀態(tài)的準(zhǔn)確判斷。例如,可能會(huì)出現(xiàn)監(jiān)控畫(huà)面中的部分?jǐn)?shù)據(jù)缺失,或者對(duì)設(shè)備狀態(tài)的誤判,如將正常運(yùn)行的設(shè)備誤判為故障狀態(tài)。

排查方法:使用網(wǎng)絡(luò)監(jiān)測(cè)工具,如 Wireshark,在網(wǎng)絡(luò)中的關(guān)鍵節(jié)點(diǎn)(如路由器的端口)捕獲 UDP 數(shù)據(jù)包。檢查數(shù)據(jù)包在經(jīng)過(guò)網(wǎng)絡(luò)設(shè)備前后的變化,特別是校驗(yàn)和字段以及相關(guān)的 IP 頭部字段。查看網(wǎng)絡(luò)設(shè)備的日志,檢查是否有關(guān)于 UDP 數(shù)據(jù)包處理異常的記錄,例如是否有修改數(shù)據(jù)包但未正確更新校驗(yàn)和的情況。解決措施:如果發(fā)現(xiàn)是網(wǎng)絡(luò)設(shè)備的兼容性問(wèn)題,可以考慮升級(jí)設(shè)備的固件。許多網(wǎng)絡(luò)設(shè)備制造商都會(huì)定期發(fā)布固件更新,以解決已知的兼容性和錯(cuò)誤處理問(wèn)題。在無(wú)法立即升級(jí)固件的情況下,可以嘗試調(diào)整網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),繞過(guò)存在問(wèn)題的網(wǎng)絡(luò)設(shè)備。例如,使用備用路徑或者重新規(guī)劃網(wǎng)絡(luò)分區(qū)。②軟件實(shí)現(xiàn)缺陷(案例詳情)

一個(gè)基于 Linux 開(kāi)發(fā)的自定義網(wǎng)絡(luò)應(yīng)用程序,在實(shí)現(xiàn) UDP 數(shù)據(jù)包的構(gòu)建和發(fā)送時(shí),存在一個(gè)軟件缺陷。開(kāi)發(fā)人員在計(jì)算 UDP 校驗(yàn)和時(shí),錯(cuò)誤地使用了部分未初始化的數(shù)據(jù)進(jìn)行計(jì)算。

由于這個(gè)錯(cuò)誤,發(fā)送出去的 UDP 數(shù)據(jù)包的校驗(yàn)和是錯(cuò)誤的。當(dāng)這些數(shù)據(jù)包到達(dá)接收端(無(wú)論是在本地網(wǎng)絡(luò)中的其他設(shè)備還是通過(guò)互聯(lián)網(wǎng)連接的遠(yuǎn)程設(shè)備)時(shí),接收端檢測(cè)到校驗(yàn)和錯(cuò)誤。

丟包現(xiàn)象及影響:接收端按照 UDP 協(xié)議規(guī)范丟棄這些校驗(yàn)和錯(cuò)誤的數(shù)據(jù)包。對(duì)于這個(gè)自定義應(yīng)用程序,這可能會(huì)導(dǎo)致嚴(yán)重的功能問(wèn)題。例如,如果該應(yīng)用程序是一個(gè)在線游戲,UDP 數(shù)據(jù)包用于傳輸游戲中的角色位置、動(dòng)作等信息,丟包會(huì)導(dǎo)致游戲角色的動(dòng)作不連貫、位置出現(xiàn)瞬移等現(xiàn)象,嚴(yán)重影響游戲體驗(yàn)。

排查方法:對(duì)于自定義應(yīng)用程序,使用代碼調(diào)試工具,如 GDB,在發(fā)送 UDP 數(shù)據(jù)包的相關(guān)代碼段設(shè)置斷點(diǎn),檢查計(jì)算校驗(yàn)和時(shí)使用的數(shù)據(jù)來(lái)源和計(jì)算過(guò)程是否正確。檢查應(yīng)用程序的日志,看是否有關(guān)于 UDP 數(shù)據(jù)包發(fā)送失敗或者校驗(yàn)和錯(cuò)誤的提示信息。解決措施:如果是代碼實(shí)現(xiàn)缺陷,修復(fù)計(jì)算 UDP 校驗(yàn)和的代碼錯(cuò)誤,確保使用正確的數(shù)據(jù)進(jìn)行計(jì)算。在應(yīng)用程序開(kāi)發(fā)過(guò)程中,增加更嚴(yán)格的測(cè)試流程,特別是針對(duì) UDP 數(shù)據(jù)包的完整性測(cè)試,包括校驗(yàn)和的計(jì)算和驗(yàn)證。③硬件故障導(dǎo)致數(shù)據(jù)損壞(案例詳情)

在一個(gè)數(shù)據(jù)中心里,有一臺(tái) Linux 服務(wù)器的網(wǎng)卡出現(xiàn)了硬件故障。故障網(wǎng)卡在發(fā)送 UDP 數(shù)據(jù)包時(shí),可能會(huì)隨機(jī)改變數(shù)據(jù)包中的某些位。

這些被改變的位會(huì)導(dǎo)致 UDP 校驗(yàn)和計(jì)算錯(cuò)誤。例如,一個(gè)字節(jié)中的某一位從 0 變?yōu)?1 或者反之,就會(huì)使基于整個(gè) UDP 數(shù)據(jù)報(bào)計(jì)算的校驗(yàn)和發(fā)生變化。當(dāng)這些數(shù)據(jù)包被發(fā)送到網(wǎng)絡(luò)中并到達(dá)接收端時(shí),接收端檢測(cè)到校驗(yàn)和不匹配。

丟包現(xiàn)象及影響:接收端會(huì)丟棄這些校驗(yàn)和錯(cuò)誤的 UDP 數(shù)據(jù)包。對(duì)于數(shù)據(jù)中心中依賴(lài) UDP 進(jìn)行數(shù)據(jù)交互的服務(wù),如某些分布式文件系統(tǒng)(使用 UDP 進(jìn)行節(jié)點(diǎn)間的元數(shù)據(jù)通信),這會(huì)導(dǎo)致文件系統(tǒng)的元數(shù)據(jù)傳輸失敗。可能會(huì)出現(xiàn)文件無(wú)法正確定位、文件共享出現(xiàn)問(wèn)題等情況,影響整個(gè)文件系統(tǒng)的正常運(yùn)行。

排查方法:使用硬件診斷工具對(duì)網(wǎng)卡進(jìn)行檢測(cè)。許多服務(wù)器主板制造商提供了專(zhuān)門(mén)的硬件診斷軟件,可以檢測(cè)網(wǎng)卡等硬件組件的健康狀況。觀察網(wǎng)卡的工作狀態(tài)指示燈,如果指示燈顯示異常(如閃爍頻率異?;蛘哳伾惓?,可能提示網(wǎng)卡存在故障。交換網(wǎng)卡端口或者更換網(wǎng)線,排除網(wǎng)線或端口故障導(dǎo)致數(shù)據(jù)損壞的可能性。如果問(wèn)題仍然存在,很可能是網(wǎng)卡本身的問(wèn)題。解決措施:如果確定是網(wǎng)卡硬件故障,更換網(wǎng)卡。在更換網(wǎng)卡后,重新測(cè)試 UDP 數(shù)據(jù)包的傳輸,確保校驗(yàn)和錯(cuò)誤不再出現(xiàn)。2.2防火墻開(kāi)啟

(1)概述

防火墻是一種網(wǎng)絡(luò)安全設(shè)備或軟件,用于監(jiān)控和控制網(wǎng)絡(luò)流量,允許或阻止特定類(lèi)型的網(wǎng)絡(luò)連接。當(dāng)防火墻規(guī)則配置不當(dāng)時(shí),可能會(huì)導(dǎo)致合法的數(shù)據(jù)包被誤拒,從而引起丟包現(xiàn)象。防火墻開(kāi)啟可能導(dǎo)致丟包的原因主要包括防火墻配置不當(dāng)和連接跟蹤表溢出:

?防火墻配置不當(dāng)?:如果防火墻配置了DROP特定端口范圍或錯(cuò)誤的規(guī)則,可能會(huì)導(dǎo)致正常的網(wǎng)絡(luò)通信被阻斷,從而造成丟包。例如,如果防火墻的配置導(dǎo)致某些必要的端口被阻止,那么通過(guò)這些端口的通信將會(huì)被中斷,導(dǎo)致數(shù)據(jù)包無(wú)法到達(dá)目的地,從而產(chǎn)生丟包現(xiàn)象?。

?連接跟蹤表溢出?:當(dāng)服務(wù)器處理的連接過(guò)多時(shí),連接跟蹤表(nf_conntrack)可能會(huì)被打滿(mǎn),導(dǎo)致服務(wù)器丟棄新建連接的數(shù)據(jù)包。這通常發(fā)生在服務(wù)器處理大量并發(fā)連接時(shí),如果連接跟蹤表溢出,即使是正常的業(yè)務(wù)流量也可能導(dǎo)致丟包。解決這一問(wèn)題的方法包括調(diào)整nf_conntrack的參數(shù),如增加nf_conntrack_max的值以擴(kuò)大連接跟蹤表的大小,或者調(diào)整nf_conntrack_tcp_timeout_established來(lái)縮短ESTABLISHED狀態(tài)連接的超時(shí)時(shí)間,從而減少因連接跟蹤表溢出而導(dǎo)致的丟包?。

(2)案例場(chǎng)景

①基于 iptables 的本地服務(wù)訪問(wèn)受阻

案例詳情:有一個(gè)基于 Linux 的小型辦公網(wǎng)絡(luò),內(nèi)部運(yùn)行著一個(gè)自定義的文件共享服務(wù),使用自定義端口(例如 12345)。管理員為了增強(qiáng)網(wǎng)絡(luò)安全,啟用了 iptables 防火墻。在配置 iptables 規(guī)則時(shí),管理員采用了默認(rèn)的嚴(yán)格策略,只允許常見(jiàn)的服務(wù)端口(如 HTTP 的 80 端口、SSH 的 22 端口等)的流量通過(guò),而忘記添加規(guī)則允許文件共享服務(wù)端口 12345 的流量。

丟包現(xiàn)象及影響:當(dāng)辦公室內(nèi)的其他員工試圖訪問(wèn)該文件共享服務(wù)時(shí),他們發(fā)出的數(shù)據(jù)包被 iptables 防火墻阻止。從網(wǎng)絡(luò)抓包工具(如 Wireshark)可以看到,目標(biāo)端口為 12345 的 UDP 或 TCP 數(shù)據(jù)包在到達(dá)運(yùn)行文件共享服務(wù)的 Linux 服務(wù)器時(shí)被直接丟棄。這導(dǎo)致員工無(wú)法正常訪問(wèn)文件共享服務(wù),影響了辦公效率,因?yàn)樗麄儫o(wú)法獲取共享文件中的重要資料或進(jìn)行文件協(xié)作。

②遠(yuǎn)程數(shù)據(jù)庫(kù)連接被拒

案例詳情:一家公司的業(yè)務(wù)應(yīng)用依賴(lài)于一個(gè)遠(yuǎn)程的 MySQL 數(shù)據(jù)庫(kù)服務(wù)器,該服務(wù)器運(yùn)行在 Linux 系統(tǒng)上且開(kāi)啟了 iptables 防火墻。數(shù)據(jù)庫(kù)服務(wù)器配置為接受來(lái)自特定 IP 范圍(公司內(nèi)部辦公網(wǎng)絡(luò) IP 段)的連接,使用默認(rèn)的 MySQL 端口 3306。由于服務(wù)器進(jìn)行了安全升級(jí),防火墻規(guī)則被重新調(diào)整。在調(diào)整過(guò)程中,新的規(guī)則雖然允許了大部分常見(jiàn)服務(wù)的流量,但由于配置失誤,針對(duì) MySQL 端口 3306 的入站規(guī)則被錯(cuò)誤地刪除了。

丟包現(xiàn)象及影響:公司內(nèi)部的業(yè)務(wù)應(yīng)用在嘗試連接到遠(yuǎn)程 MySQL 數(shù)據(jù)庫(kù)時(shí),發(fā)送的連接請(qǐng)求數(shù)據(jù)包(目標(biāo)端口為 3306)被防火墻丟棄。從數(shù)據(jù)庫(kù)服務(wù)器的日志中可以看到,沒(méi)有接收到來(lái)自?xún)?nèi)部網(wǎng)絡(luò)的連接嘗試記錄,而業(yè)務(wù)應(yīng)用端則顯示數(shù)據(jù)庫(kù)連接失敗。這使得業(yè)務(wù)應(yīng)用無(wú)法正常運(yùn)行,例如無(wú)法查詢(xún)或更新數(shù)據(jù)庫(kù)中的客戶(hù)信息、訂單數(shù)據(jù)等,嚴(yán)重影響了公司的業(yè)務(wù)流程。

③多端口服務(wù)部分端口受阻

案例詳情:有一個(gè)基于 Linux 的多媒體服務(wù)器,它運(yùn)行著多個(gè)網(wǎng)絡(luò)服務(wù),包括視頻流服務(wù)(使用端口 554 和 8554)和音頻流服務(wù)(使用端口 1935)。服務(wù)器開(kāi)啟了防火墻,并且管理員配置了一些規(guī)則來(lái)保護(hù)服務(wù)器。在一次規(guī)則更新中,管理員誤將允許端口 8554 流量的規(guī)則刪除了,同時(shí)保留了允許端口 554 和 1935 流量的規(guī)則。

丟包現(xiàn)象及影響:當(dāng)用戶(hù)嘗試訪問(wèn)使用端口 8554 的視頻流服務(wù)時(shí),發(fā)送到該端口的數(shù)據(jù)包被防火墻丟棄。在用戶(hù)端,視頻播放軟件會(huì)顯示無(wú)法連接到視頻源或者加載視頻失敗。而對(duì)于其他使用端口 554 和 1935 的服務(wù),仍然可以正常運(yùn)行,這就導(dǎo)致了多媒體服務(wù)的部分功能失效,影響了用戶(hù)的觀看體驗(yàn)。

(3)排查與解決措施

排查方法

檢查防火墻規(guī)則:對(duì)于 iptables 防火墻,可以使用命令 “iptables -L -n -v” 查看當(dāng)前的防火墻規(guī)則列表。檢查是否存在針對(duì)目標(biāo)服務(wù)端口的入站(對(duì)于服務(wù)器接收流量)或出站(對(duì)于客戶(hù)端發(fā)送流量)規(guī)則。對(duì)于其他類(lèi)型的防火墻(如 firewalld),也有相應(yīng)的命令或管理界面來(lái)查看規(guī)則設(shè)置。查看日志記錄:查看防火墻的日志記錄(iptables 可以通過(guò)配置將日志輸出到系統(tǒng)日志,如 syslog),查找是否有關(guān)于數(shù)據(jù)包被拒絕的記錄。日志中通常會(huì)顯示被拒數(shù)據(jù)包的源 IP、目標(biāo) IP、端口以及協(xié)議等信息。同時(shí)查看相關(guān)服務(wù)(如文件共享服務(wù)、數(shù)據(jù)庫(kù)服務(wù)等)的日志,看是否有連接嘗試但未成功的記錄,以確定是否是防火墻導(dǎo)致的丟包。解決措施

調(diào)整防火墻規(guī)則:如果發(fā)現(xiàn)是防火墻規(guī)則導(dǎo)致的丟包,對(duì)于 iptables,可以使用 “iptables -A” 命令添加允許特定端口流量的規(guī)則。例如,對(duì)于上述文件共享服務(wù)端口 12345,如果是 UDP 協(xié)議,可以添加規(guī)則 “iptables -A INPUT -p udp --dport 12345 -j ACCEPT” 和 “iptables -A OUTPUT -p udp --sport 12345 -j ACCEPT”。如果使用 firewalld,可以使用相應(yīng)的命令或管理界面來(lái)添加服務(wù)或端口的允許規(guī)則。規(guī)則備份與審核:在對(duì)防火墻規(guī)則進(jìn)行任何更改之前,建議先備份當(dāng)前的規(guī)則設(shè)置。這樣在出現(xiàn)問(wèn)題時(shí)可以方便地恢復(fù)到之前的狀態(tài)。在設(shè)置新的防火墻規(guī)則時(shí),進(jìn)行嚴(yán)格的審核流程,確保規(guī)則的準(zhǔn)確性和完整性??梢灾贫ㄒ粋€(gè)規(guī)則模板,明確不同類(lèi)型服務(wù)所需的規(guī)則,避免因人為失誤導(dǎo)致的丟包問(wèn)題。2.3rp_filter 開(kāi)啟

(1)概述

rp_filter(反向路徑過(guò)濾)是 Linux 內(nèi)核中的一個(gè)網(wǎng)絡(luò)功能,用于驗(yàn)證接收到的數(shù)據(jù)包的源 IP 地址是否可達(dá)。其目的是防止 IP 欺騙攻擊,通過(guò)檢查數(shù)據(jù)包的反向路徑(從接收接口到源地址的路徑)來(lái)判斷數(shù)據(jù)包的合法性。當(dāng) rp_filter 開(kāi)啟時(shí),如果數(shù)據(jù)包的反向路徑不匹配,就可能會(huì)被丟棄。

當(dāng) rp_filter 設(shè)置為 1 時(shí),啟用了接收包過(guò)濾,它會(huì)檢查進(jìn)入的 IP 包的源地址是否與它的一個(gè)接口相關(guān)聯(lián),如果不是,則默認(rèn)行為是丟棄該包。當(dāng)你遇到因 rp_filter 導(dǎo)致的丟包問(wèn)題時(shí),可能是因?yàn)槟愕木W(wǎng)絡(luò)配置不正確,或者你正在嘗試進(jìn)行 NAT 轉(zhuǎn)發(fā)或在不同網(wǎng)絡(luò)之間路由流量。

(2)案例場(chǎng)景

①多網(wǎng)卡服務(wù)器的復(fù)雜網(wǎng)絡(luò)拓?fù)?

案例詳情:考慮一個(gè)具有多個(gè)網(wǎng)卡的 Linux 服務(wù)器,例如有兩個(gè)網(wǎng)卡,eth0 連接到內(nèi)部局域網(wǎng)(192.168.1.0/24),eth1 連接到外部網(wǎng)絡(luò)(例如 10.0.0.0/24)。在服務(wù)器上開(kāi)啟了 rp_filter 功能。內(nèi)部局域網(wǎng)中的一臺(tái)客戶(hù)端(192.168.1.100)通過(guò) NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)設(shè)備訪問(wèn)外部網(wǎng)絡(luò),然后外部網(wǎng)絡(luò)中的一臺(tái)服務(wù)器(10.0.0.100)回復(fù)該客戶(hù)端的請(qǐng)求。由于 NAT 設(shè)備的存在,回復(fù)數(shù)據(jù)包的源 IP(10.0.0.100)對(duì)于連接到外部網(wǎng)絡(luò)的 eth1 是可到達(dá)的,但按照 rp_filter 的檢查邏輯,從 eth1 收到的這個(gè)數(shù)據(jù)包聲稱(chēng)來(lái)自 192.168.1.100(客戶(hù)端的真實(shí) IP),其反向路徑(從 eth1 到 192.168.1.100)看起來(lái)是不合理的,因?yàn)?eth1 直接連接的是外部網(wǎng)絡(luò)而不是內(nèi)部局域網(wǎng)。

丟包現(xiàn)象及影響:外部服務(wù)器(10.0.0.100)發(fā)送給內(nèi)部客戶(hù)端(192.168.1.100)的回復(fù)數(shù)據(jù)包被 Linux 服務(wù)器丟棄。這會(huì)導(dǎo)致客戶(hù)端的請(qǐng)求無(wú)法得到正常響應(yīng),例如,如果客戶(hù)端正在進(jìn)行網(wǎng)頁(yè)瀏覽,可能會(huì)出現(xiàn)頁(yè)面加載不完全或者長(zhǎng)時(shí)間等待無(wú)響應(yīng)的情況,影響用戶(hù)體驗(yàn)。

②虛擬機(jī)網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò)交互

案例詳情:在一臺(tái)運(yùn)行多個(gè)虛擬機(jī)的宿主機(jī)上,宿主機(jī)為 Linux 系統(tǒng)且開(kāi)啟了 rp_filter。虛擬機(jī)通過(guò)虛擬網(wǎng)絡(luò)接口與宿主機(jī)網(wǎng)絡(luò)相連。假設(shè)虛擬機(jī) A 的 IP 地址為 172.16.1.10,宿主機(jī)有一個(gè)網(wǎng)絡(luò)接口 eth0 連接到外部網(wǎng)絡(luò)。當(dāng)虛擬機(jī) A 與外部網(wǎng)絡(luò)中的某臺(tái)設(shè)備(例如 IP 為 10.0.0.100)進(jìn)行通信時(shí),外部設(shè)備回復(fù)虛擬機(jī) A 的數(shù)據(jù)包會(huì)先到達(dá)宿主機(jī)。由于虛擬機(jī)的網(wǎng)絡(luò)設(shè)置和 rp_filter 的作用,宿主機(jī)可能會(huì)誤判數(shù)據(jù)包的反向路徑。例如,回復(fù)數(shù)據(jù)包從 eth0 進(jìn)入宿主機(jī),但 rp_filter 按照其規(guī)則檢查發(fā)現(xiàn)從 eth0 到虛擬機(jī) A 的 IP 地址 172.16.1.10 的反向路徑不符合預(yù)期(可能因?yàn)樗拗鳈C(jī)內(nèi)部的虛擬網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)被 rp_filter 錯(cuò)誤解讀)。

丟包現(xiàn)象及影響:外部設(shè)備發(fā)送給虛擬機(jī) A 的回復(fù)數(shù)據(jù)包被宿主機(jī)丟棄。這會(huì)導(dǎo)致虛擬機(jī) A 中的網(wǎng)絡(luò)應(yīng)用無(wú)法正常工作,例如在虛擬機(jī) A 中運(yùn)行的網(wǎng)絡(luò)服務(wù)無(wú)法接收外部請(qǐng)求的響應(yīng),或者從虛擬機(jī) A 向外部發(fā)送請(qǐng)求后無(wú)法獲取正確的反饋,影響虛擬機(jī)的網(wǎng)絡(luò)功能和使用體驗(yàn)。

③網(wǎng)絡(luò)拓?fù)渥兏蟮倪z留問(wèn)題

案例詳情:某企業(yè)的網(wǎng)絡(luò)進(jìn)行了拓?fù)浣Y(jié)構(gòu)的調(diào)整,原來(lái)通過(guò)一個(gè)防火墻直接連接到內(nèi)部網(wǎng)絡(luò)的 Linux 服務(wù)器,現(xiàn)在增加了一個(gè)中間網(wǎng)絡(luò)設(shè)備(如路由器)進(jìn)行網(wǎng)絡(luò)隔離和優(yōu)化。在網(wǎng)絡(luò)變更之前,服務(wù)器上的 rp_filter 功能已經(jīng)開(kāi)啟且運(yùn)行正常。但網(wǎng)絡(luò)拓?fù)渥兏螅捎谛碌木W(wǎng)絡(luò)路徑和舊的 rp_filter 設(shè)置不再適配,例如,從新路由器連接到服務(wù)器的網(wǎng)絡(luò)接口收到來(lái)自?xún)?nèi)部網(wǎng)絡(luò)其他設(shè)備的數(shù)據(jù)包時(shí),rp_filter 按照舊的反向路徑邏輯進(jìn)行檢查,認(rèn)為這些數(shù)據(jù)包的反向路徑不合理,因?yàn)樗鼪](méi)有考慮到新添加的路由器。

丟包現(xiàn)象及影響內(nèi)部網(wǎng)絡(luò)設(shè)備發(fā)送給服務(wù)器的數(shù)據(jù)包被丟棄,導(dǎo)致服務(wù)器無(wú)法與內(nèi)部網(wǎng)絡(luò)中的部分設(shè)備正常通信。這可能會(huì)影響到服務(wù)器上運(yùn)行的各種網(wǎng)絡(luò)服務(wù),如文件共享服務(wù)無(wú)法被內(nèi)部用戶(hù)訪問(wèn),或者數(shù)據(jù)庫(kù)服務(wù)器無(wú)法接收來(lái)自?xún)?nèi)部應(yīng)用程序的連接請(qǐng)求,從而影響企業(yè)的業(yè)務(wù)流程。

(3)排查與解決措施

(一)排查方法

檢查 rp_filter 設(shè)置值:在 Linux 系統(tǒng)中,可以使用命令 “sysctl -a | grep rp_filter” 來(lái)查看 rp_filter 的當(dāng)前設(shè)置值。rp_filter 可以有三個(gè)值:0、1、2。值為 0 表示不進(jìn)行源地址驗(yàn)證,1 表示嚴(yán)格模式(按照接收接口檢查反向路徑),2 表示寬松模式(按照最優(yōu)路由檢查反向路徑)。了解當(dāng)前設(shè)置有助于判斷是否是 rp_filter 設(shè)置導(dǎo)致的丟包。網(wǎng)絡(luò)路徑跟蹤與分析:使用工具如 traceroute 或 mtr 來(lái)跟蹤數(shù)據(jù)包的網(wǎng)絡(luò)路徑。對(duì)于出現(xiàn)丟包的通信雙方,分別從源端和目的端進(jìn)行路徑跟蹤,查看數(shù)據(jù)包在網(wǎng)絡(luò)中的實(shí)際傳輸路徑。比較接收端的網(wǎng)絡(luò)接口和 rp_filter 預(yù)期的反向路徑,確定是否存在路徑不匹配的情況。檢查網(wǎng)絡(luò)拓?fù)浜徒涌谛畔ⅲ菏褂妹钊?“ip addr” 查看服務(wù)器的網(wǎng)絡(luò)接口信息,包括 IP 地址、子網(wǎng)掩碼等。同時(shí),繪制準(zhǔn)確的網(wǎng)絡(luò)拓?fù)鋱D,明確各個(gè)設(shè)備之間的連接關(guān)系和網(wǎng)絡(luò)路徑,以便分析 rp_filter 是否因?yàn)榫W(wǎng)絡(luò)拓?fù)涞膹?fù)雜性而誤判數(shù)據(jù)包的反向路徑。(二)解決措施

調(diào)整 rp_filter 設(shè)置值:如果確定是 rp_filter 導(dǎo)致的丟包,可以根據(jù)實(shí)際情況調(diào)整其設(shè)置值。如果網(wǎng)絡(luò)拓?fù)浔容^復(fù)雜且存在多網(wǎng)卡、NAT 或虛擬機(jī)等情況,將 rp_filter 設(shè)置為 2(寬松模式)可能會(huì)減少誤判??梢酝ㄟ^(guò)編輯 “/etc/sysctl.conf” 文件,添加或修改 “net.ipv4.conf.all.rp_filter = 2” 和 “net.ipv4.conf.eth0.rp_filter = 2”(針對(duì) eth0 接口,如果有其他接口也需相應(yīng)修改),然后使用命令 “sysctl -p” 使設(shè)置生效。重新評(píng)估網(wǎng)絡(luò)拓?fù)浜桶踩呗裕涸谡{(diào)整 rp_filter 設(shè)置的同時(shí),重新評(píng)估網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和安全策略。如果網(wǎng)絡(luò)拓?fù)浒l(fā)生了變化,可能需要更新防火墻規(guī)則、路由表等其他網(wǎng)絡(luò)配置,以確保網(wǎng)絡(luò)安全和數(shù)據(jù)包的正常傳輸。例如,在網(wǎng)絡(luò)拓?fù)渥兏?,重新配置防火墻的訪問(wèn)控制規(guī)則,使其適應(yīng)新的網(wǎng)絡(luò)路徑和設(shè)備連接關(guān)系。2.4系統(tǒng)緩沖區(qū)滿(mǎn)

(1)概述

在Linux 系統(tǒng)中,網(wǎng)絡(luò)緩沖區(qū)用于臨時(shí)存儲(chǔ)網(wǎng)絡(luò)接收和發(fā)送的數(shù)據(jù)。當(dāng)系統(tǒng)緩沖區(qū)滿(mǎn)時(shí),新到達(dá)的數(shù)據(jù)包將無(wú)處存放,從而導(dǎo)致丟包現(xiàn)象。緩沖區(qū)滿(mǎn)可能是由于網(wǎng)絡(luò)流量突發(fā)、應(yīng)用程序處理速度慢或者緩沖區(qū)設(shè)置過(guò)小等原因造成的。

當(dāng)系統(tǒng)緩沖區(qū)滿(mǎn)時(shí),新的數(shù)據(jù)無(wú)法被及時(shí)處理,從而導(dǎo)致數(shù)據(jù)包的丟失。這種情況通常發(fā)生在寫(xiě)入速度快于讀取速度的情況下,尤其是在處理網(wǎng)絡(luò)數(shù)據(jù)時(shí)。例如,在Ring Buffer(環(huán)形緩沖區(qū))溢出的情境中,如果寫(xiě)入數(shù)據(jù)的速度超過(guò)了緩沖區(qū)能夠處理的速度,就會(huì)導(dǎo)致數(shù)據(jù)覆蓋之前的存儲(chǔ)內(nèi)容,從而造成數(shù)據(jù)包的丟失。此外,網(wǎng)絡(luò)發(fā)包頻率過(guò)快,超出內(nèi)核/驅(qū)動(dòng)緩沖區(qū)的承載能力,也是導(dǎo)致丟包的一個(gè)重要原因。這種情況下,即使數(shù)據(jù)包被發(fā)送,但由于緩沖區(qū)已滿(mǎn),它們也無(wú)法被正確處理或傳輸,從而導(dǎo)致丟包現(xiàn)象的發(fā)生?。

為了解決這一問(wèn)題,可以采取多種措施。首先,可以在系統(tǒng)層面和程序?qū)用孢M(jìn)行調(diào)優(yōu),例如通過(guò)調(diào)整網(wǎng)卡緩沖區(qū)的設(shè)置來(lái)優(yōu)化數(shù)據(jù)傳輸效率。具體來(lái)說(shuō),可以通過(guò)設(shè)置接收緩沖區(qū)和發(fā)送緩沖區(qū)的大小來(lái)提高數(shù)據(jù)處理的效率,避免緩沖區(qū)溢出導(dǎo)致的丟包問(wèn)題?。此外,對(duì)于硬件和網(wǎng)絡(luò)設(shè)備的配置也是關(guān)鍵,例如調(diào)整端口速率、優(yōu)化網(wǎng)絡(luò)設(shè)備的配置等,以確保數(shù)據(jù)傳輸?shù)男屎头€(wěn)定性?。

(2)案例場(chǎng)景

①高并發(fā)網(wǎng)絡(luò)流量突發(fā)

案例詳情:有一個(gè)基于 Linux 服務(wù)器的 Web 應(yīng)用,在促銷(xiāo)活動(dòng)期間,網(wǎng)站流量突然大幅增加。大量用戶(hù)同時(shí)訪問(wèn)網(wǎng)站,向服務(wù)器發(fā)送 HTTP 請(qǐng)求。服務(wù)器的 TCP 接收緩沖區(qū)大小設(shè)置為默認(rèn)值,沒(méi)有根據(jù)可能的流量高峰進(jìn)行調(diào)整。由于大量的 HTTP 請(qǐng)求數(shù)據(jù)包快速涌入,服務(wù)器的接收緩沖區(qū)很快被填滿(mǎn)。

丟包現(xiàn)象及影響:新到達(dá)的 HTTP 請(qǐng)求數(shù)據(jù)包因?yàn)闆](méi)有可用的緩沖區(qū)空間而被丟棄。這導(dǎo)致部分用戶(hù)的請(qǐng)求無(wú)法被服務(wù)器接收,在用戶(hù)端表現(xiàn)為網(wǎng)頁(yè)無(wú)法加載或者加載緩慢。從服務(wù)器的網(wǎng)絡(luò)監(jiān)控工具(如 netstat)可以看到接收隊(duì)列中有大量的連接處于等待狀態(tài),并且丟包率逐漸上升。對(duì)于企業(yè)來(lái)說(shuō),這可能會(huì)導(dǎo)致潛在客戶(hù)的流失,影響業(yè)務(wù)的正常開(kāi)展。

②慢速應(yīng)用程序處理

案例詳情:某企業(yè)內(nèi)部有一個(gè)基于 Linux 的數(shù)據(jù)庫(kù)服務(wù)器,同時(shí)運(yùn)行著一個(gè)數(shù)據(jù)處理應(yīng)用程序。這個(gè)應(yīng)用程序從數(shù)據(jù)庫(kù)中讀取大量數(shù)據(jù)進(jìn)行復(fù)雜的計(jì)算和分析。由于應(yīng)用程序的算法優(yōu)化不足,處理速度較慢。數(shù)據(jù)庫(kù)服務(wù)器不斷接收來(lái)自客戶(hù)端的查詢(xún)請(qǐng)求,這些請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)包被存儲(chǔ)在接收緩沖區(qū)中。但是,由于應(yīng)用程序不能及時(shí)從緩沖區(qū)讀取數(shù)據(jù)進(jìn)行處理,導(dǎo)致緩沖區(qū)中的數(shù)據(jù)不斷堆積,最終緩沖區(qū)被填滿(mǎn)。

丟包現(xiàn)象及影響:新到達(dá)的數(shù)據(jù)庫(kù)查詢(xún)請(qǐng)求數(shù)據(jù)包被丟棄。在客戶(hù)端,表現(xiàn)為數(shù)據(jù)庫(kù)查詢(xún)操作超時(shí)或者返回錯(cuò)誤結(jié)果。這會(huì)影響企業(yè)內(nèi)部員工對(duì)數(shù)據(jù)的正常使用,例如財(cái)務(wù)人員無(wú)法及時(shí)獲取財(cái)務(wù)報(bào)表數(shù)據(jù),研發(fā)人員無(wú)法查詢(xún)項(xiàng)目相關(guān)的技術(shù)資料等,從而影響整個(gè)企業(yè)的工作效率。

③UDP 接收緩沖區(qū)過(guò)小

案例詳情:一個(gè)基于 UDP 協(xié)議的實(shí)時(shí)監(jiān)控系統(tǒng)部署在 Linux 設(shè)備上。該系統(tǒng)用于接收來(lái)自多個(gè)監(jiān)控設(shè)備(如攝像頭、傳感器等)發(fā)送的 UDP 數(shù)據(jù)包,以監(jiān)控環(huán)境狀態(tài)。由于 UDP 接收緩沖區(qū)在系統(tǒng)安裝時(shí)被設(shè)置為一個(gè)較小的值,而監(jiān)控設(shè)備發(fā)送數(shù)據(jù)的頻率相對(duì)較高。隨著時(shí)間的推移,UDP 接收緩沖區(qū)很快就被填滿(mǎn)。

丟包現(xiàn)象及影響:新到達(dá)的 UDP 數(shù)據(jù)包被丟棄。在監(jiān)控系統(tǒng)中,這會(huì)導(dǎo)致監(jiān)控?cái)?shù)據(jù)的丟失,例如可能會(huì)出現(xiàn)監(jiān)控畫(huà)面的部分信息缺失或者傳感器數(shù)據(jù)的不連續(xù)。對(duì)于安全監(jiān)控場(chǎng)景,這可能會(huì)錯(cuò)過(guò)一些重要的安全事件,如入侵檢測(cè)的漏報(bào)等情況,對(duì)安全防范工作產(chǎn)生嚴(yán)重影響。

(3)排查與解決措施

(一)排查方法

檢查緩沖區(qū)使用情況:使用命令 “netstat -s” 查看網(wǎng)絡(luò)統(tǒng)計(jì)信息,特別關(guān)注接收緩沖區(qū)(如 TCP 接收隊(duì)列)和發(fā)送緩沖區(qū)(如 TCP 發(fā)送隊(duì)列)的溢出情況。對(duì)于 UDP,可以查看 “UDP receive errors” 等相關(guān)指標(biāo),以確定是否存在緩沖區(qū)滿(mǎn)導(dǎo)致的丟包。使用工具如 sar(System Activity Reporter)來(lái)監(jiān)測(cè)系統(tǒng)緩沖區(qū)在一段時(shí)間內(nèi)的使用情況,包括緩沖區(qū)的大小、占用率等信息。

分析應(yīng)用程序性能:對(duì)于懷疑是由于應(yīng)用程序處理速度慢導(dǎo)致緩沖區(qū)滿(mǎn)的情況,可以使用性能分析工具,如 perf 或 oprofile。這些工具可以幫助確定應(yīng)用程序中哪些函數(shù)或代碼段消耗了大量的時(shí)間,從而找到性能瓶頸。查看應(yīng)用程序的日志,看是否有關(guān)于數(shù)據(jù)處理緩慢或者內(nèi)存使用過(guò)度的提示信息。

(二)解決措施

調(diào)整緩沖區(qū)大小:對(duì)于 TCP 緩沖區(qū),可以通過(guò)修改內(nèi)核參數(shù)來(lái)調(diào)整大小。例如,可以編輯 “/etc/sysctl.conf” 文件,添加或修改相關(guān)參數(shù)。對(duì)于接收緩沖區(qū),可以設(shè)置 “net.ipv4.tcp_rmem” 參數(shù),對(duì)于發(fā)送緩沖區(qū),可以設(shè)置 “net.ipv4.tcp_wmem” 參數(shù)。調(diào)整后使用命令 “sysctl -p” 使設(shè)置生效。對(duì)于 UDP 接收緩沖區(qū),可以使用命令 “sysctl -w net.core.rmem_max=” 和 “sysctl -w net.core.rmem_default=” 來(lái)增加 UDP 接收緩沖區(qū)的最大值和默認(rèn)值。

優(yōu)化應(yīng)用程序性能:如果是應(yīng)用程序性能問(wèn)題導(dǎo)致緩沖區(qū)滿(mǎn),可以對(duì)應(yīng)用程序進(jìn)行代碼優(yōu)化。例如,優(yōu)化算法以提高數(shù)據(jù)處理速度,減少不必要的內(nèi)存占用,或者采用多線程 / 多進(jìn)程技術(shù)來(lái)提高并發(fā)處理能力。合理安排應(yīng)用程序的資源分配,如調(diào)整數(shù)據(jù)庫(kù)連接池的大小,確保在高負(fù)載情況下能夠高效運(yùn)行。同時(shí),定期對(duì)應(yīng)用程序進(jìn)行性能測(cè)試,以發(fā)現(xiàn)并解決潛在的性能問(wèn)題。

2.5應(yīng)用程序性能問(wèn)題

(1)概述及原理

當(dāng)應(yīng)用程序存在性能問(wèn)題時(shí),可能無(wú)法及時(shí)處理接收到的網(wǎng)絡(luò)數(shù)據(jù)包,導(dǎo)致數(shù)據(jù)包在應(yīng)用層的緩沖區(qū)堆積。一旦緩沖區(qū)滿(mǎn),新到達(dá)的數(shù)據(jù)包就會(huì)被丟棄,從而造成網(wǎng)絡(luò)丟包現(xiàn)象。這種性能問(wèn)題可能源于多種因素,如算法效率低下、資源管理不善(如內(nèi)存泄漏、文件描述符耗盡)或者高并發(fā)處理能力不足等。

丟包的原因主要包括網(wǎng)絡(luò)擁塞、硬件故障、軟件錯(cuò)誤、信號(hào)干擾等。?

?網(wǎng)絡(luò)擁塞?:當(dāng)網(wǎng)絡(luò)中的數(shù)據(jù)流量超過(guò)了網(wǎng)絡(luò)設(shè)備(如路由器、交換機(jī))的處理能力時(shí),就會(huì)發(fā)生網(wǎng)絡(luò)擁塞,導(dǎo)致部分?jǐn)?shù)據(jù)包被丟棄。網(wǎng)絡(luò)擁塞通常發(fā)生在高峰期,如上班時(shí)間或晚上娛樂(lè)高峰時(shí)段?1。?硬件故障?:如果網(wǎng)絡(luò)設(shè)備(如光纖網(wǎng)卡、光纖跳線、光模塊等)出現(xiàn)故障,也可能會(huì)導(dǎo)致數(shù)據(jù)丟包。例如,光纖跳線損壞可能會(huì)導(dǎo)致信號(hào)強(qiáng)度減弱,從而使數(shù)據(jù)包無(wú)法正確傳輸。此外,電源問(wèn)題、溫度過(guò)高過(guò)低等問(wèn)題也可能引發(fā)硬件故障?1。?軟件錯(cuò)誤?:網(wǎng)絡(luò)設(shè)備的操作系統(tǒng)或者驅(qū)動(dòng)程序出現(xiàn)錯(cuò)誤,也可能導(dǎo)致數(shù)據(jù)丟包。例如,如果光纖網(wǎng)卡的驅(qū)動(dòng)程序存在bug,可能會(huì)導(dǎo)致數(shù)據(jù)包無(wú)法正確發(fā)送或接收。軟件錯(cuò)誤還可能源于配置錯(cuò)誤、兼容性問(wèn)題等?1。?信號(hào)干擾?:在無(wú)線網(wǎng)絡(luò)中,電磁波的干擾可能會(huì)導(dǎo)致數(shù)據(jù)包丟失。例如,微波爐、無(wú)線電話(huà)等設(shè)備可能會(huì)對(duì)Wi-Fi信號(hào)產(chǎn)生干擾。此外,物理障礙物(如墻壁、金屬物體)也可能阻擋或削弱信號(hào)?1。這些因素不僅影響網(wǎng)絡(luò)傳輸?shù)姆€(wěn)定性,還可能對(duì)應(yīng)用程序性能產(chǎn)生負(fù)面影響,導(dǎo)致應(yīng)用程序響應(yīng)緩慢、數(shù)據(jù)傳輸錯(cuò)誤等問(wèn)題。因此,了解丟包的原因?qū)τ诮鉀Q應(yīng)用程序性能問(wèn)題至關(guān)重要。

(2)案例場(chǎng)景

①算法效率低下

案例詳情:有一個(gè)基于 Linux 的網(wǎng)絡(luò)數(shù)據(jù)分析應(yīng)用程序,其功能是接收網(wǎng)絡(luò)數(shù)據(jù)包,對(duì)其中的數(shù)據(jù)進(jìn)行復(fù)雜的加密算法處理后再存儲(chǔ)到數(shù)據(jù)庫(kù)中。該應(yīng)用程序使用的加密算法是一種自定義的算法,在設(shè)計(jì)上存在效率問(wèn)題。隨著網(wǎng)絡(luò)流量的增加,應(yīng)用程序處理每個(gè)數(shù)據(jù)包所需的時(shí)間變得很長(zhǎng)。例如,處理一個(gè)數(shù)據(jù)包原本需要 10 毫秒,在高流量下可能延長(zhǎng)到 100 毫秒甚至更多。

丟包現(xiàn)象及影響:由于處理速度跟不上數(shù)據(jù)包的接收速度,應(yīng)用程序的內(nèi)部緩沖區(qū)很快被填滿(mǎn)。新到達(dá)的數(shù)據(jù)包由于沒(méi)有空間存儲(chǔ)而被丟棄。在網(wǎng)絡(luò)層面,可以看到應(yīng)用程序所在的 Linux 服務(wù)器的丟包率上升。對(duì)于數(shù)據(jù)收集和分析工作來(lái)說(shuō),這會(huì)導(dǎo)致部分?jǐn)?shù)據(jù)丟失,影響數(shù)據(jù)分析的準(zhǔn)確性。例如,如果是用于網(wǎng)絡(luò)安全監(jiān)控的數(shù)據(jù),可能會(huì)錯(cuò)過(guò)一些重要的安全事件信息,無(wú)法及時(shí)發(fā)現(xiàn)潛在的安全威脅。

②內(nèi)存泄漏

案例詳情:一個(gè)運(yùn)行在 Linux 系統(tǒng)上的網(wǎng)絡(luò)服務(wù)應(yīng)用程序,該程序用于為多個(gè)客戶(hù)端提供實(shí)時(shí)通信服務(wù)。程序中存在內(nèi)存泄漏問(wèn)題,隨著時(shí)間的推移和客戶(hù)端連接數(shù)量的增加,應(yīng)用程序占用的內(nèi)存不斷增加。這導(dǎo)致系統(tǒng)可用內(nèi)存逐漸減少,應(yīng)用程序用于存儲(chǔ)接收數(shù)據(jù)包的緩沖區(qū)空間也受到壓縮。

丟包現(xiàn)象及影響:當(dāng)緩沖區(qū)因?yàn)閮?nèi)存被其他部分占用而無(wú)法擴(kuò)展時(shí),一旦接收的數(shù)據(jù)包數(shù)量增多,緩沖區(qū)就會(huì)被填滿(mǎn),新到達(dá)的數(shù)據(jù)包就會(huì)被丟棄。在客戶(hù)端表現(xiàn)為通信中斷或者消息丟失。對(duì)于這個(gè)實(shí)時(shí)通信服務(wù),丟包會(huì)嚴(yán)重影響用戶(hù)體驗(yàn),可能導(dǎo)致用戶(hù)之間的對(duì)話(huà)不連貫,甚至使一些重要的信息無(wú)法傳遞,從而降低用戶(hù)對(duì)服務(wù)的滿(mǎn)意度。

③高并發(fā)處理能力不足

案例詳情:某企業(yè)開(kāi)發(fā)了一個(gè)基于 Linux 的 Web 應(yīng)用程序,用于處理在線訂單。在促銷(xiāo)活動(dòng)期間,大量用戶(hù)同時(shí)訪問(wèn)該 Web 應(yīng)用進(jìn)行下單操作。這個(gè) Web 應(yīng)用程序在設(shè)計(jì)時(shí)沒(méi)有充分考慮高并發(fā)情況,其內(nèi)部處理邏輯采用單線程順序處理每個(gè)訂單請(qǐng)求。當(dāng)并發(fā)訂單請(qǐng)求數(shù)量大幅增加時(shí),應(yīng)用程序無(wú)法同時(shí)處理多個(gè)請(qǐng)求,導(dǎo)致每個(gè)請(qǐng)求的處理時(shí)間延長(zhǎng)。

丟包現(xiàn)象及影響:服務(wù)器接收的 HTTP 請(qǐng)求數(shù)據(jù)包在應(yīng)用程序的緩沖區(qū)中等待處理,但由于處理速度過(guò)慢,緩沖區(qū)很快被填滿(mǎn),新到達(dá)的 HTTP 請(qǐng)求數(shù)據(jù)包被丟棄。在客戶(hù)端表現(xiàn)為網(wǎng)頁(yè)無(wú)法加載或者提示訂單提交失敗。這不僅會(huì)導(dǎo)致企業(yè)在促銷(xiāo)活動(dòng)期間損失訂單,還會(huì)損害企業(yè)的品牌形象,因?yàn)橛脩?hù)可能會(huì)認(rèn)為該網(wǎng)站不可靠或者服務(wù)質(zhì)量差。

(3)排查與解決措施

(一)排查方法

性能分析工具使用性能分析工具如 perf(Linux 性能分析工具)或 gprof(GNU 性能分析工具)來(lái)分析應(yīng)用程序的性能瓶頸。這些工具可以幫助確定應(yīng)用程序中哪些函數(shù)或代碼段消耗了大量的時(shí)間,從而找出可能導(dǎo)致性能低下的算法部分。對(duì)于內(nèi)存泄漏問(wèn)題,可以使用工具如 valgrind。它可以檢測(cè)程序中的內(nèi)存泄漏、非法內(nèi)存訪問(wèn)等問(wèn)題,確定內(nèi)存泄漏的具體位置。

資源監(jiān)控:利用系統(tǒng)監(jiān)控工具如 top、htop 或 sar 來(lái)監(jiān)控應(yīng)用程序的資源使用情況。查看應(yīng)用程序的內(nèi)存占用、CPU 使用率等指標(biāo)隨時(shí)間的變化情況,判斷是否存在資源管理不善的問(wèn)題。對(duì)于高并發(fā)處理能力不足的情況,可以使用壓力測(cè)試工具如 ab(ApacheBench)或 jmeter 對(duì)應(yīng)用程序進(jìn)行高并發(fā)測(cè)試,模擬大量用戶(hù)同時(shí)訪問(wèn)的場(chǎng)景,觀察應(yīng)用程序的響應(yīng)情況和丟包現(xiàn)象。

(二)解決措施

算法優(yōu)化:如果是算法效率低下導(dǎo)致的丟包,對(duì)應(yīng)用程序中的算法進(jìn)行優(yōu)化。可以參考現(xiàn)有的高效算法或者采用更先進(jìn)的算法庫(kù)。例如,將自定義的復(fù)雜加密算法替換為經(jīng)過(guò)優(yōu)化和廣泛測(cè)試的標(biāo)準(zhǔn)加密算法。采用并行計(jì)算技術(shù),如多線程或多進(jìn)程處理,將數(shù)據(jù)包處理任務(wù)進(jìn)行分解,提高處理效率。例如,將加密任務(wù)分配到多個(gè)線程中同時(shí)進(jìn)行,減少單個(gè)數(shù)據(jù)包的處理時(shí)間。

內(nèi)存管理優(yōu)化:針對(duì)內(nèi)存泄漏問(wèn)題,修復(fù)代碼中的內(nèi)存泄漏點(diǎn)。這可能涉及到對(duì)動(dòng)態(tài)內(nèi)存分配和釋放的仔細(xì)檢查,確保每個(gè) malloc()或 new()操作都有對(duì)應(yīng)的 free()或 delete()操作。優(yōu)化內(nèi)存使用策略,如采用內(nèi)存池技術(shù),減少頻繁的內(nèi)存分配和釋放操作,提高內(nèi)存使用效率,確保有足夠的空間用于存儲(chǔ)數(shù)據(jù)包。

提高高并發(fā)處理能力:對(duì)應(yīng)用程序的架構(gòu)進(jìn)行改進(jìn),采用適合高并發(fā)的設(shè)計(jì)模式,如事件驅(qū)動(dòng)架構(gòu)或異步 I/O。例如,將 Web 應(yīng)用程序從單線程順序處理模式改為基于事件驅(qū)動(dòng)的異步處理模式,提高對(duì)并發(fā)請(qǐng)求的處理能力。合理調(diào)整應(yīng)用程序的資源配置,如增加線程池的大小或者調(diào)整數(shù)據(jù)庫(kù)連接池的大小,以適應(yīng)高并發(fā)場(chǎng)景下的資源需求。同時(shí),對(duì)應(yīng)用程序進(jìn)行緩存優(yōu)化,減少重復(fù)的數(shù)據(jù)處理,提高響應(yīng)速度。

2.6鏈路層丟包

(1)概述及原理

在鏈路層,數(shù)據(jù)包的傳輸依賴(lài)于物理鏈路和鏈路層協(xié)議。鏈路層丟包可能是由于多種原因造成的,例如緩沖區(qū)溢出、硬件故障、鏈路質(zhì)量問(wèn)題以及不合理的流量控制策略等。鏈路層丟包的原因主要包括緩沖區(qū)溢出、網(wǎng)絡(luò)幀校驗(yàn)失敗、QoS設(shè)置等。?

在鏈路層,當(dāng)數(shù)據(jù)包由于緩沖區(qū)溢出等原因?qū)е戮W(wǎng)卡丟包時(shí),Linux會(huì)在網(wǎng)卡的收發(fā)數(shù)據(jù)統(tǒng)計(jì)信息中記錄下收發(fā)錯(cuò)誤的次數(shù)。通過(guò)netstat或ethtool等工具,可以查看網(wǎng)卡的丟包記錄。例如,RX-DRP表示進(jìn)入Ring Buffer后因其他原因(如內(nèi)存不足)導(dǎo)致的丟包數(shù),而RX-OVR則表示Ring Buffer溢出導(dǎo)致的丟包數(shù)。這些指標(biāo)可以幫助分析和定位鏈路層丟包的具體原因。

此外,網(wǎng)絡(luò)幀校驗(yàn)失敗也是導(dǎo)致丟包的一個(gè)重要原因。如果數(shù)據(jù)包的校驗(yàn)和與預(yù)期不符,鏈路層會(huì)認(rèn)為該數(shù)據(jù)包已損壞,從而選擇丟棄。QoS(服務(wù)質(zhì)量)設(shè)置不當(dāng)也可能導(dǎo)致丟包,特別是在配置了QoS規(guī)則的網(wǎng)絡(luò)環(huán)境中,如果規(guī)則設(shè)置不合理,可能會(huì)導(dǎo)致某些數(shù)據(jù)包被錯(cuò)誤地丟棄。

(2)案例場(chǎng)景

①緩沖區(qū)溢出

案例詳情:考慮一個(gè)企業(yè)級(jí)網(wǎng)絡(luò)中的 Linux 服務(wù)器,它通過(guò)千兆以太網(wǎng)連接到核心交換機(jī)。服務(wù)器的網(wǎng)卡具有一定大小的接收緩沖區(qū)(例如,默認(rèn)大小為 1024 個(gè)數(shù)據(jù)包)。在網(wǎng)絡(luò)高峰時(shí)段,大量的數(shù)據(jù)包從網(wǎng)絡(luò)中的其他設(shè)備快速涌向服務(wù)器。由于服務(wù)器上運(yùn)行的某些應(yīng)用程序處理數(shù)據(jù)包的速度較慢,不能及時(shí)從網(wǎng)卡的接收緩沖區(qū)讀取數(shù)據(jù)包,導(dǎo)致接收緩沖區(qū)逐漸被填滿(mǎn)。當(dāng)新的數(shù)據(jù)包到達(dá)時(shí),因?yàn)榫彌_區(qū)已經(jīng)沒(méi)有空閑空間,這些數(shù)據(jù)包就會(huì)被丟棄,從而發(fā)生鏈路層丟包現(xiàn)象。

丟包現(xiàn)象及影響:從服務(wù)器端的網(wǎng)絡(luò)監(jiān)控工具(如 ethtool -S <網(wǎng)卡名稱(chēng)>)可以觀察到接收緩沖區(qū)溢出的計(jì)數(shù)在不斷增加,同時(shí)丟包率也在上升。對(duì)于依賴(lài)網(wǎng)絡(luò)連接的應(yīng)用程序,如數(shù)據(jù)庫(kù)查詢(xún)、文件共享等,會(huì)出現(xiàn)響應(yīng)延遲或連接中斷的情況。例如,數(shù)據(jù)庫(kù)客戶(hù)端可能會(huì)收到查詢(xún)超時(shí)的錯(cuò)誤提示,影響企業(yè)內(nèi)部的業(yè)務(wù)流程和工作效率。

②硬件故障

案例詳情:有一臺(tái)運(yùn)行 Linux 操作系統(tǒng)的計(jì)算機(jī),其網(wǎng)卡出現(xiàn)了硬件故障??赡苁怯捎陂L(zhǎng)時(shí)間運(yùn)行導(dǎo)致網(wǎng)卡芯片過(guò)熱,或者是網(wǎng)卡電路中的某個(gè)元件損壞。當(dāng)網(wǎng)絡(luò)中有數(shù)據(jù)傳輸時(shí),故障網(wǎng)卡無(wú)法正確地接收和處理數(shù)據(jù)包。部分?jǐn)?shù)據(jù)包在網(wǎng)卡內(nèi)部就被損壞或者丟失,即使數(shù)據(jù)包能夠到達(dá)網(wǎng)卡,也可能因?yàn)榫W(wǎng)卡無(wú)法將其正確地傳遞給上層協(xié)議棧而被丟棄。

丟包現(xiàn)象及影響:在計(jì)算機(jī)上使用網(wǎng)絡(luò)診斷工具(如 ping 命令)時(shí),會(huì)發(fā)現(xiàn)丟包率很高,甚至無(wú)法正常 ping 通其他設(shè)備。對(duì)于這臺(tái)計(jì)算機(jī)上的所有網(wǎng)絡(luò)應(yīng)用,如網(wǎng)頁(yè)瀏覽、即時(shí)通訊等,都會(huì)受到嚴(yán)重影響,表現(xiàn)為無(wú)法正常連接網(wǎng)絡(luò)服務(wù)或者頻繁出現(xiàn)網(wǎng)絡(luò)連接中斷的情況。

③鏈路質(zhì)量問(wèn)題

案例詳情:在一個(gè)無(wú)線網(wǎng)絡(luò)環(huán)境中,有一個(gè)基于 Linux 的無(wú)線接入點(diǎn),為多個(gè)無(wú)線客戶(hù)端提供網(wǎng)絡(luò)連接。由于接入點(diǎn)的位置放置不當(dāng),周?chē)嬖谳^多的干擾源,如微波爐、無(wú)繩電話(huà)等。這些干擾源發(fā)射的信號(hào)與無(wú)線接入點(diǎn)的信號(hào)頻段相同或相近,導(dǎo)致無(wú)線鏈路的質(zhì)量下降。當(dāng)無(wú)線客戶(hù)端與接入點(diǎn)之間傳輸數(shù)據(jù)包時(shí),信號(hào)受到干擾,數(shù)據(jù)包中的部分?jǐn)?shù)據(jù)可能會(huì)發(fā)生錯(cuò)誤。雖然無(wú)線協(xié)議本身具有一定的糾錯(cuò)能力,但如果錯(cuò)誤數(shù)量超過(guò)了糾錯(cuò)能力的范圍,這些數(shù)據(jù)包就會(huì)被丟棄,從而造成鏈路層丟包。

丟包現(xiàn)象及影響:從無(wú)線客戶(hù)端的網(wǎng)絡(luò)連接狀態(tài)可以看到信號(hào)強(qiáng)度不穩(wěn)定,丟包率較高。例如,在進(jìn)行視頻流媒體播放時(shí),視頻會(huì)頻繁卡頓,音頻也可能出現(xiàn)中斷;在進(jìn)行文件下載時(shí),下載速度會(huì)非常緩慢且經(jīng)常中斷。

④流量控制策略不合理

案例詳情:在一個(gè)數(shù)據(jù)中心中,有多個(gè) Linux 服務(wù)器通過(guò)高速鏈路相互連接。為了管理網(wǎng)絡(luò)流量,管理員在服務(wù)器的網(wǎng)卡上配置了流量控制策略,使用了流量整形工具(如 tc - Traffic Control)。然而,流量控制策略的參數(shù)設(shè)置不合理。例如,設(shè)置的流量限制過(guò)低,導(dǎo)致實(shí)際網(wǎng)絡(luò)流量在正常業(yè)務(wù)高峰期間很容易就達(dá)到設(shè)定的上限。當(dāng)達(dá)到上限后,后續(xù)的數(shù)據(jù)包就會(huì)按照流量控制策略被丟棄。

丟包現(xiàn)象及影響:在服務(wù)器的網(wǎng)絡(luò)監(jiān)控中,可以看到由于流量控制而被丟棄的數(shù)據(jù)包數(shù)量不斷增加。對(duì)于數(shù)據(jù)中心內(nèi)的業(yè)務(wù)應(yīng)用,如分布式計(jì)算任務(wù)、數(shù)據(jù)備份等,會(huì)導(dǎo)致任務(wù)執(zhí)行效率低下。例如,分布式計(jì)算任務(wù)可能因?yàn)楣?jié)點(diǎn)間數(shù)據(jù)傳輸?shù)膩G包而需要不斷重傳數(shù)據(jù),延長(zhǎng)任務(wù)完成的時(shí)間。

(1)排查與解決措施

(一)排查方法

緩沖區(qū)溢出排查使用命令如 ethtool -S <網(wǎng)卡名稱(chēng)> 查看網(wǎng)卡的統(tǒng)計(jì)信息,特別關(guān)注接收緩沖區(qū)溢出的計(jì)數(shù)。同時(shí)查看服務(wù)器上運(yùn)行的應(yīng)用程序的性能,確定是否存在應(yīng)用程序處理數(shù)據(jù)包過(guò)慢導(dǎo)致緩沖區(qū)堆積的情況??梢允褂眯阅芊治龉ぞ?如 perf 或 top)來(lái)監(jiān)控應(yīng)用程序的 CPU 和內(nèi)存使用情況。硬件故障排查:首先檢查網(wǎng)卡的物理連接是否正常,包括網(wǎng)線是否插好、網(wǎng)卡指示燈是否正常閃爍等。使用硬件診斷工具(如一些主板廠商提供的網(wǎng)絡(luò)診斷軟件)對(duì)網(wǎng)卡進(jìn)行檢測(cè),查看是否有硬件故障的提示信息。嘗試更換網(wǎng)卡或者將網(wǎng)卡連接到其他正常工作的端口上,觀察丟包現(xiàn)象是否消失,以確定是否是網(wǎng)卡硬件問(wèn)題。鏈路質(zhì)量排查:在無(wú)線網(wǎng)絡(luò)中,可以使用無(wú)線信號(hào)分析工具(如 inSSIDer)來(lái)查看周?chē)臒o(wú)線信號(hào)環(huán)境,確定是否存在干擾源。對(duì)于有線網(wǎng)絡(luò),可以使用網(wǎng)絡(luò)測(cè)試儀檢查網(wǎng)線的質(zhì)量,包括是否存在線路短路、斷路等問(wèn)題。查看網(wǎng)絡(luò)設(shè)備(如交換機(jī)、路由器)的端口狀態(tài),檢查是否有錯(cuò)誤幀計(jì)數(shù)增加等現(xiàn)象,以判斷鏈路質(zhì)量。流量控制策略排查:檢查流量控制工具(如 tc)的配置文件,查看流量控制策略的參數(shù)設(shè)置,包括流量限制、隊(duì)列長(zhǎng)度等參數(shù)。使用網(wǎng)絡(luò)流量監(jiān)控工具(如 iftop 或 nload)來(lái)監(jiān)控實(shí)際的網(wǎng)絡(luò)流量,確定是否在正常業(yè)務(wù)情況下就頻繁達(dá)到流量控制的上限。(二)解決措施

緩沖區(qū)溢出解決:如果是應(yīng)用程序處理速度慢導(dǎo)致的緩沖區(qū)溢出,可以?xún)?yōu)化應(yīng)用程序的性能,如優(yōu)化算法、增加資源(如 CPU 或內(nèi)存)等。調(diào)整網(wǎng)卡的接收緩沖區(qū)大小,可以通過(guò)修改內(nèi)核參數(shù)(如 net.core.rmem_max 和 net.core.rmem_default)來(lái)增加緩沖區(qū)的容量,使網(wǎng)卡能夠暫存更多的數(shù)據(jù)包。硬件故障解決:如果確定是網(wǎng)卡硬件故障,及時(shí)更換網(wǎng)卡。如果是其他硬件設(shè)備(如網(wǎng)線、交換機(jī)端口等)故障,也需要進(jìn)行相應(yīng)的更換或維修。鏈路質(zhì)量解決:在無(wú)線網(wǎng)絡(luò)中,調(diào)整無(wú)線接入點(diǎn)的位置,盡量遠(yuǎn)離干擾源。也可以更改無(wú)線頻段,選擇一個(gè)干擾較少的頻段進(jìn)行工作。對(duì)于有線網(wǎng)絡(luò),如果是網(wǎng)線質(zhì)量問(wèn)題,更換高質(zhì)量的網(wǎng)線;如果是網(wǎng)絡(luò)設(shè)備端口問(wèn)題,將設(shè)備連接到其他正常的端口上或者對(duì)端口進(jìn)行維修。流量控制策略解決:根據(jù)實(shí)際的網(wǎng)絡(luò)流量需求,重新調(diào)整流量控制策略的參數(shù)。例如,適當(dāng)提高流量限制,合理設(shè)置隊(duì)列長(zhǎng)度等,確保在正常業(yè)務(wù)流量下不會(huì)因?yàn)榱髁靠刂贫鴮?dǎo)致丟包。2.7網(wǎng)絡(luò)層和傳輸層丟包

(1)概述及原理

在網(wǎng)絡(luò)層(如 IP 協(xié)議)和傳輸層(如 TCP、UDP 協(xié)議),丟包可能由多種因素引起。網(wǎng)絡(luò)層負(fù)責(zé)網(wǎng)絡(luò)中的路由和尋址,若路由表錯(cuò)誤、IP 地址沖突或網(wǎng)絡(luò)擁塞可能導(dǎo)致丟包。傳輸層的 TCP 協(xié)議在確保可靠連接時(shí),若出現(xiàn)諸如窗口管理問(wèn)題、重傳超時(shí)等情況會(huì)丟包;UDP 協(xié)議雖然無(wú)連接且不保證可靠傳輸,但如緩沖區(qū)滿(mǎn)等也會(huì)導(dǎo)致丟包。網(wǎng)絡(luò)層和傳輸層丟包的原因主要包括網(wǎng)絡(luò)擁塞、硬件故障、軟件錯(cuò)誤、信號(hào)干擾、帶寬限制、信號(hào)衰減等。?

?網(wǎng)絡(luò)擁塞?:當(dāng)網(wǎng)絡(luò)中的數(shù)據(jù)流量超過(guò)了網(wǎng)絡(luò)設(shè)備(如路由器、交換機(jī))的處理能力時(shí),就會(huì)發(fā)生網(wǎng)絡(luò)擁塞,導(dǎo)致部分?jǐn)?shù)據(jù)包被丟棄。網(wǎng)絡(luò)擁塞通常發(fā)生在高峰期,如上班時(shí)間或晚上娛樂(lè)高峰時(shí)段。?硬件故障?:網(wǎng)絡(luò)設(shè)備的硬件故障,如光纖網(wǎng)卡、光纖跳線、光模塊等出現(xiàn)故障,也可能導(dǎo)致數(shù)據(jù)丟包。例如,光纖跳線損壞可能導(dǎo)致信號(hào)強(qiáng)度減弱,從而使數(shù)據(jù)包無(wú)法正確傳輸。?軟件錯(cuò)誤?:網(wǎng)絡(luò)設(shè)備的操作系統(tǒng)或驅(qū)動(dòng)程序出現(xiàn)錯(cuò)誤,也可能導(dǎo)致數(shù)據(jù)丟包。例如,光纖網(wǎng)卡的驅(qū)動(dòng)程序存在bug,可能導(dǎo)致數(shù)據(jù)包無(wú)法正確發(fā)送或接收。?信號(hào)干擾?:在無(wú)線網(wǎng)絡(luò)中,電磁波的干擾可能導(dǎo)致數(shù)據(jù)包丟失。微波爐、無(wú)線電話(huà)等設(shè)備可能對(duì)Wi-Fi信號(hào)產(chǎn)生干擾,而物理障礙物也可能阻擋或削弱信號(hào)。?帶寬限制?:可用帶寬不足以支持當(dāng)前的數(shù)據(jù)傳輸需求,導(dǎo)致數(shù)據(jù)包因無(wú)法及時(shí)傳輸而被丟棄。?信號(hào)衰減?:無(wú)線網(wǎng)絡(luò)中信號(hào)強(qiáng)度不足,可能導(dǎo)致數(shù)據(jù)包在傳輸過(guò)程中丟失或無(wú)法正確接收。解決這些問(wèn)題的方法包括優(yōu)化網(wǎng)絡(luò)配置、升級(jí)硬件設(shè)備、修復(fù)軟件錯(cuò)誤、減少網(wǎng)絡(luò)擁塞、增強(qiáng)信號(hào)強(qiáng)度等。此外,定期進(jìn)行網(wǎng)絡(luò)維護(hù)和檢查也是預(yù)防數(shù)據(jù)丟包的重要措施?。

(2)案例場(chǎng)景

①網(wǎng)絡(luò)層 - 路由表錯(cuò)誤

案例詳情:在一個(gè)企業(yè)網(wǎng)絡(luò)中,網(wǎng)絡(luò)管理員在配置新的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)后,錯(cuò)誤地設(shè)置了部分路由器的路由表。例如,有一個(gè)子網(wǎng)(192.168.2.0/24)中的客戶(hù)端需要通過(guò)路由器 A 訪問(wèn)外部網(wǎng)絡(luò),但路由器 A 的路由表中指向該子網(wǎng)的下一跳地址被錯(cuò)誤設(shè)置為一個(gè)不存在的地址。當(dāng)客戶(hù)端向外部網(wǎng)絡(luò)發(fā)送數(shù)據(jù)包時(shí),數(shù)據(jù)包到達(dá)路由器 A 后,由于路由表錯(cuò)誤,路由器 A 不知道將數(shù)據(jù)包轉(zhuǎn)發(fā)到何處,導(dǎo)致這些數(shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:子網(wǎng)中的客戶(hù)端無(wú)法訪問(wèn)外部網(wǎng)絡(luò)的任何資源。從客戶(hù)端使用 ping 命令測(cè)試外部網(wǎng)絡(luò)地址時(shí),會(huì)顯示請(qǐng)求超時(shí),沒(méi)有任何響應(yīng)。對(duì)于企業(yè)來(lái)說(shuō),這可能影響員工的正常工作,如無(wú)法訪問(wèn)互聯(lián)網(wǎng)上的業(yè)務(wù)相關(guān)資源,或者無(wú)法與合作伙伴的網(wǎng)絡(luò)進(jìn)行通信。

②網(wǎng)絡(luò)層 - IP 地址沖突

案例詳情:在一個(gè)小型辦公網(wǎng)絡(luò)中,有兩臺(tái)設(shè)備(設(shè)備 A 和設(shè)備 B)意外地被配置了相同的 IP 地址(例如 192.168.1.100)。當(dāng)設(shè)備 A 向網(wǎng)絡(luò)中的其他設(shè)備發(fā)送數(shù)據(jù)包時(shí),網(wǎng)絡(luò)中的其他設(shè)備可能會(huì)將回應(yīng)數(shù)據(jù)包發(fā)送到設(shè)備 B(因?yàn)樗鼈冋J(rèn)為設(shè)備 B 就是源地址為 192.168.1.100 的設(shè)備),而設(shè)備 B 由于沒(méi)有發(fā)起相應(yīng)的請(qǐng)求,會(huì)丟棄這些數(shù)據(jù)包。同樣,當(dāng)設(shè)備 B 發(fā)送數(shù)據(jù)包時(shí)也會(huì)出現(xiàn)類(lèi)似的情況。

丟包現(xiàn)象及影響:涉及到這兩臺(tái)設(shè)備的網(wǎng)絡(luò)通信會(huì)出現(xiàn)異常。例如,在使用文件共享服務(wù)時(shí),其他設(shè)備無(wú)法正常訪問(wèn)這兩臺(tái)設(shè)備上的共享資源;或者在使用基于 IP 的網(wǎng)絡(luò)監(jiān)控系統(tǒng)時(shí),會(huì)顯示這兩臺(tái)設(shè)備的網(wǎng)絡(luò)連接不穩(wěn)定,丟包率很高。

③傳輸層 - TCP 窗口管理問(wèn)題

案例詳情:有一個(gè)基于 Linux 服務(wù)器的 Web 應(yīng)用,服務(wù)器與大量客戶(hù)端建立了 TCP 連接。服務(wù)器的 TCP 接收窗口大小設(shè)置不合理,初始設(shè)置過(guò)小(例如為 1024 字節(jié))。當(dāng)客戶(hù)端發(fā)送大量數(shù)據(jù)(如網(wǎng)頁(yè)中的大型圖片或視頻文件)時(shí),由于接收窗口很快被填滿(mǎn),服務(wù)器會(huì)通知客戶(hù)端停止發(fā)送數(shù)據(jù)。但客戶(hù)端可能在短時(shí)間內(nèi)無(wú)法及時(shí)收到服務(wù)器的通知,繼續(xù)發(fā)送數(shù)據(jù),導(dǎo)致這些超出接收窗口的數(shù)據(jù)被服務(wù)器丟棄。丟包現(xiàn)象及影響:客戶(hù)端會(huì)發(fā)現(xiàn)網(wǎng)頁(yè)加載緩慢,特別是對(duì)于包含大量數(shù)據(jù)的元素。在服務(wù)器端,可以通過(guò)查看 TCP 連接的統(tǒng)計(jì)信息(如 netstat -s 命令查看 TCP 相關(guān)統(tǒng)計(jì))發(fā)現(xiàn)接收窗口已滿(mǎn)導(dǎo)致的丟包計(jì)數(shù)增加。這會(huì)影響用戶(hù)體驗(yàn),可能導(dǎo)致用戶(hù)放棄訪問(wèn)網(wǎng)站,對(duì)網(wǎng)站的流量和業(yè)務(wù)產(chǎn)生負(fù)面影響。④傳輸層 - TCP 重傳超時(shí)

案例詳情:在一個(gè)跨地區(qū)的網(wǎng)絡(luò)連接中,有一臺(tái) Linux 服務(wù)器位于數(shù)據(jù)中心,為遠(yuǎn)程客戶(hù)端提供文件傳輸服務(wù)。網(wǎng)絡(luò)鏈路存在一定的延遲和不穩(wěn)定因素,如偶爾的網(wǎng)絡(luò)擁塞或信號(hào)衰減。在文件傳輸過(guò)程中,由于網(wǎng)絡(luò)狀況不佳,部分 TCP 數(shù)據(jù)包在傳輸過(guò)程中延遲過(guò)大。當(dāng)延遲超過(guò) TCP 的重傳超時(shí)時(shí)間(RTO)時(shí),服務(wù)器會(huì)認(rèn)為這些數(shù)據(jù)包丟失并進(jìn)行重傳。但如果網(wǎng)絡(luò)狀況持續(xù)不佳,多次重傳后仍然無(wú)法成功傳輸,這些數(shù)據(jù)包最終會(huì)被丟棄。

丟包現(xiàn)象及影響:對(duì)于文件傳輸服務(wù),文件可能無(wú)法完整傳輸,客戶(hù)端會(huì)收到文件損壞或傳輸失敗的提示。從網(wǎng)絡(luò)監(jiān)控工具(如 tcpdump 查看 TCP 數(shù)據(jù)包的傳輸情況)可以看到重傳次數(shù)過(guò)多以及最終丟包的情況。這會(huì)影響數(shù)據(jù)的完整性和可用性,對(duì)于依賴(lài)數(shù)據(jù)傳輸?shù)臉I(yè)務(wù)(如遠(yuǎn)程數(shù)據(jù)備份、云存儲(chǔ)服務(wù)等)會(huì)造成嚴(yán)重影響。

⑤傳輸層 - UDP 緩沖區(qū)滿(mǎn)

案例詳情:一個(gè)基于 UDP 的實(shí)時(shí)視頻監(jiān)控系統(tǒng),Linux 服務(wù)器接收來(lái)自多個(gè)攝像頭的 UDP 視頻流。由于攝像頭的幀率較高且分辨率較大,產(chǎn)生的數(shù)據(jù)量較大。服務(wù)器的 UDP 接收緩沖區(qū)大小沒(méi)有根據(jù)實(shí)際需求進(jìn)行調(diào)整,默認(rèn)設(shè)置較小。隨著視頻流數(shù)據(jù)的不斷涌入,UDP 接收緩沖區(qū)很快被填滿(mǎn)。

丟包現(xiàn)象及影響:新到達(dá)的 UDP 視頻數(shù)據(jù)包被丟棄,導(dǎo)致視頻監(jiān)控畫(huà)面出現(xiàn)卡頓、跳幀甚至部分畫(huà)面丟失的現(xiàn)象。這會(huì)影響監(jiān)控的效果,對(duì)于安全監(jiān)控場(chǎng)景,可能會(huì)錯(cuò)過(guò)一些重要的監(jiān)控信息,如入侵事件的部分畫(huà)面等。

(3)排查與解決措施

(一)排查方法

網(wǎng)絡(luò)層排查:對(duì)于路由表錯(cuò)誤,使用命令如 “route -n” 或 “ip route show” 查看路由器或設(shè)備的路由表,檢查是否存在錯(cuò)誤的路由項(xiàng)??梢酝ㄟ^(guò)對(duì)比正確的網(wǎng)絡(luò)拓?fù)鋱D和實(shí)際的路由設(shè)置來(lái)確定問(wèn)題所在。對(duì)于 IP 地址沖突,在網(wǎng)絡(luò)中使用網(wǎng)絡(luò)掃描工具(如 nmap)來(lái)檢測(cè)是否存在相同 IP 地址的設(shè)備。同時(shí),查看設(shè)備的網(wǎng)絡(luò)配置文件或命令行輸出(如 “ifconfig” 或 “ip addr”),確定設(shè)備的 IP 地址設(shè)置是否正確。

傳輸層排查:對(duì)于 TCP 窗口管理問(wèn)題,使用命令 “netstat -s” 查看 TCP 相關(guān)的統(tǒng)計(jì)信息,關(guān)注接收窗口已滿(mǎn)的計(jì)數(shù)。同時(shí),可以使用網(wǎng)絡(luò)分析工具(如 tcpdump)捕獲 TCP 數(shù)據(jù)包,查看服務(wù)器和客戶(hù)端之間關(guān)于窗口大小調(diào)整的交互情況。對(duì)于 TCP 重傳超時(shí)問(wèn)題,同樣使用 tcpdump 捕獲 TCP 數(shù)據(jù)包,查看重傳的次數(shù)和重傳數(shù)據(jù)包的延遲情況。可以分析網(wǎng)絡(luò)鏈路的延遲和穩(wěn)定性,使用工具如 ping 或 mtr 進(jìn)行網(wǎng)絡(luò)路徑測(cè)試,確定是否存在網(wǎng)絡(luò)擁塞或不穩(wěn)定的鏈路。對(duì)于 UDP 緩沖區(qū)滿(mǎn)問(wèn)題,使用命令 “netstat -s” 查看 UDP 相關(guān)的統(tǒng)計(jì)信息,特別是 “UDP receive errors”,如果這個(gè)值不斷增加,可能表示 UDP 緩沖區(qū)滿(mǎn)導(dǎo)致丟包。

(二)解決措施

網(wǎng)絡(luò)層解決:對(duì)于路由表錯(cuò)誤,修正路由器的路由表設(shè)置,確保下一跳地址和路由指向正確??梢愿鶕?jù)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)重新規(guī)劃和配置路由表,并且在配置后進(jìn)行測(cè)試,確保網(wǎng)絡(luò)連接正常。對(duì)于 IP 地址沖突,為其中一臺(tái)設(shè)備重新分配一個(gè)未被使用的 IP 地址。在企業(yè)網(wǎng)絡(luò)中,可以建立 IP 地址管理機(jī)制,避免類(lèi)似的 IP 地址沖突情況再次發(fā)生。

傳輸層解決:對(duì)于 TCP 窗口管理問(wèn)題,可以根據(jù)實(shí)際的網(wǎng)絡(luò)流量和服務(wù)器性能,調(diào)整 TCP 接收窗口的大小。在 Linux 系統(tǒng)中,可以通過(guò)修改內(nèi)核參數(shù)(如 “net.ipv4.tcp_rmem” 等)來(lái)優(yōu)化窗口大小設(shè)置。對(duì)于 TCP 重傳超時(shí)問(wèn)題,如果是網(wǎng)絡(luò)鏈路問(wèn)題,可以?xún)?yōu)化網(wǎng)絡(luò)鏈路,如增加帶寬、減少網(wǎng)絡(luò)擁塞點(diǎn)等。如果是因?yàn)榉?wù)器或客戶(hù)端的網(wǎng)絡(luò)配置導(dǎo)致的,可以調(diào)整 TCP 的重傳超時(shí)參數(shù)(如在某些應(yīng)用程序中可以自定義 RTO),但需要謹(jǐn)慎操作,以免影響網(wǎng)絡(luò)的穩(wěn)定性。對(duì)于 UDP 緩沖區(qū)滿(mǎn)問(wèn)題,調(diào)整 UDP 接收緩沖區(qū)的大小。在 Linux 系統(tǒng)中,可以通過(guò)修改內(nèi)核參數(shù)(如 “net.core.rmem_max” 和 “net.core.rmem_default”)來(lái)增加 UDP 接收緩沖區(qū)的容量,以適應(yīng)實(shí)際的數(shù)據(jù)流量。

2.8七種可能丟包原因

①防火墻攔截

案例詳情:在一個(gè)企業(yè)網(wǎng)絡(luò)環(huán)境中,公司為了加強(qiáng)網(wǎng)絡(luò)安全,部署了基于 Linux 系統(tǒng)的防火墻(如 iptables)。有一個(gè)新開(kāi)發(fā)的內(nèi)部 Web 應(yīng)用,運(yùn)行在特定端口(例如 8080 端口)上,開(kāi)發(fā)人員在測(cè)試時(shí)發(fā)現(xiàn),從外部網(wǎng)絡(luò)無(wú)法訪問(wèn)該應(yīng)用。經(jīng)過(guò)檢查,發(fā)現(xiàn)防火墻規(guī)則中默認(rèn)只允許常見(jiàn)的 HTTP(80 端口)和 HTTPS(443 端口)流量通過(guò),沒(méi)有針對(duì) 8080 端口的入站規(guī)則。當(dāng)外部客戶(hù)端嘗試訪問(wèn)內(nèi)部 Web 應(yīng)用時(shí),發(fā)送到 8080 端口的數(shù)據(jù)包被防火墻攔截并丟棄。

丟包現(xiàn)象及影響:外部用戶(hù)無(wú)法訪問(wèn)該內(nèi)部 Web 應(yīng)用,在瀏覽器中輸入網(wǎng)址后顯示連接超時(shí)或者無(wú)法連接。這對(duì)于企業(yè)來(lái)說(shuō),可能影響到新業(yè)務(wù)的推廣或者與外部合作伙伴的協(xié)作,例如如果該 Web 應(yīng)用是用于展示新產(chǎn)品或者與供應(yīng)商進(jìn)行訂單交互的平臺(tái),那么業(yè)務(wù)流程會(huì)受到阻礙。

②連接跟蹤表溢出

案例詳情:某數(shù)據(jù)中心有一臺(tái) Linux 服務(wù)器,承擔(dān)著大量的網(wǎng)絡(luò)連接任務(wù),如為多個(gè)用戶(hù)提供 VPN 服務(wù)、文件傳輸服務(wù)等。服務(wù)器上啟用了連接跟蹤功能(如在 Netfilter 框架下)來(lái)監(jiān)控和管理網(wǎng)絡(luò)連接。在業(yè)務(wù)高峰期間,大量的新連接不斷建立,同時(shí)由于一些長(zhǎng)連接的存在,連接跟蹤表逐漸被填滿(mǎn)。當(dāng)連接跟蹤表溢出時(shí),新到達(dá)的連接請(qǐng)求數(shù)據(jù)包被丟棄。例如,一些新的 VPN 用戶(hù)嘗試連接服務(wù)器時(shí),他們的連接請(qǐng)求數(shù)據(jù)包無(wú)法被正確處理。

丟包現(xiàn)象及影響:新的網(wǎng)絡(luò)連接無(wú)法建立,對(duì)于 VPN 用戶(hù)來(lái)說(shuō),無(wú)法連接到企業(yè)內(nèi)部網(wǎng)絡(luò),影響遠(yuǎn)程辦公;對(duì)于文件傳輸服務(wù)的新用戶(hù),無(wú)法開(kāi)始文件傳輸操作。這會(huì)導(dǎo)致用戶(hù)體驗(yàn)下降,并且可能影響企業(yè)的正常業(yè)務(wù)運(yùn)營(yíng),如文件共享、遠(yuǎn)程協(xié)作等工作無(wú)法順利開(kāi)展。

③Ring Buffer 溢出

案例詳情:有一個(gè)高性能計(jì)算集群,其中的計(jì)算節(jié)點(diǎn)為 Linux 系統(tǒng),節(jié)點(diǎn)間通過(guò)高速網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交互。每個(gè)節(jié)點(diǎn)的網(wǎng)卡都有自己的 Ring Buffer(環(huán)形緩沖區(qū))用于暫存網(wǎng)絡(luò)數(shù)據(jù)包。在進(jìn)行大規(guī)模數(shù)據(jù)并行計(jì)算時(shí),節(jié)點(diǎn)間瞬間產(chǎn)生大量的數(shù)據(jù)包。由于沒(méi)有對(duì) Ring Buffer 的大小進(jìn)行合理調(diào)整,默認(rèn)大小的 Ring Buffer 無(wú)法容納如此大量的數(shù)據(jù)包,導(dǎo)致 Ring Buffer 溢出。例如,在進(jìn)行一個(gè)涉及多個(gè)節(jié)點(diǎn)的大型模擬運(yùn)算時(shí),數(shù)據(jù)交換過(guò)程中數(shù)據(jù)包大量丟失。

丟包現(xiàn)象及影響:計(jì)算任務(wù)依賴(lài)節(jié)點(diǎn)間準(zhǔn)確的數(shù)據(jù)傳輸,丟包會(huì)導(dǎo)致計(jì)算結(jié)果錯(cuò)誤或者計(jì)算無(wú)法繼續(xù)進(jìn)行。這對(duì)于高性能計(jì)算任務(wù)來(lái)說(shuō)是非常嚴(yán)重的問(wèn)題,可能導(dǎo)致整個(gè)計(jì)算項(xiàng)目失敗,浪費(fèi)大量的計(jì)算資源和時(shí)間。

④netdev_max_backlog 溢出

案例詳情:在一個(gè)網(wǎng)絡(luò)服務(wù)提供商的機(jī)房中,有一臺(tái) Linux 服務(wù)器為眾多用戶(hù)提供 Web 服務(wù)、郵件服務(wù)等多種網(wǎng)絡(luò)服務(wù)。服務(wù)器的網(wǎng)絡(luò)流量波動(dòng)較大,在流量高峰時(shí)段,大量的數(shù)據(jù)包同時(shí)涌向服務(wù)器。服務(wù)器的 netdev_max_backlog(網(wǎng)絡(luò)設(shè)備接收隊(duì)列的最大長(zhǎng)度)參數(shù)設(shè)置為默認(rèn)值,當(dāng)網(wǎng)絡(luò)流量突發(fā)時(shí),接收隊(duì)列很快被填滿(mǎn),一旦達(dá)到 netdev_max_backlog 的上限,后續(xù)的數(shù)據(jù)包就會(huì)被丟棄。例如,當(dāng)多個(gè)用戶(hù)同時(shí)訪問(wèn) Web 頁(yè)面或者發(fā)送郵件時(shí),部分?jǐn)?shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:用戶(hù)在訪問(wèn) Web 服務(wù)時(shí)會(huì)出現(xiàn)網(wǎng)頁(yè)加載緩慢甚至無(wú)法加載的情況,對(duì)于郵件服務(wù),可能會(huì)出現(xiàn)郵件發(fā)送失敗或者接收延遲的問(wèn)題。這會(huì)影響用戶(hù)對(duì)網(wǎng)絡(luò)服務(wù)的滿(mǎn)意度,可能導(dǎo)致用戶(hù)流失,對(duì)網(wǎng)絡(luò)服務(wù)提供商的業(yè)務(wù)產(chǎn)生負(fù)面影響。

⑤硬件網(wǎng)卡相關(guān)丟包 - ring buffer 滿(mǎn)(硬中斷分發(fā)不均)

案例詳情:考慮一個(gè)工業(yè)控制網(wǎng)絡(luò)中的 Linux 設(shè)備,它通過(guò)網(wǎng)卡與多個(gè)傳感器和執(zhí)行器進(jìn)行通信。網(wǎng)卡的 ring buffer 用于接收和處理來(lái)自網(wǎng)絡(luò)的數(shù)據(jù)包。由于網(wǎng)絡(luò)中的設(shè)備分布不均勻,導(dǎo)致網(wǎng)卡接收數(shù)據(jù)包時(shí)硬中斷分發(fā)不均。例如,靠近網(wǎng)卡端口的設(shè)備發(fā)送的數(shù)據(jù)包會(huì)觸發(fā)更多的硬中斷,使得這些數(shù)據(jù)包更容易被處理,而距離較遠(yuǎn)的設(shè)備發(fā)送的數(shù)據(jù)包觸發(fā)硬中斷較少,在 ring buffer 中堆積。當(dāng) ring buffer 滿(mǎn)時(shí),距離較遠(yuǎn)設(shè)備發(fā)送的數(shù)據(jù)包就會(huì)被丟棄。

丟包現(xiàn)象及影響:在工業(yè)控制場(chǎng)景中,這可能導(dǎo)致對(duì)某些傳感器數(shù)據(jù)的丟失,從而影響對(duì)工業(yè)過(guò)程的監(jiān)控和控制。例如,如果丟失的是關(guān)鍵傳感器的溫度或壓力數(shù)據(jù),可能會(huì)導(dǎo)致工業(yè)設(shè)備的錯(cuò)誤操作或者故障,甚至引發(fā)安全事故。

⑥硬件網(wǎng)卡相關(guān)丟包 - ring buffer 滿(mǎn)(會(huì)話(huà)分發(fā)不均)

案例詳情:在一個(gè)大型企業(yè)的辦公網(wǎng)絡(luò)中,有一臺(tái) Linux 服務(wù)器作為文件服務(wù)器,為眾多員工的客戶(hù)端提供文件共享服務(wù)。服務(wù)器的網(wǎng)卡 ring buffer 在處理來(lái)自不同客戶(hù)端的會(huì)話(huà)時(shí)存在分發(fā)不均的情況。一些活躍的客戶(hù)端會(huì)話(huà)(如頻繁進(jìn)行文件上傳或下載的員工客戶(hù)端)占用了更多的 ring buffer 資源,導(dǎo)致其他客戶(hù)端的數(shù)據(jù)包在 ring buffer 中等待時(shí)間過(guò)長(zhǎng)。當(dāng) ring buffer 滿(mǎn)時(shí),部分不太活躍客戶(hù)端的數(shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:對(duì)于被丟棄數(shù)據(jù)包的客戶(hù)端,會(huì)出現(xiàn)文件共享操作中斷或者文件傳輸速度極慢的情況。這會(huì)影響員工的工作效率,例如在需要緊急獲取文件或者共享重要資料時(shí)無(wú)法順利進(jìn)行。

⑦硬件網(wǎng)卡相關(guān)丟包 - rps(接收數(shù)據(jù)包轉(zhuǎn)向)

案例詳情:在一個(gè)云計(jì)算數(shù)據(jù)中心,有大量的 Linux 虛擬機(jī)運(yùn)行在物理服務(wù)器上,這些虛擬機(jī)通過(guò)物理服務(wù)器的網(wǎng)卡與外部網(wǎng)絡(luò)進(jìn)行通信。物理服務(wù)器啟用了 rps(接收數(shù)據(jù)包轉(zhuǎn)向)功能來(lái)提高網(wǎng)絡(luò)性能。然而,rps 功能的配置存在問(wèn)題。由于虛擬機(jī)數(shù)量眾多,rps 的哈希算法沒(méi)有根據(jù)實(shí)際情況進(jìn)行優(yōu)化,導(dǎo)致數(shù)據(jù)包在轉(zhuǎn)向過(guò)程中出現(xiàn)錯(cuò)誤分配。部分虛擬機(jī)接收到大量本不應(yīng)屬于自己的數(shù)據(jù)包,而這些數(shù)據(jù)包在虛擬機(jī)的網(wǎng)卡 ring buffer 中無(wú)法正確處理,當(dāng) ring buffer 滿(mǎn)時(shí),數(shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:在虛擬機(jī)內(nèi)部,網(wǎng)絡(luò)服務(wù)會(huì)出現(xiàn)異常。例如,運(yùn)行在虛擬機(jī)中的 Web 應(yīng)用可能無(wú)法正常響應(yīng)外部請(qǐng)求,數(shù)據(jù)庫(kù)虛擬機(jī)可能出現(xiàn)連接中斷的情況。這會(huì)影響云服務(wù)提供商提供給客戶(hù)的服務(wù)質(zhì)量,可能導(dǎo)致客戶(hù)投訴或者業(yè)務(wù)損失。

2.9硬件網(wǎng)卡相關(guān)丟包

(1)ring buffer 滿(mǎn)導(dǎo)致丟包

①硬中斷分發(fā)不均

案例詳情:在一個(gè)企業(yè)網(wǎng)絡(luò)環(huán)境中,有多臺(tái) Linux 服務(wù)器連接到一個(gè)核心交換機(jī)。其中一臺(tái)服務(wù)器用于處理來(lái)自不同部門(mén)的網(wǎng)絡(luò)流量,網(wǎng)卡為 10Gbps 速率。服務(wù)器上運(yùn)行著各種網(wǎng)絡(luò)服務(wù),如文件共享、數(shù)據(jù)庫(kù)服務(wù)等。網(wǎng)絡(luò)中的設(shè)備分布在不同的物理位置,距離服務(wù)器網(wǎng)卡的遠(yuǎn)近不同。由于網(wǎng)卡驅(qū)動(dòng)默認(rèn)的硬中斷分發(fā)機(jī)制,靠近服務(wù)器的設(shè)備發(fā)送的數(shù)據(jù)包產(chǎn)生的硬中斷更容易被及時(shí)處理,這些數(shù)據(jù)包優(yōu)先進(jìn)入 ring buffer。而距離較遠(yuǎn)的設(shè)備發(fā)送的數(shù)據(jù)包,其觸發(fā)的硬中斷響應(yīng)相對(duì)滯后,導(dǎo)致在 ring buffer 中堆積。例如,在網(wǎng)絡(luò)流量高峰期,距離服務(wù)器較遠(yuǎn)的部門(mén)客戶(hù)端向服務(wù)器發(fā)送大量數(shù)據(jù)庫(kù)查詢(xún)請(qǐng)求數(shù)據(jù)包,由于硬中斷分發(fā)不均,這些數(shù)據(jù)包在 ring buffer 中等待處理的時(shí)間過(guò)長(zhǎng),最終 ring buffer 被填滿(mǎn),新到達(dá)的數(shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:從網(wǎng)絡(luò)監(jiān)控工具(如 ethtool -S <網(wǎng)卡名稱(chēng)>)可以看到 ring buffer 溢出計(jì)數(shù)增加,同時(shí)丟包率上升。對(duì)于數(shù)據(jù)庫(kù)查詢(xún),客戶(hù)端會(huì)收到查詢(xún)超時(shí)的錯(cuò)誤提示,影響員工獲取業(yè)務(wù)數(shù)據(jù)的效率,進(jìn)而可能影響企業(yè)的業(yè)務(wù)流程。

②會(huì)話(huà)分發(fā)不均

案例詳情:考慮一個(gè)大型數(shù)據(jù)中心,有一臺(tái) Linux 服務(wù)器作為郵件服務(wù)器,為眾多用戶(hù)提供郵件服務(wù)。服務(wù)器的網(wǎng)卡 ring buffer 大小為默認(rèn)值。服務(wù)器上有一些活躍用戶(hù),他們頻繁地發(fā)送和接收郵件,這些用戶(hù)的會(huì)話(huà)在網(wǎng)卡處理時(shí)占用了較多的 ring buffer 資源。例如,有幾個(gè)大型營(yíng)銷(xiāo)團(tuán)隊(duì)的員工,他們每天要發(fā)送和處理大量的郵件,其郵件客戶(hù)端與服務(wù)器之間的會(huì)話(huà)持續(xù)處于活躍狀態(tài)。而普通用戶(hù)的郵件會(huì)話(huà)相對(duì)較少,但由于會(huì)話(huà)分發(fā)不均,普通用戶(hù)發(fā)送的郵件數(shù)據(jù)包在 ring buffer 中等待的時(shí)間較長(zhǎng)。在郵件服務(wù)器流量高峰時(shí)段,如促銷(xiāo)活動(dòng)期間大量營(yíng)銷(xiāo)郵件發(fā)送時(shí),ring buffer 被填滿(mǎn),普通用戶(hù)的郵件數(shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:普通用戶(hù)會(huì)遇到郵件發(fā)送失敗或者接收延遲的問(wèn)題。從服務(wù)器的郵件日志中可以看到郵件發(fā)送錯(cuò)誤記錄增加。這會(huì)影響普通用戶(hù)的體驗(yàn),可能導(dǎo)致他們錯(cuò)過(guò)重要的郵件信息。

③rps(接收數(shù)據(jù)包轉(zhuǎn)向)

案例詳情:在一個(gè)云計(jì)算環(huán)境中,一臺(tái)物理服務(wù)器運(yùn)行著多個(gè) Linux 虛擬機(jī)。物理服務(wù)器的網(wǎng)卡支持 rps 功能,旨在提高網(wǎng)絡(luò)性能,將接收的數(shù)據(jù)包合理地分配到不同的虛擬機(jī)。物理服務(wù)器上的虛擬機(jī)運(yùn)行著不同類(lèi)型的應(yīng)用,包括 Web 應(yīng)用、數(shù)據(jù)庫(kù)應(yīng)用等。然而,rps 的配置沒(méi)有根據(jù)虛擬機(jī)的實(shí)際負(fù)載和網(wǎng)絡(luò)流量模式進(jìn)行優(yōu)化。例如,rps 默認(rèn)的哈希算法將過(guò)多的數(shù)據(jù)包轉(zhuǎn)向到某個(gè)特定的虛擬機(jī),而這個(gè)虛擬機(jī)的處理能力有限。當(dāng)網(wǎng)絡(luò)流量增加時(shí),這個(gè)虛擬機(jī)的網(wǎng)卡 ring buffer 很快被填滿(mǎn),新到達(dá)的數(shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:在被丟棄數(shù)據(jù)包的虛擬機(jī)中,運(yùn)行的 Web 應(yīng)用會(huì)出現(xiàn)頁(yè)面加載緩慢或無(wú)法加載的情況,數(shù)據(jù)庫(kù)應(yīng)用可能會(huì)出現(xiàn)連接中斷或查詢(xún)失敗的問(wèn)題。這會(huì)影響云服務(wù)提供商提供給客戶(hù)的服務(wù)質(zhì)量,導(dǎo)致客戶(hù)滿(mǎn)意度下降。

④突發(fā)流量

案例詳情:有一個(gè)小型網(wǎng)絡(luò),其中一臺(tái) Linux 服務(wù)器用于存儲(chǔ)和共享多媒體文件,如視頻、音頻等。服務(wù)器的網(wǎng)卡是 1Gbps 的速率,ring buffer 大小為標(biāo)準(zhǔn)設(shè)置。在某一時(shí)刻,多個(gè)用戶(hù)同時(shí)開(kāi)始下載大型視頻文件,例如一個(gè)熱門(mén)視頻剛剛發(fā)布,多個(gè)用戶(hù)同時(shí)從服務(wù)器下載。這突發(fā)的流量遠(yuǎn)遠(yuǎn)超過(guò)了網(wǎng)卡 ring buffer 的處理能力。大量的數(shù)據(jù)包瞬間涌入 ring buffer,由于 ring buffer 沒(méi)有足夠的空間來(lái)存儲(chǔ)這些數(shù)據(jù)包,很快就被填滿(mǎn),導(dǎo)致新到達(dá)的數(shù)據(jù)包被丟棄。

丟包現(xiàn)象及影響:用戶(hù)在下載視頻時(shí)會(huì)發(fā)現(xiàn)下載速度突然降為零,并且文件無(wú)法完整下載。從服務(wù)器端來(lái)看,網(wǎng)絡(luò)監(jiān)控工具顯示 ring buffer 溢出和丟包情況嚴(yán)重。這會(huì)影響用戶(hù)獲取多媒體內(nèi)容的體驗(yàn),對(duì)于提供多媒體服務(wù)的企業(yè)來(lái)說(shuō),可能導(dǎo)致用戶(hù)流失。

(2)利用 ntuple 保證關(guān)鍵業(yè)務(wù)

案例詳情:在一個(gè)金融網(wǎng)絡(luò)環(huán)境中,有一臺(tái) Linux 服務(wù)器運(yùn)行著核心的交易處理系統(tǒng),同時(shí)也運(yùn)行著一些輔助的監(jiān)控和管理系統(tǒng)。服務(wù)器的網(wǎng)卡為 10Gbps 速率。網(wǎng)絡(luò)中存在多種類(lèi)型的流量,包括交易數(shù)據(jù)流量、監(jiān)控?cái)?shù)據(jù)流量等。為了確保交易數(shù)據(jù)(關(guān)鍵業(yè)務(wù))的優(yōu)先處理,網(wǎng)絡(luò)管理員配置了 ntuple 規(guī)則。然而,在配置過(guò)程中出現(xiàn)了失誤。原本應(yīng)該將交易數(shù)據(jù)的源 IP、目標(biāo) IP、端口等信息準(zhǔn)確地配置到 ntuple 規(guī)則中,但由于管理員誤操作,部分交易數(shù)據(jù)的 ntuple 規(guī)則設(shè)置錯(cuò)誤。當(dāng)網(wǎng)絡(luò)流量正常時(shí),這種錯(cuò)誤沒(méi)有明顯影響,但在網(wǎng)絡(luò)擁塞或者突發(fā)流量時(shí),由于 ntuple 規(guī)則不能正確識(shí)別交易數(shù)據(jù),交易數(shù)據(jù)沒(méi)有得到優(yōu)先處理,可能會(huì)和其他非關(guān)鍵數(shù)據(jù)一起在網(wǎng)卡處面臨 ring buffer 滿(mǎn)的情況,導(dǎo)致交易數(shù)據(jù)丟包。

丟包現(xiàn)象及影響:對(duì)于金融交易系統(tǒng),交易數(shù)據(jù)丟包可能會(huì)導(dǎo)致交易失敗、訂單丟失等嚴(yán)重問(wèn)題。從服務(wù)器的交易日志中可以看到交易失敗記錄增加,這會(huì)影響金融機(jī)構(gòu)的正常運(yùn)營(yíng),可能導(dǎo)致客戶(hù)資金損失和聲譽(yù)受損。

(3)排查與解決措施

(一)排查方法

ring buffer 狀態(tài)檢查:使用命令 ethtool -S <網(wǎng)卡名稱(chēng)> 查看 ring buffer 的相關(guān)統(tǒng)計(jì)信息,如接收隊(duì)列和發(fā)送隊(duì)列的溢出計(jì)數(shù)、數(shù)據(jù)包丟棄計(jì)數(shù)等。通過(guò)這些數(shù)據(jù)可以判斷 ring buffer 是否存在滿(mǎn)的情況以及丟包是否與 ring buffer 有關(guān)。

中斷分布檢查:對(duì)于硬中斷分發(fā)不均的情況,可以使用工具如 irqbalance -d 查看中斷在不同 CPU 核心上的分布情況。如果發(fā)現(xiàn)某個(gè)或某幾個(gè) CPU 核心上中斷過(guò)于集中,可能是硬中斷分發(fā)不均導(dǎo)致 ring buffer 滿(mǎn)和丟包的原因。

會(huì)話(huà)分布分析:在懷疑會(huì)話(huà)分發(fā)不均導(dǎo)致丟包時(shí),可以通過(guò)分析服務(wù)器上的網(wǎng)絡(luò)服務(wù)日志(如郵件服務(wù)器日志、數(shù)據(jù)庫(kù)服務(wù)器日志等),查看不同用戶(hù)或客戶(hù)端的活動(dòng)情況,確定是否存在某些會(huì)話(huà)過(guò)度占用 ring buffer 資源的情況。

rps 配置檢查:檢查 rps 的配置文件(通常在 /sys/class/net/<網(wǎng)卡名稱(chēng)>/queues/rx - < 隊(duì)列編號(hào) >/rps_cpus 等相關(guān)文件中),查看哈希算法的設(shè)置、分配的 CPU 核心等參數(shù)是否合理。同時(shí),可以使用網(wǎng)絡(luò)分析工具(如 tcpdump)在物理服務(wù)器和虛擬機(jī)之間捕獲數(shù)據(jù)包,查看數(shù)據(jù)包的分配是否符合預(yù)期。

ntuple 規(guī)則檢查:對(duì)于 ntuple 規(guī)則的檢查,查看配置文件(根據(jù)不同的網(wǎng)絡(luò)管理工具而定),確保源 IP、目標(biāo) IP、端口等關(guān)鍵信息的準(zhǔn)確性??梢允褂镁W(wǎng)絡(luò)流量分析工具(如 Wireshark)在服務(wù)器網(wǎng)卡處捕獲數(shù)據(jù)包,驗(yàn)證 ntuple 規(guī)則是否正確識(shí)別關(guān)鍵業(yè)務(wù)數(shù)據(jù)。

(二)解決措施

調(diào)整 ring buffer 大?。喝绻_定是 ring buffer 滿(mǎn)導(dǎo)致丟包,可以通過(guò)修改內(nèi)核參數(shù)來(lái)調(diào)整 ring buffer 的大小。例如,對(duì)于接收 ring buffer,可以修改 net.core.rmem_max 和 net.core.rmem_default 參數(shù)來(lái)增加其容量,以適應(yīng)更多的數(shù)據(jù)包存儲(chǔ)。

優(yōu)化硬中斷分發(fā):對(duì)于硬中斷分發(fā)不均的情況,可以調(diào)整網(wǎng)卡驅(qū)動(dòng)的硬中斷分發(fā)策略。有些網(wǎng)卡驅(qū)動(dòng)提供了可調(diào)整的參數(shù),或者可以嘗試使用工具如 irqbalance 并調(diào)整其配置參數(shù),使硬中斷在不同 CPU 核心上更均勻地分布,從而提高 ring buffer 處理數(shù)據(jù)包的效率。

均衡會(huì)話(huà)處理:在發(fā)現(xiàn)會(huì)話(huà)分發(fā)不均時(shí),可以?xún)?yōu)化服務(wù)器上的網(wǎng)絡(luò)服務(wù)配置,例如調(diào)整郵件服務(wù)器的隊(duì)列管理策略,對(duì)不同用戶(hù)或客戶(hù)端的會(huì)話(huà)進(jìn)行均衡處理。也可以根據(jù)實(shí)際情況調(diào)整服務(wù)器的資源分配,確保各個(gè)會(huì)話(huà)都能得到合理的 ring buffer 資源。

rps 重新配置:根據(jù)虛擬機(jī)的實(shí)際負(fù)載和網(wǎng)絡(luò)流量模式,重新優(yōu)化 rps 的配置。調(diào)整哈希算法、合理分配 CPU 核心等參數(shù),使數(shù)據(jù)包在物理服務(wù)器和虛擬機(jī)之間能夠更合理地分配,避免某個(gè)虛擬機(jī)的 ring buffer 過(guò)載。

修正 ntuple 規(guī)則:糾正 ntuple 規(guī)則中的錯(cuò)誤配置,確保關(guān)鍵業(yè)務(wù)數(shù)據(jù)能夠被準(zhǔn)確識(shí)別并得到優(yōu)先處理。在配置完成后,進(jìn)行嚴(yán)格的測(cè)試,使用網(wǎng)絡(luò)流量模擬工具模擬不同的網(wǎng)絡(luò)場(chǎng)景,驗(yàn)證 ntuple 規(guī)則的有效性。

2.10arp 丟包

(1)ARP 概述

ARP(Address Resolution Protocol)即地址解析協(xié)議,用于將 IP 地址轉(zhuǎn)換為對(duì)應(yīng)的 MAC 地址。在局域網(wǎng)通信中,當(dāng)一個(gè)設(shè)備想要發(fā)送數(shù)據(jù)包給另一個(gè)設(shè)備時(shí),它首先需要知道目標(biāo)設(shè)備的 MAC 地址。如果 ARP 過(guò)程出現(xiàn)問(wèn)題,就可能導(dǎo)致丟包。

ARP(地址解析協(xié)議)攻擊可以導(dǎo)致網(wǎng)絡(luò)丟包,尤其是當(dāng)攻擊者通過(guò)發(fā)送偽造的ARP響應(yīng)來(lái)干擾正常的網(wǎng)絡(luò)通信時(shí)。在這種情況下,接收端可能會(huì)接收到錯(cuò)誤的MAC地址信息,導(dǎo)致數(shù)據(jù)包無(wú)法正確到達(dá)目的地,從而造成丟包現(xiàn)象。這種攻擊不僅會(huì)影響網(wǎng)絡(luò)的穩(wěn)定性和可用性,還會(huì)導(dǎo)致用戶(hù)無(wú)法正常訪問(wèn)網(wǎng)絡(luò)資源,如網(wǎng)頁(yè)加載緩慢、視頻流不流暢等。

為了解決ARP攻擊導(dǎo)致的丟包問(wèn)題,可以采取以下措施:

?使用Wireshark等網(wǎng)絡(luò)分析工具?:通過(guò)捕獲和分析網(wǎng)絡(luò)流量,可以檢測(cè)到ARP攻擊的存在,從而及時(shí)采取措施防止攻擊擴(kuò)散。?加強(qiáng)網(wǎng)絡(luò)安全?:通過(guò)配置訪問(wèn)控制列表(ACL)、啟用防火墻等安全措施,可以有效阻止惡意ARP請(qǐng)求的發(fā)送和響應(yīng)。?定期檢查和更新網(wǎng)絡(luò)設(shè)備?:確保網(wǎng)絡(luò)設(shè)備和操作系統(tǒng)都更新到最新版本,以修復(fù)已知的安全漏洞,減少被攻擊的風(fēng)險(xiǎn)。?教育和培訓(xùn)?:對(duì)網(wǎng)絡(luò)管理員和用戶(hù)進(jìn)行網(wǎng)絡(luò)安全培訓(xùn),提高他們對(duì)ARP攻擊等網(wǎng)絡(luò)安全威脅的認(rèn)識(shí)和應(yīng)對(duì)能力。(2)案例場(chǎng)景

①neighbor table overflow(鄰居表溢出)

案例詳情:在一個(gè)大型企業(yè)網(wǎng)絡(luò)中,有許多 Linux 服務(wù)器和客戶(hù)端設(shè)備。網(wǎng)絡(luò)中的一臺(tái) Linux 服務(wù)器承擔(dān)著多種網(wǎng)絡(luò)服務(wù),如文件共享、數(shù)據(jù)庫(kù)服務(wù)等。該服務(wù)器的 ARP 鄰居表大小有限(默認(rèn)大小或者管理員設(shè)置了一個(gè)相對(duì)較小的值)。隨著網(wǎng)絡(luò)中設(shè)備的不斷增加和頻繁的網(wǎng)絡(luò)交互,服務(wù)器的 ARP 鄰居表逐漸被填滿(mǎn)。例如,企業(yè)新增加了多個(gè)部門(mén)的客戶(hù)端設(shè)備,并且有大量的臨時(shí)設(shè)備(如訪客設(shè)備)接入網(wǎng)絡(luò)。當(dāng)服務(wù)器需要與新的設(shè)備進(jìn)行通信時(shí),由于鄰居表已滿(mǎn),無(wú)法再記錄新的 ARP 條目。丟包現(xiàn)象及影響:服務(wù)器在嘗試與新設(shè)備通信時(shí),無(wú)法正確解析目標(biāo)設(shè)備的 MAC 地址。從服務(wù)器端看,發(fā)送到新設(shè)備的數(shù)據(jù)包因?yàn)闊o(wú)法確定目標(biāo) MAC 地址而被丟棄。對(duì)于需要與新設(shè)備交互的網(wǎng)絡(luò)服務(wù),如文件共享服務(wù)中向新客戶(hù)端發(fā)送文件或者數(shù)據(jù)庫(kù)服務(wù)中響應(yīng)新客戶(hù)端的查詢(xún)請(qǐng)求,都會(huì)失敗。這會(huì)影響企業(yè)內(nèi)部的工作效率和業(yè)務(wù)流程,如員工無(wú)法及時(shí)獲取文件或查詢(xún)數(shù)據(jù)。②unresolved drops(未解析丟棄)

案例詳情:考慮一個(gè)小型辦公網(wǎng)絡(luò),其中有一臺(tái) Linux 服務(wù)器作為打印服務(wù)器。網(wǎng)絡(luò)中的打印機(jī)和客戶(hù)端都連接到同一個(gè)交換機(jī)上。由于網(wǎng)絡(luò)中的某些故障(如交換機(jī)的端口出現(xiàn)短暫的電氣故障或者網(wǎng)絡(luò)中的電磁干擾),打印機(jī)的 ARP 請(qǐng)求或響應(yīng)數(shù)據(jù)包在傳輸過(guò)程中被損壞。當(dāng)客戶(hù)端向打印服務(wù)器發(fā)送打印任務(wù)時(shí),打印服務(wù)器需要將數(shù)據(jù)包轉(zhuǎn)發(fā)給打印機(jī)。但是,由于之前打印機(jī)的 ARP 信息未正確解析(因?yàn)?ARP 請(qǐng)求或響應(yīng)數(shù)據(jù)包損壞),打印服務(wù)器沒(méi)有正確的打印機(jī) MAC 地址。

丟包現(xiàn)象及影響:打印服務(wù)器無(wú)法將打印任務(wù)數(shù)據(jù)包發(fā)送給打印機(jī),這些數(shù)據(jù)包被丟棄。在客戶(hù)端表現(xiàn)為打印任務(wù)失敗,顯示打印機(jī)不可用或者連接錯(cuò)誤。這會(huì)影響辦公效率,尤其是在需要及時(shí)打印重要文件的情況下。

(3)排查與解決措施

(一)排查方法

檢查鄰居表狀態(tài):在 Linux 系統(tǒng)中,可以使用命令 “ip neigh show” 查看 ARP 鄰居表的內(nèi)容。檢查鄰居表中的條目數(shù)量是否接近上限,以及是否存在異常的條目(如過(guò)期的或者不正確的 MAC 地址對(duì)應(yīng)關(guān)系)??梢允褂镁W(wǎng)絡(luò)監(jiān)控工具(如 Wireshark)在服務(wù)器的網(wǎng)絡(luò)接口上捕獲 ARP 數(shù)據(jù)包,查看是否有大量的 ARP 請(qǐng)求和響應(yīng),這可能暗示鄰居表存在問(wèn)題。

檢查 ARP 解析失敗情況:查看系統(tǒng)日志(如 syslog),搜索與 ARP 相關(guān)的錯(cuò)誤消息,例如 “ARP resolution failed” 之類(lèi)的提示。這些消息可能會(huì)指出哪些設(shè)備的 ARP 解析出現(xiàn)問(wèn)題。在懷疑有未解析丟棄的情況下,再次使用 Wireshark 在相關(guān)設(shè)備(如上述案例中的打印服務(wù)器和打印機(jī)連接的網(wǎng)絡(luò)部分)捕獲數(shù)據(jù)包,重點(diǎn)關(guān)注 ARP 數(shù)據(jù)包的完整性和交互過(guò)程,看是否存在請(qǐng)求或響應(yīng)被損壞的情況。

(二)解決措施

處理鄰居表溢出:如果確定是鄰居表溢出導(dǎo)致的丟包,可以增加鄰居表的大小。在 Linux 系統(tǒng)中,可以通過(guò)修改內(nèi)核參數(shù)來(lái)實(shí)現(xiàn)。例如,對(duì)于 IPv4,可以調(diào)整 “net.ipv4.neigh.default.gc_thresh1”、“net.ipv4.neigh.default.gc_thresh2” 和 “net.ipv4.neigh.default.gc_thresh3” 這幾個(gè)參數(shù)。這些參數(shù)分別控制著鄰居表的垃圾回收閾值,適當(dāng)提高這些值可以增加鄰居表的容量。定期清理鄰居表中的過(guò)期條目,可以使用腳本或者工具來(lái)實(shí)現(xiàn)。例如,可以編寫(xiě)一個(gè)定期執(zhí)行的腳本,使用 “ip neigh del” 命令刪除那些長(zhǎng)時(shí)間沒(méi)有更新的 ARP 條目。

解決未解析丟棄問(wèn)題:對(duì)于因 ARP 數(shù)據(jù)包損壞導(dǎo)致的未解析丟棄,首先要排查網(wǎng)絡(luò)硬件故障。檢查交換機(jī)、網(wǎng)線等設(shè)備是否正常工作,修復(fù)或更換有問(wèn)題的硬件。如果是電磁干擾問(wèn)題,可以采取措施減少干擾,如重新布置網(wǎng)線,使其遠(yuǎn)離大型電機(jī)等干擾源;或者在無(wú)線網(wǎng)絡(luò)中,更改無(wú)線頻段以避開(kāi)干擾。在網(wǎng)絡(luò)設(shè)備(如交換機(jī))上,可以啟用一些可靠性功能,如端口鏡像功能,以便更好地監(jiān)測(cè)和診斷 ARP 數(shù)據(jù)包在網(wǎng)絡(luò)中的傳輸情況,及時(shí)發(fā)現(xiàn)和解決問(wèn)題。

2.11udp 接收 buffer 滿(mǎn)

(1)概述及原理

UDP(用戶(hù)數(shù)據(jù)報(bào)協(xié)議)是一種無(wú)連接的傳輸層協(xié)議,它不提供流量控制和擁塞控制機(jī)制。當(dāng) UDP 接收端的接收 buffer 滿(mǎn)時(shí),新到達(dá)的 UDP 數(shù)據(jù)包將無(wú)處存放,從而導(dǎo)致丟包。這可能是由于接收端處理速度跟不上數(shù)據(jù)包的到達(dá)速度,或者接收 buffer 的大小設(shè)置不合理等原因造成的。

在C++中,如果你遇到UDP接收緩沖區(qū)滿(mǎn)的問(wèn)題,這通常意味著你的程序正在接收UDP數(shù)據(jù)包的速度超過(guò)了它可以處理的速度。這可能是因?yàn)榫W(wǎng)絡(luò)條件不佳、程序處理能力不足或者接收緩沖區(qū)設(shè)置得太小。

為了解決這個(gè)問(wèn)題,你可以考慮以下幾個(gè)方法:

增加接收緩沖區(qū)的大?。耗憧梢允褂胹etsockopt函數(shù)來(lái)增加UDP的接收緩沖區(qū)大小。優(yōu)化程序處理速度:檢查你的程序是否在接收到UDP數(shù)據(jù)包后立即處理,而沒(méi)有適當(dāng)?shù)木彌_和流控制機(jī)制。如果是,考慮改善程序設(shè)計(jì),使其能夠緩存和排隊(duì)數(shù)據(jù)包,或者通過(guò)調(diào)用recv時(shí)使用MSG_DONTWAIT或者M(jìn)SG_PEEK標(biāo)志來(lái)查詢(xún)是否有數(shù)據(jù)包可以接收,而不是立即消耗它們。使用異步I/O:如果你正在使用類(lèi)似于Boost.Asio這樣的庫(kù),你可以設(shè)置處理程序來(lái)異步接收數(shù)據(jù),這樣可以避免阻塞并允許你在處理完當(dāng)前數(shù)據(jù)包后再接收新的數(shù)據(jù)包。丟棄舊的或不重要的數(shù)據(jù)包:如果你的程序無(wú)法及時(shí)處理所有到達(dá)的數(shù)據(jù)包,你可以決定丟棄舊數(shù)據(jù)包或者低優(yōu)先級(jí)的數(shù)據(jù)包,以保持系統(tǒng)的運(yùn)行。使用SO_REUSEPORT和SO_REUSEADDR選項(xiàng):這些選項(xiàng)可以讓你的程序在緩沖區(qū)滿(mǎn)時(shí)繼續(xù)接收數(shù)據(jù)包,而不是丟棄新的數(shù)據(jù)包。檢查網(wǎng)絡(luò)條件:如果網(wǎng)絡(luò)條件本身較差,考慮優(yōu)化網(wǎng)絡(luò)配置或者使用其他網(wǎng)絡(luò)資源。

(2)案例場(chǎng)景

①實(shí)時(shí)視頻監(jiān)控系統(tǒng)

案例詳情:在一個(gè)大型商場(chǎng)的安全監(jiān)控系統(tǒng)中,采用了基于 UDP 的視頻監(jiān)控方案。多個(gè)高清攝像頭將實(shí)時(shí)視頻流通過(guò) UDP 協(xié)議發(fā)送到監(jiān)控服務(wù)器。每個(gè)攝像頭以較高的幀率(例如 30 幀 / 秒)和分辨率(如 1080p)進(jìn)行視頻采集和傳輸,產(chǎn)生了大量的 UDP 數(shù)據(jù)包。監(jiān)控服務(wù)器的 UDP 接收 buffer 大小設(shè)置為默認(rèn)值,沒(méi)有根據(jù)實(shí)際的視頻流數(shù)據(jù)量進(jìn)行調(diào)整。由于商場(chǎng)客流量大,需要監(jiān)控的區(qū)域多,攝像頭數(shù)量眾多,大量的 UDP 視頻數(shù)據(jù)包快速涌向監(jiān)控服務(wù)器。服務(wù)器上運(yùn)行的視頻處理程序在處理這些數(shù)據(jù)包時(shí),受到 CPU 和內(nèi)存資源的限制,不能及時(shí)從接收 buffer 中讀取和處理數(shù)據(jù),導(dǎo)致 UDP 接收 buffer 逐漸被填滿(mǎn)。丟包現(xiàn)象及影響:新到達(dá)的 UDP 視頻數(shù)據(jù)包被丟棄,在監(jiān)控畫(huà)面上表現(xiàn)為畫(huà)面卡頓、跳幀甚至部分畫(huà)面丟失。對(duì)于安全監(jiān)控來(lái)說(shuō),這可能會(huì)錯(cuò)過(guò)一些重要的安全事件,如商場(chǎng)內(nèi)的盜竊、顧客突發(fā)疾病等情況,影響商場(chǎng)的安全管理。②實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)

案例詳情:某工廠有一個(gè)基于 UDP 的實(shí)時(shí)數(shù)據(jù)采集系統(tǒng),用于采集各種生產(chǎn)設(shè)備(如數(shù)控機(jī)床、自動(dòng)化生產(chǎn)線等)的運(yùn)行參數(shù),如溫度、壓力、轉(zhuǎn)速等。這些生產(chǎn)設(shè)備以固定的時(shí)間間隔(例如每 100 毫秒)發(fā)送包含運(yùn)行參數(shù)的 UDP 數(shù)據(jù)包到數(shù)據(jù)采集服務(wù)器。在生產(chǎn)高峰期,大量設(shè)備同時(shí)發(fā)送數(shù)據(jù),產(chǎn)生了密集的 UDP 數(shù)據(jù)包流。數(shù)據(jù)采集服務(wù)器的 UDP 接收 buffer 容量有限,且服務(wù)器同時(shí)還在運(yùn)行其他數(shù)據(jù)處理任務(wù)(如數(shù)據(jù)分析、存儲(chǔ)到數(shù)據(jù)庫(kù)等),這使得服務(wù)器無(wú)法及時(shí)處理 UDP 接收 buffer 中的數(shù)據(jù)。隨著數(shù)據(jù)的不斷涌入,UDP 接收 buffer 被填滿(mǎn)。

丟包現(xiàn)象及影響:新到達(dá)的包含生產(chǎn)設(shè)備運(yùn)行參數(shù)的 UDP 數(shù)據(jù)包被丟棄。這會(huì)導(dǎo)致采集到的生產(chǎn)數(shù)據(jù)不完整,對(duì)于工廠的生產(chǎn)管理來(lái)說(shuō),可能無(wú)法準(zhǔn)確掌握設(shè)備的運(yùn)行狀態(tài),影響設(shè)備維護(hù)計(jì)劃的制定、產(chǎn)品質(zhì)量的控制等,例如可能無(wú)法及時(shí)發(fā)現(xiàn)設(shè)備的異常溫度升高,從而引發(fā)設(shè)備故障和生產(chǎn)中斷。

③網(wǎng)絡(luò)游戲服務(wù)器

案例詳情:在一個(gè)多人在線角色扮演游戲(MMORPG)中,游戲服務(wù)器使用 UDP 協(xié)議來(lái)處理玩家之間的交互數(shù)據(jù),如角色的位置移動(dòng)、攻擊動(dòng)作等信息。在游戲中的某些特殊場(chǎng)景(如大型團(tuán)戰(zhàn)場(chǎng)景),大量玩家在短時(shí)間內(nèi)頻繁操作,產(chǎn)生了大量的 UDP 數(shù)據(jù)包。游戲服務(wù)器的 UDP 接收 buffer 沒(méi)有根據(jù)游戲場(chǎng)景的峰值流量進(jìn)行優(yōu)化。服務(wù)器在處理這些 UDP 數(shù)據(jù)包時(shí),由于要進(jìn)行復(fù)雜的游戲邏輯計(jì)算(如碰撞檢測(cè)、技能效果計(jì)算等),不能及時(shí)清空 UDP 接收 buffer,導(dǎo)致接收 buffer 被填滿(mǎn)。

丟包現(xiàn)象及影響:玩家操作產(chǎn)生的 UDP 數(shù)據(jù)包被丟棄,在游戲中表現(xiàn)為角色動(dòng)作不連貫、位置瞬移、技能釋放失敗等現(xiàn)象。這嚴(yán)重影響了玩家的游戲體驗(yàn),可能導(dǎo)致玩家流失,對(duì)游戲的運(yùn)營(yíng)和口碑產(chǎn)生負(fù)面影響。

(3)排查與解決措施

(一)排查方法

檢查 UDP 接收 buffer 狀態(tài):使用命令 “netstat -s” 查看 UDP 相關(guān)的統(tǒng)計(jì)信息,重點(diǎn)關(guān)注 “UDP receive errors” 指標(biāo)。如果這個(gè)值不斷增加,很可能是 UDP 接收 buffer 滿(mǎn)導(dǎo)致丟包??梢允褂镁W(wǎng)絡(luò)分析工具(如 Wireshark)在接收端捕獲 UDP 數(shù)據(jù)包,觀察數(shù)據(jù)包的接收情況,看是否有數(shù)據(jù)包丟失的跡象,同時(shí)查看接收端的接收速率和處理速率是否匹配。

分析接收端處理能力:使用性能分析工具(如 top、htop 或 perf)來(lái)監(jiān)控接收端(如監(jiān)控服務(wù)器、數(shù)據(jù)采集服務(wù)器或游戲服務(wù)器)的 CPU 和內(nèi)存使用情況。如果 CPU 使用率過(guò)高或者內(nèi)存不足,可能會(huì)影響服務(wù)器對(duì) UDP 數(shù)據(jù)包的處理速度,進(jìn)而導(dǎo)致 UDP 接收 buffer 滿(mǎn)。檢查接收端的應(yīng)用程序日志,看是否有關(guān)于 UDP 數(shù)據(jù)包處理緩慢或錯(cuò)誤的記錄,這有助于確定是應(yīng)用程序本身的問(wèn)題還是其他外部因素導(dǎo)致的 UDP 接收 buffer 滿(mǎn)。

(二)解決措施

調(diào)整 UDP 接收 buffer 大?。涸?Linux 系統(tǒng)中,可以通過(guò)修改內(nèi)核參數(shù)來(lái)增加 UDP 接收 buffer 的大小。使用命令 “sysctl -w net.core.rmem_max=” 和 “sysctl -w net.core.rmem_default=” 來(lái)設(shè)置 UDP 接收 buffer 的最大值和默認(rèn)值,其中 < new_value > 是根據(jù)實(shí)際需求確定的合適數(shù)值。對(duì)于一些特定的應(yīng)用程序,也可以在應(yīng)用程序內(nèi)部調(diào)整 UDP 接收 buffer 的大小,如果應(yīng)用程序提供了這樣的功能。

優(yōu)化接收端處理性能:如果是接收端的 CPU 或內(nèi)存資源限制導(dǎo)致無(wú)法及時(shí)處理 UDP 數(shù)據(jù)包,可以考慮升級(jí)硬件,如增加 CPU 核心數(shù)、擴(kuò)大內(nèi)存容量等。對(duì)接收端的應(yīng)用程序進(jìn)行優(yōu)化,如優(yōu)化算法以提高數(shù)據(jù)處理速度,采用多線程或多進(jìn)程技術(shù)來(lái)提高并發(fā)處理能力。例如,在視頻監(jiān)控服務(wù)器中,可以將視頻解碼和存儲(chǔ)等任務(wù)分配到不同的線程或進(jìn)程中,提高整體處理效率。對(duì)于網(wǎng)絡(luò)游戲服務(wù)器,可以?xún)?yōu)化游戲邏輯計(jì)算算法,減少不必要的計(jì)算,提高對(duì) UDP 數(shù)據(jù)包的處理速度,從而避免 UDP 接收 buffer 被填滿(mǎn)。

2.12模擬丟包場(chǎng)景

①使用 tc(Traffic Control)模擬丟包

(一)案例詳情

網(wǎng)絡(luò)拓?fù)渑c環(huán)境設(shè)置:考慮一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)實(shí)驗(yàn)室環(huán)境,有一臺(tái) Linux 服務(wù)器作為發(fā)送端,一臺(tái) Linux 客戶(hù)端作為接收端,它們通過(guò)以太網(wǎng)交換機(jī)相連。服務(wù)器和客戶(hù)端都運(yùn)行在千兆以太網(wǎng)環(huán)境下。在服務(wù)器上,我們想要模擬網(wǎng)絡(luò)擁塞導(dǎo)致的丟包情況,以測(cè)試客戶(hù)端應(yīng)用程序在這種情況下的表現(xiàn)。

tc 規(guī)則配置與丟包模擬

管理員在服務(wù)器的網(wǎng)絡(luò)接口(例如 eth0)上使用 tc 工具配置流量控制規(guī)則。首先,創(chuàng)建一個(gè)根隊(duì)列規(guī)則:“tc qdisc add dev eth0 root handle 1: htb”,這里使用了層次化令牌桶(HTB)隊(duì)列規(guī)則。

然后,在根隊(duì)列下創(chuàng)建一個(gè)子隊(duì)列用于模擬丟包:“tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit burst 15k”,這個(gè)子隊(duì)列被設(shè)置為 100Mbps 的速率和 15KB 的突發(fā)量。

接著,為這個(gè)子隊(duì)列設(shè)置丟包概率:“tc qdisc add dev eth0 parent 1:1 handle 10: netem loss 5%”,這意味著在這個(gè)子隊(duì)列中的數(shù)據(jù)包有 5% 的概率被丟棄。

當(dāng)服務(wù)器向客戶(hù)端發(fā)送數(shù)據(jù)時(shí),根據(jù)配置的規(guī)則,部分?jǐn)?shù)據(jù)包會(huì)被隨機(jī)丟棄,就像在真實(shí)的網(wǎng)絡(luò)擁塞場(chǎng)景下一樣。

(二)丟包現(xiàn)象及影響

對(duì)網(wǎng)絡(luò)應(yīng)用的影響:如果服務(wù)器正在向客戶(hù)端發(fā)送一個(gè)大文件(例如通過(guò) FTP 協(xié)議),由于數(shù)據(jù)包的隨機(jī)丟棄,在客戶(hù)端會(huì)發(fā)現(xiàn)文件傳輸速度變慢,并且文件傳輸可能會(huì)失敗(如果丟包導(dǎo)致文件校驗(yàn)和錯(cuò)誤等情況)。對(duì)于實(shí)時(shí)性要求較高的應(yīng)用,如視頻流播放,客戶(hù)端會(huì)看到視頻畫(huà)面卡頓、跳幀,音頻也可能出現(xiàn)中斷。因?yàn)橐曨l流是由一系列連續(xù)的數(shù)據(jù)包組成的,丟包會(huì)破壞視頻和音頻數(shù)據(jù)的完整性。②使用 netem 模擬丟包

(一)案例詳情

網(wǎng)絡(luò)場(chǎng)景與模擬目標(biāo):在一個(gè)企業(yè)網(wǎng)絡(luò)中,有一個(gè)基于 Linux 的內(nèi)部測(cè)試環(huán)境,包含多個(gè)服務(wù)器和客戶(hù)端,用于測(cè)試新開(kāi)發(fā)的網(wǎng)絡(luò)應(yīng)用。網(wǎng)絡(luò)管理員想要模擬網(wǎng)絡(luò)不穩(wěn)定情況下的丟包現(xiàn)象,以評(píng)估應(yīng)用的健壯性。

netem 配置與丟包模擬:在連接測(cè)試環(huán)境的網(wǎng)絡(luò)設(shè)備(可以是路由器或者在服務(wù)器的網(wǎng)絡(luò)接口上直接設(shè)置)上使用 netem 工具進(jìn)行配置。例如,在服務(wù)器的 eth0 接口上設(shè)置:“tc qdisc add dev eth0 root netem loss 10%”,這表示在 eth0 接口上發(fā)送的數(shù)據(jù)包有 10% 的概率被丟棄。同時(shí),還可以設(shè)置其他參數(shù)來(lái)模擬更復(fù)雜的網(wǎng)絡(luò)情況,如延遲和抖動(dòng):“tc qdisc add dev eth0 root netem delay 50ms 10ms distribution normal”,這不僅設(shè)置了 10% 的丟包率,還設(shè)置了平均 50ms 的延遲,并且延遲有 10ms 的抖動(dòng),且延遲的分布為正態(tài)分布。

(二)丟包現(xiàn)象及影響

對(duì)網(wǎng)絡(luò)應(yīng)用的影響:對(duì)于企業(yè)內(nèi)部開(kāi)發(fā)的基于 TCP 的網(wǎng)絡(luò)應(yīng)用,如數(shù)據(jù)庫(kù)查詢(xún)應(yīng)用,丟包會(huì)導(dǎo)致查詢(xún)結(jié)果返回延遲或者查詢(xún)失敗。因?yàn)?TCP 會(huì)對(duì)丟包進(jìn)行重傳,多次丟包會(huì)使重傳次數(shù)增加,延長(zhǎng)查詢(xún)時(shí)間,甚至在重傳次數(shù)超過(guò)限制后認(rèn)為連接失敗。對(duì)于基于 UDP 的內(nèi)部監(jiān)控系統(tǒng),丟包會(huì)導(dǎo)致監(jiān)控?cái)?shù)據(jù)的不完整。例如,監(jiān)控系統(tǒng)用于收集服務(wù)器的性能指標(biāo)(如 CPU 使用率、內(nèi)存使用率等),丟包可能會(huì)使部分時(shí)間段的性能數(shù)據(jù)丟失,影響對(duì)服務(wù)器狀態(tài)的準(zhǔn)確判斷。

(3)排查與解決措施

(一)排查方法

檢查 tc 或 netem 規(guī)則設(shè)置:在使用 tc 工具時(shí),可以使用 “tc -s qdisc show dev ” 命令查看當(dāng)前接口(為具體的網(wǎng)絡(luò)接口,如 eth0)上的隊(duì)列規(guī)則設(shè)置,檢查是否存在丟包相關(guān)的設(shè)置(如 netem loss 參數(shù))。對(duì)于 netem,同樣可以使用類(lèi)似的命令或者查看相關(guān)的配置文件(如果是通過(guò)腳本等方式設(shè)置的)來(lái)確認(rèn)丟包模擬的參數(shù)設(shè)置。

監(jiān)控網(wǎng)絡(luò)流量與丟包情況:使用網(wǎng)絡(luò)流量監(jiān)控工具,如 iftop 或 nload,來(lái)查看網(wǎng)絡(luò)接口的流量情況??梢杂^察到流量的波動(dòng)情況,如果存在丟包模擬,流量可能會(huì)有不連續(xù)的現(xiàn)象。使用 ping 命令結(jié)合統(tǒng)計(jì)選項(xiàng)(如 “ping -c 100 -s 1000 ”,其中 -c 表示發(fā)送的數(shù)據(jù)包數(shù)量,-s 表示數(shù)據(jù)包大小,為目標(biāo)地址)來(lái)測(cè)試丟包率。對(duì)比實(shí)際丟包率與模擬丟包率是否相符。

(二)解決措施

調(diào)整或清除模擬規(guī)則:如果在測(cè)試過(guò)程中想要調(diào)整丟包率或者其他模擬參數(shù),可以重新執(zhí)行 tc 或 netem 的配置命令,修改相應(yīng)的參數(shù)。例如,要將丟包率從 10% 調(diào)整為 5%,可以重新執(zhí)行 “tc qdisc change dev eth0 root netem loss 5%”。如果想要停止丟包模擬,對(duì)于 tc 規(guī)則,可以使用 “tc qdisc del dev eth0 root” 命令刪除根隊(duì)列規(guī)則;對(duì)于 netem,可以根據(jù)具體的設(shè)置情況,先刪除 netem 相關(guān)的 qdisc 規(guī)則,再刪除根隊(duì)列規(guī)則(如果有)。

優(yōu)化應(yīng)用應(yīng)對(duì)丟包能力:對(duì)于受到丟包影響的網(wǎng)絡(luò)應(yīng)用,開(kāi)發(fā)人員可以在應(yīng)用程序中加入丟包處理機(jī)制。對(duì)于 TCP - 應(yīng)用,可以?xún)?yōu)化重傳策略,如調(diào)整重傳超時(shí)時(shí)間(RTO)或者采用更智能的重傳算法。對(duì)于 UDP - 應(yīng)用,可以在應(yīng)用程序中添加數(shù)據(jù)校驗(yàn)和重傳請(qǐng)求機(jī)制。例如,在 UDP - 監(jiān)控系統(tǒng)中,當(dāng)發(fā)現(xiàn)數(shù)據(jù)丟失時(shí),可以由接收端向發(fā)送端發(fā)送重傳請(qǐng)求,發(fā)送端根據(jù)請(qǐng)求重新發(fā)送丟失的數(shù)據(jù)。

三、丟包定位方法

3.1使用 dropwatch 查看丟包

(1)dropwatch 原理

dropwatch 是一個(gè)用于實(shí)時(shí)監(jiān)控 Linux 內(nèi)核網(wǎng)絡(luò)數(shù)據(jù)包丟棄情況的工具。它通過(guò)內(nèi)核的 netlink 套接字與內(nèi)核進(jìn)行通信,獲取有關(guān)網(wǎng)絡(luò)數(shù)據(jù)包丟棄的信息,包括在哪個(gè)網(wǎng)絡(luò)接口、哪種協(xié)議下發(fā)生丟包以及丟包的大致原因等。

(二)操作步驟與案例分析

①安裝 dropwatch(如果未安裝):在基于 Debian 或 Ubuntu 的系統(tǒng)中,可以使用 “sudo apt - get install dropwatch” 命令進(jìn)行安裝;在基于 Red Hat 或 CentOS 的系統(tǒng)中,可以使用 “yum install dropwatch” 命令(如果有相應(yīng)的軟件源)。

②啟動(dòng) dropwatch 并查看丟包信息:以管理員權(quán)限啟動(dòng) dropwatch,例如在終端中輸入 “sudo dropwatch - l eth0”(假設(shè)要監(jiān)控 eth0 接口的丟包情況)。

案例分析:在一個(gè)企業(yè)網(wǎng)絡(luò)中,有一臺(tái) Linux 服務(wù)器提供網(wǎng)絡(luò)服務(wù),用戶(hù)反映網(wǎng)絡(luò)連接不穩(wěn)定。管理員啟動(dòng) dropwatch 監(jiān)控服務(wù)器的 eth0 接口。發(fā)現(xiàn)有大量的 UDP 數(shù)據(jù)包在某個(gè)特定的端口上被丟棄。進(jìn)一步檢查發(fā)現(xiàn),是由于該端口對(duì)應(yīng)的應(yīng)用程序沒(méi)有正確處理 UDP 數(shù)據(jù)包,導(dǎo)致內(nèi)核丟棄這些數(shù)據(jù)包。

③解讀 dropwatch 輸出結(jié)果:dropwatch 的輸出結(jié)果通常包含時(shí)間戳、丟包數(shù)量、丟包的網(wǎng)絡(luò)接口以及可能的丟包原因(如果能夠確定)等信息。例如:

“09:30:15.234321 12 UDP eth0 pkttype unicast proto 17 (UDP) saddr 192.168.1.100 daddr 192.168.1.200 length 512 drop reason: no buffer space”,這個(gè)輸出表示在 09:30:15.234321 這個(gè)時(shí)間點(diǎn),有 12 個(gè) UDP 數(shù)據(jù)包在 eth0 接口被丟棄,源地址是 192.168.1.100,目標(biāo)地址是 192.168.1.200,數(shù)據(jù)包長(zhǎng)度為 512 字節(jié),丟包原因是沒(méi)有緩沖區(qū)空間。

3.2利用 iptables LOG 跟蹤報(bào)文流程

(1)iptables LOG 原理

iptables 是 Linux 系統(tǒng)中的防火墻工具,其中的 LOG 目標(biāo)可以用于記錄匹配特定規(guī)則的數(shù)據(jù)包的相關(guān)信息。通過(guò)設(shè)置合適的 iptables 規(guī)則,可以跟蹤數(shù)據(jù)包在網(wǎng)絡(luò)中的流動(dòng)情況,包括數(shù)據(jù)包是否被防火墻接受、拒絕或者在傳輸過(guò)程中是否有異常情況,從而幫助定位丟包的位置和原因。

(2)操作步驟與案例分析

①設(shè)置 iptables LOG 規(guī)則

例如,要跟蹤進(jìn)入服務(wù)器的所有 TCP 數(shù)據(jù)包,可以使用以下命令:“iptables -A INPUT -p tcp -j LOG --log - prefix "TCP_INBOUND:"”,這個(gè)規(guī)則會(huì)記錄所有進(jìn)入服務(wù)器的 TCP 數(shù)據(jù)包,并在日志中添加 “TCP_INBOUND: ” 作為前綴以便區(qū)分。

對(duì)于出站數(shù)據(jù)包,例如要跟蹤從服務(wù)器發(fā)出的 UDP 數(shù)據(jù)包,可以使用:“iptables -A OUTPUT -p udp -j LOG --log - prefix "UDP_OUTBOUND: "”。

②查看系統(tǒng)日志中的 iptables 記錄

在 Debian 或 Ubuntu 系統(tǒng)中,日志通常位于 “/var/log/syslog” 文件中;在 Red Hat 或 CentOS 系統(tǒng)中,日志可能位于 “/var/log/messages” 文件中。

案例分析:在一個(gè)網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)環(huán)境中,開(kāi)發(fā)人員發(fā)現(xiàn)從客戶(hù)端發(fā)送到 Linux 服務(wù)器的某些 HTTP 請(qǐng)求沒(méi)有得到響應(yīng),懷疑是網(wǎng)絡(luò)中間環(huán)節(jié)丟包。通過(guò)設(shè)置 iptables LOG 規(guī)則,在服務(wù)器的系統(tǒng)日志中發(fā)現(xiàn),來(lái)自特定客戶(hù)端 IP 的 HTTP 請(qǐng)求(TCP 端口 80)在到達(dá)服務(wù)器的 INPUT 鏈時(shí)被某個(gè)之前設(shè)置的防火墻規(guī)則意外拒絕,導(dǎo)致丟包。

③分析日志內(nèi)容確定丟包情況

從 iptables 的日志記錄中,可以查看數(shù)據(jù)包的源地址、目標(biāo)地址、協(xié)議類(lèi)型、端口號(hào)以及被處理的鏈(如 INPUT、OUTPUT 或 FORWARD)等信息。例如:

“Jan 15 10:15:30 server TCP_INBOUND: IN = eth0 OUT = MAC = 00:11:22:33:44:55:66:77:88:99:aa:bb SRC = 192.168.1.100 DST = 192.168.1.200 LEN = 512 TOS = 0x00 PRET = 0x00000000 CID = 0 SPI = 0x00000000 SEQ = 0x12345678 ACK = 0x00000000 WINDOW = 0 URGP = 0 OPT (0x0011)=.... TCP FIN,ACK”,這個(gè)記錄顯示了一個(gè)進(jìn)入 eth0 接口的 TCP 數(shù)據(jù)包的詳細(xì)信息,包括源地址、目標(biāo)地址、長(zhǎng)度等,通過(guò)分析這些信息可以判斷數(shù)據(jù)包是否按照預(yù)期被處理,從而確定是否存在丟包情況。

3.3利用 iptables 規(guī)則跟蹤丟包

(1)原理

除了使用 iptables LOG 來(lái)跟蹤報(bào)文流程外,還可以通過(guò)設(shè)置特定的 iptables 規(guī)則來(lái)模擬丟包場(chǎng)景,進(jìn)而確定在網(wǎng)絡(luò)傳輸?shù)哪膫€(gè)環(huán)節(jié)可能會(huì)出現(xiàn)丟包。例如,設(shè)置一個(gè)規(guī)則來(lái)丟棄特定源地址、目標(biāo)地址或協(xié)議類(lèi)型的數(shù)據(jù)包,然后觀察網(wǎng)絡(luò)應(yīng)用的反應(yīng),從而定位丟包相關(guān)的問(wèn)題。

(2)操作步驟與案例分析

①設(shè)置丟包模擬的 iptables 規(guī)則

假設(shè)要模擬丟棄來(lái)自特定 IP 地址(例如 192.168.1.100)的 UDP 數(shù)據(jù)包,可以使用以下命令:“iptables -A INPUT -s 192.168.1.100 -p udp -j DROP”。

如果要模擬在特定網(wǎng)絡(luò)接口(如 eth0)上丟棄所有的 TCP 數(shù)據(jù)包,可以使用:“iptables -A INPUT -i eth0 -p tcp -j DROP”。

②觀察網(wǎng)絡(luò)應(yīng)用反應(yīng)定位丟包

案例分析:在一個(gè)多媒體播放系統(tǒng)中,客戶(hù)端通過(guò) UDP 協(xié)議從 Linux 服務(wù)器獲取音頻和視頻流。用戶(hù)報(bào)告說(shuō)音頻流偶爾會(huì)中斷,懷疑是網(wǎng)絡(luò)丟包。管理員在服務(wù)器上設(shè)置了上述的 iptables 規(guī)則,模擬丟棄來(lái)自客戶(hù)端 IP 地址的 UDP 數(shù)據(jù)包。發(fā)現(xiàn)當(dāng)設(shè)置這個(gè)規(guī)則時(shí),音頻流中斷的情況與用戶(hù)報(bào)告的現(xiàn)象一致。進(jìn)一步檢查發(fā)現(xiàn),是因?yàn)榫W(wǎng)絡(luò)中的某個(gè)中間設(shè)備(如路由器)對(duì) UDP 流量有特殊的限制或者錯(cuò)誤配置,導(dǎo)致 UDP 數(shù)據(jù)包在傳輸過(guò)程中被丟棄。

③調(diào)整規(guī)則排查問(wèn)題:在確定了可能的丟包環(huán)節(jié)后,可以調(diào)整 iptables 規(guī)則進(jìn)行進(jìn)一步的排查。例如,可以修改規(guī)則的條件,如將源地址范圍擴(kuò)大或者縮小,或者改變協(xié)議類(lèi)型等,以更精確地定位丟包的原因。例如,如果懷疑是某個(gè) IP 地址段的問(wèn)題,可以將規(guī)則中的源地址修改為該 IP 地址段,如 “iptables -A INPUT -s 192.168.1.0/24 -p udp -j DROP”,然后觀察網(wǎng)絡(luò)應(yīng)用的反應(yīng)。

最后想補(bǔ)充一點(diǎn),很多網(wǎng)工用Ping命令來(lái)檢測(cè)丟包情況,但其實(shí)除了Ping,常用的tracert,nslookup 都可以用來(lái)判斷主機(jī)的網(wǎng)絡(luò)連通性。

而且 Linux 下有一個(gè)更好用的網(wǎng)絡(luò)聯(lián)通性判斷工具,它可以結(jié)合ping nslookup traceroute 來(lái)判斷網(wǎng)絡(luò)的相關(guān)特性,這個(gè)命令就是 mtr。

mtr 全稱(chēng) my traceroute,是一個(gè)把 ping 和 traceroute 合并到一個(gè)程序的網(wǎng)絡(luò)診斷工具。traceroute 默認(rèn)使用 UDP 數(shù)據(jù)包探測(cè),而 mtr 默認(rèn)使用 ICMP 報(bào)文探測(cè),ICMP 在某些路由節(jié)點(diǎn)的優(yōu)先級(jí)要比其他數(shù)據(jù)包低,所以測(cè)試得到的數(shù)據(jù)可能低于實(shí)際情況。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉