傳輸層
序號(sequence number)
如果你要用許多信封寄一封長信給別人,你會替每頁編號——「第 1 頁,共 40 頁」「第 2 頁,共 40 頁」——這樣即使信封到達時次序大亂、或有一封遺失,讀者也能依序重組整封信並注意到少了什麼。序號就是網路資料的那個「頁碼」。它替資料貼上標籤,讓接收端能正確排序、偵測重複、發現缺口。
TCP 替位元組串流編號,而不是替區段編號:一個區段標頭裡的序號,是該區段第一個位元組在整體串流中的位置。所以若某區段的序號是 4001、帶了 500 個位元組,那就是串流的位元組 4001 到 4500,下一個區段應該從 4501 開始。接收端用這些號碼,即使區段亂序到達也能把位元組按正確次序放進它的緩衝區,並丟掉重複的(到達了兩次的重送)。確認號則是它的鏡像——指的是同一套串流位置。
為什麼重要:序號是依序、無重複傳遞的骨幹;沒有它,位元組串流就無法重組。有個重要細節:TCP 不是從 1 開始數。兩端在交握期間各自挑一個全新、難以猜測的初始序號,這既有助於把新連線的位元組和舊連線殘留的位元組分開,也讓攻擊者較難注入偽造的資料。這個計數器是 32 位元的,在又長又快的傳輸中會繞回,TCP 會小心處理。
在交握把初始序號定為比方說 9000 之後,第一個 1460 位元組的區段帶序號 9001(位元組 9001–10460);下一個是 10461。若因亂序使得 10461 比 9001 先到,接收端仍能用這些號碼把每個位元組擺到正確位置。
序號數的是串流中的位元組,不是區段。
TCP 序號數的是位元組、不是封包,而且不從零開始——每條連線都從一個隨機化的初始值起算。那份隨機性是對「路徑外攻擊者猜序號以注入資料」的一道(不算強的)防線。
又稱
另見