乙個tcp資料報包含乙個固定的20位元組的頭、乙個可選部分以及0或多位元組的資料。
對資料報的大小有兩個限制條件:
首先,每個資料報(包括tcp頭在內)必須適合ip的載荷能力,不能超過65535位元組;其次,每個網路都存在最大傳輸單元mtu(maximum transfer unit),要求每個資料報必須適合mtu。如果乙個資料報進入了乙個mtu小於該資料報長度的網路,那麼處於網路邊界上的路由器會把該資料報分解為多個小的資料報。
tcp資料報頭
源埠、目的埠:16位長。標識出遠端和本地的埠號。
順序號:32位長。表明了傳送的資料報的順序。32 位的序列號由接收端計算機使用,重新分段的報文成最初形式。當syn 出現,序列碼實際上是初始序列碼(isn),而第乙個數
據位元組是isn+1。這個序列號(序列碼)是可以補償傳輸中的不一致。
確認號:32位長。希望收到的下乙個資料報的序列號。32 位的序列號由接收端計算機使用,重組分段的報文成最初形式,如果設定了ack 控制位,這個值表示乙個準備接收的包的序列碼。
tcp頭長:4位長。表明tcp頭中包含多少個32位字。4 位包括tcp 頭大小,指示何處資料開始。
接下來的6位未用。
連線標誌、同步序列號標誌、完成傳送資料標誌。按照順序排列是:urg、ack、psh、rst、syn、fin。
ack:ack位置1表明確認號是合法的。如果ack為0,那麼資料報不包含確認資訊,確認欄位被省略。tcp 報頭內的確認編號欄內包含的確認編號(w+1,figure:1)為下乙個預期的序列編號,同時提示遠端系統已經成功接收所有資料。
psh:表示是帶有push標誌的資料。接收方因此請求資料報一到便可送往應用程式而不必等到緩衝區裝滿時才傳送。該標誌置位時,接收端不將該資料進行佇列處理,而是盡可能快將資料轉由應用處理。在處理telnet 或rlogin 等互動模式的連線時,該標誌總是置位的。
rst:用於復位由於主機崩潰或其它原因而出現的錯誤的連線。還可以用於拒絕非法的資料報或拒絕連線請求。
syn:用於建立連線。該標誌僅在三次握手建立。
fin:用於釋放連線。
視窗(window):16 位,用來表示想收到的每個tcp 資料段的大小。視窗大小字段表示在確認了位元組之後還可以傳送多少個位元組。
校驗位(checksum):16 位tcp 頭。源機器基於資料內容計算乙個數值,收資訊機要與源機器數值結果完全一樣,從而證明資料的有效性。是為了確保高可靠性而設定的。它校驗頭部、資料和偽tcp頭部之和。
優先指標(緊急,urgent pointer):16 位,指向後面是優先資料的位元組,在urg
標誌設定了時才有效。如果urg 標誌沒有被設定,緊急域作為填充。加快處理標示為緊急
的資料段。
選項(option):長度不定,但長度必須以位元組。如果沒有選項就表示這個一位元組的域等於0。
填充:不定長,填充的內容必須為0,它是為了數學目的而存在。目的是確保空
間的可**性。保證包頭的結合和資料的開始處偏移量能夠被32 整除,一般額外的零以保
證tcp 頭是32 位的整數倍。
可選項:0個或多個32位字。包括最大tcp載荷,視窗比例、選擇重發資料報等選項。
最大tcp載荷:允許每台主機設定其能夠接受的最大的tcp載荷能力。在建立連線期間,雙方均宣告其最大載荷能力,並選取其中較小的作為標準。如果一台主機未使用該選項,那麼其載荷能力預設設定為536位元組。視窗比例:允許傳送方和接收方商定乙個合適的視窗比例因子。這一因子使滑動視窗最大能夠達到232位元組。選擇重發資料報:這個選項允許接收方請求傳送指定的乙個或多個資料報。
連線管理
在tcp中建立連線採用三次握手的方法。
為了建立連線,其中一方,如伺服器,通過執行listen和accept原語被動地等待乙個到達的連線請求。
另一方,如客戶方,執行connect原語,同時要指明它想連線到的ip位址和埠號,設定它能夠接受的tcp資料報的最大值,以及一些可選的使用者資料。connect原語傳送乙個syn=1,ack=0的資料報到目的端,並等待對方響應。
該資料報到達目的端後,那裡的tcp實體將察看是否有程序在偵聽目的埠字段指定的埠。如果沒有,它將傳送乙個rst=1的應答,拒絕建立該連線。
如果某個程序正在對該埠進行偵聽,於是便將到達的tcp資料報交給該程序,它可以接受或拒絕建立連線。如果接受,便發回乙個確認資料報。
為了釋放連線,每方均可傳送乙個fin=1的tcp資料報,表明本方已無資料傳送。當fin資料報被確認後,那個方向的連線即告關閉。當兩個方向上 的連線均關閉後,該連線就被完全釋放了。一般情況下,釋放乙個連線需要4個tcp資料報:每個方向均有乙個fin資料報和乙個ack資料報。
經典案例,這是後來被稱為mitnick 攻擊中kevin 開創了兩種攻擊技術: tcp 會話劫持 和 syn flood(同步洪流)。
在這裡我們討論的是tcp 會話劫持的問題。先讓我們明白tcp 建立連線的基本簡單的過程。為了建設乙個小型的模仿環境我們假設有3 臺接入網際網路的機器。a 為攻擊者操縱的攻擊機。b 為中介跳板機器(受信任的伺服器)。c 為受害者使用的機器(多是伺服器),這裡把c 機器鎖定為目標機器。a 機器向b機器傳送syn 包,請求建立連線,這時已經響應請求的b 機器會向a 機器回應syn/ack表明同意建立連線,當a 機器接受到b 機器傳送的syn/ack 回應時,傳送應答ack 建立,a 機器與b 機器的網路連線。這樣乙個兩台機器之間的tcp 通話通道就建立成功了。
b 終端受信任的伺服器向c 機器發起tcp 連線,a 機器對伺服器發起syn 資訊,使c 機器不能響應b 機器。在同時a 機器也向b 機器傳送虛假的c 機器回應的syn 資料報,接收到syn 資料報的b 機器(被c 機器信任)開始傳送應答連線建立的syn/ack 資料報,這時c 機器正在忙於響應以前傳送的syn 資料而無暇回應b 機器,而a 機器的攻擊者**出b 機器包的序列號(現在的tcp 序列號**難度有所加大)假冒c 機器向b 機器傳送應答ack 這時攻擊者騙取b 機器的信任,假冒c 機器與b 機器建立起tcp 協議的對話連線。這個時候的c 機器還是在響應攻擊者a 機器傳送的syn 資料。
tcp 協議棧的弱點:tcp 連線的資源消耗,其中包括:資料報資訊、條件狀態、序列號等。通過故意不完成建立連線所需要的三次握手過程,造成連線一方的資源耗盡。通過攻擊者有意的不完成建立連線所需要的三次握手的全過程,從而造成了c 機器的資源耗盡。序列號的可**性,目標主機應答連線請求時返回的syn/ack 的序列號時可**的。(早期tcp 協議棧,具體的可以參見1981 年出的關於tcp 雛形的rfc793 文件)
TCP協議資料報頭結構
tcp頭結構 tcp序列號 序列碼,sequence number 32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當syn出現,序列碼實際上是初始序列碼 isn 而第乙個資料位元組是isn 1。這個序列號 序列碼 是可以補償傳輸中的不一致。tcp應答號 acknowledgment n...
IP資料報頭部,TCP頭部,偽TCP頭部結構定義
我自己整理出來的彙編版本 ip資料報頭部結構定義 ip head struct h lenver db 4位ip版本號 4位首部長度 tos db 8位服務型別 tcp len dw 16位tcp資料報總長度 ident dw 16位標識 frag and flags dw 3位分片標誌 13位分片...
tcp偽報頭 TCP和UDP報頭的比較
該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 一 tcp報頭 tcp報文段的報頭有10個必需的字段和1個可選字段。報頭至少為20位元組。報頭後面的資料是可選項。1 源埠號 16位 標識傳送報文的計算機埠或程序。乙個tcp報文段必須包括源埠號,使目的主機知道應該向何處傳送確認報文。2 目的埠號 16位...