前言
序號欄位和確認號字段是tcp報文段首部中兩個最重要的字段,這兩個欄位是tcp可靠傳輸服務的關鍵部分。
tcp把資料看成乙個無結構的、有序的位元組流。序號是建立在傳送的字元流之上的,而不是建立在傳送的報文段的序列之上
序號(32bit)
乙個報文段的序號是該報文段首位元組的位元組流編號,舉個栗子~
假設主機a的乙個程序想通過一條tcp連線向主機b上的乙個程序傳送乙個資料流,主機a中的tcp將隱式地對資料流中的每乙個位元組編號。假定資料流由乙個包含500 000位元組的檔案組成,其mss(最大報文段長度)為1000位元組,資料流的首位元組編號是0,如下圖所示:
該tcp將為該資料流構建500個報文段,給第乙個報文段分配序號0,第二個報文段分配序號1000,以此類推,每乙個序號被填入到相應tcp報文段首部的序號欄位中。
確認號(32bit)
tcp是全雙工的,即主機a在向主機b傳送資料的同時,也許也在接收來自主機b的資料。從主機b到達的每個報文段中都有乙個序號用於從b流向a的資料。主機a填充進報文段的確認號是主機a期望從主機b收到的下一位元組的序號,舉栗子說明:
假設主機a已經收到了來自主機b的編號為0-535的所有位元組,同時假設它打算傳送乙個報文段給主機b,主機a等待主機b的資料流中位元組536及其後的所有位元組,所以主機a會在它發往主機b的報文段的確認號字段中填上536。
再舉乙個栗子~
假設主機a已收到主機b的包含位元組0-535位元組的報文段,以及另乙個包含位元組900-1000的報文段。由於某種原因,主機a還沒有收到位元組536-899的報文段。在這個例子裡,主機a為了重新構建主機b的資料流,仍在等待位元組536(和其後的位元組)。因此,a到b的下乙個報文段將在確認號字段中包含536。因為tcp只確認該流中到第乙個丟失位元組為止的位元組,所以tcp提供的是累積確認。
主機a雖然收到了位元組900-1000的報文段,但是並不會在下乙個發往主機b的報文段的確認號字段中填1001,因為535後面的位元組還沒有得到確認,而收到的900-1000位元組的報文段屬於失序到達,對於失序到達的報文段的處理方法由tcp程式設計人員去具體實現,有兩個基本選擇:一是丟棄失序報文段,二是保留失序位元組並等待缺少的位元組以填補該間隔(這是實踐中採用的方法)
292報文:
293報文:
結論:293號報文的ack表示已經收到292號報文的116個位元組
TCP報文段的首部格式
源埠 目的埠 序號確認號 資料偏移 保留urg ackpsh rstsyn fin視窗 校驗和緊急指標 選項 長度可變 填充tcp報文段首部的前20個位元組是固定,後面有4n位元組是根據需要而增加的選項,因此tcp首部最小長度20位元組。1.源埠和目的埠 各佔2個位元組,分別寫入源埠號和目的埠號。埠...
TCP序列號和確認號詳解
1.序列號和確認號的簡介及作用 tcp協議工作在osi的傳輸層,是一種可靠的面向連線的資料流協議,tcp之所以可靠,是因為它保證了傳送資料報的順序。順序是用乙個序列號來保證的。響應包內也包括乙個序列號,表示接收方準備好這個序列號的包。在tcp傳送乙個資料報時,它會把這個資料報放入重發佇列中,同時啟動...
TCP序列號和確認號詳解
1.序列號和確認號的簡介及作用 tcp協議工作在osi的傳輸層,是一種可靠的面向連線的資料流協議,tcp之所以可靠,是因為它保證了傳送資料報的順序。順序是用乙個序列號來保證的。響應包內也包括乙個序列號,表示接收方準備好這個序列號的包。在tcp傳送乙個資料報時,它會把這個資料報放入重發佇列中,同時啟動...