TCP IP 序列號迴繞

2021-09-29 01:14:53 字數 1156 閱讀 3344

tcp協議頭中有seq和ack_seq兩個字段,分別代表序列號和確認號。tcp協議通過序列號標識傳送的報文段。seq的型別是__u32,當超過__u32的最大值時,會迴繞到0。 

乙個tcp流的初始序列號(isn)並不是從0開始的,而是採用一定的隨機演算法產生的,因此isn可能很大(比如(2^32-10)),因此同乙個tcp流的seq號可能會迴繞到0。而我們tcp對於丟包和亂序等問題的判斷都是依賴於序列號大小比較的。此時就出現了所謂的tcp序列號迴繞(sequence wraparound)問題。 

核心中給出的序列號(解決序列號迴繞問題)判斷解決方案十分簡潔: 

/*

* the next routines deal with comparing 32 bit unsigned ints

* and worry about wraparound (automatic with unsigned arithmetic).

*/static inline int before(__u32 seq1, __u32 seq2)

#define after(seq2, seq1) before(seq1, seq2)

為什麼(__s32)(seq1-seq2)<0就可以判斷seq1 

為了方便說明,我們以unsigned char和char為例來說明:

//假設seq1=255, seq2=1(發生了迴繞)。

seq1 = 1111 1111 seq2 = 0000 0001

//我們希望比較結果是seq1 

seq1 - seq2=  1111 1111 -0000 0001 -----------  1111 1110

由於我們將結果轉化成了有符號數,由於最高位是1,因此結果是乙個負數,負數的絕對值為  0000 0001 + 1 = 0000 0010 = 2 因此seq1 - seq2 < 0 

注意:如果seq2=128的話,我們會發現:  seq1 - seq2=  1111 1111 -1000 0000 -----------  0111 1111 此時結果尤為正了,判斷的結果是seq1>seq2。因此,上述演算法正確的前提是,迴繞後的增量小於2^(n-1)-1。 由於tcp序列號用的32位無符號數,因此可以支援的迴繞幅度是2^31-1,滿足要求了。

imsi序列號 手機IMSI序列號

1級2014 06 25 回答 國際移動使用者識別碼 imsi international mobile subscriber identity 國際上為唯一識別乙個移動使用者所分配的號碼。從技術上講,imsi可以徹底解決國際漫遊問題。但是由於北美目前仍有大量的amps系統使用min號碼,且北美的m...

獲取CPU序列號,硬碟序列號,網絡卡mac位址

獲取cpu序列號,硬碟序列號,網絡卡mac位址 private string getmoc 獲取硬碟序列號 managementclass mchd new managementclass win32 logicaldisk managementobjectcollection mochd mchd...

讀取硬體序列號

using system using system.collections.generic using system.text using system.management namespace 讀取序列號 獲取硬碟序列號 string hdid managementclass cimobject1...