【科普系列】TCP 協(xié)議:數(shù)據(jù)傳輸?shù)摹翱煽啃l(wèi)士”
在智能汽車加速邁入數(shù)字化的今天,車載以太網(wǎng)早已不是簡單的 “數(shù)據(jù)通道”,而是像縱橫交錯的城市快速路網(wǎng)絡(luò),日夜承載著自動駕駛的決策指令、智能座艙的影音交互數(shù)據(jù)、云端互聯(lián)的實時路況信息 —— 這些數(shù)據(jù)洪流如同高速行駛的車流,一旦出現(xiàn) “丟件”“堵車”,小則影響車機使用體驗,大則關(guān)乎自動駕駛的安全決策。而在這條 “信息高速公路” 上,有一位默默守護(hù)的 “衛(wèi)士”,始終確保關(guān)鍵數(shù)據(jù)不丟失、不錯亂、準(zhǔn)時抵達(dá)目的地,它就是我們今天要聊的核心 ——TCP 協(xié)議。
TCP 協(xié)議概念
TCP協(xié)議(Transmission Control Protocol,傳輸控制協(xié)議)是車載以太網(wǎng)中的核心組件之一,主要運行于OSI模型的傳輸層。作為一種面向連接、可靠且基于字節(jié)流的傳輸層通信協(xié)議,TCP憑借其多項關(guān)鍵機制包括三次握手、四次揮手、確認(rèn)應(yīng)答、超時重傳、滑動窗口、擁塞控制以及保活機制等有效保障了數(shù)據(jù)傳輸?shù)目煽啃耘c穩(wěn)定性,確保數(shù)據(jù)在網(wǎng)絡(luò)中有序、無誤地傳輸。
TCP報文結(jié)構(gòu)
TCP協(xié)議報文也稱TCP報文段,是TCP通信的基本單元,一個TCP報文段由首部和數(shù)據(jù)兩部分組成,其中首部包含了必要的控制信息,確保數(shù)據(jù)的正確傳輸和連接管理,下圖是TCP報文結(jié)構(gòu),并對TCP首部進(jìn)行了格式解析:
源端口號:占16 位,表示發(fā)送方的端口號,取值范圍0~65535;
目的端口號:占16位,表示接收方的端口號,取值范圍0~65535;
序列號:占32位,表示本報文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號,取值范圍0~2^32 – 1,當(dāng)序號增加到2^32-1后,下一個序號就又回到0;
確認(rèn)號:占32位,表示期望收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號;
首部長度:占4位,表示TCP首部數(shù)據(jù)長度,以4字節(jié)為單位計數(shù),最大長度為60字節(jié);
標(biāo)志位:占6位,包括URG、ACK、PSH、RST、SYN、FIN 6個標(biāo)志位;
URG:占1位,緊急指針標(biāo)志,當(dāng)URG被設(shè)置1時,緊急指針字段有效;
ACK:占1位,確認(rèn)標(biāo)志,當(dāng)ACK被設(shè)置1時,確認(rèn)號字段才有效;
PSH:占1位,推送標(biāo)志,當(dāng)收到TCP報文段中的PSH值為1時應(yīng)盡快將數(shù)據(jù)傳遞給應(yīng)用程序,不需要等到整個緩存都填滿后再向應(yīng)用層傳遞;
RST:占1位,重置連接標(biāo)志,當(dāng)RST被置1時表示連接錯誤或者連接被拒絕;
SYN:占1位,同步標(biāo)志,用于連接建立,當(dāng)SYN被置1時表示一個連接請求或連接接收報文;
FIN:占1位,結(jié)束標(biāo)志,用于關(guān)閉連接;
窗口大小:占16位,表示接收方希望一次接收多少字節(jié);
檢驗和:占16位,用于校驗數(shù)據(jù)的完整性;
緊急指針:占16位,當(dāng)URG標(biāo)志置1時緊急指針才有效,緊急指針是一個正的偏移量,和序列號字段的值相加表示緊急數(shù)據(jù)最后一個字節(jié)的序號;
選項:可變長度,最大長度為40字節(jié)【計算方式 :首部總長度-20字節(jié)固定長度】,由于TCP首部的偏移單位為4 字節(jié),當(dāng)選項占用字節(jié)個數(shù)不是4字節(jié)的整數(shù)倍時,需要進(jìn)行數(shù)據(jù)填充。
以下為Wireshark數(shù)據(jù)示例
TCP連接建立與終止
TCP協(xié)議是一種面向連接的協(xié)議,在進(jìn)行數(shù)據(jù)傳輸之前,需通過三次握手建立連接,數(shù)據(jù)傳輸完成后,通過四次揮手?jǐn)嚅_連接。
1.三次握手
1)第一次握手(SYN):客戶端向服務(wù)端發(fā)送一個SYN報文,并且會隨機生成一個客戶端的序列號(seq)。
2)第二次握手(SYN-ACK):服務(wù)端收到來自客戶端的SYN報文后也會生成一個隨機的序列號,同時也會計算出確認(rèn)號(Ack),并通過SYN-ACK 報文發(fā)送給客戶端,該確認(rèn)號(Ack)也會告知客戶端下一次期望接收到報文序列號是多少。
3)第三次握手(ACK):客戶端收到來自服務(wù)端的SYN-ACK 報文后,會發(fā)送一個ACK報文通知服務(wù)端,確認(rèn)接收到了序列號并可以開始通信。
三次握手過程如圖所示,此過程確保了雙方都能確認(rèn)對方的連接能力,從而建立起一個可靠的,雙向的通信通道。
2.四次揮手
1)第一次揮手(FIN):客戶端發(fā)送一條FIN報文,通知數(shù)據(jù)發(fā)送完畢,希望關(guān)閉連接。
2)第二次揮手(ACK):服務(wù)端回復(fù)一條ACK報文,確認(rèn)收到了客戶端FIN報文,ACK報文中的確認(rèn)號是收到FIN報文的序列號加1,表示所有數(shù)據(jù)已被接收。
3)第三次揮手(FIN):服務(wù)端發(fā)送完所有數(shù)據(jù)后,也會發(fā)送一條FIN報文給客戶端,通知數(shù)據(jù)發(fā)送完畢,準(zhǔn)備關(guān)閉連接。
4)第四次揮手(ACK):客戶端回復(fù)一條ACK報文,確認(rèn)收到了服務(wù)端的FIN報文,至此,連接完全關(guān)閉。
如下圖所示,四次揮手機制確保了雙方都有機會發(fā)送完所有數(shù)據(jù),并且相互確認(rèn)了對方的終止請求,從而實現(xiàn)了TCP連接的優(yōu)雅關(guān)閉。
在揮手過程中涉及到幾種狀態(tài),如下所示:
ESTABLISHED狀態(tài): 已建立連接的狀態(tài),可正常收發(fā)數(shù)據(jù);
FIN-WAIT-1狀態(tài):客戶端向服務(wù)端發(fā)送FIN報文后進(jìn)入FIN-WAIT-1狀態(tài),此狀態(tài)下可以接收數(shù)據(jù),禁止發(fā)送新數(shù)據(jù);
FIN-WAIT-2狀態(tài):客戶端接收到ACK 報文后進(jìn)入FIN-WAIT-2狀態(tài),此狀態(tài)可以接收數(shù)據(jù),停止發(fā)送新數(shù)據(jù);
CLOSE-WAIT狀態(tài):服務(wù)端發(fā)送ACK 后進(jìn)入CLOSE-WAIT狀態(tài),此狀態(tài)可以發(fā)送數(shù)據(jù),停止接收新數(shù)據(jù);
TIME-WAIT 狀態(tài):客戶端接收到來自服務(wù)端FIN報文并返回ACK后進(jìn)TIME-WAIT 狀態(tài),該狀態(tài)持續(xù)時間為2MSL(Maximum Segment Lifetime,最大報文段生存時間);
LAST-ACK 狀態(tài):服務(wù)端發(fā)送FIN報文后進(jìn)入此狀態(tài)等待客戶端發(fā)送ACK報文;
TCP的重要機制
2.確認(rèn)應(yīng)答與超時重傳
TCP 通過確認(rèn)應(yīng)答(ACK)實現(xiàn)可靠的數(shù)據(jù)傳輸,在建立TCP連接時會雙方都會產(chǎn)生一個屬于自己的序列號,當(dāng)服務(wù)端收到數(shù)據(jù)后會根據(jù)seq信息判斷是否所期望的數(shù)據(jù)序號,判斷沒問題后會響應(yīng)一條ACK 報文告知對方已發(fā)送成功。
如下圖所示:
數(shù)據(jù)在網(wǎng)絡(luò)通道上傳輸常常會遇到突發(fā)情況,導(dǎo)致數(shù)據(jù)未發(fā)送到目的地,遇到這種情況TCP協(xié)議作為交通指揮官將會行使自己的超時重傳權(quán)力來處理突發(fā)狀況。如下兩種情景所示:
情景一:當(dāng)客戶端在一定時間內(nèi)沒有收到確認(rèn)應(yīng)答,會認(rèn)為自己數(shù)據(jù)已經(jīng)丟失并進(jìn)行重傳。
如下圖所示:
情景二:服務(wù)端回復(fù)了確認(rèn)應(yīng)答,但是服務(wù)端在一定時間內(nèi)并未收到,則客戶端也會進(jìn)行重新發(fā)送。
如下圖所示:
由以上兩種情景可知,當(dāng)客戶端在一定時間內(nèi)未接收到應(yīng)答報文才會進(jìn)行重傳,這個時間定義為超時重傳時間(RTO),如果重傳后還未接收到應(yīng)答報文,則重傳時間為2*RTO,以此類推,每重傳一次RTO值會加倍,這種行為也稱為指針退避策略。
2.滑動窗口機制
通過TCP 的確認(rèn)應(yīng)答和超時重傳機制可知,每發(fā)一個TCP報文段時都要等待對方的應(yīng)答報文,這樣的傳輸方式降低了網(wǎng)絡(luò)吞吐量,為了解決這個問題,TCP協(xié)議又增加一個滑動窗口功能。簡單的講,在服務(wù)端的窗口大小范圍內(nèi)發(fā)送一個TCP報文段后不必要一直等待確認(rèn)應(yīng)答,而是可以繼續(xù)發(fā)送。
假設(shè)需要發(fā)送1000字節(jié)數(shù)據(jù),TCP最大報文段為100字節(jié),服務(wù)端窗口大小為400字節(jié),數(shù)據(jù)該如何進(jìn)行傳輸呢?
如下圖所示:
服務(wù)端滑動窗口:當(dāng)收到TCP報文段數(shù)據(jù)總長度為400字節(jié)時,已占滿了整個窗口大小,此時無法再接收其他數(shù)據(jù),需要確認(rèn)接收后才可以釋放一定的緩存空間。
如下圖所示:
客戶端滑動窗口:
3.擁塞控制機制
通過滑動窗口、確認(rèn)應(yīng)答、超時重傳等機制都體現(xiàn)了TCP協(xié)議傳輸?shù)目煽啃裕?dāng)網(wǎng)絡(luò)擁堵狀態(tài)下,由于客戶端接收不到確認(rèn)應(yīng)答報文會在一定時間內(nèi)進(jìn)行數(shù)據(jù)重傳,這樣反而加重了擁堵程度,而TCP的擁塞控制就是避免將過多的數(shù)據(jù)包被發(fā)送到網(wǎng)絡(luò)中,導(dǎo)致網(wǎng)絡(luò)擁堵和數(shù)據(jù)丟失,TCP擁塞控制算法包括以下四個主要部分:
(1)慢啟動
慢啟動為發(fā)送方的TCP增加了另一個窗口:擁塞窗口(congestion window),記為cwnd,當(dāng)兩個主機建立TCP連接時,假定擁塞窗口被初始化為1個報文段(MSS)。發(fā)送方開始時發(fā)送一個報文段,然后等待ACK。當(dāng)收到該ACK時,擁塞窗口從1增加為2, 即可以發(fā)送兩個報文段。當(dāng)收到這兩個報文段的ACK時,擁塞窗口就增加為 4,這是一種指數(shù)增加的關(guān)系。
如下圖所示:
(2)擁塞避免
因慢啟動中擁塞窗口呈指數(shù)增長,當(dāng)達(dá)到一定值時會再次造成網(wǎng)絡(luò)擁塞,為避免這種現(xiàn)象,將設(shè)置一個閾值,當(dāng)達(dá)到閾值后擁塞窗口將進(jìn)行緩慢增長,這種方法稱為擁塞避免算法,而這個閾值稱為慢啟動閾值(slow start threshold),記為ssthresh,擁塞避免算法需要維持兩個變量:一個擁塞窗口和一個慢 啟動閾值。
工作過程下圖所示:
在該圖中,設(shè)置ssthresh初始值為16個報文段,在時刻0發(fā)送了一個報文段,在時刻1收到它的ACK,此時cwnd 增長為2,接著發(fā)送了2個報文段,并假定在時刻2接收到它們的ACK,于是cwnd增加為4(對每個ACK增加一次),這種指數(shù)增長方式一直進(jìn)行到時刻3和4之間收到8個ACK后,cwnd等于ssthresh時才停止,從此刻起,cwnd以線性方式增長,在每個往返時間內(nèi)最多增加一個報文段,假設(shè)在時刻4和5之間出現(xiàn)了超時情況,則重新進(jìn)入慢啟動,此時cwnd 為1,ssthresh值更新為cwnd/2。
(3)快速重傳
客戶端如果連續(xù)收到3個或者3個以上的重復(fù)ACK,此時會認(rèn)為某一報文段丟失并立刻進(jìn)行重傳而不需要等待超時重傳的時間,這種策略稱為快速重傳算法。
如下圖所示:
1)客戶端發(fā)送數(shù)據(jù)Seq1,服務(wù)端接收到返回Ack2(希望下一個數(shù)據(jù)的Seq號信息2);
2)客戶端發(fā)送數(shù)據(jù)Seq2,因某種原因使其發(fā)送數(shù)據(jù)中斷無法到達(dá);
3)客戶端繼續(xù)發(fā)送數(shù)據(jù)Seq3,因服務(wù)端未收到期望的Seq2的數(shù)據(jù)信息,繼續(xù)回復(fù)Ack2;
4)客戶端繼續(xù)發(fā)送Seq4,同理,服務(wù)端繼續(xù)回復(fù)Ack2;
5)當(dāng)客戶端接收到三次重復(fù)的Ack2信息后確認(rèn)發(fā)送數(shù)據(jù)Seq2丟失,客戶端重新發(fā)送Seq2,服務(wù)端接收到Seq2數(shù)據(jù)后,回復(fù)Ack5告知客戶端Seq1-Seq4數(shù)據(jù)段全部接收成功,期望下一次接收的數(shù)據(jù)信息為Seq5;
(4)快速恢復(fù)
當(dāng)快速重傳之后,不經(jīng)過慢啟動過程而直接進(jìn)入擁塞避免階段,這就是快速恢復(fù)算法,未經(jīng)過慢啟動的原因是因為接收方只有收到另一個報文段時才會產(chǎn)生重復(fù)的ACK,也說明了后續(xù)的報文段已經(jīng)成功發(fā)送到服務(wù)端的緩存中,并不需要減少網(wǎng)絡(luò)上的數(shù)據(jù)流,快速恢復(fù)算法過程如下所示:
1)當(dāng)收到第3個重復(fù)的ACK時,將ssthresh設(shè)置為當(dāng)前擁塞窗口的一半,并重傳丟失的報文段,設(shè)置cwnd為ssthresh +3個報文段;
2)每次收到另一個重復(fù)的ACK時,cwnd增加一個報文段大小
3)當(dāng)收到對丟失報文和其后若干報文段的累計確認(rèn)后置cwnd=ssthresh,進(jìn)入擁塞避免階段。
4.保活機制
保活機制(Keep-Alive) 是確保TCP連接處于活動狀態(tài)或者及時檢測并關(guān)閉空閑連接的一種方法。關(guān)于保活機制有以下幾個重要參數(shù):
保活時間:處于非活動狀態(tài)的時間內(nèi)
保活時間間隔:兩個保活探測報文的時間間隔
保活探測數(shù):探測報文的最大次數(shù)
描述:如果在保活時間內(nèi)連接處于非活動狀態(tài),則TCP一端將會開啟保活機制向另一端發(fā)送保活探測報文,如果客戶端沒有收到響應(yīng)報文,則經(jīng)過保活時間間隔后會再次發(fā)送一條保活探測報文,直到發(fā)送次數(shù)達(dá)到保活探測數(shù),此時將認(rèn)為另一端不在線,并關(guān)閉TCP連接。保活探測報文的報文段長度為0或者包含一個字節(jié)的數(shù)據(jù),序列號為對方主機最大應(yīng)答號減1
TCP在車載以太網(wǎng)中扮演關(guān)鍵角色,通過連接管理、確認(rèn)應(yīng)答、超時重傳、擁塞控制等機制,實現(xiàn)數(shù)據(jù)的高效、可靠傳輸,其實現(xiàn)遵循國際標(biāo)準(zhǔn)文檔(如RFC793),從而保證不同廠商提供的TCP實現(xiàn)具備良好的互通性與兼容性,為OTA、診斷、信息 娛樂等核心功能提供了堅實的網(wǎng)絡(luò)基礎(chǔ)。
與此同時,OPEN聯(lián)盟發(fā)布了相應(yīng)的測試規(guī)范,其中《OPEN Alliance Automotive Ethernet ECU Test Specification Layer 3-7》明確列出了TCP協(xié)議的測試項目,包括標(biāo)志位測試、窗口測試、序列號測試等,為行業(yè)提供了統(tǒng)一的驗證依據(jù)。
北匯信息作為一家專注于汽車電子測試領(lǐng)域的企業(yè),在車載以太網(wǎng)測試方面積累了豐富經(jīng)驗。我們可提供專業(yè)的培訓(xùn)、技術(shù)咨詢及完整的測試解決方案,協(xié)助汽車制造商與零部件供應(yīng)商確保車載以太網(wǎng)系統(tǒng)的可靠性及安全性。如您需要具體的測試服務(wù)或希望了解更多信息,歡迎隨時聯(lián)系我們。
參考文獻(xiàn):
【1】《TCP/IP詳解 卷1:協(xié)議》
【2】《車載以太網(wǎng)權(quán)威指南》
【3】《RFC 793文檔》
本文來自博客園,作者:{北匯信息},轉(zhuǎn)載請注明原文鏈接:{http://www.rzrgm.cn/polelink/}

浙公網(wǎng)安備 33010602011771號