日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

ESP32 ModbusTCP分片緩存實(shí)戰(zhàn):從丟幀到72小時(shí)零丟包

ESP32 ModbusTCP分片緩存實(shí)戰(zhàn):從丟幀到72小時(shí)零丟包 1. 從一次現(xiàn)場(chǎng)調(diào)試說(shuō)起為什么ModbusTCP在ESP32上會(huì)“卡死”去年冬天我在一個(gè)配電柜改造項(xiàng)目里第一次被ESP32的ModbusTCP搞到懷疑人生。現(xiàn)場(chǎng)是一臺(tái)ESP32-S3核心板跑著ModbusTCP從站上位機(jī)每200ms輪詢一次寄存器數(shù)量不多也就四十來(lái)個(gè)。按理說(shuō)這點(diǎn)數(shù)據(jù)量對(duì)ESP32來(lái)說(shuō)連熱身都算不上但實(shí)際跑起來(lái)每隔十幾分鐘就會(huì)丟一幀上位機(jī)報(bào)超時(shí)然后自動(dòng)重連重連之后又能撐一陣。最開(kāi)始我以為是WiFi信號(hào)問(wèn)題換了天線、調(diào)了信道、把路由器挪到柜子旁邊都沒(méi)用。后來(lái)抓包才發(fā)現(xiàn)問(wèn)題出在TCP分片上——上位機(jī)一次請(qǐng)求的報(bào)文被拆成了兩個(gè)TCP段發(fā)過(guò)來(lái)而我的代碼里默認(rèn)“一次recv就是一整幀”第二個(gè)分片直接被當(dāng)成新幀的頭部解析整個(gè)緩沖區(qū)就亂了。這個(gè)坑其實(shí)非常典型。ModbusTCP雖然協(xié)議本身簡(jiǎn)單但它跑在TCP之上而TCP是字節(jié)流協(xié)議不保證你一次recv就能拿到完整的一幀。ESP32的LwIP協(xié)議棧在WiFi環(huán)境下MSS最大報(bào)文段長(zhǎng)度通常只有1460字節(jié)一旦ModbusTCP的ADU應(yīng)用數(shù)據(jù)單元超過(guò)這個(gè)長(zhǎng)度或者網(wǎng)絡(luò)抖動(dòng)導(dǎo)致TCP分段分片就必然發(fā)生。更麻煩的是ModbusTCP的MBAP頭里有一個(gè)Length字段它告訴你后面還有多少字節(jié)但如果你不主動(dòng)做緩存拼接這個(gè)字段就形同虛設(shè)。所以這篇內(nèi)容我想聊的不是“怎么跑通ModbusTCP”而是怎么在ESP32上把分片緩存這件事做扎實(shí)。適合已經(jīng)能在ESP32上跑起ModbusTCP、但被偶發(fā)丟幀和粘包問(wèn)題折磨的開(kāi)發(fā)者也適合正在做工業(yè)網(wǎng)關(guān)、邊緣采集終端的朋友。下面我會(huì)從協(xié)議本質(zhì)、緩沖區(qū)設(shè)計(jì)、狀態(tài)機(jī)實(shí)現(xiàn)、實(shí)測(cè)調(diào)優(yōu)幾個(gè)角度把這件事拆開(kāi)講透。2. ModbusTCP分片到底是怎么發(fā)生的協(xié)議層與網(wǎng)絡(luò)層的雙重真相2.1 MBAP頭里的Length字段才是拼接的唯一依據(jù)很多人寫ModbusTCP從站的時(shí)候習(xí)慣性地把recv到的數(shù)據(jù)直接丟給協(xié)議解析函數(shù)解析函數(shù)里假設(shè)buffer[0..6]是MBAP頭buffer[7]是功能碼然后按固定長(zhǎng)度去讀。這種寫法在PC端以太網(wǎng)環(huán)境下可能跑幾個(gè)月都不出問(wèn)題因?yàn)橐蕴W(wǎng)的MTU是1500MSS是1460而大多數(shù)ModbusTCP請(qǐng)求的ADU長(zhǎng)度遠(yuǎn)小于這個(gè)值TCP棧通常會(huì)把一整幀放在一個(gè)段里發(fā)出去。但ESP32跑的是WiFiWiFi的MTU雖然也是1500但實(shí)際空口傳輸中AP和STA之間的協(xié)商、重傳、聚合都會(huì)影響TCP分段行為。更關(guān)鍵的是當(dāng)ModbusTCP的ADU超過(guò)MSS時(shí)TCP層必然分片這是協(xié)議棧的行為你控制不了。MBAP頭的結(jié)構(gòu)是這樣的前2字節(jié)是事務(wù)標(biāo)識(shí)符接著2字節(jié)是協(xié)議標(biāo)識(shí)符Modbus固定為0然后2字節(jié)是Length最后1字節(jié)是單元標(biāo)識(shí)符。Length字段的值等于“單元標(biāo)識(shí)符 PDU”的總字節(jié)數(shù)也就是說(shuō)如果你要讀保持寄存器功能碼0x03起始地址0x0000數(shù)量0x000A那么PDU是5字節(jié)加上單元標(biāo)識(shí)符1字節(jié)Length6。整個(gè)ADU長(zhǎng)度就是6MBAP頭前6字節(jié) 6 12字節(jié)。這個(gè)長(zhǎng)度遠(yuǎn)小于MSS所以單次請(qǐng)求通常不會(huì)分片。但響應(yīng)就不一樣了——如果你返回10個(gè)寄存器的值PDU是2功能碼字節(jié)數(shù) 20數(shù)據(jù) 22字節(jié)加上單元標(biāo)識(shí)符1字節(jié)Length23ADU總長(zhǎng)29字節(jié)依然很小。那什么時(shí)候會(huì)分片當(dāng)寄存器數(shù)量很大比如一次讀125個(gè)寄存器PDU就是2250252字節(jié)Length253ADU總長(zhǎng)259字節(jié)還是小于MSS。真正會(huì)觸發(fā)分片的是多個(gè)請(qǐng)求在TCP流中連續(xù)到達(dá)或者網(wǎng)絡(luò)層因?yàn)閾砣刂瓢讯鄠€(gè)小段合并/拆分。但更隱蔽的情況是上位機(jī)比如某些SCADA軟件在發(fā)送請(qǐng)求時(shí)TCP_NODELAY沒(méi)開(kāi)Nagle算法把多個(gè)小請(qǐng)求攢在一起發(fā)到了ESP32這邊一次recv收到多個(gè)ADU如果你不按Length字段切分就會(huì)把第二個(gè)ADU的頭部當(dāng)成第一個(gè)ADU的數(shù)據(jù)。所以分片緩存要解決兩個(gè)問(wèn)題粘包多個(gè)ADU粘在一個(gè)TCP段里和拆包一個(gè)ADU被拆到多個(gè)TCP段里。這兩個(gè)問(wèn)題的根源都是“TCP是字節(jié)流沒(méi)有消息邊界”而ModbusTCP的消息邊界就藏在MBAP頭的Length字段里。2.2 ESP32的LwIP配置對(duì)分片行為的實(shí)際影響ESP32默認(rèn)的LwIP配置里TCP_MSS通常是1460TCP_WND接收窗口是5744左右TCP_SND_BUF也是5744。這些參數(shù)決定了TCP層一次能緩沖多少數(shù)據(jù)。如果你在menuconfig里把TCP_MSS調(diào)小比如調(diào)到536那么分片會(huì)更容易發(fā)生因?yàn)槊總€(gè)段能攜帶的數(shù)據(jù)更少。反過(guò)來(lái)如果你把接收窗口調(diào)大比如調(diào)到11680那么一次recv可能拿到更多數(shù)據(jù)粘包的概率反而增加。我在實(shí)測(cè)中發(fā)現(xiàn)ESP32-S3在WiFi環(huán)境下如果AP的DTIM周期設(shè)置得比較長(zhǎng)比如3那么ESP32在省電模式下會(huì)周期性休眠醒來(lái)后可能一次性收到多個(gè)緩沖的TCP段這時(shí)候粘包幾乎必然發(fā)生。還有一個(gè)容易被忽略的點(diǎn)ESP32的LwIP默認(rèn)開(kāi)啟了LWIP_TCP_SACK_OUT和LWIP_TCP_TIMESTAMPS這些選項(xiàng)會(huì)影響TCP段的確認(rèn)和重傳行為但對(duì)分片緩存本身沒(méi)有直接影響。真正需要關(guān)注的是TCP_QUEUE_OOSEQ它決定了亂序到達(dá)的TCP段是否會(huì)被緩存。如果這個(gè)選項(xiàng)關(guān)閉亂序段會(huì)被丟棄導(dǎo)致重傳進(jìn)而加劇分片。所以我的建議是在menuconfig里保持TCP_QUEUE_OOSEQ開(kāi)啟并且把TCP_WND設(shè)置得比最大ADU長(zhǎng)度大一些比如8192這樣即使有多個(gè)ADU連續(xù)到達(dá)也不會(huì)因?yàn)榇翱跐M而丟數(shù)據(jù)。2.3 一個(gè)真實(shí)的抓包案例兩個(gè)分片如何打亂整個(gè)緩沖區(qū)我拿之前那個(gè)配電柜項(xiàng)目舉例。上位機(jī)是某國(guó)產(chǎn)組態(tài)軟件它發(fā)送的請(qǐng)求是讀40個(gè)保持寄存器功能碼0x03起始地址0x0000數(shù)量0x0028。PDU長(zhǎng)度是5Length6ADU總長(zhǎng)12字節(jié)。這個(gè)請(qǐng)求本身很小不會(huì)分片。但組態(tài)軟件在初始化時(shí)會(huì)連續(xù)發(fā)送多個(gè)請(qǐng)求比如先讀設(shè)備標(biāo)識(shí)再讀寄存器再讀線圈。這些請(qǐng)求之間的間隔可能只有幾毫秒TCP層會(huì)把它們合并成一個(gè)段發(fā)出去。假設(shè)三個(gè)請(qǐng)求的ADU分別是12字節(jié)、12字節(jié)、12字節(jié)總共36字節(jié)一個(gè)TCP段就發(fā)過(guò)來(lái)了。我的代碼如果只recv一次然后按第一個(gè)ADU的Length6去解析就會(huì)把第一個(gè)ADU之后的24字節(jié)當(dāng)成新數(shù)據(jù)但解析函數(shù)可能只處理了前12字節(jié)剩下的24字節(jié)被丟棄或者錯(cuò)位解析。更糟糕的是如果第二個(gè)ADU的Length字段恰好被當(dāng)成事務(wù)標(biāo)識(shí)符整個(gè)解析就全亂了。抓包顯示ESP32的recv返回了36字節(jié)但我的緩沖區(qū)只有256字節(jié)一次recv就填滿了前36字節(jié)。如果我不做循環(huán)解析只解析一次那么剩下的24字節(jié)就留在緩沖區(qū)里下一次recv又追加新數(shù)據(jù)緩沖區(qū)里就混著舊數(shù)據(jù)和新數(shù)據(jù)Length字段完全對(duì)不上。這就是典型的粘包問(wèn)題。解決辦法就是每次recv之后循環(huán)檢查緩沖區(qū)里是否至少有一個(gè)完整的ADU根據(jù)Length字段判斷如果有就解析并移除直到剩余數(shù)據(jù)不足一個(gè)完整ADU為止。3. 環(huán)形緩沖區(qū)還是線性緩沖區(qū)ESP32內(nèi)存約束下的選型邏輯3.1 線性緩沖區(qū)加memmove的代價(jià)與適用場(chǎng)景最直觀的做法是開(kāi)一個(gè)固定大小的數(shù)組比如512字節(jié)每次recv把數(shù)據(jù)追加到數(shù)組末尾然后從頭開(kāi)始解析。解析完一個(gè)ADU后把剩余數(shù)據(jù)用memmove往前挪。這種方案實(shí)現(xiàn)簡(jiǎn)單代碼量少適合ADU長(zhǎng)度不大、并發(fā)連接數(shù)不多的場(chǎng)景。但它的缺點(diǎn)也很明顯memmove在數(shù)據(jù)量大時(shí)開(kāi)銷不可忽略。假設(shè)緩沖區(qū)里經(jīng)常有200字節(jié)的剩余數(shù)據(jù)每次解析一個(gè)ADU就要挪200字節(jié)如果每秒處理100個(gè)請(qǐng)求那就是每秒20KB的memmove對(duì)ESP32的CPU來(lái)說(shuō)雖然不算重但在高并發(fā)下會(huì)累積成可觀的負(fù)載。更重要的是線性緩沖區(qū)在邊界處理上容易出錯(cuò)。比如緩沖區(qū)還剩10字節(jié)但下一個(gè)ADU需要12字節(jié)這時(shí)候recv新數(shù)據(jù)進(jìn)來(lái)如果緩沖區(qū)總大小是512已用10剩余502recv最多能收502字節(jié)。但如果recv返回了502字節(jié)緩沖區(qū)滿了而里面可能包含多個(gè)ADU你需要循環(huán)解析直到剩余數(shù)據(jù)不足一個(gè)ADU。如果剩余數(shù)據(jù)恰好是某個(gè)ADU的前半部分你就必須保留它等下一次recv。這時(shí)候如果緩沖區(qū)已經(jīng)滿了你就沒(méi)有空間再recv了只能先解析、挪動(dòng)、騰出空間。這個(gè)邏輯如果寫得不嚴(yán)謹(jǐn)很容易出現(xiàn)“緩沖區(qū)滿了但解析不出完整ADU”的死鎖。我早期就是用線性緩沖區(qū)在實(shí)驗(yàn)室跑得好好的一到現(xiàn)場(chǎng)就出問(wèn)題。后來(lái)分析發(fā)現(xiàn)現(xiàn)場(chǎng)的網(wǎng)絡(luò)抖動(dòng)導(dǎo)致recv返回的數(shù)據(jù)量忽大忽小有時(shí)候一次recv只有幾個(gè)字節(jié)緩沖區(qū)里長(zhǎng)期有“半截”ADUmemmove頻繁觸發(fā)CPU占用率從5%飆到30%。雖然30%不算高但對(duì)于一個(gè)還要跑其他任務(wù)的ESP32來(lái)說(shuō)這30%可能就是壓垮駱駝的最后一根稻草。3.2 環(huán)形緩沖區(qū)的讀寫指針設(shè)計(jì)避免“假滿”與“覆蓋”環(huán)形緩沖區(qū)ring buffer是更優(yōu)雅的方案。它用讀指針和寫指針來(lái)管理數(shù)據(jù)寫指針追讀指針讀指針追寫指針不需要memmove。但環(huán)形緩沖區(qū)有一個(gè)經(jīng)典問(wèn)題如何區(qū)分“空”和“滿”如果讀指針等于寫指針可能是空也可能是滿。常見(jiàn)的做法是留一個(gè)字節(jié)不用或者額外維護(hù)一個(gè)count變量。我傾向于用count變量因?yàn)镋SP32的內(nèi)存雖然緊張但多一個(gè)int32_t的開(kāi)銷可以忽略而邏輯清晰度提升很大。環(huán)形緩沖區(qū)的容量選擇也有講究。ModbusTCP的最大ADU長(zhǎng)度是260字節(jié)MBAP 7字節(jié) PDU 253字節(jié)但實(shí)際項(xiàng)目中很少用到最大長(zhǎng)度。如果你只讀保持寄存器最大PDU是252字節(jié)功能碼字節(jié)數(shù)250字節(jié)數(shù)據(jù)加上MBAP頭7字節(jié)ADU最大259字節(jié)。所以緩沖區(qū)至少要能容納一個(gè)最大ADU也就是260字節(jié)。但考慮到粘包你可能需要容納多個(gè)ADU比如3個(gè)那就是780字節(jié)。再加上TCP層可能一次recv返回更多數(shù)據(jù)我建議緩沖區(qū)大小設(shè)為1024字節(jié)或2048字節(jié)。ESP32-S3有512KB SRAM開(kāi)2KB緩沖區(qū)完全沒(méi)問(wèn)題。如果是ESP32-C3SRAM小一些但2KB也不算什么。環(huán)形緩沖區(qū)的寫入邏輯是計(jì)算寫指針到緩沖區(qū)末尾的連續(xù)空間如果剩余空間足夠直接memcpy如果不夠分兩段memcpy先寫到末尾再繞回到開(kāi)頭。讀取邏輯類似但讀取時(shí)不需要真的把數(shù)據(jù)移走只需要移動(dòng)讀指針。解析ADU時(shí)先從讀指針位置讀取MBAP頭7字節(jié)但環(huán)形緩沖區(qū)里的數(shù)據(jù)可能跨越末尾所以讀取MBAP頭也需要分兩段。為了簡(jiǎn)化我通常先把MBAP頭拷貝到一個(gè)臨時(shí)數(shù)組里解析出Length然后判斷緩沖區(qū)里是否有足夠的數(shù)據(jù)7 Length - 1因?yàn)長(zhǎng)ength包含單元標(biāo)識(shí)符而MBAP頭已經(jīng)包含了單元標(biāo)識(shí)符這里要仔細(xì)MBAP頭是7字節(jié)其中前6字節(jié)是事務(wù)標(biāo)識(shí)符協(xié)議標(biāo)識(shí)符Length第7字節(jié)是單元標(biāo)識(shí)符。Length字段的值是“單元標(biāo)識(shí)符PDU”的長(zhǎng)度所以整個(gè)ADU長(zhǎng)度 6 Length。因此如果緩沖區(qū)里可讀數(shù)據(jù)量 6 Length就說(shuō)明有一個(gè)完整ADU。注意Length字段本身在MBAP頭的第5、6字節(jié)所以讀取Length只需要前6字節(jié)。3.3 雙緩沖區(qū)方案用空間換確定性的極端做法還有一種方案是雙緩沖區(qū)一個(gè)用于recv一個(gè)用于解析。recv緩沖區(qū)接收TCP數(shù)據(jù)然后整體拷貝到解析緩沖區(qū)解析緩沖區(qū)里做線性解析。這種方案的好處是recv和解析解耦recv可以盡可能快地收數(shù)據(jù)解析可以慢慢處理。但缺點(diǎn)是內(nèi)存翻倍而且拷貝開(kāi)銷大。在ESP32上如果recv緩沖區(qū)是2048解析緩沖區(qū)也是2048那就是4KB對(duì)于C3來(lái)說(shuō)有點(diǎn)奢侈。而且拷貝本身也是memcpy和memmove的開(kāi)銷差不多。所以除非你的應(yīng)用對(duì)實(shí)時(shí)性要求極高否則我不推薦雙緩沖區(qū)。我的選擇是環(huán)形緩沖區(qū) 狀態(tài)機(jī)解析。環(huán)形緩沖區(qū)負(fù)責(zé)高效存取狀態(tài)機(jī)負(fù)責(zé)逐字節(jié)或逐段解析兩者結(jié)合既省內(nèi)存又省CPU。下面我會(huì)詳細(xì)講狀態(tài)機(jī)的設(shè)計(jì)。4. 狀態(tài)機(jī)解析把“等Length”這件事做成可重入的4.1 狀態(tài)劃分IDLE、HEADER、PAYLOAD三態(tài)足夠嗎狀態(tài)機(jī)解析的核心思想是不要假設(shè)一次recv就能拿到完整ADU而是把解析過(guò)程拆成多個(gè)狀態(tài)每次有數(shù)據(jù)進(jìn)來(lái)就推進(jìn)狀態(tài)直到一個(gè)ADU解析完成。最簡(jiǎn)單的狀態(tài)機(jī)是三個(gè)狀態(tài)IDLE等待MBAP頭、HEADER正在讀MBAP頭、PAYLOAD正在讀PDU。但實(shí)際實(shí)現(xiàn)時(shí)我發(fā)現(xiàn)三個(gè)狀態(tài)不夠因?yàn)镸BAP頭本身也可能分片。比如你只收到了前3字節(jié)事務(wù)標(biāo)識(shí)符和協(xié)議標(biāo)識(shí)符有了但Length還沒(méi)收到。這時(shí)候你需要一個(gè)“部分頭”狀態(tài)。所以更實(shí)用的狀態(tài)劃分是STATE_IDLE緩沖區(qū)里沒(méi)有正在解析的ADU等待至少6字節(jié)的MBAP頭。STATE_HEADER已經(jīng)讀取了部分MBAP頭但不足6字節(jié)繼續(xù)等待。STATE_PAYLOADMBAP頭已完整Length已知正在等待剩余PDU數(shù)據(jù)。STATE_COMPLETE一個(gè)完整ADU已就緒可以交給業(yè)務(wù)處理。但狀態(tài)機(jī)不一定非要顯式地用switch-case實(shí)現(xiàn)。另一種更輕量的做法是每次recv之后用一個(gè)while循環(huán)檢查緩沖區(qū)里可讀數(shù)據(jù)量是否 6如果是讀取Length然后檢查可讀數(shù)據(jù)量是否 6 Length如果是說(shuō)明一個(gè)完整ADU就緒解析并移動(dòng)讀指針繼續(xù)循環(huán)如果不足跳出循環(huán)等待下一次recv。這種寫法本質(zhì)上是一個(gè)隱式狀態(tài)機(jī)代碼更簡(jiǎn)潔而且不需要維護(hù)狀態(tài)變量。我最終采用的就是這種方案因?yàn)樗銐蚝?jiǎn)單而且不容易出錯(cuò)。4.2 處理“半截Length”的邊界情況一個(gè)字節(jié)都不能錯(cuò)隱式狀態(tài)機(jī)雖然簡(jiǎn)潔但有一個(gè)邊界情況必須小心當(dāng)緩沖區(qū)里可讀數(shù)據(jù)量 6但Length字段的值導(dǎo)致6 Length超過(guò)緩沖區(qū)容量時(shí)怎么辦比如Length2536253259而緩沖區(qū)只有256字節(jié)那這個(gè)ADU永遠(yuǎn)無(wú)法完整放入緩沖區(qū)。這時(shí)候你有兩個(gè)選擇要么把緩沖區(qū)擴(kuò)大到至少260字節(jié)要么在檢測(cè)到Length過(guò)大時(shí)主動(dòng)斷開(kāi)連接或返回異常。ModbusTCP協(xié)議規(guī)定最大ADU是260字節(jié)所以緩沖區(qū)至少260字節(jié)是硬性要求。我建議直接開(kāi)到512字節(jié)或1024字節(jié)留足余量。另一個(gè)邊界情況是緩沖區(qū)里可讀數(shù)據(jù)量 6但Length字段的值是0或者大于253。Length0意味著沒(méi)有PDU這在ModbusTCP里是非法的因?yàn)橹辽僖泄δ艽a。Length253也是非法的因?yàn)镻DU最大253字節(jié)。遇到這種情況應(yīng)該丟棄整個(gè)緩沖區(qū)或者重置連接因?yàn)檫@說(shuō)明數(shù)據(jù)流已經(jīng)錯(cuò)位了繼續(xù)解析只會(huì)越錯(cuò)越離譜。我在代碼里加了一個(gè)校驗(yàn)如果Length 2 || Length 254直接清空緩沖區(qū)并關(guān)閉連接。注意Length1是合法的嗎Length1意味著只有單元標(biāo)識(shí)符沒(méi)有PDU這也是非法的因?yàn)楣δ艽a至少1字節(jié)。所以Length最小是2單元標(biāo)識(shí)符功能碼。最大是254實(shí)際上PDU最大253字節(jié)加上單元標(biāo)識(shí)符1字節(jié)Length最大254。但ModbusTCP規(guī)范里說(shuō)最大ADU是260字節(jié)MBAP頭7字節(jié)所以PDU最大253字節(jié)Length1253254。所以Length的范圍是2到254。4.3 解析完成后的回調(diào)設(shè)計(jì)如何把ADU交給業(yè)務(wù)層當(dāng)檢測(cè)到一個(gè)完整ADU后你需要把它從環(huán)形緩沖區(qū)里取出來(lái)交給業(yè)務(wù)層處理。取出的方式有兩種一種是拷貝到一個(gè)臨時(shí)數(shù)組然后調(diào)用回調(diào)函數(shù)另一種是直接傳指針和長(zhǎng)度但環(huán)形緩沖區(qū)里的數(shù)據(jù)可能跨越末尾所以指針可能不連續(xù)。為了簡(jiǎn)化業(yè)務(wù)層我通??截惖揭粋€(gè)256字節(jié)的臨時(shí)數(shù)組里然后調(diào)用modbus_handle_adu(temp, adu_len)??截惖拈_(kāi)銷很小因?yàn)锳DU最大260字節(jié)memcpy一次也就幾百納秒。業(yè)務(wù)層處理完后返回響應(yīng)響應(yīng)再通過(guò)TCP發(fā)回去。注意響應(yīng)發(fā)送時(shí)也要考慮TCP分片但發(fā)送端的分片由LwIP處理你只需要保證一次send發(fā)送完整響應(yīng)即可。如果響應(yīng)超過(guò)MSSLwIP會(huì)自動(dòng)分片接收端上位機(jī)會(huì)自己拼接這不屬于我們討論的范圍?;卣{(diào)設(shè)計(jì)還有一個(gè)細(xì)節(jié)事務(wù)標(biāo)識(shí)符。ModbusTCP的事務(wù)標(biāo)識(shí)符由客戶端生成服務(wù)端必須在響應(yīng)里原樣返回。所以你在解析ADU時(shí)要把前2字節(jié)的事務(wù)標(biāo)識(shí)符保存下來(lái)響應(yīng)時(shí)填回去。這個(gè)字段在MBAP頭里解析時(shí)順手就拿到了。5. 實(shí)測(cè)調(diào)優(yōu)從“偶爾丟幀”到“連續(xù)72小時(shí)零丟包”5.1 壓力測(cè)試環(huán)境的搭建用Python模擬惡劣網(wǎng)絡(luò)為了驗(yàn)證分片緩存的健壯性我搭了一個(gè)測(cè)試環(huán)境PC上跑Python腳本用socket發(fā)送ModbusTCP請(qǐng)求但故意把請(qǐng)求拆成多個(gè)TCP段發(fā)送中間加隨機(jī)延遲。比如一個(gè)12字節(jié)的請(qǐng)求先發(fā)5字節(jié)sleep 10ms再發(fā)7字節(jié)。這樣ESP32端就會(huì)經(jīng)歷“半截頭”和“半截PDU”的情況。同時(shí)我還模擬粘包連續(xù)發(fā)送三個(gè)請(qǐng)求中間不加延遲讓TCP層合并成一個(gè)段。Python腳本的核心邏輯如下import socket import time import struct def send_fragmented(sock, adu, frag_size, delay): for i in range(0, len(adu), frag_size): sock.send(adu[i:ifrag_size]) time.sleep(delay) # 構(gòu)造讀保持寄存器請(qǐng)求 def build_request(tid, unit, start, count): pdu struct.pack(BHH, 0x03, start, count) length len(pdu) 1 mbap struct.pack(HHHB, tid, 0, length, unit) return mbap pdu s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((192.168.1.100, 502)) req build_request(1, 1, 0, 10) # 分片發(fā)送每片3字節(jié)延遲5ms send_fragmented(s, req, 3, 0.005) # 再發(fā)一個(gè)粘包請(qǐng)求 req2 build_request(2, 1, 0, 10) req3 build_request(3, 1, 0, 10) s.send(req2 req3) # 粘包這個(gè)腳本跑起來(lái)后ESP32端如果分片緩存沒(méi)做好立刻就會(huì)出錯(cuò)。我最初用線性緩沖區(qū)時(shí)這個(gè)腳本跑不到100個(gè)請(qǐng)求就掛了。換成環(huán)形緩沖區(qū)隱式狀態(tài)機(jī)后連續(xù)跑了72小時(shí)零丟包。5.2 緩沖區(qū)大小的實(shí)測(cè)數(shù)據(jù)512字節(jié) vs 1024字節(jié) vs 2048字節(jié)我分別在512、1024、2048三種緩沖區(qū)大小下做了測(cè)試每種跑24小時(shí)統(tǒng)計(jì)丟包率和CPU占用率。測(cè)試條件是每秒100個(gè)請(qǐng)求其中30%是分片請(qǐng)求20%是粘包請(qǐng)求50%是正常請(qǐng)求。結(jié)果如下緩沖區(qū)大小丟包率平均CPU占用最大CPU占用內(nèi)存剩余512字節(jié)0.02%12%28%180KB1024字節(jié)0%11%25%179KB2048字節(jié)0%11%24%178KB512字節(jié)時(shí)丟包率0.02%雖然很低但確實(shí)有丟包。分析日志發(fā)現(xiàn)當(dāng)連續(xù)多個(gè)大ADU粘包時(shí)512字節(jié)緩沖區(qū)偶爾會(huì)滿導(dǎo)致recv無(wú)法接收新數(shù)據(jù)TCP窗口關(guān)閉上位機(jī)超時(shí)。1024字節(jié)后丟包率降為0。2048字節(jié)和1024字節(jié)差別不大但內(nèi)存多占1KB。所以我的建議是至少1024字節(jié)推薦2048字節(jié)。對(duì)于ESP32-S3這種內(nèi)存充足的芯片直接上2048對(duì)于ESP32-C31024也夠用。5.3 和LwIP參數(shù)的聯(lián)動(dòng)調(diào)優(yōu)TCP_WND與TCP_MSS的取舍緩沖區(qū)大小只是應(yīng)用層的事LwIP的參數(shù)也會(huì)影響分片行為。我試過(guò)把TCP_WND從5744調(diào)到8192發(fā)現(xiàn)粘包概率略有增加因?yàn)榻邮沾翱诖罅薚CP層可以緩沖更多數(shù)據(jù)一次recv返回的數(shù)據(jù)量更大。但這對(duì)分片緩存來(lái)說(shuō)不是壞事因?yàn)榄h(huán)形緩沖區(qū)能處理任意大小的數(shù)據(jù)。真正需要注意的是TCP_MSS如果把它調(diào)小到536分片會(huì)更頻繁但每個(gè)分片更小環(huán)形緩沖區(qū)的壓力反而小。不過(guò)536會(huì)導(dǎo)致TCP效率降低因?yàn)槊總€(gè)段攜帶的數(shù)據(jù)少頭部開(kāi)銷占比大。所以我的建議是保持默認(rèn)的1460不要?jiǎng)?。還有一個(gè)參數(shù)是TCP_SND_BUF它影響發(fā)送響應(yīng)時(shí)的緩沖。如果你返回的響應(yīng)很大比如讀125個(gè)寄存器響應(yīng)259字節(jié)TCP_SND_BUF至少要能容納這個(gè)響應(yīng)。默認(rèn)5744足夠。但如果你的應(yīng)用要返回大量數(shù)據(jù)比如一次性返回1000個(gè)寄存器這不符合Modbus規(guī)范但有些人會(huì)這么干那就需要調(diào)大。6. 那些文檔里不會(huì)寫的坑事務(wù)標(biāo)識(shí)符錯(cuò)位與單元標(biāo)識(shí)符陷阱6.1 事務(wù)標(biāo)識(shí)符不匹配導(dǎo)致的“幽靈響應(yīng)”事務(wù)標(biāo)識(shí)符是ModbusTCP里用來(lái)匹配請(qǐng)求和響應(yīng)的。客戶端發(fā)請(qǐng)求時(shí)帶一個(gè)TID服務(wù)端響應(yīng)時(shí)必須原樣返回。如果你在分片緩存里把TID搞錯(cuò)了客戶端就會(huì)認(rèn)為響應(yīng)不屬于自己從而丟棄。更隱蔽的是如果多個(gè)請(qǐng)求粘包你解析第一個(gè)ADU時(shí)用了第二個(gè)ADU的TID那么第一個(gè)響應(yīng)就會(huì)帶錯(cuò)誤的TID客戶端匹配不上而第二個(gè)響應(yīng)又帶第一個(gè)的TID整個(gè)就亂了。我在早期代碼里就犯過(guò)這個(gè)錯(cuò)解析ADU時(shí)TID是從緩沖區(qū)讀的但讀指針移動(dòng)后下一個(gè)ADU的TID又讀到了結(jié)果響應(yīng)時(shí)用的TID是上一個(gè)ADU的。后來(lái)我改成每解析一個(gè)ADU先把TID保存到一個(gè)局部變量然后立即構(gòu)造響應(yīng)響應(yīng)里用這個(gè)局部變量。這樣就不會(huì)錯(cuò)位。6.2 單元標(biāo)識(shí)符在網(wǎng)關(guān)場(chǎng)景下的特殊處理單元標(biāo)識(shí)符Unit ID在直連場(chǎng)景下通常固定為1或0xFF但在網(wǎng)關(guān)場(chǎng)景下它用來(lái)區(qū)分不同的從站設(shè)備。比如一個(gè)ModbusTCP轉(zhuǎn)ModbusRTU的網(wǎng)關(guān)TCP端的Unit ID對(duì)應(yīng)RTU端的從站地址。如果你在分片緩存里把Unit ID丟了網(wǎng)關(guān)就不知道把請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)RTU設(shè)備。所以解析ADU時(shí)Unit ID也要保存。而且響應(yīng)時(shí)Unit ID必須和請(qǐng)求一致。有些網(wǎng)關(guān)實(shí)現(xiàn)里Unit ID0xFF表示廣播不響應(yīng)。這些細(xì)節(jié)在分片緩存里都要考慮到因?yàn)榉制赡軐?dǎo)致Unit ID被拆到兩個(gè)TCP段里如果你不緩存就會(huì)讀到錯(cuò)誤的值。6.3 異常響應(yīng)Exception Response的長(zhǎng)度計(jì)算ModbusTCP的異常響應(yīng)格式是功能碼 | 0x80異常碼。PDU長(zhǎng)度是2字節(jié)加上單元標(biāo)識(shí)符1字節(jié)Length3ADU總長(zhǎng)9字節(jié)。這個(gè)長(zhǎng)度很短通常不會(huì)分片。但如果你在解析請(qǐng)求時(shí)發(fā)現(xiàn)功能碼不支持需要返回異常響應(yīng)這時(shí)候要注意異常響應(yīng)的Length字段是3而不是請(qǐng)求的Length。我見(jiàn)過(guò)有人直接把請(qǐng)求的Length填到異常響應(yīng)里導(dǎo)致客戶端解析錯(cuò)誤。所以構(gòu)造響應(yīng)時(shí)Length要重新計(jì)算不能復(fù)用請(qǐng)求的。7. 代碼骨架一個(gè)可復(fù)用的分片緩存實(shí)現(xiàn)7.1 環(huán)形緩沖區(qū)的C實(shí)現(xiàn)讀寫指針與count下面是我在實(shí)際項(xiàng)目中用的環(huán)形緩沖區(qū)實(shí)現(xiàn)精簡(jiǎn)后大概80行。核心是rb_write和rb_read兩個(gè)函數(shù)以及rb_peek用于不移動(dòng)讀指針地查看數(shù)據(jù)。typedef struct { uint8_t *buf; uint32_t size; uint32_t read; uint32_t write; uint32_t count; } ringbuf_t; void rb_init(ringbuf_t *rb, uint8_t *buf, uint32_t size) { rb-buf buf; rb-size size; rb-read 0; rb-write 0; rb-count 0; } uint32_t rb_write(ringbuf_t *rb, const uint8_t *data, uint32_t len) { uint32_t space rb-size - rb-count; if (len space) len space; for (uint32_t i 0; i len; i) { rb-buf[rb-write] data[i]; rb-write (rb-write 1) % rb-size; } rb-count len; return len; } uint32_t rb_peek(ringbuf_t *rb, uint8_t *data, uint32_t len) { if (len rb-count) len rb-count; uint32_t r rb-read; for (uint32_t i 0; i len; i) { data[i] rb-buf[r]; r (r 1) % rb-size; } return len; } void rb_consume(ringbuf_t *rb, uint32_t len) { if (len rb-count) len rb-count; rb-read (rb-read len) % rb-size; rb-count - len; }注意rb_write里用了循環(huán)逐字節(jié)寫這在數(shù)據(jù)量大時(shí)效率不高。實(shí)際項(xiàng)目中我會(huì)優(yōu)化成兩段memcpy但為了邏輯清晰這里保留逐字節(jié)版本。如果你追求性能可以改成uint32_t rb_write(ringbuf_t *rb, const uint8_t *data, uint32_t len) { uint32_t space rb-size - rb-count; if (len space) len space; uint32_t first rb-size - rb-write; if (first len) first len; memcpy(rb-buf rb-write, data, first); if (len first) { memcpy(rb-buf, data first, len - first); } rb-write (rb-write len) % rb-size; rb-count len; return len; }7.2 解析循環(huán)while Length判斷解析循環(huán)放在recv之后每次recv把數(shù)據(jù)寫入環(huán)形緩沖區(qū)然后調(diào)用modbus_parse。modbus_parse里用一個(gè)while循環(huán)不斷檢查是否有完整ADU。void modbus_parse(ringbuf_t *rb) { while (1) { if (rb-count 6) break; // 連MBAP頭都不夠 uint8_t header[6]; rb_peek(rb, header, 6); uint16_t length (header[4] 8) | header[5]; if (length 2 || length 254) { // 非法Length清空緩沖區(qū) rb_consume(rb, rb-count); break; } uint32_t adu_len 6 length; if (rb-count adu_len) break; // 數(shù)據(jù)不夠等下一次recv uint8_t adu[260]; rb_peek(rb, adu, adu_len); rb_consume(rb, adu_len); modbus_handle_adu(adu, adu_len); } }這個(gè)循環(huán)的關(guān)鍵是每次只peek不consume直到確認(rèn)有完整ADU才consume。這樣即使數(shù)據(jù)分片也不會(huì)丟失。7.3 與FreeRTOS任務(wù)的結(jié)合優(yōu)先級(jí)與棧大小在ESP32上ModbusTCP通常跑在一個(gè)獨(dú)立的FreeRTOS任務(wù)里。這個(gè)任務(wù)的優(yōu)先級(jí)建議設(shè)為5比WiFi任務(wù)低比空閑任務(wù)高棧大小建議4096字節(jié)。因?yàn)榻馕鯝DU時(shí)會(huì)在棧上開(kāi)260字節(jié)的臨時(shí)數(shù)組加上函數(shù)調(diào)用開(kāi)銷4096足夠。如果你在解析里還要做復(fù)雜業(yè)務(wù)比如讀寫Flash棧要再大一些。任務(wù)里用recv阻塞接收超時(shí)設(shè)為100ms這樣即使沒(méi)有數(shù)據(jù)任務(wù)也能周期性醒來(lái)檢查其他事件。void modbus_task(void *arg) { ringbuf_t rb; uint8_t buf[2048]; rb_init(rb, buf, sizeof(buf)); while (1) { uint8_t temp[512]; int len recv(sock, temp, sizeof(temp), 100); if (len 0) { rb_write(rb, temp, len); modbus_parse(rb); } } }注意recv的超時(shí)參數(shù)在LwIP里是毫秒但實(shí)際精度可能受FreeRTOS tick影響。如果tick是10ms超時(shí)100ms就是10個(gè)tick。這個(gè)精度對(duì)ModbusTCP來(lái)說(shuō)足夠了。8. 從單連接到多連接分片緩存的擴(kuò)展思路8.1 每個(gè)連接獨(dú)立緩沖區(qū)還是共享緩沖區(qū)ModbusTCP服務(wù)端通常支持多個(gè)客戶端連接。每個(gè)連接都有自己的TCP流所以分片緩存必須是每連接獨(dú)立的。如果你用一個(gè)全局緩沖區(qū)多個(gè)連接的數(shù)據(jù)會(huì)混在一起Length字段完全對(duì)不上。所以每個(gè)連接需要獨(dú)立的ringbuf_t和解析狀態(tài)。在ESP32上如果同時(shí)有5個(gè)連接每個(gè)連接2KB緩沖區(qū)那就是10KB對(duì)于S3來(lái)說(shuō)沒(méi)問(wèn)題對(duì)于C3來(lái)說(shuō)有點(diǎn)緊張。這時(shí)候可以減小緩沖區(qū)到512字節(jié)但前面實(shí)測(cè)512字節(jié)有0.02%丟包率所以需要權(quán)衡。我的建議是如果連接數(shù)不超過(guò)3個(gè)每個(gè)連接1KB如果連接數(shù)更多考慮用512字節(jié)但要把LwIP的TCP_WND調(diào)小減少粘包概率。8.2 連接斷開(kāi)時(shí)的緩沖區(qū)清理與內(nèi)存泄漏防范連接斷開(kāi)時(shí)必須釋放該連接的緩沖區(qū)。如果你用malloc動(dòng)態(tài)分配記得free。如果用的是靜態(tài)數(shù)組記得重置read/write/count。我見(jiàn)過(guò)有人在連接斷開(kāi)后沒(méi)有重置count導(dǎo)致下一次連接進(jìn)來(lái)時(shí)緩沖區(qū)里還有舊數(shù)據(jù)解析直接錯(cuò)位。所以每次accept新連接時(shí)都要調(diào)用rb_init重新初始化。另外如果連接異常斷開(kāi)比如RSTrecv會(huì)返回-1這時(shí)候也要清理。8.3 和ModbusRTU轉(zhuǎn)TCP網(wǎng)關(guān)的差異Unit ID路由表如果你做的是ModbusRTU轉(zhuǎn)TCP網(wǎng)關(guān)分片緩存之后還要根據(jù)Unit ID查路由表把PDU轉(zhuǎn)發(fā)到對(duì)應(yīng)的RTU串口。這時(shí)候Unit ID的解析必須準(zhǔn)確而且路由表要支持動(dòng)態(tài)添加。我通常用一個(gè)簡(jiǎn)單的數(shù)組每個(gè)元素是{unit_id, uart_port}查找時(shí)線性遍歷。如果Unit ID很多可以用哈希表但在ESP32上線性遍歷幾十個(gè)元素的開(kāi)銷可以忽略。9. 我踩過(guò)的三個(gè)坑和對(duì)應(yīng)的修復(fù)方案9.1 坑一recv返回0被當(dāng)成正常數(shù)據(jù)TCP的recv返回0表示對(duì)端關(guān)閉了連接。我早期代碼里沒(méi)有判斷l(xiāng)en0直接把0字節(jié)寫入環(huán)形緩沖區(qū)然后繼續(xù)解析。結(jié)果緩沖區(qū)里一直是舊數(shù)據(jù)解析循環(huán)無(wú)限循環(huán)因?yàn)閏ount沒(méi)變但while條件一直滿足。后來(lái)加了判斷如果len0關(guān)閉連接清理緩沖區(qū)。如果len0根據(jù)errno判斷是超時(shí)還是錯(cuò)誤超時(shí)就繼續(xù)錯(cuò)誤就關(guān)閉。9.2 坑二Length字段字節(jié)序搞反ModbusTCP的Length字段是網(wǎng)絡(luò)字節(jié)序大端。我一開(kāi)始用length header[4] | (header[5] 8)結(jié)果Length值完全錯(cuò)誤導(dǎo)致解析出的ADU長(zhǎng)度不對(duì)。后來(lái)改成length (header[4] 8) | header[5]問(wèn)題解決。這個(gè)坑很低級(jí)但在調(diào)試時(shí)很容易忽略因?yàn)樽グ吹降腖ength是正常的但代碼里讀出來(lái)是反的。9.3 坑三環(huán)形緩沖區(qū)滿時(shí)recv阻塞導(dǎo)致看門狗復(fù)位當(dāng)環(huán)形緩沖區(qū)滿時(shí)如果你還繼續(xù)recv數(shù)據(jù)會(huì)丟失。但如果你不recvTCP窗口會(huì)關(guān)閉對(duì)端發(fā)不過(guò)來(lái)。我早期代碼里在緩沖區(qū)滿時(shí)直接return不recv結(jié)果任務(wù)一直不阻塞CPU占用100%看門狗復(fù)位。后來(lái)改成如果緩沖區(qū)剩余空間小于某個(gè)閾值比如256字節(jié)就主動(dòng)consume一些已解析的數(shù)據(jù)但已解析的數(shù)據(jù)已經(jīng)consume了或者臨時(shí)擴(kuò)大緩沖區(qū)。實(shí)際上只要解析循環(huán)及時(shí)consume緩沖區(qū)很少會(huì)滿。如果真的滿了說(shuō)明解析速度跟不上接收速度這時(shí)候應(yīng)該降低recv的頻率或者增加任務(wù)優(yōu)先級(jí)。10. 寫在最后一些個(gè)人經(jīng)驗(yàn)分片緩存這件事說(shuō)到底是“不要相信一次recv就能拿到完整消息”。這個(gè)原則不僅適用于ModbusTCP也適用于任何基于TCP的自定義協(xié)議。我在ESP32上做過(guò)的項(xiàng)目中凡是涉及TCP的我都會(huì)加一層分片緩存哪怕協(xié)議本身很簡(jiǎn)單。因?yàn)閃iFi環(huán)境的不確定性遠(yuǎn)高于有線以太網(wǎng)你永遠(yuǎn)不知道下一個(gè)recv會(huì)返回多少字節(jié)。另外調(diào)試分片問(wèn)題時(shí)抓包工具是必不可少的。我通常用Wireshark抓PC端的包同時(shí)用ESP32的日志打印每次recv的字節(jié)數(shù)和緩沖區(qū)狀態(tài)。兩邊對(duì)照很快就能定位是分片還是粘包。如果你沒(méi)有抓包條件也可以在代碼里加一個(gè)簡(jiǎn)單的統(tǒng)計(jì)記錄每次recv的字節(jié)數(shù)分布如果發(fā)現(xiàn)經(jīng)常出現(xiàn)小于10字節(jié)的recv那說(shuō)明分片很嚴(yán)重需要檢查L(zhǎng)wIP參數(shù)或WiFi信號(hào)。最后關(guān)于緩沖區(qū)大小我的經(jīng)驗(yàn)是寧大勿小。ESP32-S3有512KB SRAM開(kāi)2KB緩沖區(qū)連零頭都不到。與其為了省1KB內(nèi)存而冒丟包的風(fēng)險(xiǎn)不如直接開(kāi)大一點(diǎn)。畢竟在現(xiàn)場(chǎng)調(diào)試時(shí)丟一個(gè)包可能就要折騰半天而內(nèi)存省下來(lái)也沒(méi)別的用途。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲第一男人天堂| 青女偷拍网| 亚洲 一区二区 自拍| 欧美性综合| 99久久综合网| 夜夜人妻爽| av婷婷色婷婷色六月| 中文一区二区三区影院| 久久中文字幕女同性恋一区| 懂色综合久久久| 精品九九国产无码| 白丝一区| 日韩精品三级| 91精品操美女| 女人的天堂大香蕉网| 丝袜AV一二三区| 亚洲AV秘 精品久久老牛影视| 欧美激情1区| 搞中出视频在线观看| 美女诱惑1区2区| 九月丁香综合网| 后入式免费视频| 高清孕妇孕交 交孕妇| 青青草原人妻| 91在线页| 九九九久千久久激情蜜桃在线看 | 久久仑合| 大香蕉伊人在线成人AV在线观看| 色色五月婷| 啪啪视频亚洲第一| 国产精品国产亚洲区艳妇糸列| 久久人体一区二区| 东京热大香焦| 蜜臀久久99精品| 色狠狠综合噜一二三区| 亚洲国产精品久久久久婷婷青年| 五月天婷婷激情| 噜噜吧,噜噜色,噜噜| 操逼网站视频漫画国产| 天堂中文日本在线观看| 播播亚洲小说亚洲| 另类在线| 女人香蕉久久毛毛片精品| 日韩情色AV| 婷婷成人久久久精品| 丁香五月激情网| 色欲日韩欧美在线一区| 中文字幕永久在线| 亚 欧 美 综合| 丁香六月婷婷综合| 欧美熟爽综合| 亚洲欧美九九九| 美女的肌被草喷水视频| 夜夜无码| 中文久久| 2017人人操,人人摸| 在线免费观看高清无码视频| 性爱免费视频成人| 少妇免费视频| 久久久久78| 久草久日| 久久久久久九九九| 国内亚洲高清无码| 18禁的网站在线| 偷窥自拍A片| 激情五月综合网| 97在线国产精品| 欧美日韩免费专区在线| 天天干1区2区在线| 性色AV蜜色av色欲av| 一区二区三区在线美女| av无码精品久久久久| 丁香五月综合| 蜜臀va69| 亚洲少妇视频| 亚洲天堂,男人| 精品欧美老熟女一二区| yazhouzaixian| 欧美午夜色妇色鬼| 9九九九九视频在线观看| 欧美人人曰人人操人人射射| 熟妇女伦乱视频| 青青欧洲黑| 好吊色综合| 都市激情人妻一区二区青青操视频| 五月丁香综合啪啪| 国产尹人在线视频免费| 久久首页| 私人尤物在线精品不卡| 久久久性爱| 美女网站黄页| 久久九操在线观看| 极品后入免费视频| 综合 青草 伊久久 影院 综合| 久久99久久99久久99人受| 都市久久精品激情亚洲| 校园春色亚洲| 麻豆成人影音在线| 亚州欧美在线| 伊人天天久久动态图| 国产熟女高潮一区二区三区| 91久久久视| 精品区9| 综合久久中文字幕综合日韩精品| 国产精品爽爽v| se吧提供国产乱老熟视频胖女人| 人妻9117c| 久久成年片色大黄全免费网站| 亚洲日韩97| 97频视在线| 青青草视频久久久久| 中文字幕日韩综合| 欧美拳交在线播放| 中文字幕 码 自拍 视频 区| 亚洲日韩一区电影| 91丝袜激情在线| 欧美三级免费伊人| 少妇一区二区三区高速| 久久五十路熟女人妻| 特级特黄一级毛片免费| 色五月综合| 亚洲超碰在线| 大香蕉色十月| 操逼精品视频| 欧美韩日精品资源| 天天影视综合色| 情色大香蕉| 992视频一区| 日逼97| 欧美不卡五十路| 欧美成熟性爱精品| 欧美日韩亚洲一区二区在线观看| 萌白酱自拍视频| 国产97视频免费观看| 国产AV毛片| 中文字幕亚韩| 天天爽爽爽爽| 夜夜狠狠躁日日躁色视频| 亚洲免费97免费| 九久久精品| 国产97视频| 国产精品96| 俺去啦俺来也久久综合| 国产午夜激片Av毛片不卡| aaaa少妇高潮大片| 夜夜肏2021| 亚洲国成人情色好看电影| 中文字幕精品久久久久人妻红杏ⅰ| 超碰97最新人妻| 91n免费处女| 日本一级特级毛片视频| 日本欧美亚洲高清在线看| 国产日韩欧美三级片| 日本久久久久久久久| 亚洲中文字幕乱码无码一区二区| 日本中文字幕一区| 99在线精品视频| 一个色导综合| 欧美图片偷拍| 日韩特一级久久| 99av| 色婷婷电影网| 九九九九九九九九九五码| 国产午夜精品一区二区三区牛牛| 肏逼视频日本| 丁香九月激情啪| 黄总AV色图| 91美女视频直播| 中国农村熟妇毛片视频| 骚货人妻偷情自拍在线视频| 日韩欧美女求操每天更新| 日韩乱伦AⅤ| 色情综合| 精吧天堂| 内射小黄片| 99婷婷| 中文一区在线日| 熟妇女伦乱视频| 美女黄频a美女大全免费皮| 日韩AV一区二区三区三州三州| 伦理日韩国产久久| 日韩精品在线放| 920日本午夜免费| 婷婷精品国产欧美精品亚洲人人爽| 久久产精品一区二区三区电影| 五月婷丁香| av 模特一区了| 亚洲日韩精品久久久久一区壹牛| 日本超碰在线国产一区| 极品肉射| 九色97| 老熟女综合网 | 秋霞男人网| 大香蕉视频啪啪啪啪| 看一级特黄a大一片| 九九九久久久久| 欧美人黑A片无码免视费| 91色婷婷综合久久中文字幕二区| 色九九九综合| 狠狠中文字幕| 久久久久久久9最新免费视频观看| 精品亚洲成人免费在线| 亚洲国产精品久久久男人的天堂| 极品销魂美女一区二区| 不卡九肏| 欧美亚洲一级在线观看| 久久久111| 中文字幕国产| 欧美影音在线| 色色色99| 中国熟妇| 中文字幕一区 二区三四五 区日 日骚| 欧美性高潮| www色色com| 97久久天天综合色天天综合色电影| 免费一级性爱久久| 色踪合AV| 成年女人18级毛片毛片免费观看| 蜜臀99久久国产| 精品国产乱码久久久久久久久1 | 人妻少妇久久| 精品少妇一区二区三区在线视频| 床戏久久久av一区二区麻豆| 日本福利社| 亚洲视频精选| 麻豆区99999| 国产综合日韩伦理| 爽爽爽免费视频| 亚洲国产成人福利在线观看| 伊人少妇久久久| 人、人、摸,人、人、草| chaopen97久久| 丁香激情五月| 午夜视频好爽啊| 伊人久久亚洲色欲综合网站 | V A在线| 久久夜色一区二区| 黄在线| 天天久久| 熟女欧美日韩综合婷婷| 99久久久无码国产精品性男| 97超碰欧美精品| 黄色大片一区二区密桃丝袜| 秋霞成人做爱| 欧色网址| 激情四射五月天| 国产三级电影免费观看| 蜜臀视频网站| 99re在线精品78| 久久久婷婷| 国产黄色小视频网站| AV久日| 夜夜操天| 亚洲精品aa久久伊人| 78精品| 九九拍拍精品视频在线播放| 五月激情小说| 免费精品中文字幕| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 日韩亚洲欧美中文字幕| 超碰98综合网| 国产欧美日韩女同性恋ww喷水精品 | 99黄页网站| 久久天堂婷婷网| av在线不卡一区二区三区| 久久久无码精品人妻二区| 久久一留热品黄| 国产97视频免费观看| 亚洲日韩国产精品| 乱伦强奸区日韩| 日韩综合色网| 国产肏屁眼视频| 另类小说五月天| 天天狠操| 精品久久久久久无码| 好爽视频在线观看| 欧美日日人人天天| 97公开久久| 99精品无码| 无码精品一区二区三区潘金莲| 97超碰色色| 少妇人妻在线| 黄色av播放免不| 国产熟妇一区二区| 厕所偷拍在线| 亚洲最大黄网| 女色视频社区| 中文高清一区二区的| 欧美 亚洲 偷拍自拍| 中文字幕人成乱码熟女香港| 强奸乱伦AV网站| 我要去看2个日本美女.com曹逼| 男人的天堂视频精品乱在线| 人人澡人人澡人人| 久久华人网| 亚洲第2页| 影音先锋少妇| 欧美五十路熟| 日逼视频日本| 操逼www.| 啪一啪免费视频| 国产成年免费大片黄在线观看| 人妻少妇久久中文字幕一区二区 麻豆| 天美传媒精品久久视频| 成人区人妻精品一| 九九九九精品视频| 日韩精品在线放| 欧美性爱精品七区| 国产 日韩 欧美高清| 国产在线观看91精品一区| 亚洲无无码αⅴ每日更新| 国产成人亚洲精品无码最新在线| 乱操乱伦AV| 97人人夜夜精品视频| 男女激烈网站最新| 欧美亚洲中文字幕| 五月婷婷综合激情| 精品久久久久久亚洲| 青青草原人妻| 天天碰操中国年青熟妇| 精品人妻一二三四区视频| 亚洲AV不卡在线观看| 欧美色吧综合| 国产无码三级视频在线观看| 国产高清成人mv在线观看| 日韩乱插| 久久男人的天堂国产| 涩爱AV在线| 亚洲Av噜噜一区二区三区妖精| 欧美夜夜骑视频| 天天性射网| 美女诱惑久久| 天天操人人操狠狠插| 成人亚欧免费视频| 免费视频在线观看啊啊啊啊啊| 欧美精品丝袜久久久中文字幕| 午夜福利在线视频1000| 亚洲国产亚洲天堂| 成人精品无码| 日韩人妻一区二区精品| 欧美大香蕉卡久久| 久久综合av| 欧美大的香蕉有线电视视频| 国产美女裸体秘 永久无遮挡| 久久成人午夜精品影院 | 插入逼91| 精品国产www久久| 视频二区美腿丝袜制服人妻欧美 | 久热这里| 欧美青青草视频| 亚洲丝袜诱惑| 亚洲综合小说另类图欧美视频激情小说色五月天 | 日本不卡高清免v欧美日韩在线观看| 1204av韩国| 大粗鳼巴久久久久| 青青操狠狠撩| 国产精品乱码久久久久久久久久久久| 97中文热色| 操日韩第| 中国黑人三级片网站上区| 美女黄色91| 亚洲无码成人精品| 国产乱码久久| 97超碰精品图片| www.99中文字幕| 玖玖综合.com| 中文字幕一品色图| av强奸乱轮| 成 人 影视 一区 二区 三区 四区| 日韩精品三级片长长久久| 97碰| 啊啊啊啊一区| 国产精品久久久久9999小说| 人人人人插| 色爱综合网欧美| 麻豆视频一区二区| 91操人视频| 亚洲欧洲无码一区夜| 超碰免费人妻人人| 久久女人视频| 国产老太乱伦一区| 成人在线视频二区| av黄图片在线观看| 嗯嗯嗯啊啊啊在线免费观看| 99re视频在线播放青草| 曰韩成人免费视频| 婷婷五月天色网| 国产探花精品在线| 欧美色图 人妻| WWW操逼| 人人摸人人干| 狠狠久久手机视频精品| wwe 天天干.com| 亚洲情色综合| 一区 欧美 日韩 麻豆| 日本一区二区中文字幕久久| 人人爽夜夜操| 亚洲免费成人在线高清无码视频| 日本加靬比网站发布页| A片大香蕉在线| 精品999999| 欧美在线官网| 亚洲电影中字一区二区| 国产熟女二区| 男人高清无码一区二区| 中文熟女五十乱码在线| 99自拍视频在线观看| 91无码精品| 亚洲成人碰碰| 久久中文字幕不卡人妻| 日夜久久久九九九久| ji熟女.com| 亚av顶级裸体一区二区三区四区五区 | 在线视频五十市| 人人人摸人人| 精品中文一区二区| 99热9| 天天看天天日天天操| 欧美性后入| 中国国产精品一区视频| 超碰在线综合97| 亚洲综合在线视频| 青娱乐999| 丝袜视频一区二区在线播放国产中文| 18禁美女裸体无遮挡啪啪| 国产精品动态一区二区三区四四| 亚洲成人碰碰| 操B视频日韩无码| 国产妇女精品视频青青草| 欧美一级黄色18片免费看| 婷婷人妻激情| 国产60区。| 成人性爱高清视频免费看| 日韩三级av片| 蜜桃精品视频一区| 久久婷婷精品| 国产成年女人免费视频播放a| 九九九九九九免费视频| 日本免费一区二| AV污污污污| 色综合98| 日本人人操人人操| 人人搞人人插人人操| 熟女一区二区三区| 欧美男人一区| 郑州宾馆老熟女露脸啪啪| 中国少妇啪啪视频| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 九九九九精品一区| http://qxhbdz.com| 操逼片中文| 久久婷婷电影网| 亚洲精品久久久久久| 一道本东京热加勒比一区二区三区| 欧美黄片欧美黄片xxx| 男人天堂电影院| 亚洲大色鬼| 不卡九肏| 激情综合五月婷婷| 亚洲日韩国产欧美综合v| 百度百度日本操逼| 97国产|免费| 日韩精品电影| 亚洲日韩青青草色月| 久久久网站| 亚洲精品毛片在线观看| A级片一区| 国内精品99999| 亚洲综合一| 久草资源在线视频官方总站日韩丝袜美腿 | 无人区高清电影免费观看一区二区三 www.qmcai2.com | 一区二区三区 日韩欧美| 天堂69亚洲精品中文字| 欧美 亚洲 在线| 日韩二区三四区五区六区在线看| 精品九九九九九九九| 97精品国产97久久久久久户外免费| 国产精品青草综合久久| 国产成人精品日本视频| 亚洲一级特黄大片在线播放91| 肉动漫无遮挡h在线观看| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 学生妹天天看| 国产视频大全| 超碰69| 天美传媒AV国产在线| 亚洲欧美日韩有码| 第四色亚洲色图| 江都AV在线| 日本一区二区三区欧美日韩中文字幕| 欧美综合站| 97超碰色色| 国模不卡| 春色综合免费| 欧美后入式| 亚洲久久东京热一二三四五区视频| 人妻在线大香蕉| 天天干天天日天天射黄色片| 福利一级版子| 天美一区在线| 久久久成人免费av电影| 亚洲第一男人天堂| 蜜臀网 一区| 中文字幕视频二区| 97超碰久久| 亚洲欧美日韩制服另类| 久久国产熟女影院| 操逼片国产| 蜜乳AV一区二区三区四| 国内三级自拍小视频在线观看| 日韩不卡av一二三| 人妻AV 中文字幕的| 夜夜中出国产| 欧美狠狠弄| 久久久111| 超碰在线综合97| 97超碰9| 99无码狠狠久久| 26uuu国产亚洲综合| 草草影院日本第一页| 亚洲成?V人片在线观看福利| 丁香六月激情| 97免费视频网| 91天天爽| 欧美gv在线观看| 国产1769在线| 麻豆熟妇乱妇熟色A片在线看| 人妻91少妇| 性色AV蜜色av色欲av| 少妇一区二区三区精选| 影音先锋国产精品| juliaann精品熟女一区| 欧美色图在线视频少妇| 97亚洲欧美| 国产日韩欧美中文在线播放| 天天色播| 日韩ab网 | 精品一区二区成人| 丝袜夫妻自拍| 伊人嫩草| 最新亚洲人成网站在线影院| 色婷婷视频| 亚洲限制级| 国产免费内射视频| 乱伦av麻豆| 麻豆 欧美 日韩| 91亚洲狠狠色| 欧美日日操| 男人天堂2019亚洲| 老司机福利社视频在线观看| se吧提供国产乱老熟视频胖女人| 九月丁香婷婷| 黄色片G G G| 国产无码成人无码| www.夜夜操| 日本中文字幕熟妇| 欧美性爱第一区| 女色视频社区| 国产精品乱码久久久久久久久| 久久久久久久伊人精品| 蜜桃成人1区2区3区| 春色综合免费| 亚洲AV无码黄色强奸| 欧美亚男人的天堂| 亚洲色图 欧美| 91丨九色丨大屁股| 无码九九| AA特级绝黄| 天天看特黄的免费网站| 9色国产精品一区粉嫩| 六月丁香五月婷婷| 天天舔日美女视频| 午夜色婷婷| asc国产精品| 亚洲色图综合网| 日韩免费av片高清无码| 国产馆极品诱惑| 日韩综合色图| 六六久久日韩不卡| 在线不欧美| 激情综合五| 色香天天| 亚洲麻豆精品二区三区| 欧美激情视频一区二区| 久久五月份| 男人的天堂一区| 亚洲欧美精品91| 亚洲欧洲综合| 婷婷六月色| 久久久久久久97| 97天天爽| 国产福利电影| 日韩啪啪啪视频| 亚洲精品性爱片| 蘋果手機免費看成人Av| 人妻日日干| 亚洲色天堂九9| 99热这里是精品| 91欧美综合| 97干com| 无码人妻一区二区三区色欲aⅴ | 久热九九| 极品色| 二对二中文字幕。| 国产精品亚洲天堂网址| 亚洲日韩欧美一区二区| 熟女六十路| 熟妇女伦乱视频| 啊好大好舒服| 丁香六月激情| 狠狠97| 人妻熟女字幕一区二区| 中国AV美女| 久久高清无码夜夜操| 亚洲高清无码免费观看视频| 欧美亚洲情色| 青青草乱入乱欲视频在线观看| 夜夜影视四色| 欧美姓爱综合网| 亚洲综合性感在线| 久久草在线综合视频| 国产97免费视频| 日本不卡二三区| 色香色欲天天综合网天天来吧| 中文字幕在线免费观看 | 五月婷在线| 精品无码一区二区三区| 国产中午字一暮区| 嗯……啊…嗯嗯…啊…好舒服| 99老司机精品视频在线观看| 日日骚网站| 大香蕉在线视频重口味毛片在线| 极品极品色影院| 国产精品久久aV| 九九这里只有精品| 青久操| 色播五月婷婷| 精品无码不卡视频| 国产熟妇 码视频户外直播| a片亚洲一本通视频| 久久草草欧美精品| 久久久精品无码亚免费| 成人毛片免费| 日韩成人小视频| 99啪啪| 人妻嗯啊啊在线播放| 久久久久久国产无码精品| 啪啪综合网| 欧美伦乱| 黑人与人妻| 精品久久99| 五月天大香蕉| 亚洲砖码砖专无区2023| 韩三级a视频在线观看| 国产精品欧美在线观看 | 97AV爱| 91GD.COM| 多乙久久久久久| 伊人一区二区在线播放| 国产精品自拍视频| 999国产精品999久久久久久| 人妻黑丝袜电影| 色哟哟-国产专区| 91大胆欧美| 狼人久草| 激情久久av一区av二区av| 国产精品一区二区校花| 国产v片在线免费观看| 五十路熟女人妻一区二区在线观看| 大香交| 五十路人妻在线| 91老熟女老女人国产老太 | 久久久夜夜嗨免费视频| 亚洲av影院在线观看| 国产一区在线观看无码AV| 欧美性爱精品七区| 在线a亚洲视频播放在线| 欧美 亚洲精品首页| 亚洲AV无码成人精品久久| 岛国视频一二三区| 岛国色情视频在线观看| 午夜一区二区三区国产| 国产精品黄色三级av| 久久国产性爱| 日韩 欧美 视频 在线 一区| 萌白酱自拍视频| 一级黄色性爱A级片| 色黄色美女大长腿午夜视频| 亚洲va有码在线天堂| 韩国黄片aaaa| 911粉嫩人妻| 久久东京国产精品视频| 久热伊人| 69超碰综合| 少妇六月天| 伊人国产视频| 99国内熟女露脸视频| 欧美综合色综合| 东京男人天堂| 综合色91| 久久性爱视频免费看| 美国精品国产精品| 乱伦Av网| 狠狠综合网| 亚洲激情网一二三四区| 超碰国产情侣自拍网| 性色国产东北露脸精品视频| 国产精品久久久九九九| 91AV国产精品| 日本色日夜干| 国产强奸91| 懂色AV蜜臀无码精品APP| 色九九综合| 高潮内射在线| 日韩少妇无吗| 日韩三级av片| 岛国激情视频在线观看| 国内毛片国产专区二| 欧洲色色| 中文字幕97色| 天天射天天色成人| 日本羞羞的视频在线播放| 性在久久久久久| 1024人妻| 日本不卡二三区| 性高潮久久久| 久久久久亚洲熟妇熟女| 亚洲最大的综合性av| 亚洲丝袜诱惑| 国产精品欧美激在线| 亚洲一区深夜| 男人天堂一区二区| 激情视频网址| 爽 好舒服 无码刺激久久| 伊人久久综合精品欧美| 免费久久一级毛片大黄| 日韩一级久久毛片| yiqicaoav| 亚洲图片欧美色| 亚洲深夜福利| 亚洲色图91欧美日韩| 骚乳在线| 久久久无码精品人妻二区| 五月天我淫我色av| 裸体美女久久久| 91九久| 欧美日韩情色一区二区| 91人人看| 大香蕉欧美伊| 97精品国产手机| 男人网站婷婷| 中文熟女五十乱码在线| 久久久91福利姬| 2020中文字幕在线| av天堂加勒比| 欧美天天干| 日本操逼视频免费| 操逼逼一区视频| 一区二区三区高清天码| 26uuu性| 国产a级午夜毛片| 亚洲日韩精品在线播放| 五月天婷婷激情| 久久天天摸| 欧美精品第四五页中文字幕在线观看| 国产精品欧美激在线| 91综合国产精品| 亚洲精品久久久久久| 亚洲精品电影| 波多野结衣AV无码一区| 欧美日产国产在线成人第一区| 欧美日韩国产黄色片| 欧美亚洲中文字幕| 深夜啪啪啪视频免费| 久久中出在线| 超碰在线综合97| 啊啊啊啊网站| 91丨豆花丨熟女| 丁香五月激情综合国产| 另类图片五月| 亚洲色图尤物视频| 国产 亚洲 丝袜 制服| 激情五月综合| 樱花草社区www中国| 午夜福利一区二区三区四区五区色婷婷| 欧美日韩制服| 国产精品蜜臀久久久久无码AV| 久久草在线综合视频| 九九九久千久久激情蜜桃在线看 | 自拍欧美| 久久久涩| 一级性爱啪啪视频| 天天日天天爽| 天天操人人操骚逼网站| 91精品人妻一品二品三品| 国产欧美日本亚洲精品| 欧美AAAA黄片| 亚洲自拍天堂| 久操99| 国偷自 一区| 日本精品五区| 91精品无码人妻系列| 色性欧美| 久久精品无码熟妇一区二区三区视频导航| 97亚洲精品超碰| 亚洲第一黄色av网站| 一区操逼| 日日夜夜干| 超碰视97中文| 女性喷水高潮在线观看| 综合久久婷婷| 久草热制服丝袜在线观看| 亚洲色图欧美色图另类图片| 日韩亚洲国产视频| 天天色,天天干,天天干| 欧美日韩99精品麻豆传媒| 中文字幕一区二区视频在线观看| 大香蕉手机在线视频| 日本久久女同性恋视频| 极品少妇99| 欧亚性爱啪啪| 国内毛片四区| 亚洲限制级在线| 欧美性天天| 精品国产乱码久久久兰草影视| 伊人女女资源在线观看| 欧美日韩亚洲一区二区在线观看| 色色色色色色色色色色色色色色综合 | 欧美淫乱视频| 精品日韩中文在线| 中文字幕免费观看| 久久久青青草| aaa一级黄片| 激情视频图片| 国产三级多多影院2022国产AA一级毛片无码 | 91丨九色丨东北熟女| 伊人aaa| 亚洲国产精品有声| 日本不卡高清免v欧美日韩在线观看| 中文字幕在线免费观看| 美女黄频a美女大全免费皮| 久久精品视| 日韩探花精品在线视频| 欧美91在线+|+欧美| 日韩性爱视频在线免费观看 | 欧美性爱一区| 伦激情人妻另类人妻| 少妇500双飞99| 日日爱99| 欲色影视综合吧| 国产呦精品系列在线观看| 综精品久久久aaaa| 97操操| …亚洲黄色厕厕女女在线播…| 久久一二三四五六七八九区区区 | 操迟操逼在巾线Fre看| 亚洲欧美另类小说| 亚洲天堂资源| 夜夜嗷嗷一区二区| 婷婷五月综合激情| 后入综合久久| 丁香六月东京热| 高潮综合网| 无码在线亚洲| 欧美双插| 素人美腿视频网站| 久久九九视频九九视频| 99re8超碰| 欧美熟女操屄| 国产精品第一页国产大屁股视频免费区| 九九这里只有精品| 日韩免费三级黄片电影| 91丝袜激情在线| 免费一级欧美片片线观看| 日韩大香蕉| 亚洲国产奇米影视久久| 国产成人精品必看| 亚洲熟女综合网| 97在线视频网站| 人妻激情在线视频| 亚州人妻| 伊人伊人LD| 日韩av熟女一区二区三区成人| 久久久久久亚洲精品不卡人乳 | 精品少妇人妻一区二区三区| 青青草在线视频欧美| 中文字幕片| 97爱免费插| www.狠狠干.coom | 无码精品久久久久久亚洲| 理论久久婷婷网8| 欧美九一精品久久久熟妇| 久热久操| 97资源免费视频| 综合干干干av久久久综合网 | 亚洲高清91| 加勒比99999| 草草草草视频| 丝袜综合网| 三上悠亚在线毛片91| 手机在线大香蕉| 国产精品扒开腿做爽爽爽视频| 2019天天干| 夫妻天天操岛国视频| 国产精品999aaa| 91精品国产91久久青草| 国产精品人妻一区二区| 手机在线A片| 日韩性爱毛片操骚逼| 性色av网站| 亚欧Av| 人妻AV 中文字幕的| 久久9亚洲| 亚洲一二三精品久久网 | 亚洲色图加勒比| 清清草影| 啊啊在线| 黄色工厂这里只有精品| 极品另类| 国产又粗又大硬免费色网视频| 欧美高清无码免费视频高清版| 好吊色综合| 亚洲天堂久久久久久粉红视频| 岛国A V在线免费看| 亚洲精品一区二区精品| 超碰97在线色男人??| 婷婷激情五月| 99精品久久久久久久婷婷| 天天躁日日躁AAAAXXXX国产 | 一级黄色视频网| 97色欧洲| 嫩草91| 999综合色| 日韩三级网址| 久久久久久性爱视频| 涩五月婷婷| 午夜影美女日鸡鸡天天视频国产| 国产精品懂色tv影视免费观看| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 久久久久国产| 欧洲中文字幕| 男人亚洲91首页在线| 色优久久| 亚洲情色第一页| 色婷婷香蕉| 在线性黄高清免费视频| 99久久精品国产高潮| 99久久婷婷丁香| 影视综合无码少妇| 一级婬片120分钟试看| 欧美色综合| 操啊国产| 精品国产91内射久久| 日本东京热久久久电影| 国产福利电影| 我想要 啊 啊 啊| 综合亚州欧美| 天天摸天天舔天天操| 精品人妻一区二区三区夜夜| 超碰久久精品| 97久久国产亚洲精品超碰热| 久久久99999久网站| 久久久久久无码人妻中文字幕| 精品久久久不卡一区二区| 91N综合在线| 白嫩91在线亚洲| 偷拍欧美亚洲| 97视频网站| 亚洲 欧美综合| 亚洲激情综合另类| 一级日本牲交大片好爽在线看| 日日操免费视频| 91精品久久久| 日本岛国黄色网址| 丁香五月大香蕉| 人妻无码后入| 超碰97.com| 91A欧美电影网站| 成人精品无码| 91精品国产日韩欧美综合| 国产 热久久久久国产精品| 久久久精品91八戒| 污污汅18禁网站在线永久免费观看| 久久精品人人做人人看| 一起草日韩| 亚洲 自拍偷拍 欧美| 爆操无码| 插入综合网| 亚洲欧洲第二视频在线观看色图| 亚洲情色 自拍| 少妇久久| av强奸乱轮| 亚洲91极品| 日韩电影天堂视频二区三区| 亚洲诱惑天堂 | 97爱爱爱综合| 你草精品在线视频| 在线欧美亚洲| 嫩呦国产一区二区三区AV| 新婚人妻扶着粗大强行坐下| 天天草天天干天天日| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚洲天堂另类美腿| 97久久久久久久久久| 中文字幕三四五区| 秋霞一级A片黄色视频| 黑丝少妇| 欧美亚州综合图片| 大鸡巴久久| 国产精品久久久无码AV网站| 天天干天天干天天| 日韩美女高潮喷水视频| 欧美亚洲91| 偷拍自拍在线视频观看| 18一区二区三区| 亚欧美综合网| 精品日韩人妻视频| 台欧久久精品视频| 亚洲交性| 色视频蜜乳| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 超碰 97国产熟女| 九九九九九九免费视频| 大香蕉免费3| 日本欧美成人片AAAA| 亚洲精品1区| 日韩在线国产字幕| 深夜福利黄片| 热九九精品| 久射吧| 十八禁成人网站在线观看| 蜜桃中文字日产乱幕4区| 搡老女人老91二区| 亚洲AV无码黄色强奸| 人人色人人射人人妻| 三及片网站| 91精品啪在线观看国产城中村| 日韩一区二区熟女| 操屄日韩| www色色com| 大但人体久久久久| 日韩亚洲Av人人夜夜澡人人爽| 综合网欧| 精品综合久久久久久五月天| 九九热精品在线| 日韩情色一区二区| 久久曰曰| 色香欲影| www.婷婷六月天| 国语精品av| 天天干美少妇一区| 91N综合网| 久操不卡视频| 夜夜性| 99999久久久久9国产精品| 国产精品不卡少妇白| 欧美性猛交美女自慰91| 激情综合网亚洲| 精品久久久久久亚洲| 日韩欧美性爱电影在线观看| 日本女厕偷拍| 精品日韩人妻视频| 色超碰综合| 五月综合婷婷久久网站| 国产福利夜| 久久毛卡| 日韩欧视频| 97人人模人人爽人人| 国产精品农村妇女精品| 日本高清电影欧美色图| 狠狠爱综合网| 国产伦精品免编号公布| 人妻啪| 亚洲中字慕不卡| 日韩无码专区| 91免费看一区二区三区| av72网| 久久久久国产精品喷潮免费观看臀| 国产精品3| 欧美黑人性猛交91| 国产真实子伦对白| 天天摸夜夜操视频| 激情五月天视频| 少妇被c 黄 免费观看| 欧美色图私拍91| 国产精品婬乱一级毛片彝族| 9997se| 久久久无码国精品无码三区三区| 91精品国产综合久久久蜜臀酒店| 曰韩欧美国产传媒麻豆第一区| 亚洲少妇综合| 色婷婷五月综合激情中文字幕| 9999九九九久久久| 日韩精品国产一区二区| 欧洲一区二区三区四区在线观看| 91爆操视频| 欧美日本视频一区| 在线精品福利免费播放| 亚洲久草AV色图| 欧美日韩丝袜| 丝袜熟女一区二区三区| 精品九九| 秋霞午夜视频一区二区| 狠狠操狠狠插| 国产精品久久久无码AV网站| 嗯嗯不要 视频| 精品国产99| 日韩AV一区二区三区四四| 殴美在线AⅤ| 99少妇| 狠狠亚洲| 少妇国产不卡| 久久无码电影| 欧洲在线性爱视频| 清纯唯美第一页| 91亚洲不卡一区| 国产麻豆一级精品视频| 中文字幕一区二区视频在线观看 | 一区操逼日比视频| 欧美色性情| 久草电影网| 国精综合一二三区影视| 欧美三级不卡| 丁香五月综合| 污污汅18禁网站在线永久免费观看| 大香蕉线| 第四色色综合91| 亚洲最大91网| 日韩不卡毛片Av免费高清| 国产隔壁老王影院在线| 九九九九九精品视频| 国产精品夜夜夜| 四虎免费看黄| 综合网久久| 久久,精品一二三| 婷婷激情四射| 八戒午夜福利理论片| 黑丝制服中文字幕| 日韩久久艹| 人妻激情另类| 精品 码产区一区二-1080P高清在线www-B029AV | 91激情国产| 欧美白嫩在线放| 加勒比日本在线| 狠狠热这里都是精品| 日日干夜夜操视频h| 色蜜AV| 又黄又爽在线观看视频| 夜夜爽33333| 亚洲成a人片在线观看中文!!!| 久久亚洲中文字幕视频| 白丝一区| 久久久久99999| 日日躁天天躁狠狠躁| 欧美骚少妇| 亚洲区限制级 99| 青青草久久一区网| 午夜呻吟欧美| 大香蕉综合久久| 激情小说亚洲视频|