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

ARTICLE DETAIL

資訊詳情

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

Netty源碼解析:Connect與Bind兩大操作的核心差異與NIO事件鏈路

Netty源碼解析:Connect與Bind兩大操作的核心差異與NIO事件鏈路 做Netty源碼分析繞不開(kāi)兩個(gè)最基礎(chǔ)也最容易被混為一談的操作客戶(hù)端的Connect服務(wù)端的Bind。我最初啃源碼時(shí)也有個(gè)錯(cuò)覺(jué)這兩個(gè)操作不都是“把channel往某個(gè)地址上一掛”么一個(gè)連遠(yuǎn)程一個(gè)綁本地好像只是參數(shù)不同。真把調(diào)用鏈一路追下去才發(fā)現(xiàn)從入口到NIO底層的興趣事件處理它們完完全全是兩套邏輯只是中段共用了一段注冊(cè)代碼導(dǎo)致表面看著很像。這篇Connect與Bind對(duì)比總結(jié)就把這兩條鏈路從入口到NIO事件循環(huán)徹底拆開(kāi)講順便把backlog、connectTimeoutMillis、OP_ACCEPT和OP_CONNECT這幾個(gè)大家經(jīng)常面試被問(wèn)、排查時(shí)又搞不清的細(xì)節(jié)一并說(shuō)透。無(wú)論你是在準(zhǔn)備N(xiāo)etty相關(guān)面試還是排查線(xiàn)上連接不上、端口占用這類(lèi)問(wèn)題這篇都能當(dāng)一份源碼級(jí)的速查手冊(cè)用。1. 先說(shuō)結(jié)論Connect與Bind招式像內(nèi)功完全兩套1.1 從一段最常見(jiàn)的使用代碼說(shuō)起先用最典型的兩段代碼把場(chǎng)景立住。服務(wù)端是這么寫(xiě)的ServerBootstrap serverBootstrap new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childHandler(new ChannelInitializerSocketChannel() { Override protected void initChannel(SocketChannel ch) { ch.pipeline().addLast(new ServerHandler()); } }); serverBootstrap.bind(8080).sync();客戶(hù)端是這么寫(xiě)的Bootstrap bootstrap new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializerSocketChannel() { Override protected void initChannel(SocketChannel ch) { ch.pipeline().addLast(new ClientHandler()); } }); bootstrap.connect(127.0.0.1, 8080).sync();從使用者的角度兩個(gè)操作都返回ChannelFuture都可以.sync()阻塞等待失敗都能拿到.cause()寫(xiě)起來(lái)體感高度一致。但它們背后的channel類(lèi)型都不同一個(gè)是NioServerSocketChannel一個(gè)是NioSocketChannel這已經(jīng)暗示了后續(xù)走向完全不同。接下來(lái)從入口開(kāi)始一追到底。1.2 兩條鏈路的“形似”與“神離”我把兩條調(diào)用鏈從入口到最終落到底層NIO的路徑壓縮成一句話(huà)bind鏈路ServerBootstrap.bind()→AbstractBootstrap.doBind()→initAndRegister()→doBind0()→channel.bind()→pipeline.fireChannelBind()→NioServerSocketChannel.doBind()→ServerSocketChannel.bind(port, backlog)connect鏈路Bootstrap.connect()→doResolveAndConnect()→initAndRegister()→channel.connect()→pipeline.fireChannelConnect()→NioSocketChannel.doConnect()→SocketChannel.connect(remoteAddress)兩條鏈都在initAndRegister()這里匯合完成channel創(chuàng)建和注冊(cè)到NioEventLoop的selector之后立刻分道揚(yáng)鑣。后面會(huì)看到真正的格局差異在NioEventLoop處理就緒事件時(shí)才暴露出來(lái)bind之后注冊(cè)O(shè)P_ACCEPT等新連接connect之后先注冊(cè)O(shè)P_CONNECT等連接完成完成之后再轉(zhuǎn)向OP_READ讀寫(xiě)數(shù)據(jù)。1.3 這篇總結(jié)適合誰(shuí)讀完能帶走什么這篇總結(jié)適合這么幾類(lèi)人正準(zhǔn)備N(xiāo)etty源碼面試需要把啟動(dòng)流程講清楚的人線(xiàn)上遇到“偶爾連不上”、“大量TIME_WAIT”、“端口明明沒(méi)占用卻bind失敗”這類(lèi)問(wèn)題想從原理層面找切入點(diǎn)的開(kāi)發(fā)以及剛開(kāi)始看Netty源碼被doBind0、initAndRegister這些方法名繞暈的自學(xué)者。讀完你至少能帶走四樣?xùn)|西第一Connect和Bind在傳播路徑上的真正分水嶺第二OP_ACCEPT與OP_CONNECT在NioEventLoop里是怎么被區(qū)別處理的第三backlog、connectTimeoutMillis這些參數(shù)到底作用在哪一層第四遇到bind失敗、connect超時(shí)這些常見(jiàn)錯(cuò)誤時(shí)一套可復(fù)用的排查思路。2. 入口分叉Bootstrap.connect與ServerBootstrap.bind在AbstractBootstrap里怎么走2.1 bind()的調(diào)用鏈從validate到doBind0ServerBootstrap本身沒(méi)有重寫(xiě)bind方法它直接繼承了AbstractBootstrap的bind(SocketAddress localAddress)。我們跟進(jìn)去看核心的doBindprivate ChannelFuture doBind(final SocketAddress localAddress) { final ChannelFuture regFuture initAndRegister(); final Channel channel regFuture.channel(); if (regFuture.cause() ! null) { return regFuture; } if (regFuture.isDone()) { ChannelPromise promise channel.newPromise(); doBind0(regFuture, channel, localAddress, promise); return promise; } else { final PendingRegistrationPromise promise new PendingRegistrationPromise(channel); regFuture.addListener(new ChannelFutureListener() { Override public void operationComplete(ChannelFuture future) throws Exception { Throwable cause future.cause(); if (cause ! null) { promise.setFailure(cause); } else { promise.registered(); doBind0(regFuture, channel, localAddress, promise); } } }); return promise; } }這段代碼的關(guān)鍵邏輯在于initAndRegister()是異步的channel注冊(cè)到EventLoop上不一定已經(jīng)完成所以這里分兩種情況處理——注冊(cè)已完成就直接doBind0未完成就掛一個(gè)監(jiān)聽(tīng)器等注冊(cè)完成后再執(zhí)行doBind0。這是Netty異步編程的一個(gè)典型設(shè)計(jì)后續(xù)動(dòng)作不一定立刻執(zhí)行但它一定會(huì)在正確的時(shí)間點(diǎn)被觸發(fā)。繼續(xù)看doBind0這里有個(gè)值得一提的小細(xì)節(jié)private static void doBind0( final ChannelFuture regFuture, final Channel channel, final SocketAddress localAddress, final ChannelPromise promise) { channel.eventLoop().execute(new Runnable() { Override public void run() { if (regFuture.isSuccess()) { channel.bind(localAddress, promise).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); } else { promise.setFailure(regFuture.cause()); } } }); }注意兩個(gè)點(diǎn)。第一channel.bind()被放進(jìn)了eventLoop().execute()里執(zhí)行保證了channel操作一定在它所屬的IO線(xiàn)程上串行發(fā)生從根源上避免了多線(xiàn)程并發(fā)寫(xiě)channel的問(wèn)題。第二這里加了一個(gè)CLOSE_ON_FAILURE監(jiān)聽(tīng)器bind一旦失敗channel會(huì)被自動(dòng)關(guān)閉這是個(gè)很容易被忽略的兜底機(jī)制——所以線(xiàn)上bind失敗后即使你不手動(dòng)close這個(gè)channel也不會(huì)泄漏。2.2 connect()的調(diào)用鏈doResolveAndConnect先把地址解析交給線(xiàn)程池Bootstrap重寫(xiě)了connect但真正的實(shí)現(xiàn)不在connect里而是轉(zhuǎn)到了doResolveAndConnectprivate ChannelFuture doResolveAndConnect( final SocketAddress remoteAddress, final SocketAddress localAddress) { final ChannelFuture regFuture initAndRegister(); final Channel channel regFuture.channel(); if (regFuture.isDone()) { if (!regFuture.isSuccess()) { return regFuture; } return doResolveAndConnect0(channel, remoteAddress, localAddress, channel.newPromise()); } else { final PendingRegistrationPromise promise new PendingRegistrationPromise(channel); regFuture.addListener(new ChannelFutureListener() { Override public void operationComplete(ChannelFuture future) throws Exception { Throwable cause future.cause(); if (cause ! null) { promise.setFailure(cause); } else { promise.registered(); doResolveAndConnect0(channel, remoteAddress, localAddress, promise); } } }); return promise; } }結(jié)構(gòu)與doBind幾乎一致也都是等注冊(cè)完成后再發(fā)起真正的連接動(dòng)作。接下來(lái)看doResolveAndConnect0這里就出現(xiàn)了和bind的第一個(gè)顯著差異private ChannelFuture doResolveAndConnect0( final Channel channel, SocketAddress remoteAddress, final SocketAddress localAddress, final ChannelPromise promise) { try { EventLoop eventLoop channel.eventLoop(); AddressResolverSocketAddress resolver this.resolver.getResolver(eventLoop); if (!resolver.isSupported(remoteAddress) || resolver.isResolved(remoteAddress)) { channel.connect(remoteAddress, localAddress, promise); return promise; } FutureSocketAddress resolveFuture resolver.resolve(remoteAddress); ... } }如果遠(yuǎn)程目標(biāo)是域名而不是IPNetty會(huì)先用AddressResolver異步解析DNS解析完成后再真正發(fā)起channel.connect()。DNS解析默認(rèn)走的是DefaultAddressResolverGroup底層用Netty自己封裝的一套異步DNS客戶(hù)端實(shí)現(xiàn)。2.3 為什么connect要異步解析地址bind卻不用這個(gè)問(wèn)題我當(dāng)初也想過(guò)bind拿到的是本地地址本機(jī)網(wǎng)卡信息是確定性的不存在“需要查DNS”的場(chǎng)景所以bind鏈路不需要resolver這一層。connect則完全相反你寫(xiě)connect(some-service.example.com, 8080)時(shí)底層需要先把域名解析成IP而DNS查詢(xún)?cè)诰W(wǎng)絡(luò)環(huán)境里可能耗時(shí)幾十毫秒甚至數(shù)秒如果阻塞在IO線(xiàn)程上整個(gè)EventLoop上的其他channel都會(huì)被拖累。Netty把這一步也異步化了讓DNS解析發(fā)生在獨(dú)立的Resolver線(xiàn)程組里解析完成后由回調(diào)把結(jié)果帶回EventLoop再執(zhí)行真正的connect。這一點(diǎn)對(duì)比能幫我們?cè)谠创a層面理解一個(gè)宏觀(guān)設(shè)計(jì)原則任何可能阻塞IO線(xiàn)程的操作Netty都會(huì)想方設(shè)法移出去或者以異步回調(diào)的方式回來(lái)。bind是純本地系統(tǒng)調(diào)用最快路徑就是直接在EventLoop里同步執(zhí)行connect涉及域名解析就要額外走一層。3. 源碼逐行看bind與connect在Channel層真正做了什么3.1 bind從pipeline一路摸到NioServerSocketChannel.doBindchannel.bind(localAddress, promise)會(huì)從DefaultChannelPipeline進(jìn)入。Netty的pipeline傳播規(guī)則是出站事件從Tail開(kāi)始往前找直到某個(gè)ChannelOutboundHandler處理它入站事件從Head開(kāi)始往后傳播。bind是典型的出站事件所以它會(huì)倒著走pipelineTailContext - 用戶(hù)OutboundHandler - ... - HeadContextHeadContext本身就實(shí)現(xiàn)了ChannelOutboundHandler它的bind方法最終調(diào)用了unsafe.bind。unsafe是Netty對(duì)JDK底層channel操作的封裝層全名叫Channel.Unsafe名字聽(tīng)著危險(xiǎn)其實(shí)是完成真正臟活累活的地方。再往下就到了AbstractChannel.bindOverride public final void bind(final SocketAddress localAddress, final ChannelPromise promise) { ... boolean wasActive isActive(); doBind(localAddress); if (!wasActive isActive()) { pipeline.fireChannelActive(); } promise.setSuccess(); }這里有兩個(gè)關(guān)鍵判斷bind之前channel處于inactive狀態(tài)bind成功之后channel變成active于是觸發(fā)fireChannelActive()。這個(gè)事件很重要——服務(wù)端會(huì)在doBeginRead里根據(jù)isActive狀態(tài)注冊(cè)O(shè)P_ACCEPT。真正落到NIO層的是NioServerSocketChannel.doBindOverride protected void doBind(SocketAddress localAddress) throws Exception { if (PlatformDependent.javaVersion() 7) { javaChannel().bind(localAddress, config.getBacklog()); } else { javaChannel().socket().bind(localAddress, config.getBacklog()); } active true; }這里直接調(diào)用了JDK NIO的ServerSocketChannel.bind(localAddress, backlog)。注意第二個(gè)參數(shù)config.getBacklog()這個(gè)值就是從ChannelOption.SO_BACKLOG讀出來(lái)的傳給操作系統(tǒng)控制連接隊(duì)列深度的關(guān)鍵參數(shù)。如果這個(gè)端口已經(jīng)被別的進(jìn)程占用這一行會(huì)拋出SocketException(Address already in use)一路向上傳播最終體現(xiàn)在你bind().sync()拿到的異常里。3.2 connect從pipeline一路摸到NioSocketChannel.doConnectconnect同樣是出站事件同樣從Tail倒著走到HeadContext.connect然后進(jìn)入unsafe.connect最終到達(dá)NioSocketChannel.doConnectOverride protected boolean doConnect( SocketAddress remoteAddress, SocketAddress localAddress) throws Exception { if (localAddress ! null) { javaChannel().socket().bind(localAddress); } boolean success false; try { boolean connected javaChannel().connect(remoteAddress); if (!connected) { selectionKey().interestOps(SelectionKey.OP_CONNECT); } success true; return connected; } finally { if (!success) { doClose(); } } }這段代碼是理解非阻塞connect的關(guān)鍵。JDK NIO的SocketChannel.connect在非阻塞模式下并不會(huì)阻塞到連接建立完成而是立即返回一個(gè)布爾值如果返回true說(shuō)明連接已經(jīng)立刻建立比如連本機(jī)回環(huán)地址如果返回false說(shuō)明連接還在進(jìn)行中。此時(shí)Netty立刻把興趣事件設(shè)置為OP_CONNECT把“等待連接完成”這件事交給了Selector——相當(dāng)于告訴操作系統(tǒng)這個(gè)socket正在連接中等它連好了你通知我。finally塊里的doClose()是一個(gè)很?chē)?yán)謹(jǐn)?shù)亩档兹绻谠O(shè)置興趣事件之前出了任何異常說(shuō)明連接沒(méi)正常發(fā)起必須關(guān)閉channel避免半初始化狀態(tài)的socket泄漏。當(dāng)操作系統(tǒng)通知連接完成時(shí)NioSocketChannel.doFinishConnect會(huì)被調(diào)用Override protected void doFinishConnect() throws Exception { if (!javaChannel().finishConnect()) { throw new ConnectException(finishConnect() returned false); } }finishConnect()會(huì)確認(rèn)連接狀態(tài)如果連接已經(jīng)建立返回true這條鏈路就通了如果連接失敗比如對(duì)端拒絕這里會(huì)直接拋出ConnectException——這就是你在客戶(hù)端sync()時(shí)拿到Connection refused異常的最底層來(lái)源。3.3 NioEventLoop里OP_ACCEPT與OP_CONNECT的分叉處理服務(wù)端和客戶(hù)端的命運(yùn)在NioEventLoop的processSelectedKey里真正分道揚(yáng)鑣??催@段核心代碼if ((readyOps (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) ! 0 || readyOps 0) { unsafe.read(); } if ((readyOps SelectionKey.OP_WRITE) ! 0) { ch.unsafe().forceFlush(); } if ((readyOps SelectionKey.OP_CONNECT) ! 0) { int ops k.interestOps(); ops ~SelectionKey.OP_CONNECT; k.interestOps(ops); unsafe.finishConnect(); }OP_ACCEPT被歸到和OP_READ同一個(gè)分支走的是unsafe.read()。但這時(shí)的“讀”不是讀數(shù)據(jù)而是讀新連接。NioMessageUnsafe.read()內(nèi)部會(huì)調(diào)用doReadMessages把已經(jīng)完成三次握手的連接逐個(gè)accept()出來(lái)封裝成NioSocketChannel然后觸發(fā)pipeline.fireChannelRead。服務(wù)端的pipeline里有一個(gè)關(guān)鍵handler叫ServerBootstrapAcceptor它會(huì)在channelRead里把新accept出來(lái)的channel注冊(cè)到workerGroup上完成從boss線(xiàn)程到worker線(xiàn)程的交接。OP_CONNECT則是獨(dú)立的第三個(gè)分支處理邏輯更簡(jiǎn)單先清理掉OP_CONNECT興趣位然后調(diào)用finishConnect確認(rèn)連接結(jié)果。確認(rèn)成功之后客戶(hù)端channel進(jìn)入active狀態(tài)觸發(fā)fireChannelActive隨后開(kāi)始注冊(cè)O(shè)P_READ進(jìn)入正常的讀寫(xiě)工作狀態(tài)。這里可以梳理成一張對(duì)比表對(duì)比維度Bind鏈路Connect鏈路入口方法ServerBootstrap.bindBootstrap.connect監(jiān)聽(tīng)事件OP_ACCEPT等待新連接OP_CONNECT先等連接完成就緒事件分支與OP_READ同分支走unsafe.read獨(dú)立分支走unsafe.finishConnect完成后動(dòng)作accept出NioSocketChannel交給workerchannelActive后轉(zhuǎn)OP_READ底層NIO操作ServerSocketChannel.bindSocketChannel.connect/finishConnect失敗典型異常Address already in useConnection refused / connect timed out4. 參數(shù)、超時(shí)與狀態(tài)機(jī)三個(gè)容易忽略但決定成敗的細(xì)節(jié)4.1 backlog如何影響bind本地地址與臨時(shí)端口問(wèn)題backlog這個(gè)參數(shù)在面試?yán)锍霈F(xiàn)頻率很高但很多人只知道“設(shè)大一點(diǎn)可以提高并發(fā)”說(shuō)不清它到底管什么。在TCP協(xié)議里服務(wù)端socket的listen隊(duì)列由兩部分組成未完成三次握手的半連接隊(duì)列SYN Queue和已完成握手的全連接隊(duì)列Accept Queue。backlog主要控制全連接隊(duì)列的長(zhǎng)度。當(dāng)并發(fā)連接瞬間涌入accept處理速度跟不上連接建立速度時(shí)隊(duì)列就是緩沖區(qū)。隊(duì)列滿(mǎn)了新的連接請(qǐng)求會(huì)被內(nèi)核直接丟棄或拒絕。Netty的NioServerSocketChannelConfig在設(shè)置默認(rèn)backlog時(shí)有個(gè)細(xì)節(jié)優(yōu)先讀操作系統(tǒng)的net.core.somaxconn配置讀不到才用默認(rèn)值1024。也就是說(shuō)你ServerBootstrap里不顯式設(shè)置SO_BACKLOG時(shí)實(shí)際生效值不一定是你以為的默認(rèn)值。我在實(shí)測(cè)中遇到過(guò)sysctl net.core.somaxconn為128的服務(wù)器不設(shè)置SO_BACKLOG時(shí)并發(fā)一大就出現(xiàn)大量連接被重置最后顯式設(shè)置SO_BACKLOG為1024才解決——這種問(wèn)題從現(xiàn)象上很難想到根因在這里。再提一個(gè)connect鏈路上的端口細(xì)節(jié)connect方法還有一個(gè)重載可以傳localAddress但絕大多數(shù)場(chǎng)景不需要。如果你不指定操作系統(tǒng)會(huì)從臨時(shí)端口范圍內(nèi)自動(dòng)選擇一個(gè)作為客戶(hù)端端口如果指定了底層NioSocketChannel.doConnect里會(huì)先對(duì)本地地址做一次bind。指定本地端口時(shí)要注意端口沖突概率很高尤其是當(dāng)你部署多個(gè)客戶(hù)端實(shí)例在同一臺(tái)機(jī)器上時(shí)指定固定本地端口容易遇到Address already in use。4.2 connectTimeoutMillis背后的定時(shí)任務(wù)邏輯ChannelOption.CONNECT_TIMEOUT_MILLIS是客戶(hù)端連接超時(shí)配置默認(rèn)值是30秒。這個(gè)超時(shí)時(shí)間的實(shí)現(xiàn)也值得講一下它不是在doConnect里同步等待而是通過(guò)EventLoop的schedule注冊(cè)了一個(gè)延遲任務(wù)在指定時(shí)間后檢查連接是否還在進(jìn)行中如果是則關(guān)閉channel并讓promise失敗。有一個(gè)容易被誤解的點(diǎn)這個(gè)超時(shí)是從調(diào)用connect到連接事件就緒的總超時(shí)。如果系統(tǒng)內(nèi)核在更早的時(shí)候返回了ECONNREFUSED那你拿到的會(huì)是ConnectException而不是超時(shí)異常兩者產(chǎn)生原因完全不同排查方向也不同。我在實(shí)際調(diào)線(xiàn)上接口時(shí)發(fā)現(xiàn)很多“莫名其妙連接超時(shí)”其實(shí)是因?yàn)槟繕?biāo)端口被防火墻默默丟棄了請(qǐng)求包內(nèi)核收不到任何響應(yīng)才硬生生等到超時(shí)。這種情況從源碼角度很好理解connect發(fā)出了但沒(méi)有任何ACK或RST回來(lái)NIO事件一直不觸發(fā)只能靠定時(shí)任務(wù)兜底。4.3 從狀態(tài)機(jī)再看兩件事的區(qū)別Netty的channel狀態(tài)遷移是理解兩個(gè)操作底層差異的一個(gè)很好的視角。在bind鏈路上NioServerSocketChannel創(chuàng)建時(shí)是inactivebind成功后變active于是注冊(cè)O(shè)P_ACCEPT之后一直穩(wěn)定在“接受新連接”的狀態(tài)不再有大的狀態(tài)遷移。在connect鏈路上NioSocketChannel創(chuàng)建時(shí)同樣是inactiveconnect發(fā)起后進(jìn)入“連接中”的中間態(tài)finishConnect成功后才active然后注冊(cè)O(shè)P_READ開(kāi)始讀寫(xiě)。這里藏著一個(gè)經(jīng)常被忽視的點(diǎn)客戶(hù)端channel在register階段并不會(huì)注冊(cè)任何IO興趣事件。它得等connect完成之后通過(guò)fireChannelActive事件觸發(fā)doBeginRead才注冊(cè)O(shè)P_READ。如果你在handlerAdded里就嘗試讀數(shù)據(jù)會(huì)發(fā)現(xiàn)讀不到任何東西——不是沒(méi)數(shù)據(jù)而是事件還沒(méi)注冊(cè)上。這個(gè)時(shí)序問(wèn)題導(dǎo)致很多新手在寫(xiě)客戶(hù)端ChannelInitializer時(shí)把“連接建立后主動(dòng)發(fā)請(qǐng)求”的邏輯放錯(cuò)了地方正確做法是放到channelActive回調(diào)里。5. 實(shí)戰(zhàn)排查遇到連接類(lèi)問(wèn)題怎么用源碼思維定位5.1 先分清是bind還是connect階段出錯(cuò)排查連接問(wèn)題第一步永遠(yuǎn)是定位錯(cuò)誤發(fā)生在bind階段還是connect階段這兩個(gè)階段的異常類(lèi)完全不一樣但現(xiàn)象可能很接近。bind階段最常見(jiàn)的錯(cuò)誤是Address already in use也就是端口占用。但要注意這個(gè)異常不一定只出現(xiàn)在bind那一刻有些時(shí)候出現(xiàn)在ServerBootstrapAcceptor處理新連接時(shí)——如果你把childGroup的線(xiàn)程數(shù)配得太小新連接accept出來(lái)之后沒(méi)法及時(shí)注冊(cè)到worker也可能出現(xiàn)資源相關(guān)的異常但這就不是bind本身的問(wèn)題了。判斷方法很簡(jiǎn)單服務(wù)端啟動(dòng)時(shí)bind().sync()拋出的異?;揪褪莃ind階段問(wèn)題啟動(dòng)成功后運(yùn)行期間報(bào)的異?;径家鵤ccept和worker線(xiàn)程方向去查。connect階段的錯(cuò)誤類(lèi)型更豐富異常或現(xiàn)象可能原因排查方向Connection refused目標(biāo)端口未監(jiān)聽(tīng)或連接被RSTss -lnt看端口狀態(tài)Connection timed out防火墻丟包、目標(biāo)IP不可達(dá)檢查路由、防火墻策略、安全組Address already in use客戶(hù)端本地端口被占用檢查是否顯式指定了localAddress大量TIME_WAIT導(dǎo)致端口耗盡短連接過(guò)多連接未復(fù)用考慮連接池、調(diào)整端口范圍No buffer space available本地端口或文件句柄耗盡sysctl查看端口范圍、ulimit5.2 常見(jiàn)連接失敗問(wèn)題速查表結(jié)合我自己踩過(guò)的坑整理一份更貼近現(xiàn)場(chǎng)的速查表服務(wù)端端口看著沒(méi)被占用但bind一直失敗先查netstat -tlnp確認(rèn)是TCP端口而不是UDP端口占用沖突再查是否設(shè)置了SO_REUSEADDR。Linux下端口處于TIME_WAIT狀態(tài)時(shí)如果沒(méi)開(kāi)SO_REUSEADDRbind同樣會(huì)失敗Netty默認(rèn)SO_REUSEADDR是false所以高并發(fā)短連接場(chǎng)景下服務(wù)端重啟很容易遇到這個(gè)問(wèn)題建議在option里顯式打開(kāi)??蛻?hù)端連接拒絕但服務(wù)端確實(shí)在監(jiān)聽(tīng)確認(rèn)你連的不是回環(huán)地址。如果服務(wù)端監(jiān)聽(tīng)在127.0.0.1你拿內(nèi)網(wǎng)IP去連是連不上的反過(guò)來(lái)監(jiān)聽(tīng)在0.0.0.0或具體內(nèi)網(wǎng)IP用127.0.0.1連也可能失敗取決于防火墻規(guī)則。連接超時(shí)但三五秒后又恢復(fù)先懷疑半連接隊(duì)列溢出。看ss -s里SynCookies相關(guān)的統(tǒng)計(jì)或netstat -s里的listen queue overflow計(jì)數(shù)如果一直在增長(zhǎng)說(shuō)明backlog不夠或者accept處理不過(guò)來(lái)。connect失敗但服務(wù)端沒(méi)收到任何信息基本可以確定流量根本沒(méi)到服務(wù)端從防火墻、安全組、網(wǎng)絡(luò)策略方向排查不要繼續(xù)在應(yīng)用代碼里浪費(fèi)時(shí)間。5.3 我常用的斷點(diǎn)調(diào)試與日志技巧源碼分析不能只看不調(diào)我自己的經(jīng)驗(yàn)是準(zhǔn)備一個(gè)最小復(fù)現(xiàn)工程一個(gè)只打印channelActive的客戶(hù)端ChannelInitializer一個(gè)帶LoggingHandler的服務(wù)端ChannelInitializer。然后打兩組斷點(diǎn)——第一組在NioSocketChannel.doConnect和NioServerSocketChannel.doBind確認(rèn)底層NIO調(diào)用參數(shù)第二組在NioEventLoop.processSelectedKey確認(rèn)事件就緒后走的是哪個(gè)分支。日志方面Netty自帶的LoggingHandler能打印出pipeline上每個(gè)事件的傳播過(guò)程包括REGISTERED、ACTIVE、READ等這些日志可以把時(shí)序問(wèn)題可視化比你在業(yè)務(wù)handler里打日志全面得多。我排查一個(gè)客戶(hù)端偶發(fā)連接失敗問(wèn)題時(shí)就是靠LoggingHandler發(fā)現(xiàn)channelActive和channelRead之間出現(xiàn)了接近兩秒的間隔才定位到DNS解析耗時(shí)的根因——不是連接慢是域名解析慢。connectTimeoutMillis這個(gè)參數(shù)也要在測(cè)試環(huán)境里刻意壓出超時(shí)場(chǎng)景來(lái)驗(yàn)證行為把超時(shí)設(shè)為1毫秒連一個(gè)不存在且被防火墻靜默丟棄的IP觀(guān)察channel的關(guān)閉時(shí)機(jī)和異常類(lèi)型。這樣你能準(zhǔn)確區(qū)分“內(nèi)核立即告訴我們連不上”和“等超時(shí)任務(wù)把我們踢下線(xiàn)”兩種模式線(xiàn)上遇到問(wèn)題時(shí)的第一反應(yīng)就會(huì)完全不一樣。6. 一點(diǎn)個(gè)人體會(huì)源碼拆到這一步我自己最大的收獲不是記住了哪幾個(gè)方法名而是形成了一個(gè)判斷網(wǎng)絡(luò)問(wèn)題的“分層反射”先看錯(cuò)誤發(fā)生在bind還是connect再看是內(nèi)核直接反饋還是靠超時(shí)兜底最后才鉆進(jìn)業(yè)務(wù)代碼找原因。Netty把Connect和Bind設(shè)計(jì)成這樣兩張各有節(jié)奏的流程圖本質(zhì)上是為了在同一套非阻塞模型下同時(shí)安頓好“等待連接建立”和“等待新連接到來(lái)”這兩種完全不同性質(zhì)的等待。理解了這一層再看Netty源碼分析里其他和連接生命線(xiàn)相關(guān)的代碼比如重連、斷線(xiàn)檢測(cè)、優(yōu)雅停機(jī)都會(huì)順暢很多。最后再分享一個(gè)小技巧把這兩條鏈路的源碼各讀三遍之后試著關(guān)掉IDE自己在紙上畫(huà)出從Bootstrap.connect到內(nèi)核connect()的每一跳再畫(huà)出從ServerBootstrap.bind到OP_ACCEPT就緒的每一跳。畫(huà)得出來(lái)的這部分源碼你就真的吃透了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产av美女被艹的乱叫| 性色亚洲| 国产亚洲精品自在线亚洲情侣| 九九九久| 超碰午夜| 大香蕉伊然在亚洲91| 91性高潮久久久久久久久| 超碰色综合| 麻豆精品天美| 婷婷综合五月天| 操逼视频国产无套| 欧美激情色婷婷花野真衣一区二区| 婷婷丁香五月天综合东京热| 中文字幕av亚洲精品| 日本顶级天天操狠狠操夜夜操中文字幕 | 日本免费专区| 校园春色综合网| 91AV天美在线视频| 久久‘黄片视频| 人人妻人人爽人人精品| 五月丁香六月激情综合| 探花激情视频| 一区二区影院| 成人免费视瓶| 亚洲图片激情小说| 亚洲欧洲自拍| 92久久| 伊人久久久日韩一区| 欧洲熟妇xxXx欧美老妇裸体 | 性影在线视频| 国产福利在线视频网站| 国产精品嫩草久久久久| 日韩欧美大片免费高清啪啪| 国产97亚洲| 男女性扦B| 丰满少妇一区二区三区专区| 岛国小电影| 国产精品爽爽v| 五月天我淫我色av| 成人线上超碰| 午夜操一操| 欧美亚州综合网图片| 欧美91久久久久| 青青草视频在线观看一区二区| 婷婷啪啪| 91xingse| 91最新综合| 97天堂| 久久久网一区| WWW美腿丝袜香蕉中文| 久久超碰、| 狼人综合婷婷激情四射 | 日本一区二区不卡| 欧美色女人| 亚洲欧美国产精品久久久久久久| 亚洲AV无码久久精品蜜桃小说| 熟妇人妻一区二区| 青青久操| 天天草AV| 一本一首道人妻少妇免费久久| 中文字幕免费观看| 天天情欲宗合网| 国产精彩女在线观看视频| 极品丝袜无码| 日日A∨| 色香在线| 夜夜骑日日| 中文精品少妇天堂| 色香av| 极品国产内射| 中文字幕日韩精品久久| 色婷婷电影网| 性色国产东北露脸精品视频| 久9综合在线| 97超级久久| 99re99| 久久久久久久唑| 中文字幕av亚洲精品| 国产精品亚洲色婷婷久久久| 日本道久久综合色色| 五月天激情影院| 99热这里只有精品9| 超碰资源亚洲97| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 九七毛片九九毛片| 中文字幕在线免费观看2| 又粗又长又爽在线观看| 婷婷色中文字幕| 九九成人精品| 人妻熟女一区二区| 91精片| 91大神精品长腿在线观看网站| 色婷婷视频| 丁香五月天啪啪| 久草视频制服诱惑| 久久黄黄黄| 91精品人妻偷情| 欧美性爱第一区| 超碰九7免费| 国产精品爱欲| 人妻美腿丝袜制服诱惑综合天堂-| 日韩综合97P| 91精品在线播放| 日韩天天综合| 成人无码在线视频网站| 国产 v乱码一区二| 人妻加勒比东京热| 操一区| 久久东京热久久| 天天谢天天干| 婷婷色综合| 久日91在线| 蜜桃av色偷偷av老熟女| 人人透人人操| 久久网亚洲| 999999精品| 欧美人妻久久精品二区三区| 国产精品午夜成人福利| 日韩欧美性吧婷婷乱伦大香蕉| 丁香六月激情| 欧美超碰人妻97| 国产日韩欧美中文在线播放 | 久久婷婷一区| 国产一级黄色片在线观看| AV老汉| 熟女探花啪啪| 狠狠爱综合网| 日日夜夜骚| 天天爽天天操啊啊啊| 女人爽到高潮潮喷18禁网站| 日韩不卡一二三四| 亚洲人妻中文高清| AV在线播放网址| 国产亚洲日韩在线三区黑人| 九九热在线精品视频| 日本中文字幕不卡视频| 九九精品美女高溯喷水| 91丝袜| 亚洲va综合va国产va中文| 色网在线| 四虎影视永久在线免费| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 日本欧美色| 欧美性爱第一页久久| 白丝1区2区3区| 亚洲97网站| 日韩精品中文字幕一| 精品一二三区四视频| 国产精品熟女九色九色蜜臀| 嗯嗯啊啊日韩精品| 日日碰狠狠添天天爽超| 欧美色图 人妻| 熟妇的味道HD中文字幕| 天天操美美| 国内毛片国产专区二| 青操影院| 深夜操逼网| 日产操逼| 1000午夜黄色| 97精品综合久久| 中文字幕在线免费观看 | 欧美日韩222| 日本孕妇一区二区视频操逼免费看 | 丰满人妻-区二区三区免费| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 精品中文字幕第一页| 九一国产精品| 日韩人体偷拍| 人妻少妇av在线观看| 91丨人妻丨国产丨丝袜| 亚洲中文人妻色| 国产AV天美传媒一区二区三区 | 久操视频免费在线观看| 亚洲欧美情色| 亚洲色图 综合| 人、人、摸,人、人、草| 综合色区偷拍| 国产四虎在线| 做爱A级亚欧| 91欧美综合| 搡老女人老妇女老妇老熟女怎么读| 97超碰香蕉| 亚洲色丰满少妇高潮| 性做久久久久久久| 中文字幕天堂在线| 超碰美国| 久久精品国产亚洲粉嫩| 中文字幕视频在线观看一区二区| 91c色| 好爽视频在线观看视频| 国产久久久久影院老熟女| 六月激情网| 草草影院日本第一页| 香蕉综合网| 午夜精品久久久久久久| 亚洲熟女乱色一区二区三区久久久| 国产免费一区在线观看| 青草青草久热| 顶级丝袜熟女一区二区三区| 久久久久深夜无码| 91欧美少妇| 久久精品72| 一二三四日本视频高清| 色情五月综合婷婷| 欧美一区二区日韩三区| 国产丁香精品露脸视频| 国产自产91区13区| 成人无码在线视频网站| 欧美成人国产精品| 成人久久精品| 婷婷九月国产| 吊色| 九九九九九九九九九九九蜜桃| 亚洲天堂另类小说男人| 久久久亚洲精品电影免费看| 亚洲有薄码区日本系列中文字幕| 99热| 丰满人妻一区二区三区四| 色爱综合网| 欧美一区二区观看在线| 丝袜熟女一区二区三区| 一区AV| 91在线免费精品视频| 超碰吊日色| 人妻嗯啊啊在线播放| 婷婷五月综合在线| 丁香五月性爱| 国产AV毛片| 国产午夜精品理论片a大结局| 麻豆一区二区AV天美| 久久国产999| 九9热伊人| 午夜久久一区二区无码中出| 婷婷在线播放| 91人妻超碰| 97天天爽| 夜夜国产一区| 欧美成人综合| 视频在线观看青青99国产| 午夜精品久久999热蜜桃介男人用| 久久久久久久久久久久黄色 | 极品销魂美女一区二区| 网站A V在线| 久久老女人| 超碰久超碰久| 中文字幕在线免费观看2| 影音先锋每日最新资源在线观看 | 深夜激情| 思思热在线视频免费| 99re在线精品78| 熟妇一区,二区,三区。| 国产综合久久久麻桃个| 中文字幕五月婷婷免费| 日本五十路熟女一区二区| 美国美女AV在线| 中文字幕 av v| 蜜桃臀av在线观看| 97久精品| 欧美亚洲成人在线一区二区三区| a片亚洲一本通视频| 91色色综合| 久久精品中文字幕女同| 蜜桃传媒视频第一区入口在线看| 中文字幕后石码四区五区| 老司机福利青青草| 99久久e免费热视| 色香色欲天天综合网天天来吧| 天天色天天干天天射| 日韩精品黄片免费观看| 91久久久久久| 欧美色图99| 男人天堂2019| 青青伊人这里只有精品| 影音综合网| 狠狠爱夜夜干| 交换娇妻呻吟声不停中文字幕| 日本亚洲熟女视频| 77777亚洲蜜臀精品久久综合蜜臀| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚洲天天影视综合网| 久草草一二三四区久久| 无码78| 欧美色图综合| 约操熟妇| 人妻天天夜夜爽一区二区| 人妻黑丝袜电影| 亚洲一区日韩精品中文字幕| 亚洲五月天激情| 99操| 国产在线能看的你懂的| 日韩欧美中文| 美女裸体麻豆天美蜜桃91| 88在线一区二区三区| 日韩有码 一区二区三区| 综合色一区三区二区| 日韩极品无码B| 九九99精品| 青娱乐手机日韩在线视频| 亚洲图片第一页| av无码av无码专区| 国产成人啪一区二区| 91操熟女| 成年男人的天堂| 欧美美女视频| 超碰av在线| 欧美日韩丝袜 | 天堂а√在线最新版在线| 91青视频| 伊人一级免费黄片| 国产精品久久久蜜臀| 欧美色吧综合| 婷婷五月天色| 操逼短片| 成人26uuu| 亚洲人成色9999精品久久 | aaa一级黄片| 中文字幕午夜精品久久久| www.伪伪| 99re6国产精品99re| 天美传媒AV在线| 日韩黄色一区二区三区| 久久久久久久久久久精| 一区二区三区 日韩欧美| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 国产外初女出血视频| 日韩熟女乱伦中出| 四虎影视国产精品| 日本亚洲vr欧美不卡高清专区| 思思久热在线精品66| 亚洲限制级| 人人看人人摸人人色| 青青草影视蜜久久| 亚洲天堂综合AV| 97综合国产| 久久久999网站| 性爱乱伦视频免费| 搡老女人老妇女AAA一VU麻豆 | 97色欧洲| 超碰97精品在线| 少妇一级无码精品| 老司机久久| 国产女人和拘做爰视频| 精品国产乱码久久久久久久| 美女极品一区二区三区| 精品大久久| 黄色一级视| 国产无码成人无码| 色婷婷A V一二三四区麻豆综合| 91久久久久免| 亚洲中文日韩欧美大香蕉视频| 麻豆一区二区三区在线看| 久久超碰、| 91超级碰碰碰| 久久一级无码精品毛片6| 国产精品96| 亚洲不卡一| 精品国产网站| 人妻少妇色综合| 日韩乱伦AⅤ| 校园春色 欧美| 在线 欧美 亚洲| 伊人丝袜美腿高跟在线观看高清| 大香交伊人网| 婷婷久久久| 欧美大香蕉专区网| 天天摸夜夜添无码小视频| 老妇女91| 激情综合 婷婷五月 红杏| 欧美 熟女 日韩| 欧美日韩国产中文超碰| 五月丁香大香蕉| 粉嫩粉嫩一区性色AV片| 澳门黄片一香蕉视频| 精品传媒在线一区| 9久久久久久| 久久精品高清无码一区| 一区二三区四区视频大全套| 性色av一区二区| 欧美超碰96| 欧美亚洲激情小说| 亚洲天堂中文字幕无码男同| 东京热亚洲一区二区| 操屄不卡视频| 毛片电影一区二区三区| 亚洲欧洲国产综合av| 国产精品亚洲天堂网址| 国产福利视频精品视频| 少妇熟女1区2区3区| 日韩性爱长视频免费| 91爱| 囯产精品久久久久久久久久梁医生| 天堂性色| 国产精品999aaa| 精品久久久久久中文字幕视频免费| 久久久久久999| 少妇激情一区二区三区视频| 国产高清亚洲日韩一区| 国产亚洲深夜激情| 国产人妖视频一区在线观看| 欧美日韩香蕉| 91超碰人人操| 亚洲另类久操网| 九九九久千久久激情蜜桃在线看| 91偷拍欧美亚洲| 久久久久密臀一区二区| 五月天亚洲网| 亚洲天天综合| 亚洲欧美在线观看无码| 精品亚洲国产成人AV制服丝袜| 久久久国产成人一区二区三区在线 | 欧美东京热精品A∨| 成人午夜视频免费播放| 骚货| 欧美青青草视频| 久久久女人| 99re这里只有精品9| 亚洲情色综合| 亚洲第2页| a级理论午夜日本| 中文字幕国产精品1区| 亚洲AO在线| 超碰在97| 人妻少妇久久中文字幕一区二区 麻豆| 一区二区三区免费视频入口| 激情五月天社区| 69人妻人人揉人人躁人人精品| 亚洲精品天天影视综合网 | 国产男人又猛又粗又爽| 日韩精品.久久精品.AV女优.天美传媒 | 亚洲天天影视色综合| 天天综合站| 亚洲色图亚洲| 日本精品不卡一二三区| 97人人爱人人做人人乐| 俞拍久久国应视频| 亚洲色图日韩精品| http://qxhbdz.com| 大香蕉青青9| 亚洲高清自拍| 乱色视频中文字幕| 精品一区二区三区四区外站| 大奶的诱惑| 国产AV久久野战精品| 免费观看欧美日韩操逼视频| 亚熟hd视频在线| 91bbbbbb| 欧美疯狂做爰xxxx| 日韩综合97P| 98人妻精品一区二区色欲| 亚洲精品精品一区二区| 91精品国久久久久久无码| 久久69| 丰满的三级少妇欧美久久久| 国产十八禁视频| 国产色产精品在线观看| 伊人久久婷婷| 亚洲精品久久一区二区三区蜜桃臀| 51国产午夜精品视频| 九九热超碰| 久久久久久久综合,国产| 欧美一二三级精品在线| 日本九九久久99播| 男女一进一出视频久久| 污啪啪啪视频| 丝袜AV一区二区三区| 日韩黄色电影网站| 91久久久久| 欧美人妻精品一区二区| 天天色怡春院| 精品午夜福利国产一区二区在线观看| 美女高潮视频91| 超碰78| 亚洲不卡AV在线| 欧美高清91| 欧美性爱在线无码| 久久精品操| 国产超碰| 天天干人人乐| 九九视品黄色| 翔田千里AV无码秘 三区| 狠狠狠狠狠| 亚洲丝袜少妇在线| 91精品国产综合久久久蜜臀| 97超碰人人模人人拍人人| 天美国产三级传媒| 特级特黄一级毛片免费| 久久久免费懂色| 亚洲av影音先锋| 日本性一区| 国产AV超爽| 亚洲成人ab| 精品99999久久久久久| 欧美Ⅴ性爱| 午夜精品久久久久久久99热影院| 亚洲成熟国产精品美女| 78m啪啪啪| 男人的天堂在线2| 免费久久一级毛片大黄| 在线情色电影 91大| 精品v日韩欧美国产| 日本幼女18+| 亚洲色图久久成人| 日韩欧美大力操| 九九九九九九九| 亚洲第一页色| 在线播放一级无码视频| 啊啊啊啊嗯嗯在线久久久| 97亚洲国产影视| 欧美天天干| 人妻熟女一区二区三区视频| 中文字日本乱码| www黄片免费看com| 又粗又长又大国产不卡| 亚洲欧美日韩国产丝袜自拍中文| 欧美十八禁在线看| 国产第12页| 精品国产乱码久久久影院| 红桃视频高潮| 大香蕉久操| 国产午夜福利电影免费在线观看 | 园内精品自拍视频在线播放| 夜夜欧美| 日日干夜夜骑| 色九月综合| 免费一级欧美片片线观看| 啪啪综合网| 屁股久久久久久久久| 99热超碰| 在线99热| 秋霞影音一区二区三区 | 久久久久久91香蕉国产| a网站免费观看| 国产日韩区| 夜夜躁狠狠躁日日躁av| 九九超碰综合网| 97国产天堂岛| 久热色情精品| 开心五月激情网| 日本免费一级AAA大片器| 欧美天天弄| 久久有码视频| 色综合1991| 亚州色图欧美| 国产农村妇女精品一| www.色婷婷.com| 日韩激情啪啪| 亚洲综合精品国产一区| 国产精品嫩草久久久久| 成人性爱AV在线免费观看| 五十路熟女人妻一区二区三区四区五| 天天在线91| 日本黄色天堂| 97情超碰色| 国产精品电影推荐| 日日摸日日碰| 亚洲人久久久网| 超碰这里只有精品| 中文字幕超碰CAO| 美国久久一二三四| 性生活无遮挡纯毛片在线看| 日逼五月天| 1区2区3区中文字幕日韩| 欧洲Au麻豆| 国产嫩草精品A88AV在线| 青娱乐 成人娱乐在线| 国产丝袜美女诱惑| 欧美色图天堂网m| 操人妻逼91| 久久久久ab| 老鸭窝黄色视频网站| 97精品综合久久网| 东方亚洲在线操逼天堂| 蜜桃臀AV在线| 91精品国产91熟女| 亚洲欧美日韩免费观看| 岛国A V在线免费看| 亚洲免费成人在线高清无码视频| 国产精品国产自产高清AV| 一级黄色性爱A级片| 91在线精品| 超碰人人草| 天天91~综合入口| 男人的天堂.com| 精品久久大胆人体| 成人区人妻精品一| 黄色AAAAAAAAAAA大片| 日本人妻中文字幕精品| 艹比视频国产精品| 红桃视频高潮| 啪啪综合网| 亚洲熟女性高潮久久久| 综合自拍| 一本大道综合伊人精品热热| 91亚洲欧洲| 精品人人插人人操| 一区,二区,三区视频| 国产欧美另类久久久精品课程| 日韩性爱1级片视频| 91在线欧色| 国产51色综合久久免费| 99在线精品观看99| 日韩欧美中文字亚洲慕| 久操频道免费在线呗看| 国产福利第一视频| 亚洲日韩欧美一区二区| 台湾成人无码AV| 精品十三区| AA级电影三区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 激情文学88| 亚洲色图 图片| 日韩在线一区高清在线| 亚洲精品白丝| 国产精品视频精品一二| 国产精品农村妇女精品| 五月综合激情网| 东京热男人的天堂| 久久精品国产精品| 色丁香五月婷婷| 国产精品嫩草影院午夜两性| 加勒比av中文| 久久婷婷一区二| 91精品微拍福利| 国产视频97| 三级片大波波| 色激情五月天| 男女猛烈无遮掩视频免费软件| 91久久堂| 精品欧美А∨无码黑人大荫蒂| 性性久久| 日韩色欲久久一二三四区| 日韩综合色网| 青青草乱入乱欲视频在线观看| 狠狠色噜噜狠狠狠狠狠色综合久久| 国内外激情在线| 久久精品72| 1024亚洲中文字幕久在线看片你懂的 | 狠狠躁AV| 成人五月香网在线| www成人啪啪18秘 免费| 久思思热视频在线观看| 视频不卡中文字幕| 国产后入式在线观看| 91青青在线视频| 亚洲天天影视色综合| 97久久精品亚洲中六字幕| 五月丁香啪啪啪| 丁香六月婷婷| 色久综合| 91肏屄网| 99re在线观看| 污污污8888| 人人噜夜夜操| 中文熟女五十乱码在线| 国产白丝网站| 97干日韩| 婷婷综合久久| 日韩成人私密一级精品av| 96久久久久| 日韩综合无码一区久久92| 91丨人妻丨国产丨丝袜| 一级性爱视频免费在线| 欧美爆乳精品一区二区| 久热精品在线国产| 在线强奷到舒服的无码视频 | 午夜啊啊| 久久婷婷一区| 丝袜亚洲综合| 亚洲AV无码AV吞精久久久久| 大香蕉黄色一区| 99久热| 蜜臀AV成人精品蜜臀AV久久| 久久久99999久网站| 97人妻人人躁人人玩人人| 91精品人妻一区二区三区蜜桃| 中国人高清www色视频免费| 欧美综合自拍| 午夜高清成人在线视频| 嗯嗯嗯嗯啊啊啊好紧好大| 日韩午夜国产| 96精品久久| 日韩乱伦视频| 国产精品欧美激在线| 东北女人高潮视频| 大香蕉在线视频15| 黄色激情电影在线观看| 国产a级午夜毛片| 无码视频黄色网战| 96国产污污污丝袜| 亚洲综合91| 亚洲国男人的天堂| 国产精品69久久久久久久| www久久国产精品| 天天日日日射| 欧美九一精品久久久熟妇| 97爱综合| 麻豆视频test| 91情色| 91久久久久久久久久久| 色色九区| 97国产色综合| 9色国产精品一区粉嫩| 亚洲激情综合| 97免费在线观看| 97操97色| 最新国内自拍av免费| 99xav| 中文字幕在线观看永久| 精品美女久久一二三| 隔壁邻居波多野结衣中文字幕| 宗合情欲网| 欧美黄色大片在线观看| 一区二区亚州激情久婷婷欧美| 思思热久久成人| 亚州色图欧美色图| 丝袜美腿射精91| 久草国产在线视频| 东京热,男人的天堂| 在线观看精品国产免费| 国产成人啪一区二区| 日韩精品中文字幕人妻| 男人的天堂欧美| 欧美做爰无码A片视频| 黑人猛交| 精品人妻一区二区蜜桃视频| 婷婷色色五月天| 亚洲成人帖图| 99.色网| 亚洲第一在线视频| 免费A片三p视频| 91色伦| 久久久久久久久久久久黄色| 性爱乱伦一区| 免费啪啪av| 亚洲 欧美 色图| 成人天天爽| 亚洲熟女乱熟乱熟妇综合网二区| 97干在线视频| 国产午夜无码片在线观看影视| 99久久精品国产系列| 欧美丝袜91| 夜夜嗨免费视频| 亚洲一区二区 麻豆传媒| 国产精品青青草| 亚洲1区| 丁香五月激情婷婷| 色色色欧美| 狠狠综合网| 人妻熟女av国产网站| 黄片直播三级黄片两女一男| 亚洲国产ⅴ高清在线观看| 欧美成熟性爱精品| 人人么人人操| 欧美se综合| 超碰色美女| 天天添天天干电影| 亚洲男人天堂2019| 蜜臀精品1区2区| 粘花网06av视频| 亚洲淫色网中文| 亚洲极品| 色哟哟av| 天堂成人网| 91大神精品长腿在线观看网站| 一起草三级AV电影在线观看 | 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 开心激情站| 中文字幕片| 国产视频大全| 97se亚洲综合自| 久久亚洲中文字幕视频| 亚洲黄色网址视频| 婷婷综合激情| 欧美色图 人妻| 99热精品在线观看| 中文字幕美女91| 亚洲中文字幕精品久久久久久直播| 99热66| 精品久久久不卡一区二区| 99re这里只有| 国产精品无码av嫩草| 懂色AV一区二区三区| 色五月第四色| 精品日日人妻| 岛园激情| 天天摸天天碰天天添青青| 女生91网站| 亚洲宅男天堂| 久久久爆乳翘臀一线天伦理视频| 91原创在线观看| 国产后入式在线观看| 人人操我人人干| 国产乱婷婷精品二区三区| 男人天堂免费| 亚洲综合另类小说色区亚洲成av人片在www| 女人爽到高潮潮喷18禁网站| 1769精品一区二区三区| 91成人在线| 日韩有码 一区二区三区| 久久婷婷色| 亚洲欧洲日韩中文字幕一区| 日韩一级特黄av毛片| 成人一区二区三区四区| 国内毛片热久久思思热| 97中文天堂| 日日夜夜精品视频| 天堂蜜桃无码视频一区二区| 久久国产精品m码| 丁香五月激情啪啪| 日韩少妇无码| 色呦呦、国产精品| 小日子操bb在线看| 成人欧美日超碰| 久久男女激情视频网站 | 亚洲97久久精品亚洲| 亚热日本熟女| 夜夜草网站| 亚洲激情视频| 污污污8888| 亚洲制服欧美另类内射| 亚洲天天更新| 蜜臀AV成人精品蜜臀AV久久| 日韩卡一卡二卡三在线| 东京热,男人的天堂| 亚洲AV噜噜狠狠网址蜜桃动漫| 播播亚洲小说亚洲| 99蜜桃臀亚洲成人在线观看| 精品国产AV一区天美传媒| 肉丝网站91| 亚洲国产成人精品久久久国产成人一区二区三. | 26UUU欧美日本| 久久久久9999妇女| AA丁香综合激情| 人人操人人操人人人操| 97免费视频在线| 中文字幕久久精视频久久大全| 欧美在线视频99| 日美免费黄片| 性爱网站一区二区| 91亚洲电影| 2019亚洲男人天堂| 欧美猛交黑寡妇中文字幕| 久热超碰| 国产亚洲在线| 极品极品色影院| 黄在线| 一级毛片久久久久久久女人18| 天久久久噜噜噜久久国产精品爽爽| 人妻少妇色综合| 玖玖爱综合| 天天日日日射| 亚洲日韩青青草色月| 欧美AB在线观看| 嗯嗯啊啊操死我| 看黑丝美女操逼青青网站| 男人天堂久久精品| 色综合美国| 色月天AV导航| 欧美性,亚州色| 黑人与人妻| 大香蕉色欲AV| 亚洲九九视频| 成人怡红院| 亚洲免费看片| 99re在线视频这里只有精品| 91精品丝袜久久久久久| 嗯嗯啊啊操死我| 色综合久久夜色精品国产天堂| 色九区| 亚洲日韩一区电影| 欧美五区| 女人18精品一区二区三区| 国产精品在线免费| 超碰在线人人射| 国产毛片久久久久久久| 蜜臀操逼黄色视频操的好爽| 五月婷婷丁香| 日本精品性生活久久久| 亚洲欧美综合图片| 亚洲欧美高清无码| 日韩不卡a级视频专区| 亚洲高潮少妇| 久久久久大香青草精品综合| 91老司机视频| 色狠狠 - 百度| 97精品国产97久久久久久| 色欧洲97| 亚洲一曲日韩精品| 综合久草| 亚洲精品九九九| 偷窥自拍A片| 丝袜色综合| 国产一级内射无挡观看| 国产精品制服丝袜中文字幕日韩一区二区三区 | 欧美日韩性爱电影在线| 男人夜色天堂ss| 丝袜视频网国产90| 午夜偷拍久久熟女| 久久鲁夜| 老熟女搡BBBB搡BBBB视频| 亚洲 日本 一 二 三| 日韩精品亚洲一二三| 久久九九综合| 99热日| 亚洲一区二区三区中文字幕| 嗯啊抽插大香蕉网页| 综合久久9| 日本视频在线观看污污污| 成视频在线观看免费看| 97天天在线| 五月天黄色激情视频| 亚洲伊人久久精品影院| 国产精品一级片在线看| 99在线啪| 亚洲黑丝在线| 天天澡天天爽日日AV| 97超久碰| 欧美一区二区观看在线| 夜夜操夜夜高潮夜夜爽国产精品区| 亚洲欧美国产其他二区| 亚洲欧美碰碰| 狠狠夜色午夜久久综合在线| 午夜啪啪片| 天天色欧美| 亚洲第一色页夜| 亚洲日韩精品在线播放| 青娱乐啪啪视频| 亚洲精品1区| 可以免费观看的av| 天天做日日做| 亚洲精品九九九| 嗯嗯啊啊的视频| 亚洲熟妇图片| 婷婷色播婷婷| 中文字幕一区二区三区四区在线视频| 人妻天天爽| 青娱乐亚洲热| 成人黑料社久久| 亚洲精品无码久久AV| 久艹日日日| 91中文字幕在线观看| 久久超碰免费的| 男人天堂一区二区| 婷婷中文网| 日韩av不卡在线看| 中文字幕黄色片| 九月激情婷婷| 亚洲无码成人精品| 亚洲天天在线| 亚洲一二三四区| 夫妻日逼| 东京热综合久久一区二区| 美国三级日本三级久久99| 激情五月婷婷| 97av在线观看| 91亚洲网站| 国产后入| 久久精品国产精品一区| 超碰九区| 91人妻素女| 草伊人高潮喷水超碰| 综合久久9| 男人天堂2030| 亚洲天堂久久久久久粉红视频| 18精品一二区| 超碰美国| 中文字幕第9页萱萱影音先锋| 国产v片在线免费观看| 草草影院最新网址| 日韩国产中文字幕| 97人妻色| 中文字幕在线2| 亚洲猛交| 性无码专区2020| 99热99在线播放激情| 一区二区三区机械有限公司| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 91综合在线| 俺去久久| 天天情欲宗合网| 91综合网站| 日本熟女中文字幕一区| 91丨九色丨国产打屁股| 日本一片一区| 青青草依人大香蕉| 人人干黄色| 综合久久中文字幕综合日韩精品 | 欧美人体性爱互联网第一页婷婷日本| 久久中文字幕一区不卡| 国产激情片在线观看| 青娱乐av在线| 青青草色插素人| 日本一道在线播放高清| 午夜亚洲国产理论秋霞| 五月花婷婷| 欧洲一区二区| 无码天天操| 婷婷五月天久久精品视频一区二区三区 | 精品国产一区二区三区久久久蜜臀| 综合国产影视三级| 毛片视频白嫩| 99这里只有精品| 日本一区二区中文字幕久久| 欧美精品另类人妖xxxx| 九一综合网| 久久永久无码人妻视频| 亚洲综合九九| 日韩精品电影| 国产日韩无码一区二区三区久久区| 伊人久久大香大香线蕉中文| 综合网欧| 激情综合网激情综合| 91超级碰| 久热99999| 久久av一级av少妇av高潮| 国产馆极品诱惑| 人妻欧美| 色色色欧美| 97超碰欧美手机在线| 熟女乱伦A| 中文幕97| 日本精品网站在线中文| 超碰97欧美在线 | 欧美成人A天堂片在线观看| 女人妻一区| 蜜臀久久99精品久久久久久无删减| 国产高清成人传媒影视| 伊人色综合欧美| 操逼天美3区| 成人A片男人的天堂| 精品无码一区二区三区色欲| 超碰97欧美在线| 国产综合久久久麻桃个 | 色与欲影视| 婷婷久久网| 色吊丝 日日骚 清纯唯美| 国产18精品亚洲精品| 九草九九九| 妺妺跟我一起洗澡没忍住| 日韩专区久久久| 欧美刺激色黄片免费看| 亚洲激情欧美色图 | 久久夜夜夜夜| 狠狠操官网| 亚州春色| 精品中文字幕一区二区l - 百度| 亚洲熟女乱综合一区二区三区| 粉嫩av久久一区二区三区| 欧美韩国你懂得在线| 岛国大片在线观看网站入口| 偷拍综合亚洲| 亚洲高清无码AAA久久久精品| 五月天人妻综合| 337p大胆噜噜噜噜噜91Av| 91亚洲综合在线| 国产按摩一区二区三区| 精品国产av一区二区三区四区入口| 伊人国产av| 国内毛片婷婷六月色| 久久亚洲日韩国产欧| www.久久| 国产主播福利| 亚洲性少妇| 99久久综合网| 国产呦精品系列在线观看| 日本精品免费一区二区三区四区| 午夜无码精品免费看性色| 天美久久久久| 青青11操操操操操操操操| 中文字幕精品一区二| 男人成人黄色视频在线观看免费下载| 婷婷色播婷婷| a片久久久久久久久久久久 | 久啪视频| 久久久久久久久久久人妻| 日韩性爱毛片操骚逼| 97操97干| 国产久久一区二区三区野外在线| 国模艳艳啪啪一区| 91老司机视频| 骚逼一区二区| 激情五月天丁香| 一区二区精品日韩欧美在线观看 | 青青草天天亲夜夜操网| 翔田千里AV无码秘 三区| 欧美在线色| 欧美性猛交美女自慰91| 国产精品一级片在线看| 欧美综合另类| 天天干1区2区在线| 久久久久久大| 日韩国产中文字幕| 人人操人人摸人人看人人插| 后入合集| 色天堂综合| 精品久久久无码| 亚洲乱码尤物193YW| 探花视频免费观看国产专区| 国产欧美日产一区二区三区 - 国产欧美日 | 中文字幕人妻丝袜| 成人性爱美曰韩| 精品美女久久久久| 91 天天综合| 玖玖超碰熟| 黄色十八禁网站| 久久久久成人蜜桃精品| 牛牛aV| 樱花蜜乳av| 91在线视频国产网站| 久久熟女嫩草成人片免费| 成人综合视频久久| 免费男人的天堂| laoshunv91| 97免费在线视频在线观看| 性爱av在线免费观看| 国产一级内射无挡观看| 久久婷婷电影网| 国产免费内射视频| 青青草中出视频| 国产成人精品午夜福利| 天天天乱色综合全| 午夜精品99久久久久传媒| 97啪啪| 日韩去日本高清在| 久久社区一区二区三区| 韩日色费| AAAA级日本片免费视频| 97AV在线观看| 91欧美色| 国产精品久久久久婷婷二区次| 欧美草草| 日本性一区| 久久成人午夜狠狠| 久久久久密臀视频| 欧美 牲| 久久一二三四五六七八九区区| 亚洲国产一区二区三区在线 | 欧美韩国你懂得在线 | 淫穴高潮色图| 大但人体久久久久| 人人九九精| 老鸭窝成人| 蜜桃臀av一区二区| 久久9久久| 东京太热男人的天堂久久久| 久久久极品| 亚洲熟女人妻中文字幕一区二区| 91n处女在线观看| 欧美亚洲首页| 97资源久久| 91人妻少妇| 午夜男女爽爽大片免费观看| 欧美人与动性人交a| www.色吧5.com| 东北丰满熟女国产一区| 久干9操| 欧美一级A片在线看视频性色| 韩国一级婬片A片AAAAA| 亚洲成人在线播放| 国产精品91一样|