Nagle演算法
Nagle演算法是為了避免網路中存在太多的小包(協議頭比例非常大)造成擁塞,Nagle演算法就是為了盡可能發送大塊資料,避免網路中充斥著許多小資料塊,
演算法如下:若發送應用行程要發送的資料逐個位元組地送到TCP的發送快取,則發送方就把第一個資料位元組先發送出去,把后面到達的資料位元組都快取起來,當發送方接收對第一個資料字符的確認后,再把發送快取中的所有資料組裝成一個報文段再發送出去,同時繼續對隨后到達的資料進行快取,只有在收到對前一個報文段的確認后才繼續發送下一個報文段,當資料到達較快而網路速率較慢時,用這樣的方法可明顯地減少所用的網路帶寬,Nagle演算法還規定,當到達的資料已達到發送視窗大小的一半或已達到報文段的最大長度時,就立即發送一個報文段,
它的主要職責是資料的累積,實際上有三個門檻:
1)緩沖區中的位元組數達到了一定量(超過閾值MSS)
2)等待了一定的時間(一般的Nagle演算法都是等待200ms)
3)緊急資料發送,
TCP的黏包
TCP報文粘連就是,本來發送的是多個TCP報文,但是在接收端收到的確是一個報文,把多個報文合成了一報文,
TCP報文粘連的原因:“粘包”可發生在發送端,也可發生在接收端,在流傳輸中出現,UDP不會出現粘包,因為它有訊息邊界(兩端資料間是有界限的),
1、由Nagle演算法造成的發送端的粘包
Nagle演算法產生的背景是,為了解決發送多個非常小的資料包時(比如1位元組),由于包頭的存在而造成巨大的網路開銷,簡單地講,Nagle演算法就是當有資料發送時,先不立即發送,而是稍微等一小會,看看在這一小段時間內,還有沒有其他需要發送的訊息,當等過著一小會以后,再把要發送的資料一次性都發出去,這樣就可以有效地減少包頭的發送次數,
2、接收端接收不及時造成的接收端粘包
TCP會把接收到的資料存在自己的緩沖區種,然后通知應用層取資料,當應用層由于某些原因不能及時地把TCP的資料取出來,就會造成TCP緩沖區中存放了幾段資料,產生報文粘連的現象,
TCP報文粘連的解決方法
1、關閉Nagle演算法,在socket選項中,TCP_NODELAY表示是否使用Nagle演算法,
2、接收端盡可能快速的從緩沖區讀資料,
3、可以在發送的資料中,添加一個表示資料的開頭和結尾的字符,在收到訊息后,通過這些字符來處理報文粘連,
如何用UDP實作TCP(UDP的可靠性怎么提高)?
如果要通過UDP傳輸資料,但卻要保證可靠性的話,要通過第七層(應用層)來實作的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/27643.html
標籤:其他
