2016-02-01 150 views
1

我碰到代碼here的這個問題:計算校驗和。 據我所知,爲了按照TCP校驗和的要求將二進制數據結構分離爲16位字: 我重新調整w的值應當被規定爲w= ord(msg[i]) << 8 + ord(msg[i+1]),除非字節順序必須改變。我不太確定w爲什麼會被賦值爲w = ord(msg[i]) + ord(msg[i+1]) << 8。有什麼具體的我在這裏失蹤?在python中計算TCP校驗和

def checksum(msg): 
    s = 0 
    # loop taking 2 characters at a time 
    for i in range(0, len(msg), 2): 
    w = ord(msg[i]) + (ord(msg[i+1]) << 8) 
    s = s + w 

    s = (s>>16) + (s & 0xffff); 
    s = s + (s >> 16); 

    #complement and mask to 4 byte short 
    s = ~s & 0xffff 

    return s 
+0

請刪除'>'符號出現在你的代碼的開始。然後選擇所有代碼塊,然後按ctrl + k。它應該爲你做代碼格式。 –

+0

我不確定我是否理解這個問題。你知道什麼是大端(第一種情況)和小端(第二種情況)是什麼意思? Avinash; – Pynchia

+0

Avinash;謝謝你做了@Punchia:是的。味精在網絡秩序 – durga

回答

1

在這種情況下,我認爲「網絡秩序」,「大端」和「小尾」正在與TCP校驗和計算混合。

TCP校驗和計算是在RFC 1071中定義:https://tools.ietf.org/html/rfc1071

在第2頁的開頭:

使用符號[A,B]爲16位整數的a * 256 + b,其中a和b是字節,

在僞報頭中的字節和部分填充TCP報頭只是「字節」,沒有IMPL ication作出關於他們的意思(他們必須已在「網絡秩序」)

作者使用本公式只是下面的RFC 1071

+0

非常感謝。我提到RFC,它指出校驗和計算與字節順序無關 - 第3頁字節順序獨立 16位整數的和可以按字節順序計算。 ...無論底層硬件的字節順序(「big-endian」或「little-endian」) 如何,總和可以以完全相同的方式計算 。 – durga