源端口、目標(biāo)端口:計(jì)算機(jī)上的進(jìn)程要和其他進(jìn)程通信是要通過計(jì)算機(jī)端口的,而一個(gè)計(jì)算機(jī)端口某個(gè)時(shí)刻只能被一個(gè)進(jìn)程占用,所以通過指定源端口和目標(biāo)端口,就可以知道是哪兩個(gè)進(jìn)程需要通信。源端口、目標(biāo)端口是用16位表示的,可推算計(jì)算機(jī)的端口個(gè)數(shù)為2^16個(gè)。
序列號:表示本報(bào)文段所發(fā)送數(shù)據(jù)的第一個(gè)字節(jié)的編號。在TCP連接中所傳送的字節(jié)流的每一個(gè)字節(jié)都會按順序編號。由于序列號由32位表示,所以每2^32個(gè)字節(jié),就會出現(xiàn)序列號回繞,再次從 0 開始。那如何區(qū)分兩個(gè)相同序列號的不同TCP報(bào)文段就是一個(gè)問題了,后面會有答案,暫時(shí)可以不管。
確認(rèn)號:表示接收方期望收到發(fā)送方下一個(gè)報(bào)文段的第一個(gè)字節(jié)數(shù)據(jù)的編號。也就是告訴發(fā)送發(fā):我希望你(指發(fā)送方)下次發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)數(shù)據(jù)的編號是這個(gè)確認(rèn)號。也就是告訴發(fā)送方:我希望你(指發(fā)送方)下次發(fā)送給我的TCP報(bào)文段的序列號字段的值是這個(gè)確認(rèn)號。
TCP首部長度:由于TCP首部包含一個(gè)長度可變的選項(xiàng)部分,所以需要這么一個(gè)值來指定這個(gè)TCP報(bào)文段到底有多長。或者可以這么理解:就是表示TCP報(bào)文段中數(shù)據(jù)部分在整個(gè)TCP報(bào)文段中的位置。該字段的單位是32位字,即:4個(gè)字節(jié)。
URG:表示本報(bào)文段中發(fā)送的數(shù)據(jù)是否包含緊急數(shù)據(jù)。URG=1,表示有緊急數(shù)據(jù)。后面的緊急指針字段只有當(dāng)URG=1時(shí)才有效。
ACK:表示是否前面的確認(rèn)號字段是否有效。ACK=1,表示有效。只有當(dāng)ACK=1時(shí),前面的確認(rèn)號字段才有效。TCP規(guī)定,連接建立后,ACK必須為1。
PSH:告訴對方收到該報(bào)文段后是否應(yīng)該立即把數(shù)據(jù)推送給上層。如果為1,則表示對方應(yīng)當(dāng)立即把數(shù)據(jù)提交給上層,而不是緩存起來。
RST:只有當(dāng)RST=1時(shí)才有用。如果你收到一個(gè)RST=1的報(bào)文,說明你與主機(jī)的連接出現(xiàn)了嚴(yán)重錯誤(如主機(jī)崩潰),必須釋放連接,然后再重新建立連接。或者說明你上次發(fā)送給主機(jī)的數(shù)據(jù)有問題,主機(jī)拒絕響應(yīng)。
SYN:在建立連接時(shí)使用,用來同步序號。當(dāng)SYN=1,ACK=0時(shí),表示這是一個(gè)請求建立連接的報(bào)文段;當(dāng)SYN=1,ACK=1時(shí),表示對方同意建立連接。SYN=1,說明這是一個(gè)請求建立連接或同意建立連接的報(bào)文。只有在前兩次握手中SYN才置為1。
FIN:標(biāo)記數(shù)據(jù)是否發(fā)送完畢。如果FIN=1,就相當(dāng)于告訴對方:“我的數(shù)據(jù)已經(jīng)發(fā)送完畢,你可以釋放連接了”
窗口大小:表示現(xiàn)在運(yùn)行對方發(fā)送的數(shù)據(jù)量。也就是告訴對方,從本報(bào)文段的確認(rèn)號開始允許對方發(fā)送的數(shù)據(jù)量。
校驗(yàn)和:提供額外的可靠性。具體如何校驗(yàn),參考其他資料。
緊急指針:標(biāo)記緊急數(shù)據(jù)在數(shù)據(jù)字段中的位置。
選項(xiàng)部分:其最大長度可根據(jù)TCP首部長度進(jìn)行推算。TCP首部長度用4位表示,那么選項(xiàng)部分最長為:(2^4-1)*4-20=40字節(jié)。
選項(xiàng)部分的應(yīng)用: