天天看點

TCP通信粘包問題分析和解決(全)(轉)

TCP通信粘包問題分析和解決(全)

在socket網絡程式中,TCP和UDP分别是面向連接配接和非面向連接配接的。是以TCP的socket程式設計,收發兩端(用戶端和伺服器端)都要有成對的socket,是以,發送端為了将多個發往接收端的包,更有效的發到對方,使用了優化方法(Nagle算法),将多次間隔較小、資料量小的資料,合并成一個大的資料塊,然後進行封包。這樣,接收端,就難于分辨出來了,必須提供科學的拆包機制。

對于UDP,不會使用塊的合并優化算法,這樣,實際上目前認為,是由于UDP支援的是一對多的模式,是以接收端的skbuff(套接字緩沖區)采用了鍊式結構來記錄每一個到達的UDP包,在每個UDP包中就有了消息頭(消息來源位址,端口等資訊),這樣,對于接收端來說,就容易進行區分處理了。是以UDP不會出現粘包問題。

在介紹TCP之前先普及下兩個相關的概念,長連接配接和短連接配接。

1.長連接配接

Client方與Server方先建立通訊連接配接,連接配接建立後 不斷開, 然後再進行封包發送和接收。

2.短連接配接

Client方與Server每進行一次封包收發交易時才進行通訊連接配接,交易完畢後立即斷開連接配接。此種方式常用于一點對多點通訊,比如多個Client連接配接一個Server.

作為一個面向連接配接的傳輸層協定,TCP的目标是為使用者提供可靠的端到端連接配接,保證資訊有序無誤的傳輸。它除了提供基本的資料傳輸功能外,還為保證可靠性采用了資料編号、校驗和計算、資料确認等一系列措施。它對傳送的每個資料位元組都進行編号,并請求接收方回傳确認資訊(ACK)。發送方如果在規定的時間内沒有收到資料确認,就重傳該資料。

(1)     資料編号使接收方能夠處理資料的失序和重複問題。

(2)     資料誤碼問題通過在每個傳輸的資料段中增加校驗和予以解決,接收方在接收到資料後檢查校驗和,若校驗和有誤,則丢棄該有誤碼的資料段,并要求發送方重傳。

(3)     流量控制也是保證可靠性的一個重要措施,若無流控,可能會因接收緩沖區溢出而丢失大量資料,導緻許多重傳,造成網絡擁塞惡性循環。

(4)     TCP采用可變視窗進行流量控制,由接收方控制發送方發送的資料量。

TCP為使用者提供了高可靠性的網絡傳輸服務,但可靠性保障措施也影響了傳輸效率。是以,在實際工程應用中,隻有關鍵資料的傳輸才采用TCP,而普通資料的傳輸一般采用高效率的UDP。

封包

封包就是給一段資料加上標頭,這樣一來資料包就分為標頭和包體兩部分内容了(以後講過濾非法包時封包會加入"包尾"内容)。標頭其實上是個大小固定的結構體,其中有個結構體成員變量表示包體的長度,這是個很重要的變量,其他的結構體成員可根據需要自己定義。根據標頭長度固定以及標頭中含有包體長度的變量就能正确的拆分出一個完整的資料包。

轉載于:https://www.cnblogs.com/panxuejun/p/8760925.html

繼續閱讀