如何基于Nagle算法設計嵌入式TCP協(xié)議?
隨著(zhù)嵌入式系統的發(fā)展,在嵌入式系統中實(shí)現網(wǎng)絡(luò )連接已成為研究熱點(diǎn),廣泛使用的廉價(jià)8/ 16 位嵌入式處理器的性能不足與網(wǎng)絡(luò )協(xié)議的復雜構成了尖銳的矛盾。 嵌入式Internet 技術(shù)的核心是在嵌入式系統中實(shí)現TCP/ IP 協(xié)議簇, TCP 協(xié)議的機制比較復雜,對8/ 16 位嵌入式處理器的存儲能力和運算能力要求較高,必須進(jìn)行簡(jiǎn)化。
本文引用地址:http://dyxdggzs.com/article/201807/384684.htm本文提出了一種適用于8/ 16 位低速處理器的簡(jiǎn)化TCP 協(xié)議。對其性能進(jìn)行分析發(fā)現,在嵌入式網(wǎng)絡(luò )大量使用小數據包,造成網(wǎng)絡(luò )帶寬利用率低下并且容易造成網(wǎng)絡(luò )阻塞。 因此在簡(jiǎn)化的TCP 協(xié)議中引入Nagle 算法,大幅度減少了嵌入式網(wǎng)絡(luò )中發(fā)送的小數據包個(gè)數,提高了吞吐率,并減少了所需的帶寬。
簡(jiǎn)化TCP 協(xié)議的提出
TCP 協(xié)議的數據傳輸分為3 個(gè)階段: 建立連接、傳輸數據和斷開(kāi)連接,可以用狀態(tài)機 來(lái)實(shí)現。8/ 16 位嵌入式微控制器要完整實(shí)現這樣復雜的狀態(tài)機是十分困難的。在嵌入式系統中簡(jiǎn)化TCP 的實(shí)現已有相關(guān)的研究,本文進(jìn)一步引入了Nagle 算法并且進(jìn)行了網(wǎng)絡(luò )模擬,給出了實(shí)驗結果。
連接建立和斷開(kāi)機制
TCP 建立連接有兩種方式:主動(dòng)打開(kāi)和被動(dòng)打開(kāi)。如果實(shí)現服務(wù)器端應用,可以將TCP 狀態(tài)機的主動(dòng)打開(kāi)連接部分簡(jiǎn)化掉。同理客戶(hù)端應用,可以將狀態(tài)機的被動(dòng)打開(kāi)連接部分簡(jiǎn)化掉。斷開(kāi)連接也有兩種方式:主動(dòng)斷開(kāi)和被動(dòng)斷開(kāi)。其中被動(dòng)斷開(kāi)連接的處理較為簡(jiǎn)單。但為了保證安全性,希望主動(dòng)斷開(kāi)連接。主動(dòng)斷開(kāi)連接簡(jiǎn)化實(shí)現的方法是:發(fā)送一個(gè)Fin 數據報,在接收到對Fin 數據報的確認后,再發(fā)送一個(gè)Reset 數據報,就可完成主動(dòng)斷開(kāi)連接。
以服務(wù)器端的TCP 連接為例,簡(jiǎn)化后的TCP狀態(tài)機如圖1。

單TCP 連接
在8/ 16 位微控制器上實(shí)現簡(jiǎn)化TCP 協(xié)議,無(wú)需實(shí)現多個(gè)TCP 連接,只需實(shí)現單個(gè)TCP 連接即可。
簡(jiǎn)單確認機制
嵌入式系統發(fā)送數據包不大,可以將TCP 協(xié)議的滑動(dòng)窗口機制去掉,成為簡(jiǎn)單確認機制,只對單個(gè)數據報而不是批量數據發(fā)送確認。實(shí)現方法是設置TCP 頭部windows 字段的大小為1 ,即可保證TCP協(xié)議雙方都使用簡(jiǎn)單確認。
僅計算發(fā)送TCP 報文的校驗和
由于TCP 協(xié)議校驗和的計算對系統存儲和計算資源的占用都比較多,可以省去對接收數據報校驗和的計算,保留發(fā)送數據報TCP 校驗和的計算。
簡(jiǎn)化TCP 方案小結
在上述4 個(gè)方面的基礎上,在嵌入式處理器中實(shí)現了簡(jiǎn)化的TCP 協(xié)議,程序流程如圖2。其中“不同狀態(tài)的相應處理”指根據接收到的TCP 報文準備待發(fā)送數據報并將其發(fā)送到以太網(wǎng)上。
簡(jiǎn)化TCP 協(xié)議的性能分析
這種簡(jiǎn)化的TCP 協(xié)議的性能可以通過(guò)在NS-2

網(wǎng)絡(luò )模擬器中進(jìn)行模擬實(shí)現。
通常在嵌入式的環(huán)境中,應用層產(chǎn)生的數據包是很小的,經(jīng)常是每個(gè)包只有幾個(gè)、十幾、幾十個(gè)字節的數據,這樣就產(chǎn)生了一個(gè)問(wèn)題: TCP 協(xié)議的報頭開(kāi)銷(xiāo)太大。假設數據僅有一個(gè)字節,而TCP 的包頭有40 個(gè)字節,這樣的數據報對底層網(wǎng)絡(luò )的利用率僅僅只有1/ 41 ,考慮到分組之間的間隙和網(wǎng)絡(luò )硬件組成幀還需要一些比特,實(shí)際的網(wǎng)絡(luò )利用率更低。 嵌入式系統的這種常見(jiàn)的小的數據包造成了網(wǎng)絡(luò )帶寬的極大浪費。除了網(wǎng)絡(luò )利用率不高之外,還有另外一個(gè)問(wèn)題是產(chǎn)生TCP 數據包數量極多,網(wǎng)關(guān)和路由器會(huì )由于這些極大數量的小數據包而發(fā)生阻塞。
組塊技術(shù)與其不足
通過(guò)以上分析,很自然的想到采用組塊技術(shù)(clumping) 把一定數量的數據包組成一個(gè)幀,這樣既能減小報頭開(kāi)銷(xiāo),又能減小TCP 數據包的數量,而且代碼量增加很少。但是,這樣組包會(huì )產(chǎn)生一個(gè)問(wèn)題,TCP 在數據幀未達到一定大小之前不會(huì )傳輸數據,這樣產(chǎn)生的延時(shí)會(huì )影響到數據的實(shí)時(shí)傳輸。因此,有必要對怎樣避免這種延時(shí)進(jìn)行研究。
Nagle 算法的由來(lái)
在因特網(wǎng)發(fā)展初期,由于bbs 和新聞組的流行,網(wǎng)絡(luò )上充斥著(zhù)大量的telnet 產(chǎn)生的小的數據包,數量極大的這些數據包使得路由器和網(wǎng)關(guān)發(fā)生了嚴重的阻塞現象,這和嵌入式系統中的情形類(lèi)似。JoneNagle 提出了一種算法來(lái)對付這種棘手的小數據包問(wèn)題,后來(lái)被稱(chēng)為Nagle 算法。
Nagle 算法與簡(jiǎn)單的組包( clumping) 技術(shù)不同,它和慢啟動(dòng)一樣使用自計時(shí)( self clocking) 、用確認的到達來(lái)觸發(fā)其余數據的傳輸。因此它沒(méi)有引入額外的延時(shí),而且能有效地減少網(wǎng)絡(luò )上小數據包的流量。
Nagle 算法的描述
在一個(gè)連接上已經(jīng)傳輸的數據還沒(méi)有被確認的情況下,發(fā)送方的應用程序又生成了后續數據,并照常將數據送到輸出緩沖區中,但這時(shí)并不發(fā)送后續報文段,而是等到有足夠的數據填滿(mǎn)一個(gè)達到最大長(cháng)度的報文段之后再把緩沖區中的數據發(fā)送出去。
如果某個(gè)應用程序每次僅產(chǎn)生一個(gè)八位組的數據, TCP 會(huì )立即發(fā)送最初的那個(gè)八位組,但是在確認到達之前, TCP 會(huì )把后續數據存入緩沖區中。因此當應用程序生成數據的速率比網(wǎng)絡(luò )的速率快很多時(shí)(如傳送文件) ,后續的報文段將包含大量的數據,而當應用程序比網(wǎng)絡(luò )速度更慢時(shí)(如用戶(hù)敲鍵盤(pán)) ,就會(huì )發(fā)送較短的報文段而不必經(jīng)過(guò)長(cháng)的延時(shí)。
Nagle 算法在嵌入式環(huán)境的適用性
在嵌入式系統的環(huán)境中,嵌入式TCP 協(xié)議會(huì )面臨著(zhù)各種情況,比如一兩個(gè)開(kāi)關(guān)量的傳輸,或者是傳感器數據實(shí)時(shí)的傳輸,而Nagle 算法能夠自動(dòng)適應網(wǎng)絡(luò )速率和應用層數據流量的各種情況,因為它是以確認來(lái)觸發(fā)的自計時(shí)的協(xié)議。
網(wǎng)絡(luò )模擬
NS-2 是一個(gè)應用于網(wǎng)絡(luò )研究的離散事件模擬器,它充分支持有線(xiàn)與無(wú)線(xiàn)網(wǎng)絡(luò )上對于TCP、路由和多播協(xié)議的模擬。它自問(wèn)世以來(lái)受到學(xué)術(shù)界的充分信賴(lài),成為設計和檢驗新的協(xié)議和算法的權威網(wǎng)絡(luò )模擬測試平臺。
網(wǎng)絡(luò )模擬環(huán)境的構建
圖3 是本文構建的網(wǎng)絡(luò )模擬環(huán)境:節點(diǎn)0 使用本文提出的嵌入式TCP 協(xié)議發(fā)送數據,節點(diǎn)1 使用用戶(hù)投文協(xié)議(UDP) 組播協(xié)議來(lái)發(fā)送大量的數據,用于測試嵌入式TCP 協(xié)議在網(wǎng)絡(luò )阻塞情況下的性能,節點(diǎn)2 和節點(diǎn)3 之間是瓶頸路徑,模擬交換機之間的線(xiàn)路情況。
評論