首页
/
每日頭條
/
圖文
/
tcp分片傳輸
tcp分片傳輸
更新时间:2025-12-15 21:20:21

tcp分片傳輸(TCP粘包與Nagle算法)1

tcp分片傳輸(TCP粘包與Nagle算法)2

Win32可以通過設置setsockopt為TCP_NODELAY的方式,來取消Nagle算法,這樣就會出現隻要有小數據段就會發送,接收方隻要數據處理的過來,就可以避免TCP的拆包和粘包問題。但是這種方法會造成TCP傳輸效率降低,也不是一種理想的方法

也就是說協議棧為了避免一個字節就帶上包頭造成資源浪費,一般會啟動tcp nagle算法,他會把這些1個字節的數據粘起來,然後一起發送。當然你可以做手動關閉,即禁用tcp Nagle算法,涉及TCP_NODELAY選項。下面來說下nagle算法規則:

為了盡可能的利用網絡帶寬,TCP總是希望盡可能多的發送足夠大的數據。一個鍊接會設置MSS參數,因此TCP/IP希望每次都能夠以MSS尺寸的數據塊來發送數據。即Nagle算法就是為了盡可能發送大塊數據,避免網絡中充斥着許多小數據塊,提高網絡利用率。

Nagle算法的基本定義是:任意時刻,最多隻能有一個未被确認的小段。所謂小段,指的是小于MSS尺寸的數據塊,所謂未被确認,是指一個數據塊發送出去後,沒有收到對方發送的ACK确認該數據已經收到。同時擁有以下幾個規則:

1. 如果包長度達到MSS,則允許發送

2. 如果該包設置了FIN,則允許發送

3. 如果設置了TCP_NODELAY選項,則允許發送。

4. 未設置TCP_CORK選項時,若所有發出去的小數據包(包長度小于MSS)均被确認,則允許發送

5. 上述條件都未滿足,但發生了超時(一般為200ms), 則立即發送

Nagle算法隻允許一個未被ACK的包存在網絡,它不管包的大小。因此它事實上就是一個擴展的停止協議,隻不過他是基于“包停”等的,而不是基于“字節停”等的。即Nagle算法完全由TCP協議的ACK機制決定,這會帶來一些問題。比如如果對端的ACK回複很快的話,Nagle事實上不會拼接太多的包,雖然避免了網絡擁塞,但是網絡總體的利用率很低。所以Nagle算法一般和延遲确認機制一起使用 TCP延遲确認機制介紹,但是也會存在一些情況導緻網絡超時。

同時會存在需要關閉Nagle的情況分别為:

1. 對端不向本端發送數據,并且對延時比較敏感的操作;這種操作沒法捎帶ack。

2. 寫-寫-讀操作;對于此種情況,優先使用其他方式,而不是關閉Nagle算法:

1. 使用writev,而不是兩次調用write,單個writev調用會使tcp輸出一次而不是兩次,隻産生一個tcp分節,這是首選方法;

2. 把兩次寫操作的數據複制到單個緩沖區,然後對緩沖區調用一次write;

3. 關閉Nagle算法,調用write兩次;有損于網絡,通常不考慮;

粘包問題:

先來簡單介紹下什麼是粘包?

因為TCP是面向字節流的協議,沒有消息保護邊界,同時在TCP的首部沒有表示數據長度的字段。一方發送的多個數據包,可能會被合并成一個大的數據包進行傳輸,這就是粘包。粘包情況有兩種:

* 一種是粘在一起的包都是完整的數據包

* 另一種情況是粘在一起的包有不完整的包。

與粘包對應的還有一個概念:分包,他是指在出現粘包的時候我們的接收方要進行分包處理。(在長連接中都會出現) 數據包的邊界發生錯位,導緻讀出錯誤的數據分包,進而曲解原始數據含義。

tcp分片傳輸(TCP粘包與Nagle算法)3

原因:

發送方原因

TCP默認使用上面提到的Nagle協議,即會将小數據包合成大數據包一起發送出去。

接收方原因

接收方引起的粘包是由于接收方用戶進程不及時接收數據,從而導緻粘包現象。這是因為接收方先把收到的數據放在系統接收緩沖區,用戶進程從該緩沖區取數據,若下一包數據到達時前一包數據尚未被用戶進程取走,則下一包數據放到系統接收緩沖區時就接到前一包數據之後,而用戶進程根據預先設定的緩沖區大小從系統接收緩沖區取數據,這樣就一次取到了多包數據

tcp分片傳輸(TCP粘包與Nagle算法)4

從上面的可以看出,其實還是取決于因為接收方處理數據的速度太慢,發送方的數據發送的太快,導緻緩沖區存在多個數據包,當你進行正常讀取的時候,就會一次性取到幾個包粘在一起

解決辦法:

* 發送端給每個數據包添加包首部,首部中應該至少包含數據包的長度,這樣接收端在接收到數據後,通過讀取包首部的長度字段,便知道每一個數據包的實際長度了。 分包解決策略 - socket接收指定長度的buf

* 發送端将每個數據包封裝為固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩沖區中讀取固定長度的數據就自然而然的把每個數據包拆分開來。

* 可以在數據包之間設置邊界,如添加特殊符号,這樣,接收端通過這個邊界就可以将不同的數據包拆分開。

* 通過設置TCP_NODELAY來關閉Nagle算法

* 通過設置PUSH标志到TCP的報頭,發送方在發送數據的時候可以設置這個flag,這個标志會通知接收方将接收到的數據全部提交給接收進程,這裡所說的數據包括與PUSH包一起傳輸的數據以及之前就為該進程傳輸過來的數據。Server收到之後就會立刻把這些數據提交給應用層進程,而不再等待額外是否有數據到達。設置PUSH标志也不能完全解決TCP粘包,隻是降低了接收方粘包的可能性。實際上現在的TCP協議棧基本上都可以自行處理這個問題,而不是交給應用層處理,所以設置這個PUSH也不是一個理想方法

PS:

UDP因為不是面向“流”的,而且UDP是具有消息邊界的,也就是說UDP的發送的每一個數據包都是獨立的,因此UDP并不存在粘包的問題。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
長安三怪探是誰殺常山兄弟(用手戟的黑衣殺手到底是誰)
長安三怪探是誰殺常山兄弟(用手戟的黑衣殺手到底是誰)
  電視劇《風起洛陽》正在熱播,劇中黃軒飾演的男主“高秉燭”本是守護神都城下不良井的不良使,雖為賤籍身份低微,卻也是有志青年一 枚,大小也算個官差,然而天有不測風雲,第一次帶着七個小夥伴上井玩就遇到了回京途中遇襲的太子一家子!一身正義的高秉燭自然不會 坐視不管,加入了拼殺陣營,結果太子卻在趕來的援軍保護下撤了,把高秉燭一行人留在了那裡,最後結果就是七個小夥伴...
2025-12-15
李好老婆豪華餐廳(主持人李好豪宅)
李好老婆豪華餐廳(主持人李好豪宅)
  主持人利好豪宅:客廳裝了KTV樓梯很寬敞,廚房玻璃罩多此一舉   說到主持人,大家能夠想到誰呢?   方瓊程程?何炅謝娜?汪涵?等等   不過今天要給大家說的這位主持人是李好      他和她的妻子都是主持人,兩人真的可謂是琴瑟和鳴   婚後的生活也是非常的幸福,入住的豪宅也是十分的奢華   讓我們一起來看看吧!      李好的妻子郭曉敏也是一位非常優...
2025-12-15
頂級食材的燕窩究竟從何而來(原料知識用以漱口)
頂級食材的燕窩究竟從何而來(原料知識用以漱口)
  本文系《粵廚寶典》叢書作者潘英俊先生原創作品,旨在飲食文化及烹饪技術研究   前言:   燕窩作為食材始自明末清初,就連明代藥學家李時珍在《本草綱目》都沒有介紹。   這種食材比較特殊,是唯一以動物窠巢入膳或者入藥的例子。   事實上,燕窩被開發出來最初是作藥用,坊間稱其對醫治肺痨有一定療效。在曹雪芹的《紅樓夢》裡可證實此點。   燕窩入膳是繼入藥之後的...
2025-12-15
胭脂魚生長速度(水生動物圖鑒胭脂魚)
胭脂魚生長速度(水生動物圖鑒胭脂魚)
  2021年2月5日,新版《國家重點保護野生動物名錄》正式公布施行,并在6月30日之前設置過渡期。為落實好《名錄》宣貫工作,北京市水生野生動植物救護中心策劃國家重點保護水生動物圖鑒系列,以期提高公衆對水生生物認知,推動水生野生動物保護工作邁上新台階。      ,
2025-12-15
誰願做個女漢子(漢子我敬你是個姑娘)
誰願做個女漢子(漢子我敬你是個姑娘)
  【FUN眼看世界】   今天上午小編挺捉雞的,剛上班就問了一圈同事,如何假裝昨晚看了一夜球?   還沒搞清楚昨晚的比賽到底是巴西赢了還是中國赢了,為什麼大家都說姚明踢了烏龍,姚明不是和孔令輝一樣都是跳水的嘛,還有為什麼不安排劉翔上場!娜姐也不在替補陣容!這種比賽,能赢嗎??#一個試圖裝成僞球迷的小編的心聲#   看,熱情的中國隊球迷!!   我就神馬都不...
2025-12-15
Copyright 2023-2025 - www.tftnews.com All Rights Reserved