一伴鳖、網(wǎng)絡(luò)報(bào)錯(cuò)背景
近期公司線上APP(iOS端)出現(xiàn)網(wǎng)絡(luò)連接中斷节值,用戶(hù)使用WiFi沒(méi)有問(wèn)題,使用4G偶爾會(huì)出現(xiàn)“網(wǎng)絡(luò)連接中斷榜聂「懔疲”提示語(yǔ),連機(jī)檢查须肆,發(fā)現(xiàn)使用AFNetworking報(bào)錯(cuò)code=-1005匿乃,網(wǎng)絡(luò)連接中斷。由于之前沒(méi)有出現(xiàn)過(guò)這種問(wèn)題豌汇,是在APP運(yùn)營(yíng)一段時(shí)間之后幢炸,出現(xiàn)的,所以排除了APP代碼問(wèn)題拒贱,但是我還是想看一下客戶(hù)端應(yīng)該如何解決這個(gè)問(wèn)題宛徊。
二、解決方案選擇
出現(xiàn)這種情況后逻澳,公司成立了應(yīng)急小組闸天,在網(wǎng)上找了好幾個(gè)帖子,進(jìn)行測(cè)試斜做。使用方案如下:
1.由于公司項(xiàng)目中使用的AFNetworking是2.x版本苞氮,然后進(jìn)行AFNetworking框架升級(jí),升級(jí)到3.2.1版本陨享,使用4G頻繁調(diào)用接口葱淳,還是會(huì)出現(xiàn)這種情況。此方案不能解決我們本次問(wèn)題抛姑。
2.在網(wǎng)上看了帖子赞厕,有的說(shuō)是模擬器會(huì)出現(xiàn)這種情況,重啟模擬器定硝,會(huì)解決皿桑。而我們是在真機(jī)上出現(xiàn)的問(wèn)題,就重啟手機(jī)。然后進(jìn)行測(cè)試诲侮,依然沒(méi)有解決這個(gè)問(wèn)題镀虐。此方案不能解決我們本次問(wèn)題。
3.有的帖子說(shuō)是需要修改請(qǐng)求的header沟绪,設(shè)置Keep-Alive刮便,于是進(jìn)行了如下的配置并測(cè)試:
a>.運(yùn)維同事在服務(wù)器設(shè)置:1.“Connection”:“Keep-Alive”,2.“Keep-Alive”:“timeout60000”绽慈;(參考文章)此配置的詳細(xì)說(shuō)明恨旱,大家可以自行查找,下面截圖是查看的帖子說(shuō)明坝疼,此方案不能解決我們本次問(wèn)題搜贤。
b>.關(guān)閉“Keep-Alive”,由客戶(hù)端設(shè)置header里面Connection: close钝凶。此方案不能解決我們本次問(wèn)題仪芒。
3.客戶(hù)端實(shí)現(xiàn),出現(xiàn)code=-1005的情況時(shí)耕陷,自動(dòng)重新發(fā)起請(qǐng)求一次掂名。此方案比較繁瑣,而且不能解決線上APP的問(wèn)題啃炸。
三铆隘、我們使用的解決方案
經(jīng)過(guò)了兩天的方案查找以及測(cè)試,并沒(méi)有找到合適的解決方案南用,于是進(jìn)行HTTP底層連接解讀膀钠,然后根據(jù)APP調(diào)用網(wǎng)絡(luò)請(qǐng)求出現(xiàn)丟包的問(wèn)題。發(fā)現(xiàn)可能和服務(wù)端時(shí)間戳認(rèn)證有一定的關(guān)系裹虫,于是我們對(duì)Nginx上面的tcp_timestamps=1進(jìn)行關(guān)閉肿嘲,設(shè)置成tcp_timestamps=0。然后進(jìn)行上線使用筑公,發(fā)現(xiàn)能解決本次問(wèn)題雳窟,但是服務(wù)器會(huì)出現(xiàn)time_wait激增的情況(在可接受范圍內(nèi))。但是線上APP的“網(wǎng)絡(luò)連接中斷匣屡》饩龋”不再出現(xiàn),為了優(yōu)化這個(gè)配置捣作,我們進(jìn)行設(shè)置tcp_tw_recycle = 0 ;發(fā)現(xiàn)無(wú)論tcp_tw_recycle和tcp_timestamps 任何一個(gè)只要設(shè)置為0誉结,都能解決我們的問(wèn)題,但是都會(huì)導(dǎo)致time_wait上漲券躁。目前我們正在進(jìn)行相關(guān)的優(yōu)化惩坑,有知道的同學(xué)可以私信我掉盅。謝謝