TCP 報(bào)文段首部格式
TCP 連接中傳送的數(shù)據(jù)流中的每一個(gè)字節(jié)都編上一個(gè)序號(hào)匹中。序號(hào)字段的值則指的是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)忆某。
確認(rèn)號(hào)字段——占 4 字節(jié)雷则,是期望收到對(duì)方的下一個(gè)報(bào)文段的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)颊咬。
確認(rèn) ACK —— 只有當(dāng) ACK = 1 時(shí)確認(rèn)號(hào)字段才有效死嗦。當(dāng) ACK = 0 時(shí)趋距,確認(rèn)號(hào)無(wú)效粒氧。
同步 SYN —— 同步 SYN = 1 表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文越除。
終止 FIN —— 用來(lái)釋放一個(gè)連接。FIN = 1 表明此報(bào)文段的發(fā)送端的數(shù)據(jù)已發(fā)送完畢外盯,并要求釋放運(yùn)輸連接摘盆。
窗口字段 —— 占 2 字節(jié),用來(lái)讓對(duì)方設(shè)置發(fā)送窗口的依據(jù)饱苟,單位為字節(jié)孩擂。
檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩部分。在計(jì)算檢驗(yàn)和時(shí)箱熬,要在 TCP 報(bào)文段的前面加上 12 字節(jié)的偽首部类垦。
選項(xiàng)字段 —— 長(zhǎng)度可變狈邑。TCP 最初只規(guī)定了一種選項(xiàng),即最大報(bào)文段長(zhǎng)度 MSS蚤认。MSS 告訴對(duì)方 TCP:“我的緩存所能接收的報(bào)文段的數(shù)據(jù)字段的最大長(zhǎng)度是 MSS 個(gè)字節(jié)米苹。”
填充字段 —— 這是為了使整個(gè)首部長(zhǎng)度是 4 字節(jié)的整數(shù)倍砰琢。
MSS (Maximum Segment Size)是 TCP 報(bào)文段中的數(shù)據(jù)字段的最大長(zhǎng)度蘸嘶。數(shù)據(jù)字段加上 TCP 首部才等于整個(gè)的 TCP 報(bào)文段。所以陪汽,MSS是“TCP 報(bào)文段長(zhǎng)度減去 TCP 首部長(zhǎng)度”训唱。
MSS 與接收窗口值沒(méi)有關(guān)系。若選擇較小的 MSS 長(zhǎng)度挚冤,網(wǎng)絡(luò)的利用率就降低况增。
如何保證可靠性?
停止等待協(xié)議+自動(dòng)重傳請(qǐng)求 ARQ(利用率低)
停止等待”就是每發(fā)送完一個(gè)分組就停止發(fā)送训挡,等待對(duì)方的確認(rèn)巡通。在收到確認(rèn)后再發(fā)送下一個(gè)分組。
自動(dòng)重傳請(qǐng)求 ARQ (Automatic Repeat reQuest)舍哄。意思是重傳的請(qǐng)求是自動(dòng)進(jìn)行的宴凉,接收方不需要請(qǐng)求發(fā)送方重傳某個(gè)出錯(cuò)的分組,即超時(shí)重傳表悬。
流水線傳輸+連續(xù) ARQ 協(xié)議(要改進(jìn))
- 流水線傳輸就是發(fā)送方可連續(xù)發(fā)送多個(gè)分組弥锄,不必每發(fā)完一個(gè)分組就停頓下來(lái)等待對(duì)方的確認(rèn)。這樣可使信道上一直有數(shù)據(jù)不間斷地傳送蟆沫。
- 發(fā)送方維持的發(fā)送窗口籽暇,它的意義是:位于發(fā)送窗口內(nèi)的分組都可連續(xù)發(fā)送出去,而不需要等待對(duì)方的確認(rèn)饭庞。這樣戒悠,信道利用率就提高了。連續(xù) ARQ 協(xié)議規(guī)定舟山,發(fā)送方每收到一個(gè)確認(rèn)绸狐,就把發(fā)送窗口向前滑動(dòng)一個(gè)分組的位置。
累計(jì)確認(rèn)+Go-back-N(回退 N)(要改進(jìn))
- 接收方一般采用累積確認(rèn)的方式累盗。即不必對(duì)收到的分組逐個(gè)發(fā)送確認(rèn)寒矿,而是對(duì)按序到達(dá)的最后一個(gè)分組發(fā)送確認(rèn),這樣就表示:到這個(gè)分組為止的所有分組都已正確收到了若债。
優(yōu)點(diǎn):容易實(shí)現(xiàn)符相,即使確認(rèn)丟失也不必重傳。
缺點(diǎn):不能向發(fā)送方反映出接收方已經(jīng)正確收到的所有分組的信息蠢琳。
- 如果發(fā)送方發(fā)送了前 5 個(gè)分組啊终,而中間的第 3 個(gè)分組丟失了镜豹。這時(shí)接收方只能對(duì)前兩個(gè)分組發(fā)出確認(rèn)。發(fā)送方無(wú)法知道后面三個(gè)分組的下落蓝牲,而只好把后面的三個(gè)分組都再重傳一次逛艰。這就叫做 Go-back-N(回退 N),表示需要再退回來(lái)重傳已發(fā)送過(guò)的 N 個(gè)分組搞旭。
滑動(dòng)窗口
TCP 的滑動(dòng)窗口是以字節(jié)為單位的散怖。現(xiàn)假定 A 收到了 B 發(fā)來(lái)的確認(rèn)報(bào)文段,其中窗口是 20 字節(jié)肄渗,而確認(rèn)號(hào)是 31(這表明 B 期望收到的下一個(gè)序號(hào)是 31镇眷,而序號(hào) 30 為止的數(shù)據(jù)已經(jīng)收到了)。根據(jù)這兩個(gè)數(shù)據(jù)翎嫡,A 就構(gòu)造出自己的發(fā)送窗口欠动。
發(fā)送緩存用來(lái)暫時(shí)存放:
(1)發(fā)送應(yīng)用程序傳送給發(fā)送方 TCP 準(zhǔn)備發(fā)送的數(shù)據(jù);
(2)TCP 已發(fā)送出但尚未收到確認(rèn)的數(shù)據(jù)惑申。接收緩存用來(lái)暫時(shí)存放:
(1)按序到達(dá)的具伍、但尚未被接收應(yīng)用程序讀取的數(shù)據(jù);
(2)不按序到達(dá)的數(shù)據(jù)圈驼。
需要強(qiáng)調(diào)三點(diǎn)
- A 的發(fā)送窗口并不總是和 B 的接收窗口一樣大(因?yàn)橛幸欢ǖ臅r(shí)間滯后)人芽。
- TCP 標(biāo)準(zhǔn)沒(méi)有規(guī)定對(duì)不按序到達(dá)的數(shù)據(jù)應(yīng)如何處理。通常是先臨時(shí)存放在接收窗口中绩脆,等到字節(jié)流中所缺少的字節(jié)收到后萤厅,再按序交付上層的應(yīng)用進(jìn)程。
- TCP 要求接收方必須有累積確認(rèn)的功能靴迫,這樣可以減小傳輸開(kāi)銷惕味。
接收方發(fā)送確認(rèn)
接收方可以在合適的時(shí)候發(fā)送確認(rèn),也可以在自己有數(shù)據(jù)要發(fā)送時(shí)把確認(rèn)信息順便捎帶上玉锌。注意:
接收方不應(yīng)過(guò)分推遲發(fā)送確認(rèn)名挥,否則會(huì)導(dǎo)致發(fā)送方不必要的重傳,這反而浪費(fèi)了網(wǎng)絡(luò)的資源主守。
捎帶確認(rèn)實(shí)際上并不經(jīng)常發(fā)生禀倔,因?yàn)榇蠖鄶?shù)應(yīng)用程序很少同時(shí)在兩個(gè)方向上發(fā)送數(shù)據(jù)。