源端口號 (Source Port - 16 bits)
寄件人的門牌號。 發(fā)送數(shù)據(jù)的應(yīng)用程序在發(fā)送方電腦上的“門牌號”(端口號)。就像快遞單上的寄件人地址,接收方知道這個數(shù)據(jù)是從哪個程序發(fā)來的,好把回信發(fā)給正確的“門牌號”。
目的端口號 (Destination Port - 16 bits)
收件人的門牌號。 接收數(shù)據(jù)的應(yīng)用程序在接收方電腦上的“門牌號”(端口號)。就像快遞單上的收件人地址,接收方的網(wǎng)絡(luò)設(shè)備(TCP/IP協(xié)議棧)根據(jù)這個門牌號,把數(shù)據(jù)包交給正確的程序(比如瀏覽器)。
序列號 (Sequence Number - 32 bits)
包裹的頁碼編號(從第幾頁開始)。 想象你要郵寄一本很厚的書,不得不拆成很多個小包裹。這個編號告訴你當(dāng)前包裹里裝的是這本書的第幾頁(或者第幾塊數(shù)據(jù)), 接收方收到一堆零散的包裹(數(shù)據(jù)包)后,能按照這個編號把它們按順序拼回那本完整的書(原始數(shù)據(jù))。同時,它也用于識別重復(fù)的包裹或丟失的包裹(編號不連續(xù)了)。
確認(rèn)號 (Acknowledgment Number - 32 bits)
回執(zhí)單上的“下一張期待頁碼”。 當(dāng)收件人收到包裹并檢查無誤后,會發(fā)一個回執(zhí)給寄件人?;貓?zhí)上寫著:“我已收到到第 X 頁(確認(rèn)號)為止的所有包裹了,請寄下一頁(X+1)給我吧!”,確認(rèn)對方已收到數(shù)據(jù),并告訴對方接下來希望收到哪個編號的數(shù)據(jù)包。這是 TCP 可靠傳輸?shù)暮诵臋C(jī)制!只有當(dāng) ACK 標(biāo)志位(見下面)為 1 時,這個字段才有效。
數(shù)據(jù)偏移 (Data Offset / Header Length - 4 bits)
這張“發(fā)貨單”本身有多長? 單位是 4 字節(jié)。比如,固定部分 20 字節(jié)就是 5 (20/4=5),如果加上選項(xiàng)部分,這個值會變大,告訴接收方,“發(fā)貨單”(TCP 首部)在哪里結(jié)束,后面真正的“貨物”(應(yīng)用層數(shù)據(jù))從哪里開始。
保留 (Reserved - 6 bits)
預(yù)留的空白格子。 暫時沒用,填 0。留給未來可能的新功能,控制位 (Flags - 6 bits, 每個占1位) - 最重要的部分之一!這是 6 個獨(dú)立的開關(guān)(標(biāo)志位),每個開關(guān)要么開(1)要么關(guān)(0),表示這個 TCP 包的特殊意圖:
URG (Urgent):緊急開關(guān)。 “包裹里有加急物品!” 當(dāng)它打開(1)時,表示這個數(shù)據(jù)包里有需要優(yōu)先處理的緊急數(shù)據(jù)。這時緊急指針字段(見下面)才有效。現(xiàn)在用的比較少。
ACK (Acknowledgment):確認(rèn)開關(guān)。 “這是個回執(zhí)單!” 當(dāng)它打開(1)時,表示這個包是用來確認(rèn)對方發(fā)來的數(shù)據(jù)的。這時確認(rèn)號字段才有效。絕大多數(shù) TCP 包(除了第一個握手包)這個開關(guān)都是開著的!
PSH (Push):推送開關(guān)。 “別攢著了,趕緊送貨上門!” 發(fā)送方打開(1),要求接收方收到這個包后,立刻把數(shù)據(jù)交給上層應(yīng)用程序,不要等緩沖區(qū)滿了再交。接收方打開(1),表示當(dāng)前數(shù)據(jù)包里的數(shù)據(jù)是應(yīng)用程序要求立即上交的。
RST (Reset):重置開關(guān)。 “出大問題了!趕緊斷線重連!” 當(dāng)連接出現(xiàn)嚴(yán)重錯誤(如端口未打開、連接異常)時,會發(fā)送一個打開(1)RST 開關(guān)的包,強(qiáng)制立即終止連接。
SYN (Synchronize):同步/連接請求開關(guān)。 “你好!我想和你建立連接?!?在建立連接(三次握手)時使用。第一次握手(客戶端發(fā)起請求)和第二次握手(服務(wù)器響應(yīng))時,這個開關(guān)是開著的(1)。它用來初始化序列號。
FIN (Finish):結(jié)束開關(guān)。 “我的東西發(fā)完了,再見!” 用于正常關(guān)閉連接(四次揮手)。當(dāng)一方數(shù)據(jù)發(fā)送完畢,就會發(fā)送一個打開(1)FIN 開關(guān)的包,表示它要關(guān)閉自己這一側(cè)的連接。
窗口大小 (Window Size - 16 bits)
收件人的倉庫還有多大空位? 接收方告訴發(fā)送方:“我現(xiàn)在最多還能接收這么多字節(jié)的數(shù)據(jù)(窗口大小值),你別發(fā)多了!” 這個值在通信過程中會動態(tài)變化,TCP 流量控制的核心機(jī)制!防止發(fā)送方發(fā)得太快,把接收方的緩沖區(qū)(倉庫)塞爆。
校驗(yàn)和 (Checksum - 16 bits)
包裹的防偽封條/完整性標(biāo)簽。 發(fā)送方根據(jù)整個 TCP 包(首部+數(shù)據(jù))的內(nèi)容計(jì)算出一個“指紋”(校驗(yàn)和)。接收方收到后,按照同樣的算法再算一遍,接收方比較自己算的“指紋”和包裹上貼的“指紋”(校驗(yàn)和字段)。如果不一樣,說明包裹在運(yùn)輸過程中損壞(比特位出錯了)或者被篡改了,這個包就會被丟棄。保證數(shù)據(jù)傳輸?shù)耐暾浴?nbsp;
緊急指針 (Urgent Pointer - 16 bits)
加急物品在包裹里的位置。 只有當(dāng) URG 開關(guān)打開(1) 時才有效。它指向當(dāng)前數(shù)據(jù)包中緊急數(shù)據(jù)最后一個字節(jié)的位置,告訴接收方應(yīng)用程序,從包的開頭到緊急指針指向的位置是緊急數(shù)據(jù),需要優(yōu)先處理。
選項(xiàng) (Options - 長度可變,0-40字節(jié))
特殊要求/增值服務(wù)。 可選的附加信息,用于一些高級功能。常見的選項(xiàng)有:
最大報(bào)文段長度 (MSS): 在建立連接(握手)時,雙方協(xié)商每個 TCP 包最多能裝多少數(shù)據(jù)(不包括首部)。避免在傳輸路徑中被分片。
窗口縮放因子 (Window Scale): 因?yàn)榛敬翱诖笮∽侄沃挥?span> 16 位,最大只能表示 65535 字節(jié)。這個選項(xiàng)允許雙方協(xié)商一個縮放因子,將實(shí)際窗口大小放大(比如左移若干位),用于高速網(wǎng)絡(luò)。
時間戳 (Timestamp): 用于更精確地計(jì)算往返時間和防止序列號回繞,提供 TCP 的擴(kuò)展功能,優(yōu)化性能或增加特性。
填充 (Padding - 長度可變)
填空格,湊整。 因?yàn)?span> TCP 首部長度必須是 32 位 (4 字節(jié)) 的整數(shù)倍。如果選項(xiàng)部分的長度不是 4 字節(jié)的整數(shù)倍,就需要在最后用 0 填充一些位,把整個首部長度湊齊,確保首部對齊,便于硬件處理。