2020年7月1日 星期三

QoS中ToS和CoS的區別?802.1p、ip pri、dscp的區別?

from:https://blog.51cto.com/imccie/1750821

談到qos首先需要了解qos調度的幾個重要過程,qos調度過程包括網絡入口數據流量的分類和標記、骨幹網設備上的擁塞避免和擁塞管理、網路出口的隊列調度這幾個重要過程.
1、cos和tos的區別:
通過acl對流量進行分類以後,緊接著就需要對報文進行標記,打標記可以在三層(ip)報文頭上做,也可以在二層報文頭上做.
tos(type of service)就是指在三層報文頭(即ip頭)作標記,cos(code of service)則是在二層報文頭作標記,tos與cos只是qos的一種標記機制。
2、802.1p、ip preference、tos、dscp的區別:
(1)、802.1p:
當需要在二層報文頭做標記的時候,由於單純二層報文沒有地方能打標記,二層打標記只能在trunk上完成,trunk要用到802.1q或isl協議,如果使用的是802.1q協議,標記會打在802.1q協議頭的tci字段上,打了標記(優先級)後的報文,就稱為802.1p報文了。
二層報文頭:
dasadatafcs

802.1q報文頭:
dasatpid
2byte
tci
2byte
ptdatafcs

tci字段結構:
tci
pri
3 bits
cfi
1 bit
vlan id
12 bits
 
tpid字段標識此報文是802.1q報文,tci字段有3bit是用來標記優先級的,如果標記了優先級就稱為802.1p報文了。
(2)、ip preference和tos:
ip報文結構如下:
versionihltype of servicepacket length
identificationflagfrag offset
time to liveprotocolheader checksum
source address
destination address
optionspadding






ip報文頭的type of sevice字段長度為1個字節,其中高3 bit用來標記優先級,所以有0-7共8個ip preference級別。
type of service字段的中間4bit為tos子字段,最低1bit未用但必須置0。4bit的tos分別代表:最小時延、最大吞吐量、最小費用和最高可靠性。4bit中只能將其中1bit置1。如果所有4bit均為0,那麼就表示是普通服務。type of service字段結構如下:
type of service
xxxdelaytroughputcostrely0
ip preferencetos長置0

(3)、dscp:
為了更精細化的控制數據流分類,rfc2474定義了dscp(differential services code point),dscp擴展了type of service字段的高6 bit來表示報文優先級,因此,標記範圍從0-63。type of service字段結構如下:
type of service
xxxxxx00
ip preference長置0

dscp定義了四個系列,default、cs系列、af系列、ef系列。
①、default :
就是默認的不做優先級,即ip preference字段都是0。
type of service
00000000
ip preference長置0

②、cs系列:
rfc2474定義最高3比特為級別/類別選擇代碼(class selector codepoints,cs),其意義和ipv4報頭中ip優先級的定義是相同的,cs0 ~ cs7的級別相當於ip優先級0 ~ 7。但它並沒有定義第3到第5比特的具體含義以及使用規則。dscp使用6比特,可以定義64個優先級(0-63)。cs系列ip報文中type of service字段結構如下:
 
type of service
00100000
ip preference長置0

.
.
.
type of service
11100000
ip preference長置0

cs = 6網間控制(internetwork control),dscp = 48 (110000).路由協議優先級默認是cs6。
cs = 7網內控制(intranetwork control),dscp = 56 (111000)
③、af :
保證轉發(assured forwarding, af)由rfc2597對cs1~cs4進行進一步定義。它使用第3和第4比特做丟棄優先級標誌。01-低丟棄優先級;10-中丟棄優先級;11-高丟棄優先級。這樣,在同一類數據中,又根據被丟棄的可能性劃分出3個級別。af11~af13,af21~af23,af31~af33,af41~af43.下表列出了af服務等級及其對應的dscp值:

cs1
00100
cs2
01000
cs3
01100
cs4
10000
low drop
01
af11
00101
af21
01001
af31
01101
af41
10001
medium drop
10
af12
00110
af22
01010
af32
01110
af42
10010
high drop
11
af13
00111
af23
01011
af33
01111
af43
10011

④、ef:
由rfc2598定義,dscp值為46 (101110)。ef服務適用於低丟包率,低延遲,低抖動及保證帶寬的業務,voip默認級別是ef。

2020年6月2日 星期二

SMI(MDC/MDIO)介紹 Clause 22/45

From:http://blog.chinaaet.com/justlxy/p/5100064818

SMI:串行管理接口(Serial Management Interface),通常直接被稱為MDIO接口(Management Data Input/Output Interface)。
MDIO最早在IEEE 802.3的第22卷定義,後來在第45卷又定義了增強版本的MDIO,其主要被應用於以太網的MAC和PHY層之間,用於MAC層器件通過讀寫寄存器來實現對PHY層器件的操作與管理。


MDIO主機(即產生MDC時鐘的設備)通常被稱為STA(Station Management Entity),而MDIO從機通常被稱為MMD(MDIO Management Device)。通常STA都是MAC層器件的一部分,而MMD則是PHY層器件的一部分。MDIO接口包括兩條線,MDIO和MDC,其中MDIO是雙向數據線,而MDC是由STA驅動的時鐘線。MDC時鐘的最高速率一般為2.5MHz,MDC也可以是非固定頻率,甚至可以是非週期的。MDIO接口只是會在MDC時鐘的上升沿進行採樣,而並不在意MDC時鐘的頻率(類似於I2C接口)。如下圖所示。
blob.png
MDIO接口有兩個版本,通常被稱為卷22版本和卷45版本。卷22版本的MDIO接口最多支持連接32個MMD(PHY層設備),每個設備最多支持32個寄存器。卷45版本的MDIO接口最多支持連接32個MMD,32個設備類型,每個設備最多支持64K個寄存器。卷22版本的MDIO接口的數據幀格式如下:
blob.png
具體每個bit描述如下:
blob.png
blob.png
卷45版本的MDIO接口的數據幀格式如下:
blob.png
具體每個bit的描述如下:
blob.png
blob.png
如果是STA(MAC層設備)驅動MDIO,則MDIO相對於MDC上升沿,至少要有10ns的建立時間(Setup Time)和10ns的保持時間(Hold Time)。如下圖所示:
blob.png
如果MDIO是由MMD(PHY層設備)驅動的,則MDIO相對於MDC的Tco(Clock to Output Delay)的範圍是0ns~300ns。如下圖所示:
blob.png
實際上,MDC的頻率也並非一定是小於或等於2.5MHz,比如Marvell的88E1512最大支持12MHz的MDC:
blob.png
IEEE 802.3建議同時對MDIO進行下拉(下拉電阻建議為2k歐姆+5%),和上拉(上拉電阻建議為1.5k歐姆+5%),使得在TA時,MDIO處於中間態。但是並非所有的PHY器件都有這樣的要求,比如Marvell的88E1512只要求對MDIO進行上拉即可,上拉電阻範圍為1.5k~10kΩ。
主要參考資料
1、IEEE 802.3 第22卷,第45卷
3、Lattice, RD1194, MDIO Master and Slave Controllers User Guide
4、Marvell,Alaska 88E1512 Datasheet

2020年2月20日 星期四

arp_ignore 和 arp_filter

From:http://huntxu.github.io/2015-12-24-arp-filter-vs-arp-ignore.html


arp_ignore 和 arp_filter

24 Dec 2015
先說結論好了
  1. arp_filter有個表哥叫做rp_filter,這裏的rpReserve Path的意思,其實就是用來檢查返回的包是否會從相對應的到來的包使用相同的網絡接口出去。它們的區別只是層次不同
  2. arp_ignore 則是內核用來確定是否應該回覆從該端口收到的ARP請求的
  3. 這兩個判斷都在內核中的net/ipv4/arp.c
故事是因爲有個同事在一個機器上用libvirt搭建了幾臺虛擬機之後使用橋接連接這幾臺機器,並且使用自動部署工具去部署這幾臺機器。結果發現其中有一臺機器的一個網卡沒有成功得到預期的地址。調查之後發現那臺機器在配置該地址之前使用了arping -D去檢查是否與其他機器已有的地址相互衝突了,剛巧該地址和宿主機之上的另外一個網卡地址相同,於是宿主機上橋接虛擬機網絡的網卡,便響應了那個ARP請求,導致配置失敗。
一開始我也很奇怪,爲什麼明明宿主機上橋接着虛擬機網絡的網卡並不擁有那個目標地址但卻會回覆,而更奇怪的是,虛擬機中使用arping不加-D參數,也收不到回覆。所以經過一番搜索與測試驗證,才大致搞明白了其中的原因。
首先,在內核文檔中有這樣一段對arp_filter參數的描述:
0 - (default) The kernel can respond to arp requests with addresses
from other interfaces. This may seem wrong but it usually makes
sense, because it increases the chance of successful communication.
IP addresses are owned by the complete host on Linux, not by
particular interfaces. Only for more complex setups like load-
balancing, does this behaviour cause problems.
內核認爲一個IP地址是屬於整個主機的,而非某個特定的端口,所以默認情況下,每個端口都會回覆目標是其他端口的IP地址的ARP請求。
查看了機器之後發現這一項爲默認值0,但是又一個疑問發生了,爲什麼使用arping不帶-D參數就無法收到返回呢?答案是rp_filter做了過濾,默認回應的包不從收到的端口出去,所以並不回覆。
那麼接下來又有一個問題,爲什麼帶了-D參數就收的到回覆呢?原因是,如果使用arping -D的話,發出的請求包的原地址是設置爲0.0.0.0的,這點可以參考RFC2131中的4.4.1一段。然後來看代碼:
    /* Special case: IPv4 duplicate address detection packet (RFC2131) */
    if (sip == 0) {
            if (arp->ar_op == htons(ARPOP_REQUEST) &&
                inet_addr_type_dev_table(net, dev, tip) == RTN_LOCAL &&
                !arp_ignore(in_dev, sip, tip))
                    arp_send_dst(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip,
                                    sha, dev->dev_addr, sha, reply_dst);
            goto out;
    }
當請求包的地址爲0.0.0.0的時候,內核只照顧arp_ignore這個選項,而不去管arp_filter選項的內容,也不去管rp_filter的內容。
下面看兩個場景,加深一下對這幾個參數的印象:
  1. 主機上兩個接口,地址分別處於不同的子網之中
    • 這種情況不會引起混亂
    • 從哪個端口進來的ARP請求,一般來說請求的源地址也是那個子網之中的地址,因此回覆包也會從該端口出去,所以能通過rp_filter以及arp_filter的驗證
    • 這種情況下的回覆只需要考慮arp_ignore的影響
  2. 主機上兩個接口,地址處於相同的子網之中
    • 容易引起混亂的情況
    • 兩個端口進來的ARP請求,基本上源地址是同一個子網,因此回覆的包只會從ifindex較小(猜測,未驗證)的端口發送出去,因此從其中一個端口進來的請求有可能無法通過rp_filter以及arp_filter的驗證
    • 同樣需要考慮arp_ignore的影響,對於上面說的收到無法通過rp_filter以及arp_filter驗證的請求包的端口,除非請求的源地址爲0.0.0.0,否則便根本不會回覆,而另一端口收到的則正常,而且對兩個接口上所設置的地址,都能夠通過上述的驗證
    • 要想讓兩個端口在同一子網中互不干擾,各自使用各自的地址並各自對請求包進行回覆,則需要使用策略路由,並且將arp_filterrp_filter打開,arp_ignore正確設置
關於這些選項的具體設置值的意義,可以參考內核文檔,這裏就不複製粘貼進來加長篇幅了。總之,在能夠進行規劃的情況下,還是儘量避免容易引起混亂的情況爲好。

How to repair and clone disk with ddrescue

  ddrescue  is a tool that can be used to repair and clone disks on a  Linux system . This includes hard drives, partitions, DVD discs, flas...