傳輸層

初始序號(initial sequence number)

當你替一份全新的文件編頁碼,你大可每次都從第 1 頁開始——但若新舊文件共用一張書桌,相同的頁碼會造成混淆。TCP 面對的正是這個問題,所以它不讓每條連線的位元組計數都從 1 起算,而是在連線開啟時,由每一端各挑一個全新的起始值。那個起始值就是初始序號(ISN):指派給每一端將送出的第一個位元組的串流位置。

TCP 連線的每個方向都有自己的 ISN,由那一端選定,並在三向交握的 SYN 區段中向對方宣告。對端確認 ISN+1(SYN 本身在邏輯上佔掉一個序號格),從此之後每個位元組都從 ISN 往上數。這個值不是簡單的 1 或 0;現代協定堆疊以難以預測的方式挑選它(歷史上與一個時鐘加上隨機性綁定),這樣同一對主機之間的兩條不同連線就不會重用相同號碼,攻擊者也不容易猜中序號、把偽造資料塞進串流。

為什麼重要:ISN 一次解決兩個真實問題。第一,它防止「新連線」和「同一對端點的舊連線殘留、延遲的區段」之間的混淆——若沒有不同的起始號碼,一個遊蕩的舊封包可能被誤認為新資料。第二,把它隨機化是對「路徑外注入」與「連線劫持」攻擊的一道不算強的安全措施。這也正是交握所「同步」的東西:SYN 的意思是「這是我的 ISN;請把你的計數對齊我的」。

你這端以 SYN、seq=2,938,471,002 開場——那就是你的 ISN。伺服器確認 2,938,471,003,並在 SYN-ACK 中宣告它自己的 ISN。從那裡起,你的第一個真正資料位元組是 2,938,471,003,而不是位元組 1。

每個方向都從自己隨機化的 ISN 起算,而不是從 1。

可預測的 ISN 曾是真實的弱點:能猜中它的攻擊者,不必看到流量就能注入或劫持連線。把 ISN 隨機化如今是標準做法,但它是補強、而非取代像 TLS 這樣真正的安全機制。

又称
ISN初始序號起始序號