TCP/IP協(xié)議是計算機(jī)通信網(wǎng)絡(luò)中目前使用最多的網(wǎng)絡(luò)通信協(xié)議,同時也融入了生活的方方面面,不管是瀏覽網(wǎng)頁使用的http/https協(xié)議、物聯(lián)網(wǎng)設(shè)備使用的MQTT/MQTTS協(xié)議與下載文件使用的ftp協(xié)議、工業(yè)以太網(wǎng)中使用的Modbus TCP協(xié)議等很多應(yīng)用層協(xié)議,都是基于TCP/IP協(xié)議。TCP/IP協(xié)議在傳輸數(shù)據(jù)的同時,也提供了以下功能:
1、慢啟動:網(wǎng)絡(luò)環(huán)境擁塞檢測;
2、重傳機(jī)制:保證數(shù)據(jù)的完整性,與連接可靠性;
3、滑動窗口:流量控制,降低網(wǎng)絡(luò)環(huán)境壓力,避免數(shù)據(jù)丟包;
4、Keep-alive:網(wǎng)絡(luò)異常檢測;
本文將介紹TCP協(xié)議的重傳機(jī)制與如何通調(diào)整重傳機(jī)制,提高特定情況下的TCP連接穩(wěn)定性。
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。TCP協(xié)議提供了一種全雙工的、面向連接的、可靠的字節(jié)流服務(wù),是TCP/IP協(xié)議簇中最重要也是最復(fù)雜的協(xié)議。為了保證數(shù)據(jù)的可靠傳輸,TCP協(xié)議采用了重傳機(jī)制。
面向連接:通信前需要先三次握手建立連接,通信后四次揮手釋放連接。
可靠性:通過序號解決報文亂序/丟失、超時重傳、擁塞控制、滑動窗口、檢驗和等方式保證數(shù)據(jù)傳輸?shù)目煽啃浴?/span>
字節(jié)流:沒有固定的報文邊界,數(shù)據(jù)在TCP中以字節(jié)流的形式傳輸。
全雙工:通信兩端在任意時刻可以互相發(fā)送數(shù)據(jù),既可以是客戶端也可以是服務(wù)端。
TCP假設(shè)它可以從較低級別的協(xié)議獲得簡單的、可能不可靠的數(shù)據(jù)報服務(wù),原則上TCP應(yīng)該能夠在從硬線連接到分組交換或電路交換網(wǎng)絡(luò)的各種通信系統(tǒng)之上操作。
TCP重傳機(jī)制的基本工作原理是,在數(shù)據(jù)傳輸過程中,當(dāng)發(fā)送方?jīng)]有接收到確認(rèn)信息(ACK)時,會重傳之前的數(shù)據(jù)。這種重傳機(jī)制確保了數(shù)據(jù)的完整性和正確性。
重傳機(jī)制的實現(xiàn)方式主要有兩種:超時重傳和快速重傳。
超時重傳是TCP協(xié)議在發(fā)送數(shù)據(jù)時,設(shè)定一個定時器。當(dāng)超過指定的時間(即RTO,Retransmission Timeout超時重傳時間)后,如果沒有收到對方的ACK確認(rèn)應(yīng)答報文,就會重發(fā)該數(shù)據(jù)。每次當(dāng)遇到一次超時重傳時,都會將下一次超時時間間隔設(shè)為先前值的兩倍。這是TCP在應(yīng)對網(wǎng)絡(luò)環(huán)境差、不宜頻繁反復(fù)發(fā)送的情況時采取的策略。
上圖中是通過wireshark抓取的一段TCP通訊中出現(xiàn)超時重傳且自動恢復(fù)的報文截圖,IP地址為192.168.3.111的是客戶端,192.168.3.108的是服務(wù)器,客戶端一直在向服務(wù)器發(fā)送數(shù)據(jù)。
正常情況下,服務(wù)器應(yīng)該Ack 客戶端的seq(序號2031)+len(數(shù)據(jù)長度20)即上圖中第二條報文的ACK=2051
在上圖中我們可以看到,重傳的報文seq一直為2051,并且數(shù)據(jù)seq=2051的報文傳輸了四次,都沒有服務(wù)器的ACK。所以判斷TCP有沒有發(fā)生重傳最直觀的方法就是看有沒有重復(fù)的seq,還有一種是看seq有沒有突然下降,如下所示:
Linux下的重傳間隔與次數(shù)
Windows下的重傳間隔與次數(shù)
在TCP協(xié)議中,若在重傳次數(shù)內(nèi)沒有收到對方的ACK,那么協(xié)議棧會主動RST這條鏈路。應(yīng)用層會表現(xiàn)為連接斷開,由于應(yīng)用層并不能知道連接斷開原因,所以某些時候會錯誤的認(rèn)為是被對方主動斷開連接,如果不通過抓包,就很難找到斷開連接的原因。
在一般的計算機(jī)網(wǎng)絡(luò)中,TCP通訊雙方的協(xié)議棧機(jī)制完整,系統(tǒng)資源充足,應(yīng)用層處理速度快,所以一般的情況下,系統(tǒng)默認(rèn)的重傳參數(shù)就能滿足幾乎大部分由于網(wǎng)絡(luò)環(huán)境異常導(dǎo)致的丟包。但很多低成本嵌入式以太網(wǎng)方案因為成本與資源的原因,設(shè)備處理速度慢、內(nèi)存資源等限制,在某些情況下無法接收過多的數(shù)據(jù),導(dǎo)致數(shù)據(jù)丟包,無法ACK發(fā)送方的數(shù)據(jù)。導(dǎo)致連接異常斷開。但這種情況完全可以通過降低發(fā)送頻率或者增加重傳次數(shù)的方法來避免。
快速重傳是一種不以時間為驅(qū)動,而是以數(shù)據(jù)驅(qū)動的重傳機(jī)制??焖僦貍魍ㄟ^收到同一丟失數(shù)據(jù)包的多個重復(fù)確認(rèn)(ACK)來觸發(fā)。特定的觸發(fā)條件通常被稱為“三重重復(fù)ACK”。如果接收方檢測到同一丟失數(shù)據(jù)包在重復(fù)ACK中連續(xù)三次被確認(rèn),則認(rèn)為這是丟失數(shù)據(jù)包已丟失且后續(xù)數(shù)據(jù)包正在到達(dá)接收方的強(qiáng)烈指示。發(fā)送方在收到這樣的信號后,會假設(shè)丟包的可能性很高,并立即發(fā)起快速重傳,從而更快地從數(shù)據(jù)包丟失中恢復(fù)并保持更順暢的數(shù)據(jù)流。這兩種重傳機(jī)制共同確保了TCP協(xié)議在數(shù)據(jù)傳輸過程中的可靠性和穩(wěn)定性。
今天的分享就到這里啦,EBYTE每一天都致力于更好的助力物聯(lián)化、智能化、自動化的發(fā)展,提升資源利用率,更多產(chǎn)品及相關(guān)資料,感興趣的小伙伴可以登錄我們的億佰特官網(wǎng)進(jìn)行了解,也可以直接撥打400電話咨詢技術(shù)專員!
7 X 24 銷售服務(wù)熱線
4000-330-990深圳辦事處柯經(jīng)理:18218726658 杭州辦事處戴經(jīng)理:17512568697
常州辦事處崔經(jīng)理:15906110783 南京辦事處葛經(jīng)理:17626012283
業(yè)務(wù)郵箱:support@cdebyte.com
全國銷售投訴電話:19934352316
地址:四川省成都市高新西區(qū)西區(qū)大道199號B5棟(前臺座機(jī):028-61543675)
?? 成都億佰特電子科技有限公司【版權(quán)所有】 蜀ICP備13019384號-3