tcp 重发 应用层重传
采用TCP時(shí),應(yīng)用層需要超時(shí)重傳嗎?
需要,原因如下:
1tcp的超時(shí)控制不是你能設(shè)置的,所有的tcp超時(shí)都是用系統(tǒng)的時(shí)間設(shè)定,而且這個(gè)時(shí)間很長(zhǎng),超時(shí)的結(jié)果就是斷開連接。和你應(yīng)用要達(dá)到的目的顯然差很遠(yuǎn)
2send的返回OK!=數(shù)據(jù)被對(duì)方成功收到,且,數(shù)據(jù)被對(duì)方成功受到!=數(shù)據(jù)被對(duì)方邏輯成功處理
舉個(gè)極端的例子:
對(duì)方收到包,但是還沒來的及處理,程序崩掉了,這個(gè)時(shí)候你的網(wǎng)絡(luò)層顯示的顯然是對(duì)方收到了(確實(shí)也是對(duì)方收到了),但是對(duì)方并沒有正確處理這個(gè)包,這個(gè)時(shí)候從邏輯上講,你應(yīng)該需要重發(fā)的,保證對(duì)方正確處理完畢。
3如果底層通信質(zhì)量不好,TCP可能會(huì)斷鏈重連,或者序號(hào)檢測(cè)發(fā)現(xiàn)異常重置序號(hào)。這些情況下TCP層都會(huì)丟幀,應(yīng)用層如果有重要的消息還是要自己做重傳。
TCP協(xié)議本身是可靠的,它的重傳機(jī)制保證了消息的可送達(dá)性(如果沒有收到對(duì)端的ACK確認(rèn),它會(huì)在等待一定時(shí)間后,嘗試再次發(fā)送,且這是一個(gè)循環(huán)過程,上限是9分鐘。超過9分鐘,則認(rèn)為連接已經(jīng)斷開,關(guān)閉socket)。
雖然有了TCP的可靠性保證,但是很多基于TCP的應(yīng)用間通信依然會(huì)采用RETRY機(jī)制:發(fā)送消息后,如果在一定時(shí)間內(nèi)沒有收到對(duì)端的確認(rèn)消息,則重發(fā)消息。明明TCP已經(jīng)可以保證消息的可送達(dá),為什么還要在應(yīng)用層加這么一層實(shí)現(xiàn)呢?
1. 有些服務(wù)進(jìn)程,基于性能或是內(nèi)存容量方面的考慮,使用了限長(zhǎng)的消息隊(duì)列:如果收到的瞬時(shí)消息過多,超過了消息隊(duì)列的可處理個(gè)數(shù),所有超出的消息會(huì)被它丟棄。注意,在這種情況下,TCP確實(shí)是將消息成功送達(dá)了,只是應(yīng)用層不接受而已。客戶進(jìn)程等待一小段時(shí)間,嘗試再次發(fā)送,有可能此時(shí)服務(wù)端的處理壓力已經(jīng)降下來了,消息就能被處理了。
2. 進(jìn)入了弱網(wǎng)環(huán)境的移動(dòng)應(yīng)用,發(fā)送超時(shí)往往意味著已經(jīng)斷連。此時(shí)的RETRY,在底層意味著重新連接,然后再次發(fā)送消息。
其他:進(jìn)入了弱網(wǎng)環(huán)境的移動(dòng)應(yīng)用,可能會(huì)給用戶帶來不大順暢的使用體驗(yàn)。當(dāng)用戶發(fā)送了一條消息,與其讓用戶等待9分鐘才得知消息未能送達(dá),不如在應(yīng)用層設(shè)置超時(shí)重傳,一旦超過規(guī)定時(shí)間(比如20s),則直接告知用戶,當(dāng)前網(wǎng)絡(luò)狀況不佳,不妨晚些時(shí)候再嘗試發(fā)送。
總結(jié)
以上是生活随笔為你收集整理的tcp 重发 应用层重传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米盒子mdz06aa是几代能刷机吗
- 下一篇: 开塞露的用法(如何正确使用开塞露?)