<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    TCP 粘包問題是如何形成的?


    發現錯別字 1年前 提問
    回答
    1
    瀏覽
    2390
    請勿發布不友善或者負能量的內容。與人為善,比聰明更重要!
    回答數量: 1
    CISP-PTE CISM-WSE

    TCP粘包問題的形成,可能是發送方的原因,也有可能是接受方的原因。

    • 發送方:由于TCP需要盡可能高效和可靠,所以TCP協議默認采用Nagle算法,以合并相連的小數據包,再一次性發送,以達到提升網絡傳輸效率的目的。這個合并過程就是在發送緩沖區中進行的,也就是說數據發送出來它已經是粘包的狀態了。但是接收方并不知道發送方合并數據包,而且數據包的合并在TCP協議中是沒有分界線的,所以這就會導致接收方不能還原其本來的數據包。

    • 接收方:TCP是基于“流”的。網絡傳輸數據的速度可能會快過接收方處理數據的速度,這時候就會導致,接收方在讀取緩沖區時,緩沖區存在多個數據包。在TCP協議中接收方是一次讀取緩沖區中的所有內容,所以不能反映原本的數據信息。(放數據的速度 > 應用層拿數據速度)

    解決TCP粘包問題的方式如下:

    • 禁用Nagle算法:因為TCP協議采用Nagle算法,導致粘包。所以可以禁用Nagle算法。這種方法雖然能一定程度上解決TCP粘包,但是并不能完全解決問題。因為接收方也是可能造成粘包的原因,這種方法只是發送方有效。而且禁用Nagle算法,一定程度上使TCP傳輸效率降低了。所以,這并不是一種理想的方法。

    • 設置PUSH標志:PUSH是TCP報頭中的一個標志位,發送方在發送數據的時候可以設置這個標志位。該標志通知接收方將接收到的數據全部提交給接收進程。這里所說的數據包括與此PUSH包一起傳輸的數據以及之前就為該進程傳輸過來的數據。當Server端收到這些數據后,它需要立刻將這些數據提交給應用層進程,而不再等待是否還有額外的數據到達。設置PUSH標志也不能完全解決TCP粘包,只是降低了接收方粘包的可能性。實際上現在的TCP協議棧基本上都可以自行處理這個問題,而不是交給應用層處理。所以設置PUSH標志,也不是一種理想的方法。

    • 自定協議:自定協議,將數據包分為了封包和解包兩個過程。在發送方發送數據時,對發送的數據進行封包操作。在接收方接收到數據時對接收的數據包需要進行解包操作。自定協議時,封包就是為發送的數據增加包頭,包頭包含數據的大小的信息,數據就跟隨在包頭之后。當然包頭也可以有其他的信息,比如一些做校驗的信息。這里主要討論TCP粘包的問題,所以不考慮其他的。

    回答所涉及的環境:聯想天逸510S、Windows 10。

    1年前 / 評論
    亚洲 欧美 自拍 唯美 另类