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

ARTICLE DETAIL

資訊詳情

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

Web服務(wù)器HTTP解析機(jī)制詳解:主從狀態(tài)機(jī)與緩沖區(qū)設(shè)計(jì)

Web服務(wù)器HTTP解析機(jī)制詳解:主從狀態(tài)機(jī)與緩沖區(qū)設(shè)計(jì) 拿到一份Web服務(wù)器源碼我建議你第一眼看HTTP解析模塊。別的什么線程池、epoll事件循環(huán)、定時(shí)器本質(zhì)上都在為同一件事服務(wù)——把一個(gè)HTTP請(qǐng)求正確地讀進(jìn)來(lái)、解析干凈、處理掉、再回一個(gè)像樣的響應(yīng)。很多朋友卡在TinyWebServer這類項(xiàng)目上不是看不懂C語(yǔ)法而是被HTTP報(bào)文的解析過(guò)程繞暈了一會(huì)兒主狀態(tài)機(jī)一會(huì)兒從狀態(tài)機(jī)緩沖區(qū)里一堆char*指來(lái)指去讀一半數(shù)據(jù)又返回繼續(xù)等。這篇博文就專門(mén)盯著HTTP機(jī)制這一塊從整體設(shè)計(jì)思路講到狀態(tài)機(jī)的每一段邏輯再補(bǔ)充實(shí)戰(zhàn)中容易踩的坑希望幫大家把這塊硬骨頭啃下來(lái)。適合正在讀小型Web服務(wù)器源碼的開(kāi)發(fā)者也適合準(zhǔn)備網(wǎng)絡(luò)編程方向面試的朋友作為復(fù)習(xí)提綱。1. 先搞清楚整體設(shè)計(jì)HTTP機(jī)制在服務(wù)器里到底管什么1.1 TinyWebServer的經(jīng)典分層結(jié)構(gòu)TinyWebServer是一個(gè)麻雀雖小五臟俱全的Linux C服務(wù)器項(xiàng)目常見(jiàn)的模塊劃分大致是epoll事件驅(qū)動(dòng)層負(fù)責(zé)監(jiān)聽(tīng)連接上的讀寫(xiě)事件線程池負(fù)責(zé)把業(yè)務(wù)處理任務(wù)分發(fā)到工作線程HTTP模塊負(fù)責(zé)解析請(qǐng)求和構(gòu)造響應(yīng)而存儲(chǔ)層或靜態(tài)文件訪問(wèn)模塊負(fù)責(zé)真正的資源讀取。整個(gè)鏈路可以簡(jiǎn)化為這樣客戶端 - accept - epoll 監(jiān)聽(tīng)可讀 - 線程池任務(wù) - HTTP解析 - 業(yè)務(wù)處理 - HTTP響應(yīng) - 寫(xiě)回客戶端HTTP機(jī)制就是這條鏈路里承上啟下的中間層。它不關(guān)心連接是怎么建立的也不關(guān)心文件系統(tǒng)里有什么內(nèi)容它只做兩件事把客戶端發(fā)來(lái)的字節(jié)流變成結(jié)構(gòu)化的請(qǐng)求數(shù)據(jù)再把處理結(jié)果變成符合協(xié)議格式的字節(jié)流返回去。理解了這個(gè)定位你再去讀源碼就會(huì)發(fā)現(xiàn)它的接口邊界非常清楚——對(duì)外暴露的往往就是process_read和process_write這兩個(gè)入口。1.2 HTTP協(xié)議格式是解析的“基準(zhǔn)線”要解析HTTP腦子里必須先有報(bào)文格式的完整圖景。一個(gè)標(biāo)準(zhǔn)的HTTP/1.1請(qǐng)求報(bào)文長(zhǎng)這樣POST /login HTTP/1.1\r\n Host: 192.168.1.101:8080\r\n Content-Type: application/x-www-form-urlencoded\r\n Content-Length: 27\r\n Connection: keep-alive\r\n \r\n usernamehellopasswordworld注意\r\n是HTTP協(xié)議的行分隔符每一行以回車(chē)換行結(jié)尾請(qǐng)求頭和請(qǐng)求體之間用一個(gè)空行也就是連續(xù)兩個(gè)\r\n分隔。這一行和空行的處理是整個(gè)解析邏輯的地基TinyWebServer的從狀態(tài)機(jī)就是在為這個(gè)“按行切割”服務(wù)的。理解了HTTP報(bào)文的這種文本結(jié)構(gòu)解析代碼看起來(lái)就不再是一堆神秘指針的亂舞而是一個(gè)標(biāo)準(zhǔn)的狀態(tài)流轉(zhuǎn)過(guò)程。1.3 為什么只靠“讀一行處理一行”不行初學(xué)者最容易產(chǎn)生的疑問(wèn)是既然HTTP報(bào)文是文本為什么不直接一行行讀、一行行解析問(wèn)題出在TCP流本身沒(méi)有邊界。你一次read讀到的數(shù)據(jù)可能只有半個(gè)請(qǐng)求行也可能包含兩個(gè)完整的請(qǐng)求還可能恰好卡在\r和\n之間。如果每次讀取都從頭完整解析數(shù)據(jù)不完整就很尷尬。所以TinyWebServer的思路是維護(hù)一個(gè)應(yīng)用層緩沖區(qū)把內(nèi)核里讀到的數(shù)據(jù)先暫存再通過(guò)狀態(tài)機(jī)逐字節(jié)、逐行地推進(jìn)。數(shù)據(jù)沒(méi)讀完就返回NO_REQUEST繼續(xù)等待下一次可讀事件數(shù)據(jù)完整就返回GET_REQUEST進(jìn)入業(yè)務(wù)處理。狀態(tài)機(jī)的好處就是天然適合這種“數(shù)據(jù)到達(dá)不完整”的流式場(chǎng)景這也是理解整個(gè)HTTP模塊最關(guān)鍵的一把鑰匙。2. 狀態(tài)機(jī)拆解主從狀態(tài)機(jī)各自的職責(zé)邊界2.1 兩個(gè)“狀態(tài)”分別代表什么TinyWebServer里常說(shuō)的主從狀態(tài)機(jī)實(shí)際上是兩個(gè)不同層面的狀態(tài)概念。主狀態(tài)機(jī)描述的是“當(dāng)前HTTP報(bào)文解析進(jìn)行到哪個(gè)部分”典型狀態(tài)是CHECK_STATE_REQUESTLINE // 正在解析請(qǐng)求行 CHECK_STATE_HEADER // 正在解析請(qǐng)求頭 CHECK_STATE_CONTENT // 正在解析請(qǐng)求體從狀態(tài)機(jī)描述的是“當(dāng)前正在處理的這一行數(shù)據(jù)是否完整”典型狀態(tài)是LINE_OK // 讀到了一個(gè)完整的行 LINE_BAD // 行格式有問(wèn)題比如沒(méi)有以\r\n結(jié)尾 LINE_OPEN // 數(shù)據(jù)還不完整需要繼續(xù)讀套用一句比較直白的話主狀態(tài)機(jī)在管“我該干什么”從狀態(tài)機(jī)在管“手上這一行能不能干活”。兩個(gè)狀態(tài)機(jī)配合起來(lái)整個(gè)HTTP解析就能做到邊讀邊解析來(lái)多少數(shù)據(jù)就消化多少數(shù)據(jù)。2.2 從狀態(tài)機(jī)是怎么切出“一行”的從狀態(tài)機(jī)最常見(jiàn)的實(shí)現(xiàn)是用一個(gè)指針遍歷緩沖區(qū)逐字符尋找\r\n。偽代碼如下LINE_STATUS parse_line(char* buffer, int checked_idx, int read_idx) { for (; checked_idx read_idx; checked_idx) { if (buffer[checked_idx] \r) { if (checked_idx 1 read_idx) { return LINE_OPEN; // \r 是緩沖區(qū)的最后一個(gè)字符還不能下結(jié)論 } if (buffer[checked_idx 1] \n) { buffer[checked_idx] \0; buffer[checked_idx] \0; return LINE_OK; } return LINE_BAD; // 只有\(zhòng)r后面不是\n格式錯(cuò)誤 } } return LINE_OPEN; }這里最值得品味的是LINE_OPEN的處理為什么\r出現(xiàn)在緩沖區(qū)末尾時(shí)不能立刻判斷因?yàn)橄乱淮蝦ead讀進(jìn)來(lái)的第一個(gè)字節(jié)可能就是\n所以必須留到下一次數(shù)據(jù)到達(dá)時(shí)再確認(rèn)。這就是流式解析的精髓——永遠(yuǎn)不要假設(shè)一次read能帶來(lái)完整的數(shù)據(jù)。2.3 主狀態(tài)機(jī)如何配合從狀態(tài)機(jī)推進(jìn)主狀態(tài)機(jī)的核心邏輯大致是每當(dāng)從狀態(tài)機(jī)切出一個(gè)完整行LINE_OK就根據(jù)當(dāng)前主狀態(tài)決定把這行交給哪個(gè)解析函數(shù)。請(qǐng)求行階段 - 解析請(qǐng)求行 - 成功后切換到請(qǐng)求頭階段 請(qǐng)求頭階段 - 解析請(qǐng)求頭 - 如果讀到空行說(shuō)明請(qǐng)求頭結(jié)束根據(jù)是否有正文切到請(qǐng)求體階段 請(qǐng)求體階段 - 直接讀取剩余字節(jié)作為請(qǐng)求體這種設(shè)計(jì)把每個(gè)階段拆得很干凈。請(qǐng)求行解析只關(guān)心方法、URL、版本號(hào)請(qǐng)求頭解析只關(guān)心Host、Connection、Content-Length這些關(guān)鍵字段請(qǐng)求體階段則把剩余的字節(jié)原樣保存。三個(gè)階段的邏輯互不干擾出問(wèn)題時(shí)也容易定位。3. 關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)數(shù)據(jù)是怎么一步步變成結(jié)構(gòu)化請(qǐng)求的3.1 緩沖區(qū)與指針?biāo)饕呐浜献xTinyWebServer的解析代碼最頭疼的往往是那一堆索引變量。常見(jiàn)的命名有這么幾個(gè)m_read_buf // 讀緩沖區(qū) m_read_idx // 緩沖區(qū)里有效數(shù)據(jù)的末尾位置 m_checked_idx // 當(dāng)前解析到的位置 m_start_line // 當(dāng)前行的起始位置三個(gè)索引的關(guān)系可以畫(huà)成一條數(shù)軸m_start_line到m_checked_idx是已經(jīng)切出來(lái)但可能還沒(méi)被主狀態(tài)機(jī)處理的行m_checked_idx到m_read_idx是尚未解析的原始數(shù)據(jù)。每次從狀態(tài)機(jī)跑完m_checked_idx會(huì)推進(jìn)到一行的末尾當(dāng)整行被主狀態(tài)機(jī)消費(fèi)后再把m_start_line移動(dòng)到下一行的開(kāi)頭。這套索引配合起來(lái)即使數(shù)據(jù)分多次到達(dá)也不會(huì)亂套。需要注意的是讀取數(shù)據(jù)時(shí)如果緩沖區(qū)的剩余空間不足還要考慮把未解析的數(shù)據(jù)前移騰出空間繼續(xù)讀新數(shù)據(jù)。這個(gè)細(xì)節(jié)容易被忽略但它直接決定了緩沖區(qū)能不能應(yīng)對(duì)超大頭部。3.2 請(qǐng)求行解析三個(gè)核心字段怎么摳出來(lái)請(qǐng)求行是GET /index.html HTTP/1.1這種格式三個(gè)字段以空格分隔。解析思路通常是先找出第一個(gè)空格來(lái)切出方法再?gòu)氖S嗖糠掷镎页龅诙€(gè)空格來(lái)切出URL最后剩下的就是版本號(hào)。HTTP_CODE parse_request_line(char* text) { m_url strpbrk(text, \t); // 找第一個(gè)空格 if (!m_url) return BAD_REQUEST; *m_url \0; m_method text; // 此時(shí) text 就是方法名 m_version strpbrk(m_url, \t); // 找第二個(gè)空格 if (!m_version) return BAD_REQUEST; *m_version \0; if (strcasecmp(m_version, HTTP/1.1) ! 0) { return BAD_REQUEST; } if (strcasecmp(m_method, GET) 0) { // 處理GET請(qǐng)求 } else if (strcasecmp(m_method, POST) 0) { // 處理POST請(qǐng)求 } else { return BAD_REQUEST; } return NO_REQUEST; }這里有兩個(gè)容易踩的坑。第一strpbrk返回的地址在*m_url \0之后m_url已經(jīng)指向真正URL的起始位置但這一步會(huì)修改緩沖區(qū)內(nèi)容所以解析后的字符串不能再依賴原始的完整報(bào)文。第二URL可能帶上參數(shù)/index.html?namevalue需要考慮是整段解析還是剝掉參數(shù)。TinyWebServer這類小型項(xiàng)目通常會(huì)把?后面的內(nèi)容去掉或作為查詢串單獨(dú)保存具體策略影響后續(xù)靜態(tài)文件的查找路徑。3.3 請(qǐng)求頭解析只抓關(guān)鍵字段就夠了請(qǐng)求頭可以有很多行但其實(shí)對(duì)一個(gè)小型Web服務(wù)器來(lái)說(shuō)真正關(guān)心的字段沒(méi)幾個(gè)。常見(jiàn)實(shí)現(xiàn)會(huì)循環(huán)讀取請(qǐng)求頭直到遇到空行依次判斷Connection: keep-alive決定是否長(zhǎng)連接對(duì)應(yīng)m_linger標(biāo)志Host: xxx用于日志或虛擬主機(jī)存到m_hostContent-Length: 數(shù)字決定請(qǐng)求體要讀多少字節(jié)存到m_content_lengthHTTP_CODE parse_headers(char* text) { if (strncasecmp(text, Connection:, 11) 0) { text 11; while (*text ) text; if (strncasecmp(text, keep-alive, 10) 0) { m_linger true; } } else if (strncasecmp(text, Content-Length:, 15) 0) { text 15; while (*text ) text; m_content_length atol(text); } else if (strncasecmp(text, Host:, 5) 0) { text 5; while (*text ) text; m_host text; } return NO_REQUEST; }注意這些比較都用了strncasecmp因?yàn)镠TTP頭字段名是大小寫(xiě)不敏感的實(shí)際請(qǐng)求里可能出現(xiàn)content-length:這種寫(xiě)法。我在自己調(diào)試時(shí)遇到過(guò)真實(shí)的客戶端發(fā)送大寫(xiě)字段名如果代碼用strcmp就會(huì)漏掉這是協(xié)議實(shí)現(xiàn)時(shí)很容易踩的坑。3.4 請(qǐng)求體的特殊處理方式請(qǐng)求體解析和前面不太一樣。請(qǐng)求行、請(qǐng)求頭都是“按行”處理的而請(qǐng)求體是純粹的字節(jié)流根本沒(méi)有行概念。所以主狀態(tài)機(jī)進(jìn)入CHECK_STATE_CONTENT之后不能再依賴從狀態(tài)機(jī)切行而是直接檢查當(dāng)前緩沖區(qū)里剩余的數(shù)據(jù)量是否達(dá)到Content-Length聲明的長(zhǎng)度。這一段邏輯的關(guān)鍵點(diǎn)在于如果數(shù)據(jù)還沒(méi)收完返回NO_REQUEST如果收完了從緩沖區(qū)里把請(qǐng)求體指針記錄下來(lái)再返回GET_REQUEST表示整個(gè)請(qǐng)求已經(jīng)解析完整。我見(jiàn)過(guò)不少人在面試時(shí)被問(wèn)到“GET和POST解析的差異”核心答案之一就在這里——GET沒(méi)有請(qǐng)求體讀完請(qǐng)求頭遇到空行就結(jié)束了POST必須再用Content-Length確認(rèn)請(qǐng)求體是否完整。3.5 整體解析流程串起來(lái)看把上面的細(xì)節(jié)串成一個(gè)流程就是經(jīng)典的process_read邏輯循環(huán) { 從狀態(tài)機(jī)切出一行 如果 LINE_OPEN返回 NO_REQUEST等待更多數(shù)據(jù) 如果 LINE_BAD返回 BAD_REQUEST 如果 LINE_OK主狀態(tài)機(jī)按當(dāng)前狀態(tài)處理這一行 }每次read事件觸發(fā)后都會(huì)先往m_read_buf里追加數(shù)據(jù)再調(diào)用process_read。如果返回NO_REQUEST說(shuō)明數(shù)據(jù)還沒(méi)齊連接繼續(xù)掛在epoll上等下一次事件。這個(gè)過(guò)程是可以無(wú)狀態(tài)反復(fù)進(jìn)入的也正因?yàn)檫@個(gè)設(shè)計(jì)才能用非阻塞IO處理海量連接。4. 響應(yīng)構(gòu)建與連接生命周期從解析結(jié)果到完整回包4.1 響應(yīng)報(bào)文是怎么拼出來(lái)的解析完請(qǐng)求只是上半場(chǎng)下半場(chǎng)是根據(jù)業(yè)務(wù)結(jié)果生成響應(yīng)報(bào)文。一個(gè)最小但完整的HTTP響應(yīng)長(zhǎng)這樣HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n Content-Length: 1024\r\n Connection: keep-alive\r\n \r\n html...TinyWebServer的常見(jiàn)做法是維護(hù)一個(gè)寫(xiě)緩沖區(qū)m_write_buf用一系列add_*函數(shù)往里逐行追加內(nèi)容。比如add_status_line寫(xiě)入狀態(tài)行add_headers寫(xiě)入通用頭add_content寫(xiě)入正文。這個(gè)過(guò)程本質(zhì)上是責(zé)任鏈一樣的組裝流程先寫(xiě)狀態(tài)行再寫(xiě)每個(gè)頭字段最后寫(xiě)入正文。代碼風(fēng)格通常長(zhǎng)這樣add_status_line(200, OK); add_headers(1024); add_content(body, 1024);4.2 狀態(tài)碼與錯(cuò)誤頁(yè)面的處理策略小型Web服務(wù)器不需要實(shí)現(xiàn)所有狀態(tài)碼但至少要區(qū)分幾類典型結(jié)果請(qǐng)求成功200、請(qǐng)求格式錯(cuò)誤400、資源不存在404、禁止訪問(wèn)403、服務(wù)器內(nèi)部錯(cuò)誤500、方法不支持501。每一類都對(duì)應(yīng)一個(gè)標(biāo)準(zhǔn)的響應(yīng)文本例如狀態(tài)碼含義典型場(chǎng)景200OK請(qǐng)求成功并返回內(nèi)容400Bad RequestHTTP格式錯(cuò)誤解析返回BAD_REQUEST403Forbidden文件存在但權(quán)限不足404Not Found請(qǐng)求的文件或目錄不存在500Internal Error服務(wù)器內(nèi)部邏輯錯(cuò)誤501Not Implemented遇到未支持的方法這些狀態(tài)碼的定義最好集中放在一個(gè)枚舉或常量區(qū)響應(yīng)時(shí)統(tǒng)一映射——實(shí)際項(xiàng)目里我習(xí)慣于把狀態(tài)碼和響應(yīng)文本做成一個(gè)映射表避免散落各處的魔數(shù)。這不僅改了這里忘了那里更重要的是日志里能直接輸出可讀的響應(yīng)結(jié)果排查問(wèn)題快很多。4.3 keep-alive與短連接的生命周期管理Connection: keep-alive會(huì)影響連接處理完當(dāng)前請(qǐng)求后的去向。如果m_linger為真處理完一個(gè)請(qǐng)求后連接不關(guān)閉繼續(xù)掛在epoll上等待下一個(gè)請(qǐng)求如果m_linger為假響應(yīng)寫(xiě)完就主動(dòng)關(guān)閉連接。這里有個(gè)很容易忽略的細(xì)節(jié)長(zhǎng)連接下同一個(gè)連接可以連續(xù)發(fā)送多個(gè)請(qǐng)求HTTP pipelining不常見(jiàn)但連續(xù)請(qǐng)求是很常見(jiàn)的。所以處理完一個(gè)請(qǐng)求后要么把緩沖區(qū)里殘留的數(shù)據(jù)交給下一輪解析要么在寫(xiě)完后直接重置連接狀態(tài)。我在閱讀實(shí)際代碼時(shí)見(jiàn)過(guò)有人在這里出現(xiàn)邏輯漏洞——長(zhǎng)連接處理完第一個(gè)請(qǐng)求后就傻等新數(shù)據(jù)實(shí)際上第二個(gè)請(qǐng)求已經(jīng)跟著到了緩沖區(qū)里導(dǎo)致請(qǐng)求積壓。4.4 連接超時(shí)與資源回收HTTP機(jī)制不止是解析和響應(yīng)還要關(guān)注連接長(zhǎng)時(shí)間不活動(dòng)的問(wèn)題。常見(jiàn)做法是配合定時(shí)器每個(gè)連接記錄最近活躍時(shí)間每次讀寫(xiě)后更新定時(shí)器定期掃描發(fā)現(xiàn)超過(guò)閾值比如60秒的連接就主動(dòng)關(guān)閉同時(shí)釋放fd、從epoll移除、清理對(duì)應(yīng)的線程池任務(wù)。超時(shí)關(guān)閉和keep-alive是有微妙的配合關(guān)系的keep-alive是想讓連接多活一會(huì)兒以減少握手開(kāi)銷(xiāo)但如果沒(méi)有超時(shí)機(jī)制惡意客戶端占著連接不放就會(huì)把fd和線程資源耗盡。所以“可以長(zhǎng)連接但不能無(wú)限長(zhǎng)”這條原則是服務(wù)器開(kāi)發(fā)里一條寫(xiě)進(jìn)所有項(xiàng)目的基本紀(jì)律。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 問(wèn)題速查表我在學(xué)習(xí)和調(diào)試這類代碼的過(guò)程中積累了一批出現(xiàn)頻率極高的問(wèn)題這里整理成速查表方便大家對(duì)照排查?,F(xiàn)象可能原因排查方向請(qǐng)求頭解析后字段為空字段名比較時(shí)大小寫(xiě)不敏感沒(méi)處理好檢查是否用了strcasecmp/strncasecmp發(fā)完P(guān)OST請(qǐng)求服務(wù)器一直不響應(yīng)緩沖區(qū)里請(qǐng)求體沒(méi)收全一直卡在NO_REQUEST檢查Content-Length是否正確解析確認(rèn)請(qǐng)求體讀取邏輯響應(yīng)返回后客戶端還在等結(jié)果響應(yīng)頭缺少Content-Length或Connection未正確設(shè)置檢查響應(yīng)組裝里頭字段是否完整長(zhǎng)連接處理完第一個(gè)請(qǐng)求后第二個(gè)請(qǐng)求失效緩沖區(qū)殘留數(shù)據(jù)沒(méi)被正確處理檢查reset或下一輪解析的起始索引高并發(fā)下出現(xiàn)錯(cuò)亂的響應(yīng)多線程下多個(gè)連接共用了同一個(gè)緩沖區(qū)或解析狀態(tài)檢查連接對(duì)象是否每個(gè)fd獨(dú)立持有解析狀態(tài)文件內(nèi)容讀出來(lái)了但響應(yīng)亂碼二進(jìn)制文件在解析中遇到\0被截?cái)鄼z查讀取文件時(shí)是否以二進(jìn)制方式讀取并記錄真實(shí)長(zhǎng)度5.2 一個(gè)實(shí)際的“粘包”排查案例有一次我自己調(diào)試一個(gè)模擬項(xiàng)目時(shí)用Python腳本連續(xù)發(fā)送兩個(gè)請(qǐng)求到同一個(gè)連接上服務(wù)器總是只處理第一個(gè)第二個(gè)請(qǐng)求完全沒(méi)反應(yīng)。起初懷疑是epoll事件丟了花了不少時(shí)間查事件循環(huán)后來(lái)在緩沖區(qū)索引上定位到了問(wèn)題第一個(gè)請(qǐng)求解析完后m_checked_idx和m_read_idx沒(méi)有正確調(diào)整到下一個(gè)請(qǐng)求的起始位置導(dǎo)致第二個(gè)請(qǐng)求的數(shù)據(jù)被當(dāng)成殘余數(shù)據(jù)一直沒(méi)進(jìn)入解析流程。解決辦法是在每次請(qǐng)求處理完成后把緩沖區(qū)里未消費(fèi)的字節(jié)整體前移并用解析后的新起始位置作為下一輪掃描起點(diǎn)。這種問(wèn)題最難的不是修而是復(fù)現(xiàn)——單發(fā)一個(gè)請(qǐng)求永遠(yuǎn)測(cè)不出來(lái)必須構(gòu)造連續(xù)請(qǐng)求的腳本才行。所以我的經(jīng)驗(yàn)是調(diào)試HTTP解析器一定要準(zhǔn)備一個(gè)能發(fā)送連續(xù)請(qǐng)求、支持自定義報(bào)文的測(cè)試腳本而不是只用瀏覽器訪問(wèn)。5.3 用日志和斷言定位解析狀態(tài)讀這類源碼時(shí)最有效的調(diào)試手段其實(shí)不是打斷點(diǎn)而是日志。我習(xí)慣在三個(gè)關(guān)鍵位置打日志每次read后打印本次讀取的字節(jié)數(shù)和緩沖區(qū)總長(zhǎng)度每次從狀態(tài)機(jī)切出一行后打印這行的原始內(nèi)容每次主狀態(tài)機(jī)狀態(tài)切換時(shí)打印新的狀態(tài)有了這三行日志一個(gè)請(qǐng)求從進(jìn)入到處理完的完整鏈路就一目了然。遇到解析異常時(shí)對(duì)比日志里緩沖區(qū)內(nèi)容和HTTP報(bào)文的預(yù)期格式通常幾秒鐘就能看出是哪一步的問(wèn)題。這個(gè)習(xí)慣在我們面試討論項(xiàng)目時(shí)也經(jīng)常被問(wèn)到因?yàn)樗w現(xiàn)的不只是會(huì)用而是真的理解狀態(tài)流轉(zhuǎn)。6. 閱讀這份源碼后的幾點(diǎn)個(gè)人體會(huì)6.1 狀態(tài)機(jī)的設(shè)計(jì)比想象中更通用讀完TinyWebServer的HTTP解析代碼我發(fā)現(xiàn)狀態(tài)機(jī)的思路絕不只適用于HTTP。任何需要處理“流式輸入、分塊解析”的場(chǎng)景——比如JSON流式解析、自定義TCP協(xié)議拆包、WebSocket幀解析——都可以套用這套主從狀態(tài)機(jī)的設(shè)計(jì)。核心思想都是一樣解析方不假設(shè)一次拿到完整數(shù)據(jù)而是通過(guò)狀態(tài)記住當(dāng)前進(jìn)度來(lái)一段處理一段。6.2 緩沖區(qū)管理是隱藏的主角HTTP解析表面上是狀態(tài)機(jī)在驅(qū)動(dòng)實(shí)際上是緩沖區(qū)在兜底。所有的指針、索引、狀態(tài)轉(zhuǎn)移都在圍繞同一個(gè)問(wèn)題如何高效地管理一塊可能裝不滿、可能溢出、可能殘留多種含義數(shù)據(jù)的字節(jié)數(shù)組。當(dāng)時(shí)我做模擬項(xiàng)目時(shí)試著把緩沖區(qū)從1KB改成4KB發(fā)現(xiàn)解析邏輯完全不用動(dòng)這就是緩沖區(qū)與狀態(tài)機(jī)解耦帶來(lái)的好處。6.3 可以繼續(xù)往哪些方向擴(kuò)展這個(gè)HTTP機(jī)制讀懂了后面能擴(kuò)展的方向其實(shí)很多。最簡(jiǎn)單的把解析器擴(kuò)展成支持HEAD和OPTIONS方法稍微復(fù)雜點(diǎn)給響應(yīng)頭加上Cache-Control之類的緩存控制字段再往上走可以移植到支持HTTPS或者實(shí)現(xiàn)HTTP/2的幀解析。甚至可以把解析模塊單獨(dú)抽出來(lái)做成一個(gè)庫(kù)核心的狀態(tài)機(jī)框架完全不需要大改。我自己在后續(xù)做某個(gè)跨平臺(tái)系統(tǒng)時(shí)就把這套狀態(tài)機(jī)思路套到了一個(gè)自定義二進(jìn)制協(xié)議上省了非常多事。所以如果你還在為搞不懂這幾個(gè)狀態(tài)糾結(jié)放寬心敲兩遍、跑幾個(gè)用例這個(gè)坎過(guò)去了后面整個(gè)網(wǎng)絡(luò)編程的地基就算打牢了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚州高清av| 丰满人妻-区二区三区免费看| 能直接看AV的网站| 日本性爱少妇| 亚洲天堂7777| 六月婷婷激情| 欧美制服网站美腿丝袜| 午夜天堂精品久久| 亚洲综合97| 人人操人人肉久久精品| 色天使大香蕉| 久久久涩| 日韩人妻一二三区视频| 亚洲色婷婷综合久久久久中文| 精品国产一区二区久久| 密臀在线免费观看| 亚洲自拍一区夜夜操| 裸体美女久久久| 青青草吊丝| 久久综合av| 九九九九热| 美女写真| 97人肏| 天天日天天屌天天操| av草草在线电影| 欧美色网| 性爱1区| 大香蕉 222| 欧美 日韩 国产传媒| 偷拍亚洲情色| 成全动漫视频观看免费下载| 影音先锋中文字幕日本好一区二区| 国产精品麻豆成人AV艾秋| 另类av天堂| 女人综合网| 大色综合网| 日本不卡码黄色| 日1区2区3区2020| 亚洲囯产精品女人久久久| 日本三级韩国三级99| 伊人在线大香蕉视频久久| 亚洲精品乱码线路中文字幕| 国产福利第一视频| 91美女高潮| 99精品伊人| 日韩av情韩国爱禁区av一区二区| 天天射夜夜操| 俺去啦俺来也久久综合| 一区二区三区高清天码| 国产A v无码专区| 在线观看中文av字幕| 尤物视频新赏网鲜网色诱网| 人人摸人人叼| 日韩综合97p| 免费精品无码一级毛片牛牛影视| 日韩不卡av一二三| 日韩乱插| 中文字幕人乱码中文字的预防方法 | 精品丝袜无码一区二区三APP| 色欲久久久久综合网| 亚洲国产综合图区中文字幕| 翔田千里A片一区二区| 美女写真| 宗合情欲网| 国产精品网站www| 欧美亚洲今日在线| 人人操人人大香蕉| 97这里只精品| 国产精品福利视频| 欧美日韩国产高清在线一二三区| 粉嫩av在线一区二区| 欧美一级特黄淫片在线观看| 丁香五月偷拍| 欧美激情色婷婷花野真衣一区二区| 午夜毛片高清免费不卡| 青青草在线视频播放器| 日本成人A片免费看| 亚洲精品视频二区| 亚洲怡春院| 成人自拍三级在线观看| 久操黄色视频| 久久99国产精品| 中国乱伦一区二区| 欧美激情色婷婷花野真衣一区二区| 偷拍 欧美 日韩| 97中文超碰| 欧美综合另类| 人妻在线臀日韩| 精品人妻一区二区三区免费视频| 欧美日韩丝袜| 97色伦97色伦国产欧美| 国产乱码精品久久久久久| 99老司机精品视频在线观看| 亚洲综合伊人| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日韩无码专区| 亚洲综合草草| 九九热在线视频| 免费a v| 亚洲综合激情五月久久| 性爱网站一区二区| 日韩在线女优天天干| 欧亚性爱在线视频| 男人天堂欧美| 色偷偷人人玩人人舔人人操人人摸人人爽| 国产福利一区二| 婷婷月色| 国产精品久久久三级无码| dy888午夜老子影视达达兔| 蜜臀久久99精品久久久久免费观| av无码精品久久久久| 天美精品av| 日韩欧洲操屄视频| 男人天堂新在线| 日韩一级二级三级免费看完整版国语版| 成人性爱美曰韩| 日韩精品在线视频,日韩精品……| 国产精品网站免费| 视频在线观看一二三区| 桃花色涩综合影院| 丁香色狠狠色综合久久小说| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 大香蕉伊人色偷偷在线| 国产剧情AV不卡在线观看| 午夜精品久久久| 国产精品第一页国产大屁股视频免费区i| 欧美日韩香蕉| 69av一区二区三区| 日韩兔费看黄片| 日本在线999| 色偷偷综合91久久噜噜| 亚州五月| 大香蕉手机在线| 久久熟女嫩草成人片免费| 天天舔天天| 日本3级一区二区免费| 夜夜高潮夜夜爽国产伦精品| 91欧美性| 啊啊啊啊好疼| 亚洲国产福利视频| 97在线亚洲| 亚洲久久天堂| 96免费视频在线| 区二区亚洲婷| 亚洲乱色视频一区、二区在线| 亚洲国产精品乱码在线观看| 操逼逼福利视频| 亚洲国产精品99久久久| 粉嫩粉嫩一区性色AV片| 日日噜噜夜夜狠狠视频无| 欧美18 在线观看| 香蕉黄色一级视频| 久久久久久AⅤ无码免费肉站 | 亚州五月| 屁股久久久久久久久久| 日韩人妻无码不卡网站| 老司机天天操| 婷婷丁香五月综合| 视频在线观看一二三区| 热热色青青草| 男女猛烈无遮掩视频免费软件| 国产高清精品一区二区三区毛片 | 97超碰色色| 97亚洲精品超碰| 久热影视| 日韩精品99999| 久久久久久久久久久久久久久久9| 亚洲精品97p| 91在线免费精品视频| 色狠狠 - 百度| 日韩亚洲美女一区久久| 锕锕好爽 死我在线观看| 精品对白久久不卡| www.色操逼| 99热婷婷| 欧美亚洲韩国视频十五区 | 久久99精品国产| 精精品人妻一区二区三区| 搡老女人老熟女91| 夜夜操狠狠操| 欧美人妻制服| 高清国产av无码| 欧美熟爽综合| 飘花国产午夜精品不卡| 亚热日本熟女| www久久99| 97中文字幕一区| 国产91久久九九免费精品无码| 亚洲九月丁香| 老司机香蕉| 中文字幕乱碼在线| 精品亚洲国产成人AV制服丝袜| 97中文字幕一区| 久久熟女人| 无码动漫av中文字幕| 走光一区92下载| 99无码视频| 亚洲欧美日韩免费电影| 校园春色中文字幕AV| 中文字幕一区二区免费在线| 国产精品69久久久久久久| 影音先锋中文字幕日本好一区二区| 欧美日韩精品久久久久东北老熟妇| 69人妻精品一区二区绯色| 超碰免费人人| 乱伦a片视频| 国产树林里野战在线看| 国产熟女免费观看久久| 亚洲色图欧美色图制服诱惑| 亚洲色性情三级| 玖玖综合.com| 国产午夜福利视频在线| 亚洲城人男人的天堂| 躁躁日曰躁2020| 99精品网| 亚洲男人天堂AV| 久久久无码av精| 第一高清av中文字幕| 3p国产色噜噜一区| 久久精品中文| 人人人摸人人| 熟女乱伦二区| 国产区性爱在线视频秋霞豆| 婷婷爱五月| 精品亚洲天堂| 九一精品牛牛一区二区| 久99视频| 亚洲91在线播放影院| julia ann久久| 三级片大波波| 天天摸夜夜添无码小视频| 色五月第四色| 黑丝少妇在线观看| 91久久青青草原精品| 婷婷色网| 99国内精品| 久久精品国产亚洲AV成人直播| 亚洲欧美首页| 骚女高跟AV在线| 亚洲精品无码少妇久久| 玖玖无码超碰| 中文字幕久久亚州无码| 岛国片在线观看视频亚洲| 巨乳特殊服务按摩| 后入日本1234| 97视频在线视频| 性站 | jizzjizz欧美| WWW美腿丝袜香蕉中文| A啊啊在线观看| 日本高清_区二区三区| 亚洲欧美日韩制服另类| 大粗鳼巴久久久久| 国产91专区| 国模91| 狠狠干2020| 久久性爱视频| 六九九九| 啊啊啊不要啊啊受不了了视频在线| 国产懂色精品国产av| 999岛国大片| 五月天偷拍| 床上啊啊啊一区二区三区| 美女自卫慰黄网站免费| 99操逼| 亚洲免费精品一区| 先锋音影AV| 久久久性爱视频| 九九九精品一区二区无码| 亚州高清AV| 国产亚洲日韩欧| 国产三级中文字幕粉嫩| 精品久久久不卡一区二区| 国产强奸超碰AV| 久久久久久午夜男人的天堂| 玖玖婷婷五月天| 欧美视频第二页| 色爱天堂| 影音先锋中文字幕日本好一区二区| 亚洲日产专区| 久久久久久91香蕉国产| 一二三区精品视频| 亲子敌伦对白在线播放| www.久久爱| 丁香五月成人| 日韩电影中文字幕| 91日韩| 开心五月婷婷激情| 九区国产| 熟女精品va中文字幕| 人妻久久久| 欧美精品欧美精品系列| jk白丝没脱就开始啪啪| 久久精品视频久久久| 亚州精品人妻一二三区| 欧美极度丰满熟妇hd| 日本三级韩三级99久久| 青操影院| 人人操人人操草草| 青青草色插素人| 你懂的在线观看区国产| 久久99久久99久久99人受| 曰本道人妻久久久在线不卡色视频| 三男一女不戴套的A片| 大稥蕉免费视频这里只有精品| 在线播放欧洲免费av| 日日夜夜模| 久久精品店| 天天插天天干| 国产精品爆乳懂色蜜乳| 日本天天操| 天美传媒AV国产在线| 91丝袜人妻| 自拍偷拍第26| 精品久久久一本一道| 精品色色| 影音先锋日本乱伦| 天欧美在线| 国产日韩欧美三级片| 日本大香蕉综合网| 久干网| 国内精品伊人久久久久影院会| 欧洲中文字幕| 亚洲乱码国产乱码精网站| 成人资源中文字幕在线观看| 亚洲色图激情小说| 可以在线观看的黄色网址| 美女91网址| 大香蕉乱伦视频网| 国产专区第一页| 国内毛片四区| 色网1| 狂操嫩妻视频一区二区三区| 欧美日产国产在线成人第一区| 日韩精品电影| 欧美色九九九| 欧美极品少妇交| 操我无码| 色吧 综合| 久久久月天| 国产精品视频一区二区三区八戒| 激情综合网激情综合| 亚洲诱惑天堂 | 欧美色图99| 日本操大逼| 亚洲影视综合| 在线啊v一区| 东京太热男人的天堂久久久| 九九精品美女高溯喷水| 97超碰总站| 色婷婷婷五月天激情四射| 欧美性爱一内片一区二区三区| 99人妻碰碰碰久久久久禁片| 激情无码日韩| 日本道不卡| 亚洲 欧美 日本 国内 首页| 男人的天堂kva| 亚洲超碰97| 中文字幕,人妻,日韩| 久久人人爽爽人人爽人人片αV| 人人操人人操人人人操| 国产呦精品一区二区三区下载| 静品嫩模一区二区| 欧美色图亚州激情| 黄站在线免费观看| 岛国黄片网站| 久99热| 99天天超碰| 熟妇人妻丰满久久久久久久无码 | 国产福利影视| 大香蕉在线视频15| 破处bbq| 国产精品第一区第一页| 亚洲AV无码成人精品久久| 人人妻人人操人人乐| 人妻 欧美亚洲| 白丝AV| 国产在线精品偷| 人妻AV 中文字幕的| 性交一区二区在线播放| 亚洲色图91| www久久99| 国产女人9999| 99999re| 色9999日韩国产| 日韩中文字幕宗合在线| 黄色免费一级在线毛片| 久久亚洲不卡| 啊啊啊想要| 久久婷婷五月综合| 操逼国产免费| 午夜精品久久久99热蜜桃的功能特点| 中出后入| 欧美性Fer办公室秘书| 欧美性,亚州色| 999综合色| 2026国产精品视频| 91超碰在线播放| 欧美男女午夜啪啪| 激情文学欧美| 欧美人妻中出| 玖玖爱伊人玖玖爱| 天美国产精品| 久久线上视频免费看| 亚洲av综合色| 色噜噜人妻丝袜a∨先锋影| 亚洲精品影视老司机| 欧美日韩中文视频播放| 精品九九九九九九| 国产九九九九九九| 国产传媒美日韩av| 熟女露脸激情自拍视频| 日本视频一区二区三区| 我想要啊 啊 啊| 免费观看性欧美一级| 人妻夜夜爽天天爽麻豆三区网站| 欧美96在线|欧| 国产无码高清操逼视频| 精品一区二区三区蜜桃臀赵总 | 欧美春色| 五月婷婷丁香中文字幕| 色偷偷超碰亚洲| 国产精品爽爽va在线观看98| 久久亚洲色图中文字幕| 强奸乱伦Av网| 高清视频一区| 97人人射| 久久久久九九九九九| 久久婷婷亚洲| 一本色道久久综合亚洲二区三区| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 午夜亚洲国产理论秋霞| 亚洲综合性感在线| 欧美老妇曰批的视频| 色老牛| 亚洲中文字幕一区| 亚洲精品欧洲精品| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 999国产精品999久久久久久| 干婷婷综合网| 国产丝袜欧美在线视频| 久久国产999| 久久人人爽人人爽人人片Ⅴ| 啊啊啊想要| 色 亚洲 91| 天天流夜夜操| 九九九九九九免费视频| 超碰97欧美在线| 五月天亚洲网| 久久精品国产AV一区二区三区| 精品人妻av在线播放| 亚洲欧洲小说图片视频| 91亚洲欧美综合高清在线| 亚洲丝袜B诱惑| 亚洲国产午夜真人一级片中文字幕精品黄网站| 免费精品无码一级毛片牛牛影视 | 久久精品国产99精品亚洲蜜...| 97欧美色| 人妻日日夜夜精品| 亚洲无码视频免费在线观看网址! J?P?NESEHD熟女熟妇伦 | 伊人加勒比| 欧美淫乱视频| 亚洲欧洲无码一区夜| 啊好爽受不了无码| 欧美日韩m| 久操大香蕉手机视频在线看| 日本高清有码网址视频| 国产成人无码啪| 亚洲乱色熟女一区| 国产在线播放成人免费| 男人的午夜天堂| 99草精| 亚洲色图 91| 久操视频这里只有精品| 欧美双插| 亚欧高清| 久久美女国产| 无码人妻丰满热妇又大又粗| 在线国产一区二区av| 亚洲黄色网址视频| 日韩精品永久在线观看| 99视频自拍| 久久久五月天| 日本不卡高清免v欧美日韩在线观看| 日本色婷婷| 欧美在线官网| 亚洲www91| 欧美色图小说综合| 九九九九9999| 国产一级高跟丝袜| 日本一区二区不卡精品| 色欲日韩欧美在线一区| 人人爱操| 日本一区二区电影网站| 用力操死我| 插入粉嫩少妇视频| 国产 亚洲 一二三四| 亚洲中文字幕精品久久久久久直播| 欧美日韩操逼嗦吊| 免费农村成人少妇人妻Aa一区二区视频 | 久久原创中文| 欧亚日韩中文在线| 一区二区三区美女超清| 国产成人+综合亚洲+天堂| 亚洲精品一区中文字幕乱码| 超碰这里只有精品| 老熟妇91| 澳门成人网站久国产日韩| av激情亚洲五月天| 老熟女91av| 中文字幕精品亚洲熟女| 日韩中文欧美| 亚洲操逼网| 岛国在线免费视频| 中文97国产| 久久成人精品| 欧美18 在线观看| 殴美大黄片| 亚洲限制级在线| 欧美se综合| **一级毛片国产| 久久少妇视频| 岛国激情视频在线观看| 日韩精品高清资源在线| 91亚洲电影| 69人妻精品一区二区绯色| 欧美线天码中字| 无码精品蜜桃一区二区三区ww| 97色色国产视频| 亚洲欧洲成人在线电影| 中文字幕乱码人妻一区二区三区,99精品| 97国产精品久久久久| 日韩欧美亚洲一区二区三区影院| 欧美亚洲日韩16色| 日韩免费三级黄片电影| 韩国一区二区精品亚洲| 亚洲美女30b| 日本精品五区| japan日本高清乱xxxx| 欧美国产有色电影| 无码国产Av| 日韩 欧美 校园一区| 大象AV在线| 中文字幕91综合| 91精品人妻一品二品三品| 久久一区二区三区入口| 亚洲天堂一二| 久久,精品一二三| 麻豆区久久久久亚| 亚洲成人av电影在线| 校园春色宗合网| 久久久夜夜嗨免费视频| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 日韩在线欧美精品一区二区| 色眯眯av| 操狠狠| 免费啪啪av| 在线洲亚线| 亚州熟妇精品| 亚洲91亚洲| 国产色呦呦| 乱抡国产91| 久久网亚洲| 蜜桃在线观看一区二区三区| 国产做?爰片久久毛片?片美国| 99热一区二区三区四区| 日日骚精品视频| 女人爽到高潮久久久| 一区二区三区黄色片a| 9Ⅰ超碰| 97久久精品不卡| 少妇六月天| 久久久一区二区三区四曲免费听| av绯色| 秋霞久久亚洲精品成人| 亚洲 欧美 精品专区 极品| 99热欧美| 91宗合网| 日韩有码专区| 欧中美三级一区二区三区| 欧美日韩91| 2011国产精品| 亚洲男人的天堂V| 黑人精品久久97| 久久久久9999精品九九九| 色综合久久夜色精品国产天堂| 九九成人精品| 日本精品国产视频| 亚洲狼狼干综合1| 色蜜AV| 免费啪啪一级视频| 国产无码精品高清| 欧美十八禁网站| 国产树林里野战在线看| 99热18| 97WW精品| 亚洲天堂人人妻| 伊人991| 丝袜狠狠草尤物 91| 久久亚洲不卡一区二区三区 | 精品四五区| WWW4虎| 欧美日韩国产电影| 97情超碰色| 午夜爽爽爽| 99这里只有精品国产| 久久国产性爱| 思思99热| 欧美一级欧美三级在线观看| 欧美少妇高潮久久91| chaopen97久久| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 日本免费一区二区不卡 | 国产精品午夜福利亚洲综合网| 涩综合导航| 色色色99| 天天舔天天日天天射| 97美日韩视频| 一本色道综合久久欧美| 日本色色色视频| 极品丝袜无码| 蜜桃AV天堂| AⅤ片水多多| 人看人人摸人人操| 97中文天堂| 色五月AV在线| 综合网 欧美| 超碰成人国产| 久操影视| 3p国产欧美99热| 亚洲中文字幕久久无码精品| 天天做天天爱| 亚洲AV无码成人精品久久| 色欲人妻一区二区在线| 丰满人妻区一区二区三| 国产美女销魂在线观看不卡| 色区久久| 亚州性色| julia高潮后不停追击中出| 久久九九一区二区三区成人| 欧美18 在线观看| 一区黄二区黄| 国产黄色影片在线观看| 蜜桃臀 后入 一区 二区 三区 在线| 亚洲人妻五月丁香婷婷| 狠狠综合网| 欧美日韩狠狠爱| 91黑丝露脚| 91精品人妻| 亚洲有薄码区日本系列中文字幕| 国产精品乱码久久| 91超碰人人| 国产精品人妻免费精品| 96AV久久久| 91天美| 啊啊啊啊二区好大| 91强奸乱轮| 欧美日韩亚洲少妇寂寞影院正在播放 | 操屄不卡视频| 日韩综合色网| 97精品一二区| 性爱Av免费| 国产一区二区在线看| 熟女人妻久久中文字幕一二区| 黄色免费一级在线毛片| 欧美亚州色的图| 亚洲五月婷婷| 亚欧毛片基地国产毛片基地| 2003天天干夜夜操| 人人乐大香蕉| 日韩中文字幕在线视频观看| 亚洲毛片基地专区| 日韩精品人妻中文字有码在线| 亚洲女毛多水多21P| 久久久四区| 操死我了嗯嗯嗯| 99热精品在线在线| 女性喷水高潮在线观看| 亚洲,欧美,综合网| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 欧美图片色五月天| 夜夜操91744565| 97干在线视频| 老子午夜伦不卡影院| 国产熟女一区二区| 超碰日韩美妻| 精彩国产视频播放1区2区| 亚洲夜夜欢无码一区二区| 成人性爱视频在线看| 日韩小电影| 精品传媒在线一区| 色综91| 日韩视频中文字幕| 欧美日韩精品久久久久久久久东北老熟妇| 久久久性少妇| 99热销国产这里有精品| 青青草福利视频| 精品人妻中文字幕高清| 欧美A片中文字幕| 一级黄色牲爱A级片| 国产成人精品亚洲日本| 婷婷丁香六月| 欧美一二在线| 青青草久久| 囯产精品久久久久久久久久二区三区| 亚洲情欲| 先锋色眉乱伦资源| 五月婷婷六月色| 99热亚洲天堂| 久日综合网| 中文字幕三四区| 国产对白刺激视频| 婷婷综合| 97在线观看免费视频l| 精品女同一区| 亚欧免费| 超碰爽人妻熟女Av| 99色在线| 热99这里有精品综合久久 | 久久久久国产精品久久久| 日夜伊人网| 激情小说成人日本无码一| 少妇天堂网络| 婷婷国产精品一区二区| 偷拍 精品 另类 四区| 97摸视频| www亚洲免费| 亚洲久9| 992这里有精品| 91插B网站| 欧美亚洲高清| 操操逼视频| 久久精9| 亚洲欧洲久久天堂| 精品美女在线视频| 一级性爱视频免费观看 | 精品久久九| 农村少妇久久久久久久| A级在线视频| 色五月婷婷在线| 亚洲第一男人天堂| 亚洲小电影免费涩涩成人在线高清| AV天堂电影网| 黄呦呦在线| 歐美一級亂黃99在綫精品| 亚洲熟妇综合久久久久久| 白嫩妹子国产骚| 国产一区在线观看无码AV| 亚洲色天堂日韩中| 伊人国产视频| 色在线综合| 刺激精品视频| 日韩卡一卡二卡三在线| 日韩欧美操逼xxx| 91在线页| 99热精品在线播放| 国产蜜臀精品一区二区尤物| 日本人妻伦在线中文字幕| 91九色网| 懂色AV中文| 九久久九精品视频| 97色碰| 亚洲黄日韩无码专区| 精品国产三级av韩国在线| 精品网站9999| 日日干夜夜操视频h| 日本一区二区三区欧美日韩中文字幕| 国产精品一区二区a| Julia在线播放亚洲久久| 诱惑网综合| 亚洲国产成人精品久久久国产成人一区二区三. | 国产操逼网站亚洲一级黄色| a片久久久久久久久久久久| 国产日韩欧美三级片| 亚洲诱惑| 亚洲熟女乱色一区二区三区| 色五月婷婷五月天| h无码动漫在线观看| 欧美亚洲综合色| 香蕉欧美| 六月婷婷色综合| 欧美综合狠| 国产精品亚洲一级av第二区| 色蜜AV| 少妇久久久久久| 日本新免费二区三区| 超碰97玖玖爱| 亚洲精品九九九| 精品人妻美妇91job| 欧洲亚洲天堂精品| 手机看片日韩人妻| 一本久久精品中文字| 自拍偷拍 日韩欧美| 亚洲色图自拍| 3P乱轮视频| 人妻激情偷乱视频一区二区三区| 国产AV人人 夜夜人人澡| 91福利网在线观看| 殴美性色a级欧美| 日韩性爱啪啪视频| 欧洲精品在线播放| 国产亚洲精品美女久久久| 久久9视频| 国产在线激情| 午夜精品久久久99| 日韩紧密久久| 大香蕉十区| 91高跟美女在线播放| 精品国产91久久久久久一区黄无| 99ri视频| 久久精品三级影视| 人人摸人人干| 亚洲不卡不卡中文字幕不卡| 日韩精品人妻系列无码天堂| 偷拍欧美综合| 69精品人人人人| 色悠久久久av| 亚洲人妻爽爽爽| 日本成熟少妇A∨网站| 亚洲āv网址在线观看| 成人性爱av| 五月婷婷久久综合| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 超碰97国产欧美| 婷婷超| 国产极品99热在线播放69| 亚洲欧美另类激情小说| 激情国产乱伦Av| 理论久久婷婷网 8| 精品一国2| 欧美亚洲中文| 操逼网免费无码视频| 影音综合网| 97在线视频免费看| 欧美特大AA级黄片| 爱爱60秒免费视频| 亚精品无码毛片一区二区三区| 91一区二匹| 国产激情在线| 亚洲色图综合网| 国产强奸乱伦第1页| 欧美性爱另类综合| 精品小视频在线| 91 欧美| 亚洲乱熟女一区二区三区大香蕉| 99re在线观看| 免费精品无码一级毛片牛牛影视| 激情综合婷婷| 国产人伦精品一区二区三区| 四方色播| www.婷婷| 日韩一二三区| 亚洲欧美精品91| 少妇丝袜在线观看AV| 久久亚州精品成人Av无| 国产精品久久发布| 69天堂| http://qxhbdz.com| 久久 精品| 情侣开房子拍 日韩无码 女的很漂亮| 男人的天堂Va| 久久九九99| 激情小说在线视频| 九九久久久久久爱| A片A5445444| 久久久久网站-538在线视频-欧美永久乱码 | 精品婷婷| 涩涩五月天| 99熟女| 九九九九久久久| 亚洲日本韩国极品一区二区| 亚洲国产精品乱码在线观看| 中文字幕二区日韩天堂| 欧美性爱无码一区二区三区| 97干97色| 校园春色五月天| 2017天天插| 91性网| 国产午夜精品一区二区三区牛牛| 日本999精品| 亚洲熟妇自偷自拍另欧美| 无码高清国产AV| 亚洲一区在线观看欧洲| 亚洲视频精选| 麻豆人妻偷人精品无码视频| 冬京热男人的天堂| 91被操| 天堂亚洲欧美| 欧成人精品H无码| 免费视频在线一区二区不卡| 人妻无一区二区三区| 日逼视频日本| 日本3级一区二区免费| 国产自产自拍| 97超碰总站| 国产女人操逼视频| 情色大香蕉| 国产亚洲日韩在线三区黑人| 麻豆久久久久久久久丝袜| 搡老熟女免费视频| 亚洲男人天堂手机版| 久久久久78| 激情丁香五月| 搡老熟女免费视频| 神马久久网| 东京热男人的天堂精品| 香蕉av一区二区三区| 欧美成人A√在线一区二区| 丝袜综合| 日本中文字幕不卡视频| 男人久久精品| 亚洲欧洲国产综合av| 亚洲风情在线观看| 亚洲永久AV无码精品秋霞| 日本三级日本三级三级人妇四虎| 日韩去日本高清在| 亚洲一区二区在线观看91| 日本三级韩三级99久久| 大香蕉 222| 大香网站| 乱伦一二三区| 欧美日韩大陆黑人少妇99| 久久成人国产| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 蜜乳AV.COM| 亚洲蜜臀懂色| 精品人妻1区| 人妻天天夜夜爽一区二区| 日韩福利综合一区| 精品一区二区三区麻豆| 欧美夜色| 精品久久久久,69国产成人精| 激情看片网站| 色播五月丁香| 九九av| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 色婷婷电影网| 97色论| 亚洲人综合| 中文字幕乱亚洲美女精品一区| 亚洲欧美一区二区网址| 精品国产一区二区三区香蕉欧美| 婷婷干黄色| 99在线精品观看99| 欧美老熟另类| 色妹子A V| 国产人妻精品久久久一区二区三区| 一区二区三区男女操逼黄色小电影| 四季AV一区二区凹凸精品小说| 青青草吊丝| 亚欧美综合网。| 色噜噜人妻av中文字幕| 蜜臀久久99精品久久久久| 91丨九色丨国产丨人妻在线| 噜噜噜无码AV一级一级久久影院| 五月丁香激情综合网| 欧美久久婷婷| 久96热在线观看视频| 最新国产亚洲精品精品国产亚洲综合| 精品国产网站| 超碰诱惑| 久久婷婷亚洲| 亚洲欧美一区二区不卡视频播放| 78操B| 国产成人超碰在线| 伊人久久青青草| 91丰满| 理论久久婷婷网 8| 男女香蕉一区二区| 成人小说视频在线精品欧美| 五月丁香六月激情| 天天综合站| 免费看黄视频亚洲网站| 色婷婷五月天| 久久亚洲一区二区色婷婷| 精品久久久久久中文| 中文字幕日韩人妻视频一区二区三区 | 国产天天看| 后入 亚洲 美女 射| 久噜噜| 97色色,97综合| 欧美日日人人天天| 97K超碰在线| 青青草天天亲夜夜操网| 成人五级久久| 亚洲成av人片色午夜乱码| 日本天堂在线播放| 日韩国产中文字幕| 国产区在线| 久久精品亚洲婷婷| 久久国产乱子伦精品免费女人| 激情欧美日韩女同久久| 操逼逼福利视频| 精品人妻久久久| 99re这里只有精品中心播放 | 一区二区日韩欧美久久| 国产精品不卡av免费在线观看| 国产精品午夜成人福利| 国产精品探花视频| 大香蕉综合网| 日本顶级天天操狠狠操夜夜操中文字幕| 一区二区三区高清天码| 精品少妇一区二区| 青青草吊丝| 尤物一级在线免费观看| 超碰免费97| 欧美黑人91| 亚洲av热热色| 亚洲精品色| 国产中文字幕曰本毛片| 91bbb| 桑老女人九区| 91麻豆天美传媒HD| 精品一区二区三区蜜桃臀赵总| 午夜国产乱伦视频| 男人天堂新在线| 97免费视频在线观看视频| 激情综合五月天| 日韩黄色一区二区三区| 天天做天天爱夜夜爽毛片试看| 精品十八在线观看| 91天美传媒在线观看| 91久热这里只有精品| 国产亚州日韩欧美看片| 中文字幕美女91| 国产美女在线精品免费看| 精品无人区麻豆乱码1区2区图片| 亚洲性少妇| 二三四区精品| 射丝袜大香蕉| 精品乱码久久久久| 色大师网站www永久网站视频| 96AV久久久| 亚洲中文人妻色| 精品久久久久久久久久久久| 啊啊啊在线观看免费视频| 鸥美插入视频| 日本新免费二区三区| 欧美日韩97在线| 欧美精品欧美精品系列 | 五月婷婷丁香| 日韩人妻精品久久久久| 国产精品久久发布| 欧美少妇第一页| 男人把坤坤插入女人的下体| 亚洲的天堂网| AV女优男人的天堂| 日本成a人v网站在线观看| 91香蕉视频在线观看免费| 无码高清国产AV| 九九黄色网| 久久嫩草国产成人一区| av久日| 国产97免费视频| 十八禁av无码免费网站APP| 色嗨嗨在线| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 久久久国产三级黄色片| 中文字幕成人| 美日韩在线不卡人妻| 97ai亚洲| 日韩簧片免费看| 婷婷综合久久| 欧洲亚洲人人爽爽视频| 91美女在线观看| 国模无码一区二区三区在线| 久久国产99精品72福利| 大香蕉日亚洲日本亚大| 人妻另类 专区 欧美 制服| 黄色一级视| 91日日| 日本淫乱女一区二区三区视频| 国产精选三级在线观看| 超碰 另类 欧美| 亚洲欧美伦综合| 亚洲中文字幕三级在线| 二三四区精品| 国产一区二区三区白丝| 99精品久久久久久久婷婷| 亚州春色| 1769国内精品视频| 欧亚综合一卡二卡中文字幕| 亚洲午夜蜜臀| 日韩精品永久在线观看| 蜜臀av网址| 免费观看的黄色的网站| 久久九九一区二区三区成人| 久久系列| 99热亚洲天堂| 人妻精品视频一区二区三区| 中文字幕av色| 人妻另类 专区 欧美 制服| 国产原创精品| 久久大黄片| 久久精品国产99国产精品亚洲| 久久久久久亚洲Av无码精| 久久久久亚洲精品| 在线观看无码三级少妇| 久久精品99久久久久久| 91成人在线免费视频| 青青草好吊| 一色网男人的天堂| 欧美一区二区三区互相| 综合九九| 欧美男女午夜啪啪| 26uuu国产亚洲综合| 91女优在线观看 | www.av在线观看| 91亚洲欧美激情| 亚洲精品天天影视综合网 | 亚洲情色一区二区三区| 无码天天操| 日韩熟女无码| 综合欧美亚洲| 久久久久久人体| 日本精品一区二区三| 绯色AV粉色AV蜜臀AV| 韩国一区二区精品亚洲| 骚逼高潮久久精品| 婷婷天堂站| 色爱综合网| 色五月av| 国产精品久久久久av| 日韩色| 青青操综合网| 欧美aaaaaaa| 超碰在线香蕉| 看黄片视频免费| 激情久久久| 人人天天干干| 六月色色| 狠狠干,狠狠操| 五月色网| 久久精品小视频| 内射白嫩美女| 欧美日韩成人在线| 国产97视频免费观看| 看一级特黄a大一片| 国产大陆天天艹| 久久久无码av精| 日韩亚洲中文字幕在线| 亚洲AV无码AV吞精久久久久 | 91久久国产精品| 超碰伊人在线| 色眯眯av| 人妻大香蕉| 日韩日韩日韩-国产乱码精品一区二区| 亚洲一二三| 五十路熟女,国产欧美精品区一区二区三区 | 国产欧美在线观看免费观看| 午夜传煤十二区精品| 性感美女91影视| 狠狠爱夜夜| 激情五月综合开心五月| 国产精品久久久无码aV去| 国产日产精品久久快鸭的功能介绍| se吧提供国产乱老熟视频胖女人| 日韩操逼性鲍| 日韩国产乱子伦App|