亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

WebSocket詳解:從握手原理到生產(chǎn)環(huán)境的心跳重連實(shí)戰(zhàn)

WebSocket詳解:從握手原理到生產(chǎn)環(huán)境的心跳重連實(shí)戰(zhàn) 網(wǎng)上搜“websorket詳解”大概率是手滑把WebSocket打錯(cuò)了但點(diǎn)進(jìn)來(lái)的朋友應(yīng)該都是想搞懂這個(gè)協(xié)議到底是怎么回事。我先說(shuō)結(jié)論WebSocket就是跑在TCP之上的一條全雙工通道客戶端和服務(wù)端完成一次握手之后兩邊隨時(shí)都可以往對(duì)面懟數(shù)據(jù)不用像HTTP那樣每次請(qǐng)求都重新建立連接。它解決的核心痛點(diǎn)就是——HTTP的“請(qǐng)求-響應(yīng)”模型沒法讓服務(wù)器主動(dòng)找客戶端說(shuō)話而現(xiàn)實(shí)里聊天、推送、協(xié)同編輯、實(shí)時(shí)行情這類場(chǎng)景恰恰最需要的就是“服務(wù)器主動(dòng)開口”。這篇東西我會(huì)從協(xié)議原理講到代碼實(shí)現(xiàn)再到生產(chǎn)環(huán)境的坑適合兩種人看一是剛準(zhǔn)備做實(shí)時(shí)功能、想知道WebSocket和輪詢?cè)趺催x的小白二是用了很久但老在斷線重連、心跳?;钌显愿^的實(shí)戰(zhàn)派。1. WebSocket到底解決了什么問題1.1 從輪詢地獄到長(zhǎng)連接在WebSocket出現(xiàn)之前想做實(shí)時(shí)功能基本就三條路短輪詢前端每隔幾秒發(fā)一次HTTP請(qǐng)求問“有消息沒”。實(shí)現(xiàn)最簡(jiǎn)單但消息延遲取決于輪詢間隔間隔調(diào)短了服務(wù)端壓力成倍翻。我見過一個(gè)項(xiàng)目把輪詢間隔從5秒改到1秒數(shù)據(jù)庫(kù)連接池直接被打滿最后只能加機(jī)器。長(zhǎng)輪詢請(qǐng)求發(fā)過去之后服務(wù)端先hold住有數(shù)據(jù)再返回。比短輪詢省請(qǐng)求但每個(gè)未完成的請(qǐng)求都會(huì)占用一個(gè)連接連接數(shù)上去之后網(wǎng)關(guān)和服務(wù)器都得跟著調(diào)參數(shù)而且請(qǐng)求超時(shí)、中間鏈路斷掉的問題排查起來(lái)特別累。SSEServer-Sent Events服務(wù)端單向推送瀏覽器端用EventSource就能接比WebSocket簡(jiǎn)單但只能服務(wù)端往客戶端推客戶端想給服務(wù)端傳數(shù)據(jù)還得另開一條HTTP通道。這三條路各有各的憋屈。短輪詢的延遲和服務(wù)器負(fù)載互相矛盾長(zhǎng)輪詢?cè)陂L(zhǎng)連接數(shù)量大的時(shí)候?qū)Υ韺雍瓦B接池極不友好SSE又天生是半雙工。WebSocket的思路完全不一樣——它把“建立連接”和“傳輸數(shù)據(jù)”拆開先用HTTP協(xié)議完成一次升級(jí)握手然后保持這條TCP連接不關(guān)閉后續(xù)所有數(shù)據(jù)都在這條連接上雙向流動(dòng)。下面這張對(duì)比表可以直觀看到差別方案實(shí)時(shí)性服務(wù)端壓力雙向通信短輪詢?nèi)Q于間隔秒級(jí)起步高支持長(zhǎng)輪詢有改善但仍受超時(shí)影響中高支持SSE高低不支持WebSocket毫秒級(jí)推送低支持這個(gè)設(shè)計(jì)的直接收益是通信雙方不需要再花時(shí)間在連接建立、請(qǐng)求頭解析這些重復(fù)勞動(dòng)上實(shí)時(shí)性從“秒級(jí)輪詢”直接拉到了“毫秒級(jí)推送”。同一臺(tái)服務(wù)器同樣的配置用WebSocket支撐的連接數(shù)往往是輪詢方案的數(shù)倍因?yàn)槭〉袅撕A恐貜?fù)的HTTP握手開銷。1.2 協(xié)議設(shè)計(jì)的核心思路一次握手雙向通信很多人誤以為WebSocket是HTTP的升級(jí)版其實(shí)它跟HTTP是平級(jí)的關(guān)系。WebSocket握手走的是HTTP的Upgrade機(jī)制但握手完成之后協(xié)議就切換成了RFC 6455定義的獨(dú)立協(xié)議后續(xù)的幀格式、掩碼規(guī)則、控制幀這些跟HTTP沒有任何關(guān)系。那為什么非要借HTTP來(lái)握手因?yàn)閷?shí)際工程里客戶端到服務(wù)端之間往往隔著一堆基礎(chǔ)設(shè)施——負(fù)載均衡、反向代理、防火墻、網(wǎng)關(guān)。這些設(shè)施大部分只認(rèn)HTTP如果WebSocket上來(lái)就自己搞一套握手協(xié)議所有中間層都得跟著改。借道HTTP升級(jí)意味著現(xiàn)有的80/443端口、SSL證書、域名配置還有那些按HTTP路由分發(fā)請(qǐng)求的代理全部可以復(fù)用落地成本低得多。所以協(xié)議設(shè)計(jì)的核心思路就一句話用HTTP的殼完成升級(jí)用獨(dú)立協(xié)議做傳輸。這個(gè)妥協(xié)換來(lái)了巨大的工程收益也讓W(xué)ebSocket在瀏覽器、App、服務(wù)端之間幾乎成了實(shí)時(shí)通信的默認(rèn)選項(xiàng)。后面不管你用哪種語(yǔ)言的庫(kù)底層走的都是這套流程理解了這個(gè)思路看任何WebSocket框架的文檔都會(huì)快很多。2. 協(xié)議層的關(guān)鍵機(jī)制弄清楚這些才算真正入門2.1 握手階段到底發(fā)生了什么握手過程其實(shí)就是兩條HTTP報(bào)文但有幾個(gè)細(xì)節(jié)值得單獨(dú)摳一摳??蛻舳税l(fā)起請(qǐng)求大致長(zhǎng)這樣GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13注意兩個(gè)頭缺一不可Upgrade: websocket表示要升級(jí)協(xié)議Connection: Upgrade則告訴中間設(shè)備別把連接關(guān)掉。Sec-WebSocket-Key是一個(gè)隨機(jī)的Base64編碼字符串原始數(shù)據(jù)長(zhǎng)度16字節(jié)它的作用是觸發(fā)服務(wù)端校驗(yàn)防止老式緩存代理把后續(xù)WebSocket數(shù)據(jù)錯(cuò)誤地當(dāng)HTTP響應(yīng)緩存或轉(zhuǎn)發(fā)。服務(wù)端收到之后會(huì)把這個(gè)Key拼上一個(gè)固定的魔數(shù)GUID這個(gè)字符串在RFC 6455里寫死了258EAFA5-E914-47DA-95CA-C5AB0DC85B11然后做一次SHA-1哈希再Base64編碼作為Sec-WebSocket-Accept返回HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbKxOo這個(gè)Accept值是可以自己驗(yàn)證的別把它當(dāng)黑盒。我調(diào)試自研服務(wù)端時(shí)就經(jīng)常用Node.js的crypto先算一遍確認(rèn)自己實(shí)現(xiàn)的握手邏輯和庫(kù)的行為一致const crypto require(crypto); function computeAccept(key) { const GUID 258EAFA5-E914-47DA-95CA-C5AB0DC85B11; const hash crypto.createHash(sha1); hash.update(key GUID); return hash.digest(base64); }如果你在做跨語(yǔ)言對(duì)接拿著客戶端發(fā)來(lái)的Sec-WebSocket-Key用這段邏輯算一遍跟服務(wù)端返回的Accept比對(duì)就知道握手到底有沒有走對(duì)。這里有一個(gè)容易忽略的工程細(xì)節(jié)握手之后原始HTTP連接就被“奪走”了不能再往這條連接上發(fā)任何HTTP響應(yīng)。有些新人在握手完成后試圖通過同一個(gè)socket返回一段JSON數(shù)據(jù)結(jié)果客戶端直接報(bào)協(xié)議錯(cuò)誤原因就是沒理解“協(xié)議切換”這件事。另外如果客戶端需要攜帶子協(xié)議標(biāo)識(shí)比如聊天走JSON、文件走二進(jìn)制可以加Sec-WebSocket-Protocol頭服務(wù)端在響應(yīng)里選一個(gè)返回這是業(yè)務(wù)層的協(xié)議協(xié)商跟前文的協(xié)議升級(jí)是兩碼事別搞混。2.2 數(shù)據(jù)幀格式一個(gè)字節(jié)一個(gè)字節(jié)拆給你看WebSocket傳輸數(shù)據(jù)的基本單位是“幀”frame。一個(gè)幀從前往后依次是FIN1 bit標(biāo)志這一幀是不是消息的最后一幀。大消息可以拆成多幀發(fā)送最后一幀的FIN置1。RSV1-3各1 bit一般不用只有協(xié)商了擴(kuò)展比如壓縮才會(huì)用到收到非0值且沒協(xié)商對(duì)應(yīng)擴(kuò)展時(shí)必須斷開連接。opcode4 bits幀類型。0x1是文本幀0x2是二進(jìn)制幀0x8是關(guān)閉幀0x9是Ping0xA是Pong。MASK1 bit客戶端發(fā)往服務(wù)端的幀這一位必須為1服務(wù)端發(fā)往客戶端的幀這一位必須為0。就這么一個(gè)不對(duì)稱規(guī)則坑了無(wú)數(shù)人。Payload length7 bits/16 bits/64 bits載荷長(zhǎng)度。前7位小于126時(shí)就是實(shí)際長(zhǎng)度等于126則后面2字節(jié)才是長(zhǎng)度等于127則后面8字節(jié)才是長(zhǎng)度。Masking key4字節(jié)MASK為1時(shí)這里帶上隨機(jī)掩碼密鑰。Payload data實(shí)際數(shù)據(jù)。其中opcode的取值是排查問題時(shí)的關(guān)鍵信息整理成表格方便對(duì)照opcode含義說(shuō)明0x1文本幀載荷按UTF-8編碼0x2二進(jìn)制幀載荷原樣傳輸0x8關(guān)閉幀帶關(guān)閉碼和原因文本0x9Ping心跳探測(cè)0xAPong收到Ping后必須回復(fù)載荷原樣復(fù)制理解了幀格式最大的收獲是能看懂“為什么短字符串抓包出來(lái)幀頭挺長(zhǎng)”——因?yàn)橐獛?字節(jié)掩碼和幀頭本身的開銷。消息越短這個(gè)固定開銷占比越明顯。實(shí)測(cè)一條5字節(jié)的消息實(shí)際線上傳輸大約是10到14字節(jié)批量發(fā)送大量短消息時(shí)這個(gè)開銷積少成多會(huì)直接影響吞吐量。2.3 掩碼規(guī)則為什么客戶端必須加掩碼而服務(wù)端不用這是很多教程一筆帶過但面試和實(shí)戰(zhàn)都愛考的點(diǎn)。RFC規(guī)定客戶端發(fā)送的幀必須設(shè)置MASK位并用隨機(jī)Masking key對(duì)載荷做掩碼服務(wù)端發(fā)送的幀則不允許設(shè)置MASK位。掩碼不是加密算法非常簡(jiǎn)單——把載荷的每個(gè)字節(jié)與Masking key循環(huán)異或masked[i] payload[i] ^ maskingKey[i % 4]那為什么非要這樣設(shè)計(jì)核心原因是防御一種叫做“緩存投毒”cache poisoning的攻擊場(chǎng)景。早期WebSocket在公網(wǎng)環(huán)境可能經(jīng)過某些中間代理代理會(huì)基于HTTP語(yǔ)義去解析流量。如果沒有掩碼攻擊者可以通過偽造報(bào)文讓代理把一段精心構(gòu)造的HTTP響應(yīng)“緩存”下來(lái)進(jìn)而污染其他用戶拿到的內(nèi)容。加一層隨機(jī)掩碼之后代理無(wú)法可靠解析和預(yù)測(cè)數(shù)據(jù)內(nèi)容這種攻擊基本就失效了。明白這層邏輯你就知道為什么自己寫服務(wù)端時(shí)解析客戶端幀必須做“取消掩碼”而往客戶端回消息時(shí)直接明文發(fā)送即可。很多人第一次抓包發(fā)現(xiàn)客戶端發(fā)過來(lái)的數(shù)據(jù)跟實(shí)際文本對(duì)不上十有八九就是忘了處理掩碼。2.4 心跳與?;頟ing/Pong的正確姿勢(shì)TCP長(zhǎng)連接本身不會(huì)自動(dòng)保持活躍。如果一段時(shí)間沒有數(shù)據(jù)傳輸中間的路由器、NAT網(wǎng)關(guān)、負(fù)載均衡都可能因?yàn)榭臻e超時(shí)把連接靜默回收。連接“假死”之后兩端在真正發(fā)數(shù)據(jù)之前是感知不到的于是就會(huì)出現(xiàn)“看起來(lái)連著一發(fā)消息就失敗”的詭異現(xiàn)象。WebSocket協(xié)議內(nèi)置了Ping/Pong控制幀一端發(fā)Ping另一端收到后必須回一個(gè)Pong載荷數(shù)據(jù)原樣復(fù)制。這套機(jī)制在協(xié)議層面提供了合規(guī)的探活方式應(yīng)用層只需要在合理的時(shí)間間隔內(nèi)發(fā)Ping并記錄上一次Pong回來(lái)的時(shí)間就能判斷連接是否真的活著。實(shí)際落地時(shí)心跳不是“發(fā)個(gè)Ping”這么簡(jiǎn)單。間隔太短高頻Ping幀本身就成了不小負(fù)擔(dān)間隔太長(zhǎng)又起不到及時(shí)發(fā)現(xiàn)問題的作用。我一般以60秒為基準(zhǔn)30秒發(fā)一個(gè)Ping連續(xù)兩次未收到Pong就主動(dòng)斷開重連。但這不是固定值需要根據(jù)你所在網(wǎng)絡(luò)環(huán)境、代理超時(shí)時(shí)間、服務(wù)端負(fù)載綜合調(diào)整具體怎么校準(zhǔn)我在第四節(jié)細(xì)講。3. 手把手搭一個(gè)完整的WebSocket服務(wù)3.1 技術(shù)選型不同語(yǔ)言和庫(kù)怎么選WebSocket在服務(wù)端幾乎是標(biāo)配能力各語(yǔ)言都有成熟庫(kù)。Node.js生態(tài)里最常見的兩個(gè)ws輕量、性能好底層就是純WebSocket實(shí)現(xiàn)沒有多余的開銷我搭內(nèi)部服務(wù)時(shí)首選它。socket.io自帶斷線重連、事件廣播、rooms等功能適合快速開發(fā)但它不是純WebSocket協(xié)議握手和數(shù)據(jù)格式都有自己的封裝真要深入調(diào)協(xié)議時(shí)會(huì)多一層黑盒。Java那邊常用Netty生態(tài)成熟Go有g(shù)orilla/websocket寫起來(lái)很舒服Python的websockets庫(kù)也不錯(cuò)。選型建議很簡(jiǎn)單先看團(tuán)隊(duì)熟悉度再看你是想“開箱即用”還是“要掌控每一個(gè)字節(jié)”。前者選帶封裝、帶重連的庫(kù)后者選純協(xié)議實(shí)現(xiàn)。下面我用Node.js的ws庫(kù)走一遍完整流程。這套代碼我直接用在內(nèi)部消息推送服務(wù)上邏輯不復(fù)雜但很完整可以直接抄。提示如果你當(dāng)前用的框架本身帶了WebSocket支持可以先基于內(nèi)置能力跑通再考慮引入獨(dú)立庫(kù)。沒必要為了“用庫(kù)”而多加一層依賴。3.2 服務(wù)端實(shí)現(xiàn)核心步驟第一步初始化一個(gè)HttpServer掛到同一個(gè)端口上。WebSocket握手走的是HTTP Upgrade所以需要先有一個(gè)HTTP服務(wù)去接住握手請(qǐng)求再升級(jí)成WebSocket連接const http require(http); const WebSocket require(ws); const server http.createServer((req, res) { res.writeHead(200, { Content-Type: text/plain }); res.end(WebSocket server is running\n); }); const wss new WebSocket.Server({ server, path: /ws });注意path參數(shù)它規(guī)定只有訪問/ws的請(qǐng)求才會(huì)被升級(jí)其他路徑仍走普通HTTP邏輯。這個(gè)設(shè)計(jì)很方便做“HTTP WebSocket 共用一個(gè)端口”生產(chǎn)環(huán)境里一個(gè)8000端口既能提供REST接口又能提供實(shí)時(shí)通道省得再多開一個(gè)端口去應(yīng)付防火墻策略。第二步監(jiān)聽連接事件維護(hù)客戶端集合處理消息和關(guān)閉邏輯const clients new Map(); wss.on(connection, (socket, req) { const id ${Date.now()}-${Math.random().toString(16).slice(2, 8)}; clients.set(id, socket); socket.id id; socket.on(message, (data) { const text data.toString(); // 這里解析業(yè)務(wù)消息比如 { type: chat, payload: {...} } handleMessage(id, text); }); socket.on(close, () { clients.delete(id); console.log(client ${id} closed, current${clients.size}); }); socket.on(error, (err) { console.error(socket ${id} error:, err.message); }); });這里有兩個(gè)細(xì)節(jié)值得說(shuō)。一是用Map而不是數(shù)組管理客戶端連接頻繁上下線時(shí)Map的增刪都是O(1)而且每個(gè)連接有獨(dú)立ID做定向推送特別方便。二是error事件一定要監(jiān)聽。Node.js的EventEmitter如果沒監(jiān)聽error一旦socket異常直接會(huì)把整個(gè)進(jìn)程帶崩這是新手最常見的翻車點(diǎn)。第三步實(shí)現(xiàn)廣播和定向推送。WebSocket本身沒有“房間”概念所有業(yè)務(wù)上的分組、私聊、群聊都是應(yīng)用層用Map、Set這些數(shù)據(jù)結(jié)構(gòu)自己維護(hù)的function broadcast(json, exceptId null) { const text JSON.stringify(json); for (const [id, socket] of clients) { if (id ! exceptId socket.readyState WebSocket.OPEN) { socket.send(text); } } } function sendTo(id, json) { const socket clients.get(id); if (socket socket.readyState WebSocket.OPEN) { socket.send(JSON.stringify(json)); } }發(fā)送前檢查readyState OPEN是必須的。TCP斷開的通知往往有延遲Map里存的連接可能已經(jīng)死亡但還沒觸發(fā)close事件不加這個(gè)判斷就會(huì)往死連接上寫數(shù)據(jù)進(jìn)而觸發(fā)error嚴(yán)重時(shí)導(dǎo)致內(nèi)存堆積。服務(wù)端寫完還要處理優(yōu)雅退出進(jìn)程收到SIGTERM時(shí)先給所有客戶端發(fā)一個(gè)關(guān)閉幀opcode 0x8并帶上規(guī)范關(guān)閉碼再關(guān)閉服務(wù)。這個(gè)細(xì)節(jié)很多人不做但做了之后客戶端重連的日志會(huì)干凈很多排錯(cuò)也更省心。3.3 客戶端接入與消息協(xié)議設(shè)計(jì)瀏覽器端幾乎不用引任何庫(kù)直接用原生WebSocket對(duì)象const ws new WebSocket(ws://localhost:8000/ws); ws.onopen () { console.log(connected); ws.send(JSON.stringify({ type: join, room: general })); }; ws.onmessage (event) { const msg JSON.parse(event.data); // 按 type 分發(fā)處理 handleMsg(msg); }; ws.onclose () { console.log(disconnected, will retry in 3s...); setTimeout(connect, 3000); };這里我要單獨(dú)強(qiáng)調(diào)“消息協(xié)議設(shè)計(jì)”。很多人直接ws.send(hello)裸發(fā)字符串demo沒問題但業(yè)務(wù)一復(fù)雜無(wú)結(jié)構(gòu)的字符串會(huì)讓服務(wù)端解析邏輯變成一個(gè)巨大的if-else沼澤改一個(gè)字段要翻半天代碼。我的習(xí)慣是統(tǒng)一用JSON封裝消息至少包含兩個(gè)字段type表示消息類型payload表示具體數(shù)據(jù)。比如聊天消息是{ type: chat, payload: { from: u1, content: hi } }心跳是{ type: ping }服務(wù)端通知是{ type: notice, payload: {...} }。前端收到消息先看type再分發(fā)后端處理也只需要一個(gè)switch新增功能時(shí)改動(dòng)的局部性很好。如果涉及二進(jìn)制傳文件、傳圖片可以用type區(qū)分文本和二進(jìn)制通道或者約定二進(jìn)制幀的第一個(gè)字節(jié)表示類型。這種做法在工程里比“協(xié)議文檔寫一套、代碼實(shí)現(xiàn)套另一套”靠譜得多因?yàn)轭愋妥侄尉驮跀?shù)據(jù)里連文檔都不用翻。4. 生產(chǎn)環(huán)境實(shí)測(cè)那些不得不踩的坑4.1 斷線重連別用定時(shí)器硬懟WebSocket連接在弱網(wǎng)、移動(dòng)網(wǎng)絡(luò)切換、服務(wù)端重啟、代理超時(shí)這些場(chǎng)景下斷線幾乎是必然的。生產(chǎn)環(huán)境必須實(shí)現(xiàn)斷線重連但重連不是setInterval每3秒連一次那么粗暴。無(wú)腦定時(shí)重連有兩個(gè)問題一是服務(wù)端宕機(jī)期間客戶端同時(shí)高頻重連可以把服務(wù)端“重連風(fēng)暴”打到雪崩二是客戶端重試太頻繁在弱網(wǎng)下會(huì)消耗大量電量和流量后臺(tái)掛著幾十個(gè)連接無(wú)限重試用戶手機(jī)直接發(fā)燙。我的做法是指數(shù)退避加隨機(jī)抖動(dòng)function connect(attempt 1) { const ws new WebSocket(url); ws.onclose () { const delay Math.min(30000, 1000 * Math.pow(2, attempt - 1)); const jitter Math.floor(Math.random() * 1000); setTimeout(() connect(attempt 1), delay jitter); }; }從1秒起步每次翻倍上限30秒每次加一個(gè)隨機(jī)抖動(dòng)。抖動(dòng)的意義在于打散客戶端的重連時(shí)刻避免成百上千個(gè)客戶端同時(shí)發(fā)起連接請(qǐng)求。這個(gè)策略一般項(xiàng)目直接抄就行。另外給重連設(shè)一個(gè)“冷靜期”連續(xù)重連多次后停止自動(dòng)重連提示用戶手動(dòng)刷新或點(diǎn)按鈕避免客戶端在后臺(tái)無(wú)限重試、白白耗電。4.2 心跳超時(shí)參數(shù)怎么調(diào)前面說(shuō)過Ping/Pong的機(jī)制這里給一組我在實(shí)戰(zhàn)中校準(zhǔn)過的經(jīng)驗(yàn)值。服務(wù)端主動(dòng)Ping間隔建議設(shè)在30到60秒超時(shí)閾值設(shè)為間隔的2倍。比如60秒發(fā)一次Ping120秒沒收到Pong就斷開。如果服務(wù)部署在云廠商負(fù)載均衡后面一定要先查L(zhǎng)B的空閑超時(shí)時(shí)間這個(gè)值通常在60秒左右。心跳間隔必須比它短不然LB先把連接掐了你的心跳探活反而成了擺設(shè)。我遇到過線上WebSocket每過幾分鐘就批量斷開日志全是1006最后發(fā)現(xiàn)就是心跳間隔跟LB超時(shí)卡在同一臨界點(diǎn)兩邊在打架??蛻舳藗?cè)的心跳邏輯要更謹(jǐn)慎。移動(dòng)端App切后臺(tái)時(shí)系統(tǒng)隨時(shí)可能凍結(jié)網(wǎng)絡(luò)這時(shí)候發(fā)Ping也沒意義。有的客戶端干脆在切后臺(tái)時(shí)主動(dòng)斷開回到前臺(tái)再重連。這個(gè)策略聽起來(lái)粗暴但在移動(dòng)網(wǎng)絡(luò)下體驗(yàn)反而更好省掉了無(wú)數(shù)“假死連接”的維護(hù)成本。注意不要把Ping和業(yè)務(wù)消息混在一起。業(yè)務(wù)消息密集時(shí)確實(shí)能順帶?;畹珮I(yè)務(wù)一減少連接就裸奔了。心跳一定要用獨(dú)立的Ping/Pong幀來(lái)做。4.3 代理層、負(fù)載均衡和網(wǎng)關(guān)配置WebSocket長(zhǎng)連接最大的敵人就是中間層的空閑超時(shí)和并發(fā)限制。我踩過的一個(gè)典型坑是服務(wù)端部署在內(nèi)網(wǎng)前端通過反向代理訪問線上跑著跑著連接就斷客戶端日志全是1006。查了半天才定位到反代默認(rèn)的空閑超時(shí)是60秒心跳間隔剛好也壓著60秒結(jié)果兩邊在臨界點(diǎn)上打架。解決辦法是把反代的proxy_read_timeout調(diào)大到比如300秒同時(shí)把心跳間隔壓到30秒。這兩個(gè)參數(shù)配合好之后斷線問題立刻消失。如果你用的是云LB同理去控制臺(tái)把“空閑超時(shí)”調(diào)到合理值同時(shí)保證心跳周期小于該值留出余量。另外還要注意HTTP/2的問題。很多反代默認(rèn)開啟HTTP/2而HTTP/2和WebSocket的兼容性在早期并不好部分老版本反代甚至不支持在HTTP/2連接上做Upgrade。遇到“客戶端能連上但升級(jí)總是失敗”的情況優(yōu)先檢查反代是不是把HTTP/2的流量劫走了需要關(guān)閉HTTP/2或?qū)ebSocket路徑做特殊處理。這個(gè)坑排查起來(lái)相當(dāng)隱蔽因?yàn)轫?yè)面其他接口全是正常的只有實(shí)時(shí)通道不通。4.4 連接堆積與內(nèi)存泄漏排查WebSocket是長(zhǎng)連接意味著每個(gè)客戶端在服務(wù)端都占著一個(gè)socket對(duì)象和對(duì)應(yīng)的網(wǎng)絡(luò)緩沖。連接數(shù)上來(lái)之后內(nèi)存和句柄數(shù)的增長(zhǎng)是線性的管理不好很容易把服務(wù)器內(nèi)存吃爆。我排查內(nèi)存泄漏有一套固定動(dòng)作先用process.memoryUsage()或系統(tǒng)自帶的監(jiān)控工具觀察堆內(nèi)存曲線的斜率再看clients這個(gè)Map的size是不是在持續(xù)增長(zhǎng)如果是就檢查是否有連接沒有觸發(fā)close事件。常見原因是客戶端異常斷電TCP的FIN包沒發(fā)出來(lái)服務(wù)端感知不到連接死亡只能靠心跳超時(shí)兜底。所以生產(chǎn)環(huán)境里“服務(wù)端主動(dòng)心跳 超時(shí)斷開未響應(yīng)連接”不是可選項(xiàng)而是必須項(xiàng)。每次心跳都會(huì)過濾掉一批僵尸連接Map的size才會(huì)穩(wěn)定在一個(gè)正常水位。我算過一筆賬一個(gè)僵尸連接大約占幾十KB內(nèi)存一萬(wàn)條僵尸連接就能吃掉幾百M(fèi)B內(nèi)存在云服務(wù)器上這不是小數(shù)目。還有一個(gè)隱蔽問題消息發(fā)送太頻繁客戶端處理不過來(lái)網(wǎng)絡(luò)緩沖不斷堆積最后服務(wù)端發(fā)送延遲飆升。這時(shí)候需要做背壓處理——把發(fā)送操作放進(jìn)隊(duì)列當(dāng)隊(duì)列超過閾值時(shí)主動(dòng)斷開最慢的那個(gè)客戶端防止整個(gè)服務(wù)的發(fā)送延遲被拖垮。這個(gè)在消息量大的聊天室和行情推送場(chǎng)景里非常關(guān)鍵不做的話一個(gè)慢客戶端能把全房間的推送速度都帶下來(lái)。寫在最后WebSocket這個(gè)協(xié)議原理講起來(lái)就那些東西但真正把它用穩(wěn)靠的是工程里一個(gè)個(gè)細(xì)節(jié)。我自己的體會(huì)是先把握手和幀格式吃透遇到問題能自己抓包分析再把心跳和重連做成標(biāo)配別指望網(wǎng)絡(luò)永遠(yuǎn)可靠最后是消息協(xié)議一定要結(jié)構(gòu)化不然項(xiàng)目越改越亂。如果你正準(zhǔn)備在項(xiàng)目里上實(shí)時(shí)通信建議先別急著引入消息隊(duì)列那一套重裝備用WebSocket加一個(gè)簡(jiǎn)單的消息分發(fā)就能覆蓋絕大多數(shù)場(chǎng)景。等真到了需要跨服務(wù)推送、消息持久化、多端同步的時(shí)候再考慮在WebSocket之上加一層業(yè)務(wù)消息總線那時(shí)候你會(huì)感謝當(dāng)初把協(xié)議底層搞明白的自己。最后再分享一個(gè)小技巧調(diào)試WebSocket問題抓包工具比日志好用得多因?yàn)槟隳苤苯涌吹轿帐謭?bào)錯(cuò)、幀類型、掩碼位這些底層信息。客戶端日志只告訴你“斷了”抓包才能告訴你“為什么斷”。把這個(gè)習(xí)慣養(yǎng)成以后遇到再詭異的連接問題都不會(huì)慌。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色女综合| 日本黄色精品专区网站| 一区二区三区无卡视频在线观看| 九九热精品在线| 视频在线观看免费一区二区三区| 日本羞羞的视频在线播放| 人妻熟女一区二区| 青青草在线视频欧美| 女人被添高潮免费视频| 婷婷丁香九月| 偷拍精品一区二区三区| 日日操夜夜操天天操免费观看麻豆| 久草精品一区 | 久久人妻少妇| 91天天综合网,天天综合网| 午夜丁香婷婷| 伊人久久88国产女| 色小视频蜜乳| 久久精视频美日韩在线视频| 亚洲偷拍自拍在线视频| 亚洲免费成人在线高清无码视频 | 亚洲九九夜夜| www.婷婷| 五月激情影院| 婷婷导航| 日韩一区二区精品视频| 五月婷婷AV| 色色婷| 加勒比久久综合网高清| 国产精品永久免费10000| 蜜臀久久99精品久久久久久-DVD原版全| 久久久性少妇| 凹凸 69堂 在线播放| 操老熟女AV| 亚洲AV不卡在线观看尤物| 久久欧洲| 97在线无精品| 天天综合91入口| 亚洲精品乱码久久久久久蜜桃麻豆| 2017天天透天天通天天擦| 激情文学欧美| 伊人久久AV诱惑悠悠| 欧美精品一二三| 国产馆| 干超碰碰熟女| 亚洲导航深夜福利| 日本3级一区二区免费| 日韩成人精品视频自拍| 一区二区三区在线资源| 特级大荫道BBwBBwBBW| 老熟女91av| 怡红院成人av| 欧美情色亚洲| 久久精品午夜国产亚洲AV无码| A 天堂| 乱伦一区二区三区‘| 中日韩久久久| 天天摸天天舔天天操| 一区二区三区欧美激情| 国产美女mm131爽爽爽爽| 中文字幕亚洲热播人妻| 激情五月天综合网| 高跟伊人julia ann| 97爱b| 亚洲综合在线91| 人妻少妇久久中文字幕一区二区 麻豆 | 这里都是精品| 欧美αv.com| 国产精品一区二区黄片| 亚洲另类色图片| 色妇91| 草草草视频| 亚洲精品成人动漫在线| 久久久国产成人一区二区三区在线 | 欧美精品三区| 神马麻豆福利院| 亚洲国产成人精品久久久国产成人一区二区| 级做a爱无码性色永久免费| 狠狠色狠狠色狠狠五月| 欧州色图区| 中文熟女五十乱码在线| 精品国产三级av韩国在线| 免费强奸av| 国产精品 亚洲情色| 超碰这里只有精品| 强奸抽插av| 丁香婷婷大香蕉| 久久久久性熟视频| 91综合天天看| 五月天婷婷基地| 天天射夜夜| 偷拍盗拍亚洲色图图片| 日韩成人性爱电影在线播放| 美日韩一二三区| 精品传媒在线一区| 久久国产99精品72福利 | 中国少妇XXXX做受| 五月天加勒比啪| 亚洲图片欧美色图| 天操老女人| 伊人国产成人av网站| 99ri精品| 日韩97超碰| 色成人Www精品永久观看| 91粉芽高清在线一区二区| 欧美成人国产精品| 综合免费无码中文| 日韩三级av片| 日韩成人综合网| 色偷综合| 日本操大逼| a人欧美综合天堂麻豆| 精品国产AV一区天美传媒| 日本国产欧美高清在线| 亚欧洲一区二区视频| 福利社区午夜一区二区| 亚洲自拍欧美色综合| 熟女这里只有精品6| 天天操女人| 2017天天拍大香蕉| 亚洲日韩av一区二区三区百合| 蜜臀久久99精品久久久久久成人小说 | 免费精品国偷自产在线在线| 啊啊啊用力在线观看| 欧美日韩亚洲天堂| 婷婷四五区| 亚洲人天堂| 亚洲情色电影网| 手机看片91人妻| 青青欧美在线| 国产操伦| 夜夜嗨一区二区三区三州加勒比 | 日本2020一区二区| 后X久久| 一区二区精品日韩欧美在线观看 | 91精品久久久| 狠狠色五月亚洲91| 欧美色日本| av天堂天堂av日韩| 国产sv美女内射| 亚洲精品97在线| 国产乱伦亚洲色图高清无码| 欧美影音在线| 色九月婷婷| 久久啊啊啊| 四虎AV无码| xxx0国产在线播放| A级片日韩欧美国产欧美视频精选观看| 日韩99999色| 一区不卡在线观看av| 传媒免费一区二区三区| 91亚洲人电影| 免费精品人妻一区二区三| 91n免费处女| 日本天天操| 久久超碰国产一区二区三区| 蜜桃视频啊啊啊啊| 在线人妻熟女一区二区三区四区五区| 天天色,天天干,天天干| 天天做天天爱| 中文欧丝袜诱惑| 丝袜美腿诱惑亚洲欧美视频在线观看| 韩国成人精品久久久免费看| 老熟女91视频| 神马九九九| 91熟女熟妇视频网站| 牛牛操视频逼| 日日爱99| 久久久久99精品成人片蜜臀| 久久久久ab| baiduhicn.com。| 久久99精品九九久久久婷婷| 蜜区区视频79 | 女性喷水高潮在线观看| 91 国产丝袜在线播放-百度| 麻豆天美国美国产| 国产三级电影免费观看| 中文字幕在线观看永久| 亚洲在线| 人妻第一页| 91无码人妻| 青青草国产亚洲精品久久| 在免费jIzzjIzz在线视频| 欧美色图色综合| 日本免费二区三区| 亚洲天堂日本| 久久亚洲人妻| 日韩三级在线观看mp4| 亚洲综合成人网| 天天综合网日韩7799| 国产精品96久久久久久| 九九亚洲| 欧美性爱一区二区| 国产视频第二页| 欧美激情黑人| 91欧美情色| 久草成人影片| 超碰视97中文| 色悠久久久av| 骚货 中文字幕 av| 色偷综合| 综合大香蕉美。| 不卡一区视频| 女人的天堂大香蕉网| 亚洲 欧美 中文 日韩超碰| 99热超碰在线| 国产亚洲一黄| 色噜噜综合在线| 99亚洲天堂| 国产精品成人无码av| 国产精品久久久久中文字幕| 亚洲高清国产理伦片| 国产一区二区三区白丝| 最新日产中文在线麻豆| 午夜色婷婷| 激情综合五月丁香| 精品视频久久久久九九九九9999 | 天天射夜夜骑| 2018天天干在线视频| 操逼啊啊啊91| 色婷婷在线视频| 亚州精人品大香蕉| 久久综合女优| 后入福利| 天天综合-91入口| 欧美在线91| 超碰日韩人妻| 日韩黄色一区二区三区| 欧美.亚洲.另类.丝袜.制服.诱惑| 91碰碰碰| 日韩ab网| 亚洲第一页综合在线| 男人天堂新| av三级电影在线播放| 国产在线激情视频| 激情综合五月| 亚洲 欧美 小说| 久久少妇人妻| 91天天综合日韩欧美| 国产精品日韩在线一区| 精品久久久久,69国产成人精| 女同性恋一区二区三区精品视频| 欧美在线视频观看一二三四区高清 | 一级性爱视频免费观看| 人妻81p| 激情五月综合| 久久久久久久久久久久黄色 | 国产乱码久久久| 在线视频 亚洲精品| AV天堂国产| 婷婷五月天AV| 丰满精品人妻少妇久久字幕| 国产无码久久高清| 久久久夜夜嗨免费视频| 亚洲国内精品成人不卡| 又大又大又大又粗爽高潮观看 | 欧美日韩婷婷中文| 亚洲97在线观看| 日本视频一区二区三区| 夜草欧美| 日韩黄色片子| 爱爱动态试试看6 0秒| 男人的天堂三级| 国产女同视频在线播放| 日本有码影片下载| 无套后入双马尾| 欧美经典一区二区三区| 国产不卡精品91| 色欲久久99精品久久| 精品国产乱码| 九一综合精品视品av| 91综合天天看| 99热伊人| 啪啪啪男女亚洲中文字幕99| 亚洲国产成人高清在线| 久九9精品| 国产乱伦亚洲色图高清无码| 亚洲综合97中文网| 欧美BT 亚洲色图| 国产精品成人无码a v毛片| 好湿好紧好爽 视频| 久久久草草精品| 国产一区在线观看无码AV| 欧洲免费一区二| 久久二| 国产成人+综合亚洲+天堂| 97超碰免费生活| 91人妻最真实刺激绿帽| 10000部十八禁看电影| 亚州性色| 91蜜臀熟女| 久久老熟女| 自偷自拍的亚洲视频| 亚洲91综合| www黄片免费看com| 大香交| 新版天堂中文资源8在线| 龙兴卡官方查询| 欧美操逼熟女| 亚洲中文字幕av | 青青草国产亚洲精品久久 | 久久久久亚洲一区女同性恋中文字幕| 影音先锋乱伦资源| 日日噜噜夜夜久久亚洲一区二区| jk白丝没脱就开始啪啪| 日日骚精品视频| 91爆操视频| 青青久日| 人人操天天爽| 久久精品三级影视| 欧美精品97| 综合网,亚洲,欧美| 亚洲精品一区二区精品| 激情文学小说一区二区| 爽爽淫人网| 亚洲一区在线观看欧洲| 亚洲精品蜜桃久久久久久久| 中文自拍欧美影视| 99热| 大香蕉在线SuP| 日韩精品中文字幕二区| 校园春色亚洲| 国产精品白丝AV| 69人妻精品一区二区绯色| 国产品精品自在在线午夜免费 | 看大黄色大片原件| 一本色道久久综合狠狠操| 午夜人妻精品综合在线| 国产精品亚洲天堂网址| 天天综合站| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 久久风骚城市| 日本三级小说中文字幕| 性爱边摸边日免费AV| 青青草色AV| 亚洲成人一二三区| 国产免费久久久久| 欧美激情另类一区二区| 粉嫩AV一区二区夜夜| 亚洲 欧美 另类 日韩 人妻一区| www.激情| 免费看国产曰批40分钟怎么下载| 9久精品| 蜜桃精品一区二区三区久在线| 99激情| 日韩人成网站在线播放| 九九热AV| 蜜臀久久99精品久久久久久成人小说 | 成人a级高清视频在线观看| 国产后入式在线观看| 青青草伊人久久| 婷婷六月色| 久草国产在线视频| 97在线观看播放视频| 久久区| 亚洲情色 无码专区| 日日橹狠狠爱欧美超碰| 天天欧美色| 91一起操| 操逼日韩无码 | 999 久久久| 久久久久久久久久久人妻| 国产精品无码在线| 欧美一级久久久久久久大片动画| 黄片www视频免费| 99操逼| 91精品久久久久久久久久| 精品福利视频| 欧美中文字幕男人天堂久久精品| 久久婷婷亚洲| 亚洲免费人妻在| 精品午夜福利国产一区二区在线观看| 亚洲精品一二牛牛| 天天做天天爱夜夜爽毛片试看| 老熟女91视频| 校园春色亚洲| 日本爽爽爽爽爽爽免费视频| 日本熟妇浓毛hdsex| 亚洲色图A| 男人的天堂Va| 97国产超碰| 夜夜精品视频| 男人的天堂 在线一区| 日韩欧视频| 久久久亚洲熟妇资源| 91久热| 蜜臀一二三区| 亚洲情色 自拍| 色九九久九九| 91 丝袜在线播放| 国产精品人妻免费精品| 日韩强奸av| 一区二区精品日韩欧美在线观看| 国产亚洲日韩在线三区黑人| 青青草天天亲夜夜操网| 五月婷婷综合网| 夜夜爽爽爽| 精品久一区免费| 啊啊啊啊啊好大好舒服想要| 欧美在线视频播放| 丰满熟妇大乳做爰| 91精品91久久久久77777俄罗斯老妇姓x| 人妻天堂网| 97在线免费视频| 综合影院永久入口国产| 午夜男人av| 91日本在线观看| 久久黄黄| 国产第11页| 久久久涩| A级片日韩欧美国产欧美视频精选观看| 日韩精品资源专区二区| 国产精品视频白浆免费| 久久久久13| 91麻豆天美传媒HD| 91美女视频直播| 七月婷婷综合| 成人性爱高清视频免费看| 五月婷婷深深爱| 国产传媒日本欧美专区| 国产精品动态一区二区三区四四| 91欧美亚洲| 国产精品国产自产高清AV| 国产精品久久久久久久久AV大片| 中文字幕大片三级狠狠干| 四虎免费看黄| 久久二| 樱花蜜乳av| 亚洲色图91欧美日韩| 高跟伊人julia ann| 亚洲中文sv| 影音先锋视频在线| 亚洲天堂人妻一区二区| 加勒比性爱成人在线| 热99这里有精品综合久久 | 精品人妻一区二区视频| 人人色97| 91中文字幕在线观看| 欧美精品69性爱| 国产亚州日韩欧美看片| 亚洲诱惑| 性久久久| 久久久久久久久久久久久9999| 天堂涩涩| 成人小说视频在线精品欧美| www.97在线| 国产又粗又长又大的视频| AV一起草在线| 艾草av| 免费视频一二三区| 人人操AV| 九九热精品视频六| 日韩av乱伦| …中文字幕亚洲乱,97人妻无码费视…| CCYY草草影院地址入口| 国产天美欧美| 无码人妻精品酒店| 亚洲天堂东京热| 性欧美999| 日韩精品一区的| 国产精彩女在线观看视频| 秋霞一集毛片观看| 800zy一区二区| 久久精品一区二区| 殴美牲| 好爽视频在线观看视频| 骚逼高潮久久精品| 97色综合中文网| 中文字幕精品一区二区精品| 先锋女优在线观看视频| h在线看免费版在线看| 91情色在线| 综合久久婷婷| 国产精品电影大全| 九九九九九九成人| 免费公开人人操| 色香伊人| 日韩精品中文字幕二区| 手机在线大香蕉| 东京热亚洲一区二区| 亚洲资源一区| 国内精品不卡无毒99999| 久久精品国产亚洲5555| 91成人国产综合久久精品蜜月| 日韩字幕一区| 色网综合网| 国产精品久久久三级无码| 大逼色网站| 色妹子A V| 免费中文综合精品| 精品中文日韩字幕视频| 国产麻豆一级精品视频| 久久久久夜夜夜夜| 欧美国产一区二区三区麻豆传媒| 国产理论视频在线播放| 热热色中文无码| 蜜臀在线免费观看在线免费观看| 五月婷婷六月丁香网址| 天天综合网~91| 黄色乱论网站| 强奸乱伦日韩AV| 国产免费内射视频| 91总综合网| 爆操无码| 欧美日韩在线视频网站| 超碰到97情色| 亚洲成人一二三区| 久久久久九九九| 亚州综合在线| 中文字幕欧美日本乱码一线二线| 盗摄 精品 另类 一区| 大香蕉乱级| 欧美狠狠狠| 射欧美综合| 巨爆乳肉感一区二区三区竹菊影视 | 狠狠中文字幕| 久久男人的天堂| 香蕉免费一区二区三区不读 | 人妖欧美一区二区| 欧亚第一综合网| 欧美操人| 大香蕉免费乱伦视频| 蜜臀久久99精品久久久| 亚洲97网站| 美女91在线观看| 日本免费中文一区二区三区四区| 伊人五月天激情| 99久久国产精品免费高潮| 好爽要喷了| 你草精品在线视频| 久久超碰久| 静品嫩模一区二区| 男女激情黄色网址| 影视综合无码少妇| 天天夜躁日日躁狠狠2002| 欧美激情1区| 国产外初女出血视频| 麻豆人妻少妇在线免费观看| 国产精品一区人妻精品阁在线| 人妻人人做人人澡人人爽欧美一区| 秋霞午夜成人福利片片| 美女91AV| 大香蕉综合网| 不卡在线观看视频| 97碰久久| 日本久久超碰| 九久9精品| 国产精品夜夜夜| 中文在线视频| 午夜久久久| 日本精品九九九| 国产精品久久久久久久免牛肉蒲团 | 欧美色道啊| 日韩亚洲97| 欧洲自拍色图gif在线| 久偷拍| 久久综合女优| 狠综合网| 十八禁电影伊人网| 久久精品操| 久久香蕉国产线看观看亚洲女人 | 97超碰美国| 97资源超碰| 久久久噜噜噜久久久| 丰满人妻一区二区三区免费,| 久草五月| 天天综合日韩网| 天天干天天日天天射黄色| 精品福利视频| 99久热精品99re6热| 亚洲熟女乱综合一区二区三区| 神马久久久久久久久久久久| 熟妇高潮精品一区二区三区下载| 91色色综合| 久久久久九九九九九| 欧美高清91| 欧美97爱| av在线观看不卡网站| 中文字幕日韩人妻视频一区二区三区| 日本欧美亚洲高清在线看| 欧美性爱精品一区二区| 国产伦精品免编号公布| 国产人妻一区二区三区欧美毛片| 学生妹天天看| 亚州性色| 国产精品对白自产拍| 岛国片在线播放| 超碰在97| 日人妻视频91| 97超碰色屌| 欧美久久久| 国产精选视频| 国产精品露脸在线观看| 夜夜天天噜狠狠爱2021| 久久激情网| 亚洲欧美性生活| 久热99999| 九九九色| 亚洲各类熟们中文字幕| 人人妻人人操人人乐| 亚洲污污网站| 国产捆绑一区| 亚洲欧美日韩精品久久久一区二区| 五月天综合网| 热热热热日日漂亮永久永久国产日| 色哟哟av| 国产亚洲精品精AV.| 亚洲国产一区二区三区四区国产| 中文字幕加勒比海高清无码免费视频 | 曰韩av中文字幕专区| 不卡超碰护士AV在线免费播放| 色娱乐色呦呦夜夜夜夜av| 无码人妻一区二区三区四区老鸭窝| A一区片| 五月天丁香| 日本不卡一区二区三区| 成全动漫视频观看免费下载| 色色丁香| 国产欧美日产一区二区三区 - 国产欧美日| 蜜桃av色偷偷av老熟女| 日韩中文字幕在线视频观看| 亚洲男人的天堂AV| 91五十路| 婷婷综合久久| 亚洲极品| 中文字幕亚洲热播人妻| 美女淫穴| 午夜精品久久一区二区| 99色综合| 欧美综合1性辶| 日本国产欧美高清在线| 欧美78| 人人干黄色| 国产四虎在线| 精品无码久久久久久久久果冻糖心| 亚洲 欧美 手机在线观看| 欧美久久婷婷| 操逼逼一区视频| 亚洲综合有玛| 天天干天天舔| 成人精品视频一区二区| 一级毛片电影免费看| 免费看毛片操穴| 友优传媒精品在线一区二区| 婷婷丁香久久| 国产成人五月天丁香花| 久久婷综合| 98超碰欧美| 91一区二区| 久久久久夜夜夜夜| 欧美大香蕉在线观看| 亚洲色欧美| 欧美成人亚洲精品| 久久久99免费| 久啪| 日本肏逼视频在线观看| 人妻人久久精品中文字幕| 日日碰狠狠添天天爽超| 国产97av| 91蜜臀熟女| 天堂69亚洲精品中文字| 亚洲精品国产精品乱码不卡| 免费观看国产小粉嫩喷水精品午| 欧美天堂超碰97| 国模无码一区二区三区在线| 噜噜噜噜天天狠狠| 夜夜中出国产| 成 人 A V免费视频在线观看| 丝袜喷水在线| 色官网色综合| 亚洲欧美综合网| 日夜啪电影| 91东京热男人的天堂| 亚洲精品 欧美精品| 日本网色| 91福利网在线观看| 久久久久久久六六 | 999久久芭蕾| 欧美色棕合| 国产一区二区三区视频在线看| 北野未奈加勒比av| 夜夜肏2021| 浓厚中出中文字幕在线| 欧洲性人爱视频| 成人五月香网在线| 人妻丰满熟妇一区二区三| 九99久久| 99爱久久视频频| 日本一区二区三区四区免费观看| 三四中文字幕| 日欧毛片久久| 人人摸人人干| 日韩性爱1级片视频| 国产美女高潮视频| 人妻酒店出差被中出免费在线播放| 欧美亚洲中文字幕| 久久av无码| 91蜜桃传媒精品久久久一区二区| 美日韩一卡二卡三卡免费人妻精品| 性色av蜜臀av色欲aV| 欧美色院| 老鸭窝成人| 亚洲第一色页夜| 天天干天天干天天干| 国产高清精品一区二区三区毛片| 91中出视频| 欧美色综合图片| 亚洲精品97在线| 午夜免费福利视频一区| av绯色| 国产精品美女久久久久久网站| 亚洲91射| 九九九九欧美| 玖玖综合色| 蜜桃色色网站视频三区| 免费在线观看AV无码网站| 中文字幕一区二区三区四区在线视频| 精品视频久久| 亚洲狠狠入| 九九免费影片| 精品一二三区女同 | 国内精品久久人妻性色av| 97天堂| 精品国产乱码久久久| 色网1| 欧亚成人在线视频| 色爱欲亚洲| http://qxhbdz.com| 色五月网址| 去干网最新版| 欧美很很操视频| 人人操人人大香蕉| 国产色呦呦| 国产精品探花在线| 中文字幕交换人妻| 日韩Va亚洲va欧美Ⅴa久久| 成人无码电影在线观看网| 亚洲伊人久久综合97| 中文字幕国产在线天堂| 91美女在线观看| 啊啊啊啊啊啊啊啊在线观看| 色97干| 国产精品福利视频| 亚洲97| 国产狂喷潮在线精品| 欧美精品精品一区二区| 精品三级在线专区| 国产精品久久久久久久久久梁医生| 亚洲 欧美 精品专区 极品| 亚洲无992tv| 91免费看一区二区三区 | 三级片大波波| 亚州色图狠狠干| laoshunv91| 97免费视频在线观看视频| 久久精品99久久久久久| 精品9999| 男人天堂新在线| 九九九精品| av在线播放国产一区| 无码 黑人一区二区三区| 日韩免费在线视频观看| 2018天天干在线视频| 国产69精品久久久久99尤物| 女人高潮大叫一级毛片| 综合久久99| 一道本东京热加勒比一区二区三区| 大香蕉欧美伊| 性感美女啊啊啊在线| 美女t无毒不卡不卡| 五十路熟女人妻一区二区在线观看| 探花视频免费观看国产专区| 夜夜操青青草| 亚洲人妻AV| 亚洲91网。| AV色五月| 青春草莓视频在线观看网址| 久久riav中文精品| 欧美很很操视频| sss视频华人在线| 久久视频,这里只有精品 | 懂色中文一区二区三区| 日本肏逼视频在线观看| 久久免费老司机精品| 无码人妻精品一区二区三区九九| 欧洲色综合| 中日韩一区二区三区欧美| 欧美日本一区二区a人| 夜色五月天| 十八禁一区二区无码观看| 97伊人网| 蜜乳AV一区二区三区四| 中日无幕一二三四区| 九九九九九九免费视频| 1769一区| 天天做天天爱天天爽| 97在线青| 欧美色www亚洲国产阿娇要播| 国产成人bd在线观看| 91视频观看网站| 婷婷久久久精品| 人人操肉肉| 内射日韩大臀美女| 999久久久久久久久| 亚洲图片色图欧美另类| 殴美牲| 丝袜美腿91| 免费一级特黄特色大片在线观看看| 伊人成人中文字幕久久网| 四虎在线免费视频| se吧提供91精品国产91久久久久久| www.超碰在线| 欧美第二页午夜| 日本韩国国产精品一区| 中文字幕 人妻不满 在线视频| 色五月激情AV在线| 第四色奇米影视777| 久久久久13| 久久精品区| 久久欧美性爱视频| 超碰伊人在线| 91c色| 1区2区3区中文字幕日韩| 操国产高清| 极品五月天噜噜| 大奶的诱惑| 看日韩美女二区三区免费操逼视频| www.成人无码| 日韩一级片在线看| 尤物视频偷拍免费| 日本视频在线观看污污污| 欧洲小说色图视频另类| 国产操逼视频在线观看| 99精品网站| 欧洲综合无码| 性性久久| 中日韩久久久| 伊人四虎综合| 成人午夜无码视频| aV中文麻| 国产刺激视频| 国产60页| 91成人在线| 人人摸.人人色| 中文字幕超碰CAO| 韩国一级AAA| 超碰到97情色| 久热伊人| 超碰97亚洲| 亚洲欧美九九九| 中文字幕乱码人妻二区三区| 中 文字幕一区二区三四 五 区日 日 骚| 亚洲日韩在线a不卡99精品| 人妻美腿丝袜制服诱惑综合天堂-| 18禁在线视频| 色香伊人| 婷婷伊人綜合中文字幕小说| 好涩综合| 黄色小说亚洲| 干干干天天| 亚洲性综合11| 91久久久久久久久久久| 久久欲| 99热国产精品| 国产欧美伊人| 久久久精品中文字幕爱豆| 亚洲性少妇| 操一区| 福利视频香蕉免费一区二区在线| www.AV有限公司一区| 亚洲另类综合欧美| 岛国片在线播放| 色色青青久久| 亚洲熟女国产综合另类| 久操网无码在线| 九九九九九九综合| 久草资源在线视频官方总站日韩丝袜美腿| 最新岛国大片| 国产成人精品网站| 麻豆性爱视频在线播放| 欧美一级做a爰片免费视频| 97超碰中文在线| 久久国语| 热久久精品| 日韩欧美中文| 日韩成年人性爱视频| 色偷偷男人的天堂麻豆| 久久久啊啊| 亚洲第一无码播放立川理惠| 日韩兔费看黄片| 国产AV线| 97爱爱影院| 婷婷五月天激情四射| 大香蕉一区二区在线观看.| 日韩99999| 无码人妻精品一区二区三区九九| 少妇超碰在线| 性爱乱伦网址| www.久久制服糖| 人人澡人人干| 国产精品九九| 曰本熟女视频| 日韩美一区| www.av在线观看| 成 人片 黄色大片| 啊啊啊好多水| 极品少妇久久久久| 97精品国产精品免费观看| 东京太热久久久| 97色色视频| 日韩AV熟女乱伦| 欧美综合娱乐久久| a级免费在线观看| 唯美清纯 妖精视频| asc国产精品| 精品国产久久乱码| 啊啊啊在线观看免费视频| 懂色AV一区二区三区| 亚洲图片偷拍视频区| 色狠狠 - 百度| 九九热久久99精品re| A级国产欧美激情在线| 嗯嗯啊啊操我| 淫淫综合网| 超碰色97| 91欧美经典| 99久久久| 九t超碰| 亚洲人妻色图| 东京太热男人的天堂久久久| chaopen97久久| 人人妻人人色一区二区三区| 久久人妻一区二区三区高清| 亚洲性感丝袜诱惑在线观看| 国产少妇高潮| 99re热| 成人精品水蜜桃久久久久久久| 在线情色电影 91大| 欧洲精品久久| 中国黄色特级精品一区二区三区片| 亚州综合AⅤ| 操死我了嗯嗯嗯| 伊人 俄罗斯 a v| 亚洲人码13| 俺去啦自拍| 亚洲欧美91| 色五月av| 97超碰色| 国产三级资源在线观看| 成人麻豆av电影网站| 在线观看AV片| 日韩性爱高清免费视频| 婷婷五月花| 嗯啊啊啊轻点视频 | 台湾佬大香蕉| 精品国产乱码久久久久久蜜臀| 好爽视频在线观看视频 | 久久精品欧美一区蜜桃| 国产视频三区四区| 久久久性爱视频| 九九九九九九视频| 亚洲女优有码无码高清| 91五十路| 国产精品盗摄 偷窥盗摄| 国产亚洲精品av一区| 亚洲欧美中文日韩视频中国语| 九九热在线视频| 99re不伦| 99精品无码| 伊人天天久久动态图| 国产亚洲精品无码三区| 亚洲av无线观看| 亚洲宅男天堂| 久久 亚洲 日韩 人妻| 日本高清一本二本免费不卡| 99re98| 可以在线观看的黄色网址| 欧美刺激色黄片免费看| 欧美熟爽综合| 啊啊啊啊啊啊啊啊啊在线观看| 四虎影视欧美| 尤物黄色在线观看网站| 色五月激情综合网| 97精品视频免费| 91操熟妇| 久久亚洲国产成人| 中日高清无码操逼视频| 大香蕉99热| 激情在线青青操| 亚洲欧洲综合成人av一区| 九九香蕉网| 香港日本韩国人妇99www.wccm20| 大香蕉一人| 在线看的av| 亚洲 日本 一 二 三| 嫩草影院永久在线制服丝袜| 亚洲一区二区AV| 国产亚洲美日韩Aⅴ中文字幕无码成人| 国产亚洲99久久精品| 日本人妻天堂网站在线播放| 日本媚薬中文字幕在线| 国产女人操逼视频| 国产夫妻一区二区| 嗯嗯啊啊啊好爽| 男人高清无码一区二区| 蜜臀久久99精品久久久久免费观| 激情婷婷黑人91| 一起草日韩| 日韩久久超碰色| 色综合91好| 免费操逼视频下载| 久久女同性恋一二区| 高清国产精品福利网站| 婷婷操逼| 丁香7月婷婷| 日韩久久.一级黄色片| 一区二区三区四区五区高清无码永久视频 | 91无遮挡| 九九av| 91天天综合在线观看| 啪啪资源网| 99色骚| 眼镜人妻101.com| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 国产67194| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚洲情色中文字幕一区| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 无码精品啪啪啪一区二区三区三州| 国产亚洲日韩欧| 亚欧美天堂在线| 亚洲婷婷综合网| 日韩情色视频| 人妻夜夜爽天天爽三区麻豆AV网站| 色五月丁香五月| 久久久久久人| 婷婷午夜| 亚州性色| 91原创在线观看| 国产一级内射高清视频| 九九热免费国产视频婷婷伊人| 热热色中文无码| 日本欧美韩国日产片片在线看免| 欧美性性性| 亚洲美乱| 天天干天天舔| 美女诱惑在线一区| 久久久久久久国产视频| 黄色十八禁| 亚洲一区二区三区欧美日韩| 亚洲中文字幕一区| 婷婷久久网| 天天综合-91入口| 亚洲精品色| 国产日逼视频| 熟女久久久| 日本久久99| 狠狠91| 九九九久久久久| 韩国一级AAA| 青青草导航在线视频| 超碰碰碰碰| 国产午夜精品理论片a大结局| 午夜性| 亚洲少妇综合在线播放| 日韩91网| 日本精品88888888| 四虎影视永久在线免费| 亚洲综合另类色图| 婷婷久草一区二区三区| 欧美性爽xyxOOOO| A男人的天堂| 婷婷五月天AV| 免费观看成人www精品视频| 亚洲素人网| 蜜桃久久综合视频| 免费福利视频中文字幕| 天天操熟妇| 四虎AV无码| 午夜黄色免费在线观看| 亚洲国产精品无石码久久| 青青草啪啪网| 久99热| 不卡中文字幕aⅴ在线| 欧洲大香蕉| 亚洲AV乱码专区国产噜噜亚洲 | 日日妻色网| www.狠狠干.coom| 国产51色综合久久免费| 超碰97国产欧美| 亚洲精品一卡二卡三卡福利视频网站| 无码自拍SM| 自拍偷拍国产欧美日韩韩| 五月天九九日国产精品一区二区三区| 欧美人妻精品| 欧美很很操视频| 影音先锋日本一区二区| 黄色成年| 欧美日韩天堂| 91肏屄网| 久久99久久99久久99人受| 午夜.DJ高清在线观看免费7 | 99精品在线观看| 成人a大片在线观看| 啊啊啊想要| 精品久操| 日本超碰97日韩精品人妻| 日本特黄f c2| 九九无码视频| 熟女五十路一区二区三| 国产精品久久久| 草久在线| 欧美天天在线| 和协影院中文字幕三区| 久久熟女人| 狠狠五月天| 国产AV久久久蜜爱影集| 国产一区在线观看无码AV| 九九九热| 伊人操| 久久久555| nuu12国产麻豆精品| 97国产色图| 久久111| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 色视频蜜乳| 中文一区二区三区影院| 99热婷婷一区二区三| 人妻精品一区一区三区蜜桃91| 欧美色自拍| 亚洲情色一区二区三区| 人妻无码后入| 欧美五区| 性色中出| 久久精品一区| 亚欧美天堂在线| 男女打扑克高清网站| 97天天爽| 国产蜜臀精品一区免费尤物| 狠狠欧美| 国产丝袜美女诱惑| 欧美九九爱| 亚洲日韩久久精品一区| 最近2018中文字幕在线高清第一页| 97亚洲色图| 少妇淫妇久久久久久久| 欧美成人精品欧美一级乱黄一区二…| 中日992视频| 99re28在线观看| 亚洲熟女诱惑| 97免费在线观看| 搡老熟女免费视频| 亚洲性爱成人| 欧美激情视频在线一区| 亚洲精品成人动漫在线| 午夜超爽| 国产av美女被艹的乱叫| 91|九色|国产熟女| 五月婷婷激情网| 国产免费大片|