久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

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)來的朋友應(yīng)該都是想搞懂這個(gè)協(xié)議到底是怎么回事。我先說結(jié)論WebSocket就是跑在TCP之上的一條全雙工通道客戶端和服務(wù)端完成一次握手之后兩邊隨時(shí)都可以往對(duì)面懟數(shù)據(jù)不用像HTTP那樣每次請(qǐng)求都重新建立連接。它解決的核心痛點(diǎn)就是——HTTP的“請(qǐng)求-響應(yīng)”模型沒法讓服務(wù)器主動(dòng)找客戶端說話而現(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í)、中間鏈路斷掉的問題排查起來特別累。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來握手因?yàn)閷?shí)際工程里客戶端到服務(wù)端之間往往隔著一堆基礎(chǔ)設(shè)施——負(fù)載均衡、反向代理、防火墻、網(wǎng)關(guān)。這些設(shè)施大部分只認(rèn)HTTP如果WebSocket上來就自己搞一套握手協(xié)議所有中間層都得跟著改。借道HTTP升級(jí)意味著現(xiàn)有的80/443端口、SSL證書、域名配置還有那些按HTTP路由分發(fā)請(qǐng)求的代理全部可以復(fù)用落地成本低得多。所以協(xié)議設(shè)計(jì)的核心思路就一句話用HTTP的殼完成升級(jí)用獨(dú)立協(xié)議做傳輸。這個(gè)妥協(xié)換來了巨大的工程收益也讓W(xué)ebSocket在瀏覽器、App、服務(wù)端之間幾乎成了實(shí)時(shí)通信的默認(rèn)選項(xiàng)。后面不管你用哪種語言的庫(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); }如果你在做跨語言對(duì)接拿著客戶端發(fā)來的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ī)則坑了無數(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含義說明0x1文本幀載荷按UTF-8編碼0x2二進(jìn)制幀載荷原樣傳輸0x8關(guān)閉幀帶關(guān)閉碼和原因文本0x9Ping心跳探測(cè)0xAPong收到Ping后必須回復(fù)載荷原樣復(fù)制理解了幀格式最大的收獲是能看懂“為什么短字符串抓包出來幀頭挺長(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語義去解析流量。如果沒有掩碼攻擊者可以通過偽造報(bào)文讓代理把一段精心構(gòu)造的HTTP響應(yīng)“緩存”下來進(jìn)而污染其他用戶拿到的內(nèi)容。加一層隨機(jī)掩碼之后代理無法可靠解析和預(yù)測(cè)數(shù)據(jù)內(nèi)容這種攻擊基本就失效了。明白這層邏輯你就知道為什么自己寫服務(wù)端時(shí)解析客戶端幀必須做“取消掩碼”而往客戶端回消息時(shí)直接明文發(fā)送即可。很多人第一次抓包發(fā)現(xiàn)客戶端發(fā)過來的數(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)“看起來連著一發(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回來的時(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ù)選型不同語言和庫(kù)怎么選WebSocket在服務(wù)端幾乎是標(biāo)配能力各語言都有成熟庫(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寫起來很舒服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é)值得說。一是用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ù)雜無結(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秒連一次那么粗暴。無腦定時(shí)重連有兩個(gè)問題一是服務(wù)端宕機(jī)期間客戶端同時(shí)高頻重連可以把服務(wù)端“重連風(fēng)暴”打到雪崩二是客戶端重試太頻繁在弱網(wǎng)下會(huì)消耗大量電量和流量后臺(tái)掛著幾十個(gè)連接無限重試用戶手機(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)無限重試、白白耗電。4.2 心跳超時(shí)參數(shù)怎么調(diào)前面說過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è)策略聽起來粗暴但在移動(dòng)網(wǎng)絡(luò)下體驗(yàn)反而更好省掉了無數(shù)“假死連接”的維護(hù)成本。注意不要把Ping和業(yè)務(wù)消息混在一起。業(yè)務(wù)消息密集時(shí)確實(shí)能順帶保活但業(yè)務(wù)一減少連接就裸奔了。心跳一定要用獨(dú)立的Ping/Pong幀來做。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è)坑排查起來相當(dāng)隱蔽因?yàn)轫撁嫫渌涌谌钦5闹挥袑?shí)時(shí)通道不通。4.4 連接堆積與內(nèi)存泄漏排查WebSocket是長(zhǎng)連接意味著每個(gè)客戶端在服務(wù)端都占著一個(gè)socket對(duì)象和對(duì)應(yīng)的網(wǎng)絡(luò)緩沖。連接數(shù)上來之后內(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ā)出來服務(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)存一萬條僵尸連接就能吃掉幾百M(fèi)B內(nèi)存在云服務(wù)器上這不是小數(shù)目。還有一個(gè)隱蔽問題消息發(fā)送太頻繁客戶端處理不過來網(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è)慢客戶端能把全房間的推送速度都帶下來。寫在最后WebSocket這個(gè)協(xié)議原理講起來就那些東西但真正把它用穩(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ò)、幀類型、掩碼位這些底層信息??蛻舳巳罩局桓嬖V你“斷了”抓包才能告訴你“為什么斷”。把這個(gè)習(xí)慣養(yǎng)成以后遇到再詭異的連接問題都不會(huì)慌。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
超碰成人国产| 97色色国产视频| 精品二999| 综合久久97| 岛国精品视频在线观看| 九九九九九用不成了| 伊人麻豆传媒| 婷婷亚洲天堂| 久久9精品网站| 眼镜人妻101.com| 久久婷婷视频| 欧中美三级一区二区三区| 免费1级a做爰片观看| 国产精品一区二区三区在线密挑| 96久久久久久久| 久久精品国产免费观看99| 九一屌逼| 啪啪性爱免费视频| 啪啪视频mP4| 东北操逼| 国内精品久久久久影院亚洲| 国产一区二区在线看| xxx0国产在线播放| 国语精品内射在线观看| 亚洲欧美日韩国产丝袜自拍中文| 色哟哟AⅤ| 欧美很很操视频| 97视频一区| 国产精品懂色tv影视免费观看| 亚洲天堂区| 秘书高跟黑色丝袜国产91在线| 人人操人人狠狠操| 亚洲综合97| 天天欧美欧美亚洲网| 操一操摸一摸| 亚洲天堂人人妻| 亚洲系列第一页| wuyechaopeng| 亚洲日韩精品在线播放| 五月天丁香欧洲日韩| 偷拍综合网| 亚洲成人精品久久久| 懂色中文一区二区三区| 日日日日做夜夜夜夜做无码97| 伊人女女资源在线观看| 欧美日韩中文视频播放| 成人熟女区| 91精品久久久久久77777| 欧美激情专区| 久久精品中文字幕女同| 蜜臀久久一区二区| 亚洲精品国产熟女| 性欧美| 91一区二区| 欧州一区二区三区四区| 淫荡少妇免费| 欧美性爱综合,免费| 中日韩久久久免费看| 五十路熟女工口| 99热官网| 六月丁丁香| 国内精品久久人妻性色av| 黑人在线91| 97超碰久久色| 四虎免费看黄| 少妇500双飞99| 色色五月婷| 国产呦精品一区二区三区下载| 91无遮挡| 精品免费视频国产一区| 欧美劲爆第一页| 中美日韩毛片| 97精品国产97久久久久久免费| 99色天堂| 丁香五月影院| 中文字幕一区电影在线观看| 日韩性爱啪啪视频| 久久久97| 欧美性爱精品七区| 操逼网站网站| 97色网| 日本女人久久久| 欧美日韩小说| 综合网亚洲| 人妻丝袜日本| 综合久久少妇中文字幕| 亚洲开心网| 亚洲国产综合图区中文字幕 | 91美女丝袜诱惑视频| 精品久久久久久亚洲| 成人八戒网站| 激激五月| 诱惑人妻欧美一区在线播放| 五十路熟女工口| 久久久久幕乱码| 欧美性爱第一页久久| 九九九精品成人免费视频小说| 日韩有码专区| 99精品国产户外露出| 青草成人免费视频一COm| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 久久九九综合| 亚州国产精品乱| www.狠狠操| 激情开心五月天| 日韩人妻大香蕉| 330Dv国产女人终合视频极品人与兽 | 精品在线78| 亚洲一区二区AV| 91视频伊人| 亚洲伊人久久综合97| 日韩欧美成人午夜福利| 女同性恋久久| 日本人体九九九九九九| 色综合潮| 亚洲高潮影院| 97视频免费播放| 亚洲成人在线高清| 亚洲成人av色网| AV色图| 98久久| 在线国产一区二区av| 99亚洲精品| 日韩欧亚中文在线| 久久产精品一区二区三区电影| 波多野结衣先锋影音| 大香蕉宗合网在线| 98福利在线视频| 国产成人网| 亚洲av无码成人精品国产| 夜间福利片1000无码| 久操com| 亚洲综合贴图91| 久久久精品中文字幕爱豆| 蜜臀AV网站| 99在线观看无大码| 操www| 国产成人主播| 国产午夜精品理论片一二三区区| 精品国产乱码久久久久久久久1| 亚洲大色堂| 亚洲激情视频| 96AV精品| 在线日韩精品一区二区三区| 亚洲免费97免费| 午夜美女诱惑电源网| 五月丁香综合啪啪| 熟妇高潮二区三区| 97干色天堂| 人人操人人精品影片| 久久综合激情| 日本 色 导航| 亚洲另类春色| 国产丝袜一区二区三区| 91偷拍欧美亚洲| 色婷婷五月综合激情中文字幕| 另类图片天天影视| 肉丝无码中文高清| 欧美丝袜激情| 久久久一区二区三区四曲免费听| 极品综合| 一起草在线视频| 日本999精品| 日本在线不卡一二区| av网站国产主播在线| 一二三区视频在线观看| 欧美青青草视频| 国产性感骚丝袜在线| 另类专区在线观看| 亚卅熟女乱色| 曰韩av中文字幕专区| 日韩图区 偷拍| 日本人妻丰满熟妇久久久久久| 亚洲区小说| 91路www| 大香蕉天天看妹子| 国产美女91视频| 在线观看十八禁| 人妻嗯啊啊在线播放| 亚洲一区二区精品福利| 美女午夜福利免费视频| 国产毛片久久久久久久| 欧美一级美片在线观看免费| 日韩一级欧美一级国产一级台湾| 亚洲天天综合| 黄色免费一级在线毛片| 黑人精品一区二区在线播放| 人人妻碰人人免费| 台湾一区国产高清在线| 黄片视频观看| 波多野结衣先锋影音| 日本性爰一道本| 日韩精品 视频一区二区| 嗯啊视频免费在线观看| 久久久无码av精| 福利在线黄片| 青青草在线成人视频| 亚洲色图激情小说| 亚洲人妻熟妇三十三区| 精品无码产区一区二| 久久r精品| 少妇精品久久| 日韩一级性爱无码| 国产懂色精品国产av| 五月婷婷激情网| 青草青青久久久久久国产| 97久久资源| 天天射夜夜| 蜜汁欧美| 亚洲一区操| 欧美劲爆视频一区二区| 一本久道久久综合狠狠爱| 91九久| 亚洲AV在线资源| 深夜视频| 国产精品久久久久久无码红治院| 蜜桃无码AV一区二区| 嗯嗯嗯啊啊啊在线免费观看| 新视频sss国产| 一本色道久久综合精品婷婷| 三级激情网站| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 老色69| 欧美色综合影院| 伊人五月天青青草婷婷| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 日韩中文9| 婷婷在线播放| 色操逼网| 91爱剪切久久| 美女毛片999| 中文字幕成人| 欧美精品一区二区少妇免费A片| 超碰欧美| 午夜天堂精品久久| 人人插人人搞人人操| 人妻久久一区二区三区 | 1区2区3区中文字幕日韩| 国产探花精品在线| 欧美性色综合网| 操人妻少妇中文| 日本高清有码网址视频| 夜夜爽33333| 91 丝袜在线播放| 一二三区精品视频| 国产黄片精品在线| 日韩婷婷| 美日韩一卡二卡三卡免费人妻精品| 亚洲综合影视| 18禁在线视频| 色诱avtt| 久久国产乱子伦精品免费女人| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 色婷婷综合网| 日韩综合色图| 色综合加勒比四四季| 国产中出内射一区二区| 啊啊啊不要啊啊受不了了视频在线 | 3028国产精品| 精品成人久久久人人亚洲| 欧美在线播放aaaa| 粉嫩av在线| 91天天爱| 色播丁香| 国产精品盗摄 偷窥盗摄| 裸模AV女优| 日韩精品中文字幕一| 色妇91| 免费夜夜爱黄色视频毛片| 青青草国产欧美非洲黑人| 啊啊啊好湿国产一二| 一区操逼| 亚洲图片91| 动漫片子网站3黄| 国产女人与拘做受视频免费| 4tube欧美女厕所| 91黑丝少妇| 婷婷午夜成人色中色| 国产丝袜啪啪| 超碰天天操| 人人操AV| 亚洲成人美女无吗| 日韩高清黄片| 99999精品| 亚洲文学偷乱拍啪啪啪啪 | 人人操 欧美| 久久久熟女一区| 亚洲熟妇图片| 天美精品av| 人妻中文字幕日韩电影| 人妻一区二区三区视频| 久久啊啊啊| 欧美狠狠狠| 久久久久9999精品九九九| 四虎AV在线观看| 人妻熟女av国产网站| 色色色日本| 青草成人免费视频一com| 青青操日韩| 香蕉av一区二区三区| 99国产精品在线观看| 婷婷亚洲综合| 九九热视频在线观看| 精品国产久热在线观看| 99久久久er直播网址| 91精品亚洲内射孕妇| 97干97色| 午夜男女爽爽爽影院视频| 啊v在线观看视频| 日韩性色| 干超碰碰熟女| 亚洲97综| 欧美操人视频| 91露脸熟女专区| 国产精品探花色| 日韩精品中文字幕人妻| 超碰精品国产无码| 99这里只有精品国产| 日韩字幕一区| 熟女人妇一区二区三区| 激情啪啪拍91| 性色一线| yiren97| 97在线观看免费视频l| 99re69| 久久夜夜夜| www.av不卡中文字幕| 久久精品91| 亚洲人妻色图| 中文字幕精品三级久久久| 亚洲国产欧美一区二区潘金莲| 久久久97| 日韩三级网址| 天操天操夜操夜月操月年年操 | 啊啊啊好想要| 国产 亚洲 丝袜 制服| 久久久111| 性爱视频无打码在线观看| 亚洲国产一区二区三区在线 | 国产 日韩,欧美 自拍| 中文字幕 码 自拍 视频 区| 国产搭汕a级片| 国产亚洲精品自在线亚洲情侣| 懂色av中文字幕一区二区三区天美| 午夜福利激情在线视频| 亚洲污污网站| 91成人在线免费视频| 欧洲性人爱视频| 欧美啪啪女女| 国产99 中文字幕日韩小视频| 色九九九综合| 国产在线激情| 日本丝袜美腿人妻九九| 男女日B国产| 韩日巨乳美女免费视频在线观看| 国产精品无套内谢| 无码粉嫩白虎一线天b区| 亚洲黑丝在线| 91亚洲色人| 亚洲风情综合网| 亚洲精品97在线| 欧美精品日韩久久久九| 青青青草原| oumeisetu综合| 91在线超高颜值国产| 青青草在线视频美女| 日韩免费人妻色情网站| 亚洲国产婷婷在线播放| 欧美狠狠狠| 97干天天| 免费一级欧美片片线观看| 亚洲色图91| 日本加勒比无码专区| 亚洲国产成人精品女人久久久| 国产日韩手机视频在线| 午夜福利免费福利视频| 久久偷拍人| 色淫网站优优视频| 国产亚洲精品农村妇女| 天天影视色香色欲| 色在线69堂| 久久这里只| 精品久久久久9999| 久久色精品视频在线| 26uuu性| 69超碰综合| 日日摸日日碰夜夜爽视频| 日韩国产不卡在线视频| 嗯~啊~快点 死我视频| 天堂亚洲精品| av天堂手机版追回| 人人潮人人摸| 久久久一级| 啊啊嗯嗯好爽| 国产精品香蕉| 久久AV无码1区2区3区| 岛国片在线观看视频亚洲| 亚洲无码偷拍| 久久精品超碰| 老熟女阿 国产91| AV在线资源| 欧美色图亚洲色图成人在在线| 在线综合色| 亚洲性爱乱操x| 日韩有码专区| 精品人妻一区二区三区四区| 九九av| 美女久久久久久久| 97国产色综合| 丁香五月社区| 日本三级中国三级99人妇网站| 国产精品蜜臀久久久久无码AV| 男女国产精品| 欧美激情精品久久久久久| 久久久精品视频欧州站| 大香网伊人久久综合网eew| 啊啊啊用力在线观看| 亚洲一区深夜| 嗯啊不要在线观看嗯啊| 大香樵伊人网| 精品夜夜澡人妻无码| 殴美,日韩国产伦精品| 开心激情婷婷| 红杏大香蕉| 特污免视频| 大香蕉97久久| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 九九国产热| 久久精品女同亚洲女同13| 凹凸精品熟女在线观看| 1级午夜影院费免区| 看免费的黄片| 另类 日韩 熟女| 国产AV高清AV无码| 亚洲天堂中文字幕无码男同| 蜜桃成人1区2区3区| 日本 情色 1区2区3区| 欧美日韩人妻精品一区二区三区| 91麻豆天美国产| 亚洲av无码成人精品国产| 亚洲成人无码影院| 午夜爽爽爽在线观看永久入口姬片| www.亚洲黄色| 人人操 欧美| 操操操日本的逼| 亚洲精品天堂久久A∨51成人漫 | 测评在线观看AV| 羞涩视频| 国产精品 久久久精品一牛| 日韩欧美大片免费高清啪啪| 久久激情亚洲精品无码?V| 大稥蕉免费视频这里只有精品| 综合五月天| 国产强奸乱伦无码视频| 欧美综合色| 久久久国产亚洲精品系列| 午夜久久一区二区无码中出| 中文字幕91页| 再深点灬舒服灬太大了好硬好爽| 日本黄色大片一级视频免费麻豆| 女同性恋久久| 日韩中文字幕宗合在线| 国产强奸乱伦无码视频| 中文高清一区二区的| 99re欧美| 99热国产| 老熟妇一区二区三区| 成人精品一区二区91毛片不卡| 亚洲色图超碰在线| 一本久道久久综合狠狠爱一密臀精| 欧亚在线视频| 国产高清在线自在拍69| 久久久久久电影| 青青草在线成人视频| 人妻一区二区三区熟女| 亚洲限制级| 男女国产精品| 国产av白丝| 精品国产99999| 国产亚洲99久久精品| 亚州高清AV| 操屄不卡视频| 欧美久久人体| 中文字幕在线日亚州9| 亚洲性综合| 国产精品麻豆免费视频| 水野优香在线观看| 精品一区二区三区蜜桃臀赵总 | 超碰在97| 九色婷婷| 婷婷五月激情综合| 亚洲天堂电影网99999| 国产在线视视频有精品| 中文字幕乱妇免费视频| 夜夜操91744565| 综合av社区| 色大师网站www永久网站视频| 十八禁成人网站在线观看| 啪啪啪综合| 嗯嗯啊啊亚欧精品| 亚洲免费人妻在| 国产又黄又粗又猛大片| 91亚.色| 亚欧高清在线| 91精品国产综合久久久蜜臀| 男人的亚洲天堂| 91色碰| 十八禁的黄污污免费网站| 99超碰网| 蜜桃臀 后入 一区 二区 三区 在线| 艹精品| 躁躁躁日日躁2020| 亚州高清色综合| 五月丁香综合激情| 国产三级多多影院2022国产AA一级毛片无码| av橘色网站| 麻豆精品A片免费观看| 中文字幕在线免费观看视频| 高清无码在线播放网站| 国产精品片| 日本高清一本二本免费不卡| n1038 一二三区| 九九色热| 秋霞免费AV| 亚洲中字幕日本一区二区三区| 亚洲欧洲激情| 日韩综合成人免费视频| 九九九国产精品| 亚洲成人精品久久久| 99久久婷婷国产综合精品草原| 亚洲图片婷婷五月天| 91欧美在线| 一卡二卡三卡| 四虎在线免费视频| 97一本大道亚洲一区| 96AV精品| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 九九RE视频在线精品| 波多野结衣一级视频| 神马九九| 热热色91| 丝袜美腿操av| 亚洲人妻久久久| 蜜桃视频一区二区三区 | 免费人人搞97| 欧美久久婷| 狠狠干综合| 乱色视频中文字幕| 欧美日韩国内不卡| 国产综合永久精品日韩鬼片| 欧美操逼熟女| 成年女人黄网站| 都市久久精品激情亚洲| 国产亚洲欧美每日在线| 国产精品国产亚洲区艳妇糸列| 久久国产乱子伦精品免费女,网站| 美女上床网站| 综合亚州欧美| 国产91美女视频| 992大香蕉| 国产综合久| 亚洲激情在线| 亚洲人综合19| 超碰91在线| 欧美色九九| 亚洲色图91| 中文乱码字字幕在线第5页| 久久久久久人妻一区精品色欧美| 粉嫩粉嫩一区性色AV片| 蜜色网色哟哟| 很很干很很操| 国产欧美日韩在线不卡第一页| 永久免费发布性爱网| 日韩乱伦影音先锋| 免费一级毛片在线视频观看| 色狠狠综合| 成片免费播放| 天综合网| 337p大胆噜噜噜噜噜91Av| 91狼人| 日本道久久综合色色| 乱伦Av网| 国产精品视频一区二区三区八戒| 无码 有码 国产18p| 久久AV无码网址| 亚洲色诱惑| 在线 制服丝袜中出 人妻| 91一区二区| 91欧美偷拍| 超碰97最新人妻| 91美女视频电影| av天堂加勒比| 伊人久久AV诱惑悠悠| 日韩操啪| 欧美日韩不卡a片| 在线可观看的黄色网址| 日比av无码| 高颜值美女口爆高潮浪叫| 78操B| 久久久久久久强迫| 亚洲国产精品久久AV| 欧美高清无码免费视频高清版| 日韩操p| 日韩,欧美,中文在线| 九九热在线精品视频| 久久9亚洲| 麻豆 亚洲 97| JuliaAnnXXX888| 极品销魂美女一区二区| 口爆吞精在线观看| 99自拍视频| 亚洲日韩av一区二区三区百合| 嗯嗯啊好大| 天天肏夜夜肏| 中文字幕一区二区免费在线| 久久99综合| 亚洲情色一区三区| aV中文麻| 国内毛片热久久思思热| 插日本熟女视频| 天综合网| 色偷偷男人的天堂麻豆| 成人免费性爱视视| 久久精品国产亚洲AV高级北京| 野狼激情网| 日韩av色图| 熟女人妻精品一区二区视频 | 久久亚洲日韩熟女精品| 国产精品免费1区2区视频| 黄片直播三级黄片两女一男| 久久精品亚洲东京热色播| 最新9久久久9免费视频| 人妻一区二区三区四区视频| 亚洲一区二区三区AV无码| 大香蕉在线视频15| 青青草大香蕉视频| 亚洲砖码砖专无区2023| 韩国国产欧美情侣视频在线| 五月丁香综合网| 精品国产Av无码久久久伦古装| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 欧美日韩97| 亚洲欧美在线观看免费| 啊啊啊com| 久久久久久久久9| 欧美一级在线观看成人| 日日碰狠狠添天天爽超| 性性欧美| 久久久久97| 操碰91| 97丝袜亚洲在线播放| 欧美人与动性人交a| 欧美性爱在线无码| 青草视频人妻在线观看| 日本人妻伦在线中文字幕| 啊啊啊啊啊啊啊啊啊啊在线观看| 亚洲精品成人激情在线| 91精品无码久久久久久久 | 久操网址| 天天夜夜rb| 综合网欧| 你草精品在线视频| 亚洲在线| 色婷婷五月天| 欧日韩一二三f区| 人人摸人人干人人拍97| 欧美老妇女内射网址| 麻豆国产97在线| 国产91美女高潮| www.91视频网| 综合婷婷| 99re久久| 久久婷婷五月天| 劲爆欧美人妖三区91| 強姦亂倫a| 97精品国产97久久久久久免费| 99精品九九九九九九| 大香蕉免费乱伦视频| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 久久人体一区二区| 999亚洲国产视频| 熟女高潮合集-永久久久-成人AV| 69少妇一区二区| 日本A级视频| 国产对白刺激视频| 秋霞成人做爱| 中文字幕丰满人妻日本| 麻豆 美女 丝袜 人妻 中文| 欧美夜夜骑视频| 青青草视频在线观看一区二区| 丝袜熟女2P| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 激情终合网| 强奸国产精品视频| 国产乱码精品久久久久久| 成人亚欧免费视频| 亚洲精品久久久久久| 97久久超碰| 天天综合中文字幕 91| 欧美三级一级| 国产中文字幕在线点播| 免费亚洲国产精品久久一区| 久久久亚洲欧美综合| 久久熟女精品不卡一区| 色九九综合| 丝袜AV一区二区三区| 奸色色 男人天堂 天天射| 丁香婷婷五月| 亚洲的天堂网| 四虎影院成年人片| 超碰成人人人爽人人爽| 狠狠图片青青草| 国产av美女被艹的乱叫| 97神马久久| 超碰性爱97| 日本高清_区二区三区| 欧美中日韩XXXX| 久久久艹艹艹| 亚洲一欧洲中文字幕在线| 色噜噜人妻av中文字幕| 九久9热| 一类无码操逼视频| 色吊丝 日日骚 清纯唯美| 国产少妇与亚洲av| 日韩av不卡在线看| 91精品导航| 青青草九九九九九| 一级人妻性爱视频| 欧美日韩国产色五月综合在线| 青草视频在线看看看看看看看看看| av爱爱爱| 4tube欧美女厕所| 亚洲日韩av一区二区三区百合| 国产精品麻豆视频网站| 日日躁天天躁狠狠躁| 大香蕉欧美伊| 国产成人亚洲精品无码古代早漏男 | 日韩性爱毛片操骚逼| 亚洲欧美在线丝袜| 久插综合| 五月天激情网站| 免费黄色片。| 九久精品| 久湿久久| 成人日本精品九区| 干婷婷综合网| a片在线播放| 99久在线精品99re8蜜桃| 日日黄色三级网站| 日本三级中国三级99人妇网站| 福利社区午夜一区二区| 欧美97色| 欧美色老汉| 一区二区 电影 亚洲| 中文字幕一区av| 加勒比久久综合网高清| 亚洲一卡二卡在线免费| 91色欧美| 97 国产一区| 欧美色图天堂在线| 思思性爱| 乱伦一区二区三区‘| 亚洲自拍97| 丝袜视频网国产90| 新视频sss国产| 日韩欧亚太美不卡| Blackedraw视频一区二区| 日本中文熟女视频| 欧亚三区动漫| 99热线麻豆| 人妻免费观看| 伊人一区二区三区| 强上我不卡卡| 亚洲欧美一区二区三区在钱蜜桃| 亚洲成人久久美女| 亚洲av无线观看| 国产隔壁老王影院在线| 久久成年片色大黄全免费网站| 黄色工厂这里只有精品| 黄站在线免费观看| 性九九九九九九| 日韩欧美资源| 加勒比综合九九99视频在线播放| 高树玛利亚无码流出| 97自拍视频在线| 亚洲人妻AV| 91精品无码人妻系列| 国产精品自拍xxxx| 国产在线视频二区| 在线观看不卡一区二区三区| 国内91熟女人妻丝袜天天精品视频在线| 国产视频一区二区免费| 国产熟女免费观看久久| 岛国在线一区二区三区| 亚洲精美粉嫩嫩泬在线观看| 97人人操人人摸| 国产操伦| 国产av又色又爽又黄| 日韩簧片免费看| 久久久久亚洲熟妇熟女| 黄色大片视频在线免费看| 91丨人妻丨国产丨丝袜| 一区二区三区不卡视频| 97精| 亚洲av性爱电影| 日韩免费中文字幕视频| 强奸抽插av| 加勒比在线观看一区二区| 99re免费视频精品全部| 免费1级a做爰片观看| 日韩三A大片在线观看 | 五码视频在线观看| 日韩熟女乱伦中出| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 国内伊人久久久久久网站视频| 久久男人的天堂| 中文字幕久久婷婷丁香五月天| 蜜臀AV秘一区翔田千里| 久草成人影片| 日韩精品第3页| 国产亚洲 中文欧美久久| 五月综合视频| 天天超级碰碰碰| 无码区蜜乳| 伊人大香蕉在线| 日日夜夜草草草| 青青草精品| 色播五月婷婷| 色情五月综合婷婷| 你想操日本小逼吗| 手机在线A片| 99婷婷一区二区| 欧美色亚洲| 精品人妻一区二区乱码一区二区| 一本一首道人妻少妇免费久久| 51国产午夜精品视频| 婷婷五月天成人网| 情色日播放AV| 97超视频在线观看| 丁香7月婷婷| av天堂电影网| 91深夜夜| 一起草AV| 天天摸夜夜摸| 四虎影视永久在线观看精品免费网站 | 青娱乐福利99| 亚洲密乳AV| 色色色999| 青青草视频在线观看一区二区| 狠操91,com| 五月天亚洲色图| 天天色,天天干,天天干| 亚洲成人碰碰| 97伪v| 欧美第二页| 一区二区三区高清天码| 国产高潮AA片免费看| 青娱乐亚洲热| 后入式福利| 18禁看网站一区| 日欧操屄视频| 抽查国产福利主播| 国产嫩草精品A88AV| 97欧美日韩精品| 免费的黄片有限公司| 大香樵伊人网| 欧美激色| 91在线精品一区二区三区| 亚洲AV无码久久久国产精品| 国产男女无套97| 欧美第五页| 国产女人高潮嗷嗷嗷叫小说| 色婷婷视频| 亚欧美综合网。| 97色亚洲| 日韩在线观看中文字幕视频| 大香蕉 222| 日本道人妻久久久在线不卡色视频| 成人五月天丁香激情综合| 岛国黄色大片网站| 亚洲限制级| 欧美少妇色图| www.久久99| 噜噜噜亚洲精品| 国产精品白丝在线播放| 发朗少妇买婬全视频中文| 吊色| 国产精品点击进入在线影院| 涩涩五月天| 91色香| 98超碰日本| 久久久久国产精品久久久| 99re视频在线观看这里只有精品| 亚洲黄a三级三级三级看三级| 视频国产欧美在线播放| 欧美色图天堂在线| 91痴汉| 国模少妇一区二区三区| 国产欧美成人精品| 久久国产免费激情视频| 精品人妻一区春色| 蜜臀AV秘一区翔田千里| 久久久久密臀一区二区| 久久久久久性爱视频| 99热导航| A V视频日本| 后入人妻无码| 欧美成人一级麻豆| 黄色免费一级在线毛片| 啊啊啊操一区| 动漫av中文| 一级做a爰片久久毛片图片| 区一在线观看| 精品国产Av无码久久久伦古装| 天天干少妇| 99AV| 国模精品娜娜一二三区| 亚洲欧美综合网站| 日本五十路熟女一区二区| 欧洲小说色图视频另类| 少妇无码av专区线| 成人精品一区二区三区| 午夜福利1区2区3区| 精彩国产视频播放1区2区| 亚洲精品97| 精品福利视频| 91视频精品| 久久97资源 网| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| 极品五月天噜噜| 亚洲欧美日韩中文播放| 96AV精品| 国产强奸无码乱伦| 不卡超碰护士AV在线免费播放| 天天做天天爱| 天堂九九九九九九九九九| 久久精品| 国产丰满少妇久久久精品影院| 精品国产一区二区三区香蕉欧美| 青娱乐大香蕉| 最近2019中文字幕国语免费版| 岛国不卡超碰护士AV在线播放| 亚洲欧美一区二区三区一猛片| 亚州,欧美在线| 六月丁香久久| 男人天堂欧美| 热天堂一区二区| 日韩人妻制服丝袜av| 激情黄色五月天| 久久综合激情| 成年无码动漫av片无尽在线| 99啪啪视频| 综合五月婷婷亚洲一区| 九九九草| 99精品视频在线观看| 婷婷爽人人婷婷爽视频| 成人网欧美风情| 乱伦AVxx| 97久久超碰日韩精品| 怡红院怡春院| 新婚人妻扶着粗大强行坐下| 欧美狠狠狠| 久久久精久久久| 狠日操| 97鸡把在线视频| 中文字幕精品人妻丝袜| 嫩呦国产一区二区三区AV| 久久后入制服| 欧美色偷拍| 乳欲人妻办公室奶水| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 九九热精品在线| 91丨九色丨国产丨人妻在线 | 久9无限国产| 97天天弄| 国产亚洲精品av一区| 精品视频久久| 欧美激情久久久久| 久久亚洲婷婷| 影音先锋少妇| 欧日韩一二三f区| 色婷婷综合久久中文字幕雪峰| 伊人色综合网电影| 国产资源中文字幕在线| 成人情色综合网| 久久这里精品国产99丫e6| 丰满人妻av一区二区三区| 日韩视频中文字幕| 精品无码产区一区二| 超碰97资源大奶| 色久桃花影院在线观看| 精品久久久av无码免费| 亚洲欧美天| 欧美综合加勒比在线| 综合啪啪| 九九精品无码专区免费| 人妻第一页| 热久久99999| 亚洲第一页色| 婷婷AV一区二区三区| 美女天天干| 亚洲影视高清第一页| 东京成人一区| 午夜精品视频777| 老熟女搡BBBB搡BBBB视频| 五月天亚洲网| 亚洲 欧美都市激情| 乱伦AVxx| 久久亚州精品成人Av无| 深夜视频| 小骚逼被操的爽不爽| 色呦呦、国产精品| 五月丁香六月婷| 日韩av一级黄片| 少妇一区二区三区精选| 97干在线| 日本媚薬中文字幕在线| 91无码人妻| 金典av| 91爽啪| 亚洲色图欧美视频| 久久成人国产| 亚洲男人综合| 亚洲天堂一区| 国产精品福利视频| 欧美色图欧美| 国产精品禁久久久精品| 高跟伊人julia ann| 欧美超碰9798| 天天综合网国产| 色婷婷亚洲婷婷| 九九热AV| 青草av在线| 午夜寂寞欧美| 亚洲乱码国产乱码精网站| 久操com| 思思视频免费看网站| 啪啪视频免费在线观看| 伦理第一页| 快灬快灬 一下爽蜜桃在线观看| 色区97| 久热网| 五月天久久人妻| 九九这里只有精品| 九九九九九九九九九九九蜜桃| 黄色片G G G| 欧美亚洲性爱一区二区| 狼人综合婷婷激情四射 | 亚洲丰满很很操| 啊啊啊在线看| 国产精品乱码久久久、久久| 视频黄站| 超碰在线97国产| 中国小夫妻勾搭露脸淫荡对白 | 韩国一级婬片A片AAAAA| 五月丁香激情啪啪| 亚洲成人久久美女| 色情成人五月天| 精品一区二区三区蜜桃臀赵总| 五月天激情婷婷| 97资源超碰| 亚洲激情 欧美色图| 影音综合网| 999综合色| 色 亚洲 91| 欧亚第一综合网| 97免费视频网| 国产女人9999| 99热这里只有精品1| 亚洲色婷婷综合久久久久中文| 蜜臀99久| 性色AV蜜色av色欲av| 国产第12页| 中文一区在线视频| 色一情一乱一乱一区91Av| 人妻熟女一区在| 天天干天天日天天射黄色大片| 91天天爱| 一级免费精品| 夜夜欢天天干| 大香久久| 91精品国产91久久福利| 欧美一级国产一级| 中文自拍欧美影视| 男人天堂2012| 啊啊啊在线观看免费视频| 丝袜美腿射精91| 人妻丝袜二区| 精品美女久久久久| 可以在线观看AV的网站| 欧美色色色| 久久欧洲| 久操| 亚洲超碰97| 国产女同视频在线播放| 日韩性爱电影一区| 亚洲欧洲视频小说在线观看| 色综合久久夜色精品国产天堂| 久久久久久裸体| 日韩欧美加勒比| 韩日性爱av| 精品人妻伦一二三区久久| 大香蕉综合久久| 中国91AV| 久久午夜鲁丝片| 综合五月婷婷| 黄色十八禁网站| 欧美系列在线一区二区| 日本人妻中文字幕| 欧美日韩性爱无码| 激情第四色| 成人精品在线| 一区在线国产播放| 欧美国产欧美在线观看| 中文字幕一区二区三区四区在线视频| 人妻天堂网| 97碰久久| 樱花蜜乳av| www.人人cao| 色第一页| 秋霞色色影院| 91丨熟女丨丰满熟女| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 久久天天躁日日躁狠狠躁| 五月天精品| 97在线视频网站| 被窝影院午夜看片无码| 乱性AV| 成人午夜高潮av猛片| 亚洲天堂一区| 97超碰人人模人人拍人人| 人人搞人人插人人操| 果冻国产精品麻豆成人av| 自拍偷拍2025在线观看| 久久思思热| 白丝1区2区3区| 人妻AV在线| 久久五月婷| 久热大香蕉| 中文字幕在在线观看网站| 国产精品情侣啪啪| 东北女人的毛片| 日韩欧美中文字| 欧美激情1区| 最近2018中文字幕在线高清第一页| 亚洲欧洲中文日韩女优乱码| 性暴力欧美猛交在线直播| 国产亚洲精品农村妇女 | 极品色综合| 99热欧美| 超碰午夜| 2024年最新色情网站在线观看| 熟女精品va中文字幕| 精品人妻二区三区| 外国91| 超碰成人国产| 狠操91,com| 国产亚洲精品农村妇女| 伊人国产av| 久久亚洲AV无码白度|