
作者 | 雨田
小編 | CACTUS
在智能汽車加速邁入數(shù)字化的今天,車載以太網(wǎng)早已不是簡單的 “數(shù)據(jù)通道”,而是像縱橫交錯(cuò)的城市快速路網(wǎng)絡(luò),日夜承載著自動(dòng)駕駛的決策指令、智能座艙的影音交互數(shù)據(jù)、云端互聯(lián)的實(shí)時(shí)路況信息 —— 這些數(shù)據(jù)洪流如同高速行駛的車流,一旦出現(xiàn) “丟件”“堵車”,小則影響車機(jī)使用體驗(yàn),大則關(guān)乎自動(dòng)駕駛的安全決策。而在這條 “信息高速公路” 上,有一位默默守護(hù)的 “衛(wèi)士”,始終確保關(guān)鍵數(shù)據(jù)不丟失、不錯(cuò)亂、準(zhǔn)時(shí)抵達(dá)目的地,它就是我們今天要聊的核心 ——TCP 協(xié)議。

TCP 協(xié)議概念
TCP協(xié)議(Transmission Control Protocol,傳輸控制協(xié)議)是車載以太網(wǎng)中的核心組件之一,主要運(yùn)行于OSI模型的傳輸層。作為一種面向連接、可靠且基于字節(jié)流的傳輸層通信協(xié)議,TCP憑借其多項(xiàng)關(guān)鍵機(jī)制包括三次握手、四次揮手、確認(rèn)應(yīng)答、超時(shí)重傳、滑動(dòng)窗口、擁塞控制以及?;顧C(jī)制等有效保障了數(shù)據(jù)傳輸?shù)目煽啃耘c穩(wěn)定性,確保數(shù)據(jù)在網(wǎng)絡(luò)中有序、無誤地傳輸。


TCP報(bào)文結(jié)構(gòu)
TCP協(xié)議報(bào)文也稱TCP報(bào)文段,是TCP通信的基本單元,一個(gè)TCP報(bào)文段由首部和數(shù)據(jù)兩部分組成,其中首部包含了必要的控制信息,確保數(shù)據(jù)的正確傳輸和連接管理,下圖是TCP報(bào)文結(jié)構(gòu),并對(duì)TCP首部進(jìn)行了格式解析:

源端口號(hào):占16 位,表示發(fā)送方的端口號(hào),取值范圍0~65535;
目的端口號(hào):占16位,表示接收方的端口號(hào),取值范圍0~65535;
序列號(hào):占32位,表示本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào),取值范圍0~2^32 – 1,當(dāng)序號(hào)增加到2^32-1后,下一個(gè)序號(hào)就又回到0;
確認(rèn)號(hào):占32位,表示期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào);
首部長度:占4位,表示TCP首部數(shù)據(jù)長度,以4字節(jié)為單位計(jì)數(shù),最大長度為60字節(jié);
標(biāo)志位:占6位,包括URG、ACK、PSH、RST、SYN、FIN 6個(gè)標(biāo)志位;
URG:占1位,緊急指針標(biāo)志,當(dāng)URG被設(shè)置1時(shí),緊急指針字段有效;
ACK:占1位,確認(rèn)標(biāo)志,當(dāng)ACK被設(shè)置1時(shí),確認(rèn)號(hào)字段才有效;
PSH:占1位,推送標(biāo)志,當(dāng)收到TCP報(bào)文段中的PSH值為1時(shí)應(yīng)盡快將數(shù)據(jù)傳遞給應(yīng)用程序,不需要等到整個(gè)緩存都填滿后再向應(yīng)用層傳遞;
RST:占1位,重置連接標(biāo)志,當(dāng)RST被置1時(shí)表示連接錯(cuò)誤或者連接被拒絕;
SYN:占1位,同步標(biāo)志,用于連接建立,當(dāng)SYN被置1時(shí)表示一個(gè)連接請(qǐng)求或連接接收?qǐng)?bào)文;
FIN:占1位,結(jié)束標(biāo)志,用于關(guān)閉連接;
窗口大?。赫?6位,表示接收方希望一次接收多少字節(jié);
檢驗(yàn)和:占16位,用于校驗(yàn)數(shù)據(jù)的完整性;
緊急指針:占16位,當(dāng)URG標(biāo)志置1時(shí)緊急指針才有效,緊急指針是一個(gè)正的偏移量,和序列號(hào)字段的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào);
選項(xiàng):可變長度,最大長度為40字節(jié)【計(jì)算方式 :首部總長度-20字節(jié)固定長度】,由于TCP首部的偏移單位為4 字節(jié),當(dāng)選項(xiàng)占用字節(jié)個(gè)數(shù)不是4字節(jié)的整數(shù)倍時(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ā)送一個(gè)SYN報(bào)文,并且會(huì)隨機(jī)生成一個(gè)客戶端的序列號(hào)(seq)。
2)第二次握手(SYN-ACK):服務(wù)端收到來自客戶端的SYN報(bào)文后也會(huì)生成一個(gè)隨機(jī)的序列號(hào),同時(shí)也會(huì)計(jì)算出確認(rèn)號(hào)(Ack),并通過SYN-ACK 報(bào)文發(fā)送給客戶端,該確認(rèn)號(hào)(Ack)也會(huì)告知客戶端下一次期望接收到報(bào)文序列號(hào)是多少。
3)第三次握手(ACK):客戶端收到來自服務(wù)端的SYN-ACK 報(bào)文后,會(huì)發(fā)送一個(gè)ACK報(bào)文通知服務(wù)端,確認(rèn)接收到了序列號(hào)并可以開始通信。
三次握手過程如圖所示,此過程確保了雙方都能確認(rèn)對(duì)方的連接能力,從而建立起一個(gè)可靠的,雙向的通信通道。

2.四次揮手
1)第一次揮手(FIN):客戶端發(fā)送一條FIN報(bào)文,通知數(shù)據(jù)發(fā)送完畢,希望關(guān)閉連接。
2)第二次揮手(ACK):服務(wù)端回復(fù)一條ACK報(bào)文,確認(rèn)收到了客戶端FIN報(bào)文,ACK報(bào)文中的確認(rèn)號(hào)是收到FIN報(bào)文的序列號(hào)加1,表示所有數(shù)據(jù)已被接收。
3)第三次揮手(FIN):服務(wù)端發(fā)送完所有數(shù)據(jù)后,也會(huì)發(fā)送一條FIN報(bào)文給客戶端,通知數(shù)據(jù)發(fā)送完畢,準(zhǔn)備關(guān)閉連接。
4)第四次揮手(ACK):客戶端回復(fù)一條ACK報(bào)文,確認(rèn)收到了服務(wù)端的FIN報(bào)文,至此,連接完全關(guān)閉。
如下圖所示,四次揮手機(jī)制確保了雙方都有機(jī)會(huì)發(fā)送完所有數(shù)據(jù),并且相互確認(rèn)了對(duì)方的終止請(qǐng)求,從而實(shí)現(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報(bào)文后進(jìn)入FIN-WAIT-1狀態(tài),此狀態(tài)下可以接收數(shù)據(jù),禁止發(fā)送新數(shù)據(jù);
FIN-WAIT-2狀態(tài):客戶端接收到ACK 報(bào)文后進(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報(bào)文并返回ACK后進(jìn)TIME-WAIT 狀態(tài),該狀態(tài)持續(xù)時(shí)間為2MSL(Maximum Segment Lifetime,最大報(bào)文段生存時(shí)間);
LAST-ACK 狀態(tài):服務(wù)端發(fā)送FIN報(bào)文后進(jìn)入此狀態(tài)等待客戶端發(fā)送ACK報(bào)文;

TCP的重要機(jī)制
1.確認(rèn)應(yīng)答與超時(shí)重傳
TCP 通過確認(rèn)應(yīng)答(ACK)實(shí)現(xiàn)可靠的數(shù)據(jù)傳輸,在建立TCP連接時(shí)會(huì)雙方都會(huì)產(chǎn)生一個(gè)屬于自己的序列號(hào),當(dāng)服務(wù)端收到數(shù)據(jù)后會(huì)根據(jù)seq信息判斷是否所期望的數(shù)據(jù)序號(hào),判斷沒問題后會(huì)響應(yīng)一條ACK 報(bào)文告知對(duì)方已發(fā)送成功。
如下圖所示:

數(shù)據(jù)在網(wǎng)絡(luò)通道上傳輸常常會(huì)遇到突發(fā)情況,導(dǎo)致數(shù)據(jù)未發(fā)送到目的地,遇到這種情況TCP協(xié)議作為交通指揮官將會(huì)行使自己的超時(shí)重傳權(quán)力來處理突發(fā)狀況。如下兩種情景所示:
情景一:當(dāng)客戶端在一定時(shí)間內(nèi)沒有收到確認(rèn)應(yīng)答,會(huì)認(rèn)為自己數(shù)據(jù)已經(jīng)丟失并進(jìn)行重傳。
如下圖所示:

情景二:服務(wù)端回復(fù)了確認(rèn)應(yīng)答,但是服務(wù)端在一定時(shí)間內(nèi)并未收到,則客戶端也會(huì)進(jìn)行重新發(fā)送。
如下圖所示:

由以上兩種情景可知,當(dāng)客戶端在一定時(shí)間內(nèi)未接收到應(yīng)答報(bào)文才會(huì)進(jìn)行重傳,這個(gè)時(shí)間定義為超時(shí)重傳時(shí)間(RTO),如果重傳后還未接收到應(yīng)答報(bào)文,則重傳時(shí)間為2*RTO,以此類推,每重傳一次RTO值會(huì)加倍,這種行為也稱為指針退避策略。
2.滑動(dòng)窗口機(jī)制
通過TCP 的確認(rèn)應(yīng)答和超時(shí)重傳機(jī)制可知,每發(fā)一個(gè)TCP報(bào)文段時(shí)都要等待對(duì)方的應(yīng)答報(bào)文,這樣的傳輸方式降低了網(wǎng)絡(luò)吞吐量,為了解決這個(gè)問題,TCP協(xié)議又增加一個(gè)滑動(dòng)窗口功能。簡單的講,在服務(wù)端的窗口大小范圍內(nèi)發(fā)送一個(gè)TCP報(bào)文段后不必要一直等待確認(rèn)應(yīng)答,而是可以繼續(xù)發(fā)送。
假設(shè)需要發(fā)送1000字節(jié)數(shù)據(jù),TCP最大報(bào)文段為100字節(jié),服務(wù)端窗口大小為400字節(jié),數(shù)據(jù)該如何進(jìn)行傳輸呢?
如下圖所示:

服務(wù)端滑動(dòng)窗口:當(dāng)收到TCP報(bào)文段數(shù)據(jù)總長度為400字節(jié)時(shí),已占滿了整個(gè)窗口大小,此時(shí)無法再接收其他數(shù)據(jù),需要確認(rèn)接收后才可以釋放一定的緩存空間。
如下圖所示:

客戶端滑動(dòng)窗口:

3.擁塞控制機(jī)制
通過滑動(dòng)窗口、確認(rèn)應(yīng)答、超時(shí)重傳等機(jī)制都體現(xiàn)了TCP協(xié)議傳輸?shù)目煽啃?,?dāng)網(wǎng)絡(luò)擁堵狀態(tài)下,由于客戶端接收不到確認(rèn)應(yīng)答報(bào)文會(huì)在一定時(shí)間內(nèi)進(jìn)行數(shù)據(jù)重傳,這樣反而加重了擁堵程度,而TCP的擁塞控制就是避免將過多的數(shù)據(jù)包被發(fā)送到網(wǎng)絡(luò)中,導(dǎo)致網(wǎng)絡(luò)擁堵和數(shù)據(jù)丟失,TCP擁塞控制算法包括以下四個(gè)主要部分:
(1)慢啟動(dòng)
慢啟動(dòng)為發(fā)送方的TCP增加了另一個(gè)窗口:擁塞窗口(congestion window),記為cwnd,當(dāng)兩個(gè)主機(jī)建立TCP連接時(shí),假定擁塞窗口被初始化為1個(gè)報(bào)文段(MSS)。發(fā)送方開始時(shí)發(fā)送一個(gè)報(bào)文段,然后等待ACK。當(dāng)收到該ACK時(shí),擁塞窗口從1增加為2, 即可以發(fā)送兩個(gè)報(bào)文段。當(dāng)收到這兩個(gè)報(bào)文段的ACK時(shí),擁塞窗口就增加為 4,這是一種指數(shù)增加的關(guān)系。
如下圖所示:

(2)擁塞避免
因慢啟動(dòng)中擁塞窗口呈指數(shù)增長,當(dāng)達(dá)到一定值時(shí)會(huì)再次造成網(wǎng)絡(luò)擁塞,為避免這種現(xiàn)象,將設(shè)置一個(gè)閾值,當(dāng)達(dá)到閾值后擁塞窗口將進(jìn)行緩慢增長,這種方法稱為擁塞避免算法,而這個(gè)閾值稱為慢啟動(dòng)閾值(slow start threshold),記為ssthresh,擁塞避免算法需要維持兩個(gè)變量:一個(gè)擁塞窗口和一個(gè)慢 啟動(dòng)閾值。
工作過程下圖所示:

在該圖中,設(shè)置ssthresh初始值為16個(gè)報(bào)文段,在時(shí)刻0發(fā)送了一個(gè)報(bào)文段,在時(shí)刻1收到它的ACK,此時(shí)cwnd 增長為2,接著發(fā)送了2個(gè)報(bào)文段,并假定在時(shí)刻2接收到它們的ACK,于是cwnd增加為4(對(duì)每個(gè)ACK增加一次),這種指數(shù)增長方式一直進(jìn)行到時(shí)刻3和4之間收到8個(gè)ACK后,cwnd等于ssthresh時(shí)才停止,從此刻起,cwnd以線性方式增長,在每個(gè)往返時(shí)間內(nèi)最多增加一個(gè)報(bào)文段,假設(shè)在時(shí)刻4和5之間出現(xiàn)了超時(shí)情況,則重新進(jìn)入慢啟動(dòng),此時(shí)cwnd 為1,ssthresh值更新為cwnd/2。
(3)快速重傳
客戶端如果連續(xù)收到3個(gè)或者3個(gè)以上的重復(fù)ACK,此時(shí)會(huì)認(rèn)為某一報(bào)文段丟失并立刻進(jìn)行重傳而不需要等待超時(shí)重傳的時(shí)間,這種策略稱為快速重傳算法。
如下圖所示:

1)客戶端發(fā)送數(shù)據(jù)Seq1,服務(wù)端接收到返回Ack2(希望下一個(gè)數(shù)據(jù)的Seq號(hào)信息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)過慢啟動(dòng)過程而直接進(jìn)入擁塞避免階段,這就是快速恢復(fù)算法,未經(jīng)過慢啟動(dòng)的原因是因?yàn)榻邮辗街挥惺盏搅硪粋€(gè)報(bào)文段時(shí)才會(huì)產(chǎn)生重復(fù)的ACK,也說明了后續(xù)的報(bào)文段已經(jīng)成功發(fā)送到服務(wù)端的緩存中,并不需要減少網(wǎng)絡(luò)上的數(shù)據(jù)流,快速恢復(fù)算法過程如下所示:
1)當(dāng)收到第3個(gè)重復(fù)的ACK時(shí),將ssthresh設(shè)置為當(dāng)前擁塞窗口的一半,并重傳丟失的報(bào)文段,設(shè)置cwnd為ssthresh +3個(gè)報(bào)文段;
2)每次收到另一個(gè)重復(fù)的ACK時(shí),cwnd增加一個(gè)報(bào)文段大小
3)當(dāng)收到對(duì)丟失報(bào)文和其后若干報(bào)文段的累計(jì)確認(rèn)后置cwnd=ssthresh,進(jìn)入擁塞避免階段。

4.?;顧C(jī)制
?;顧C(jī)制(Keep-Alive) 是確保TCP連接處于活動(dòng)狀態(tài)或者及時(shí)檢測(cè)并關(guān)閉空閑連接的一種方法。關(guān)于保活機(jī)制有以下幾個(gè)重要參數(shù):
?;顣r(shí)間:處于非活動(dòng)狀態(tài)的時(shí)間內(nèi)
?;顣r(shí)間間隔:兩個(gè)保活探測(cè)報(bào)文的時(shí)間間隔
?;钐綔y(cè)數(shù):探測(cè)報(bào)文的最大次數(shù)
描述:如果在?;顣r(shí)間內(nèi)連接處于非活動(dòng)狀態(tài),則TCP一端將會(huì)開啟?;顧C(jī)制向另一端發(fā)送?;钐綔y(cè)報(bào)文,如果客戶端沒有收到響應(yīng)報(bào)文,則經(jīng)過?;顣r(shí)間間隔后會(huì)再次發(fā)送一條?;钐綔y(cè)報(bào)文,直到發(fā)送次數(shù)達(dá)到?;钐綔y(cè)數(shù),此時(shí)將認(rèn)為另一端不在線,并關(guān)閉TCP連接。保活探測(cè)報(bào)文的報(bào)文段長度為0或者包含一個(gè)字節(jié)的數(shù)據(jù),序列號(hào)為對(duì)方主機(jī)最大應(yīng)答號(hào)減1
TCP在車載以太網(wǎng)中扮演關(guān)鍵角色,通過連接管理、確認(rèn)應(yīng)答、超時(shí)重傳、擁塞控制等機(jī)制,實(shí)現(xiàn)數(shù)據(jù)的高效、可靠傳輸,其實(shí)現(xiàn)遵循國際標(biāo)準(zhǔn)文檔(如RFC793),從而保證不同廠商提供的TCP實(shí)現(xiàn)具備良好的互通性與兼容性,為OTA、診斷、信息 娛樂等核心功能提供了堅(jiān)實(shí)的網(wǎng)絡(luò)基礎(chǔ)。
與此同時(shí),OPEN聯(lián)盟發(fā)布了相應(yīng)的測(cè)試規(guī)范,其中《OPEN Alliance Automotive Ethernet ECU Test Specification Layer 3-7》明確列出了TCP協(xié)議的測(cè)試項(xiàng)目,包括標(biāo)志位測(cè)試、窗口測(cè)試、序列號(hào)測(cè)試等,為行業(yè)提供了統(tǒng)一的驗(yàn)證依據(jù)。
北匯信息作為一家專注于汽車電子測(cè)試領(lǐng)域的企業(yè),在車載以太網(wǎng)測(cè)試方面積累了豐富經(jīng)驗(yàn)。我們可提供專業(yè)的培訓(xùn)、技術(shù)咨詢及完整的測(cè)試解決方案,協(xié)助汽車制造商與零部件供應(yīng)商確保車載以太網(wǎng)系統(tǒng)的可靠性及安全性。如您需要具體的測(cè)試服務(wù)或希望了解更多信息,歡迎隨時(shí)聯(lián)系我們。
參考文獻(xiàn):
【1】《TCP/IP詳解 卷1:協(xié)議》
【2】《車載以太網(wǎng)權(quán)威指南》
【3】《RFC 793文檔》
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
2201瀏覽量
67594 -
TCP
+關(guān)注
關(guān)注
8文章
1425瀏覽量
83536 -
車載以太網(wǎng)
+關(guān)注
關(guān)注
19文章
266瀏覽量
24077
發(fā)布評(píng)論請(qǐng)先 登錄
TCP協(xié)議保證數(shù)據(jù)傳輸可靠性的方式主要有什么
GPRS網(wǎng)絡(luò)上數(shù)據(jù)傳輸協(xié)議之討論
tcp ip 數(shù)據(jù)傳輸
TCP/IP協(xié)議單片機(jī)在網(wǎng)絡(luò)通信中的數(shù)據(jù)傳輸技術(shù)
tcp_ip 協(xié)議講座:介紹數(shù)據(jù)傳輸
消息協(xié)議如何提高數(shù)據(jù)傳輸的可靠性
udp是什么協(xié)議 TCP與UDP的區(qū)別
如何實(shí)現(xiàn)MQTT協(xié)議數(shù)據(jù)傳輸?
工業(yè)控制領(lǐng)域基于TCP/IP的數(shù)據(jù)傳輸方案
讓“可靠”變得“更快更安全”的數(shù)據(jù)傳輸協(xié)議:SCTP
DTU的多種協(xié)議,解鎖數(shù)據(jù)傳輸的無限可能
【科普系列】TCP 協(xié)議:數(shù)據(jù)傳輸?shù)摹翱煽啃l(wèi)士”
評(píng)論