99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

Java手寫DHCP服務器:報文解析與租約管理的完整實踐

Java手寫DHCP服務器:報文解析與租約管理的完整實踐 簡介面向DHCP協(xié)議與Java網(wǎng)絡編程開發(fā)者提供一套可直接運行的DHCP服務器與客戶端源代碼適合用于課程設計、畢業(yè)設計以及企業(yè)內(nèi)網(wǎng)管理工具的二次開發(fā)參考。壓縮包共84個文件大小僅186KB其中包含16個Java源文件作為核心實現(xiàn)代碼64個HTML格式的Javadoc頁面用于查閱類與接口說明另含CSS樣式、properties配置和GIF圖片等輔助文件整體結(jié)構清晰便于按需取用。代碼完整實現(xiàn)了DHCP發(fā)現(xiàn)、提供、請求、確認四個階段讀者可學習到基于UDP廣播的報文交互、BOOTP協(xié)議的編解碼方式以及服務器端多線程并發(fā)處理和IP地址池的動態(tài)分配策略。通過閱讀源碼和文檔既能掌握DatagramSocket、NIO等網(wǎng)絡編程技巧也能理解真實協(xié)議落地時的異常處理、配置存儲等工程問題為深入網(wǎng)絡協(xié)議開發(fā)打下基礎。截至當前已有632人學習使用是一份實用且輕量的協(xié)議源碼學習資料。1. 當你的設備拿不到 IPJava 手寫 DHCP 到底在做什么排查網(wǎng)絡時最讓人血壓飆升的場景之一就是終端瘋狂廣播 DHCP Discover 卻始終收不到 Offer。抓包一看服務器根本沒回應或者回應了但報文格式錯得離譜。這時候你如果能有一份 Java 實現(xiàn)的 DHCP 源代碼在手可以直接在 JVM 里跑起來調(diào)試比反復翻 RFC 2131 和路由器日志要直觀得多。DHCP 協(xié)議本身不復雜復雜的是 UDP 廣播、報文選項解析、租約狀態(tài)機這些細節(jié)在 Java 里怎么落地。這個方向的價值在于它不是讓你去替代現(xiàn)成的 dhcpd 或路由器內(nèi)置服務而是幫你理解協(xié)議交互的每一幀報文、每一個狀態(tài)轉(zhuǎn)換。無論是做網(wǎng)絡設備模擬器、接入認證系統(tǒng)、還是在測試環(huán)境里模擬 DHCP 攻擊與防護場景一份能跑的 Java 源碼都是最直接的學習和調(diào)試工具。適合的人群是網(wǎng)絡協(xié)議棧開發(fā)者、物聯(lián)網(wǎng)設備接入層的工程師以及那些在面試里被問到「DHCP 報文是怎么組裝和解析的」之后想弄個明白的 Java 后端。2. 實現(xiàn)前必須吃透的 DHCP 報文結(jié)構從 BOOTP 到選項域的字節(jié)級拆解2.1 為什么 DHCP 報文要用字節(jié)數(shù)組硬拼而不是 JSON 或?qū)ο罅骱芏嗳藙偵鲜謺r第一反應是我需要一個 DHCP 報文類把 op、htype、xid 這些字段用 Java 對象表示然后序列化。這個方向沒錯但注意 DHCP 報文在網(wǎng)絡上傳輸時就是純字節(jié)流而且它沒有現(xiàn)成的 Java 序列化協(xié)議必須按 RFC 2131 規(guī)定的固定偏移量逐字節(jié)塞進去。報文頭固定部分只有 236 字節(jié)從 op 字段到 sname 的 64 字節(jié)加上 file 的 128 字節(jié)后面接著的是 64 字節(jié)的 options 區(qū)。這里的第一個坑是你用的 ByteBuffer 是 Big-Endian 字節(jié)序而 DHCP 報文里絕大多數(shù)多字節(jié)字段比如 yiaddr、ciaddr都是網(wǎng)絡字節(jié)序也就是 Big-Endian。這意味著直接調(diào)用ByteBuffer.wrap()然后putInt()是安全的但如果你為了取某個字段用getInt()時忘記考慮緩沖區(qū)位置就會讀到錯位的數(shù)據(jù)。常見的實現(xiàn)方式是寫一個專門的 DHCPPacket 類內(nèi)部持有byte[] packet對外提供getOp()、setOp()之類的訪問方法。這樣在解碼時不需要反復 copy 字節(jié)直接對底層數(shù)組按偏移量操作。我一般還會內(nèi)置一個parseOptions()方法把 options 區(qū)從 240 字節(jié)偏移開始循環(huán)讀取先讀 option code1 字節(jié)如果是 0 是 padding如果是 255 是 end否則讀長度再讀值。這個循環(huán)邏輯是整個解析器最容易出錯的地方原因在于你必須在讀 code 前判斷剩余長度是否至少為 2code len否則直接拋異常。2.2 報文類型選項53 號選項和事務 ID區(qū)分 Discover / Offer / Request 的分水嶺如果你只是在網(wǎng)絡上抓包看源端口 68 和 67 就能猜出大概。但代碼要處理的是具體邏輯分支Discover類型 1、Offer類型 2、Request類型 3、Ack類型 5、Nak類型 6這些行為全靠 options 區(qū)里的第 53 號選項區(qū)分。byte類型取值有符號的問題在這里就暴露了。Java 里的byte是 -128 到 127而 DHCP 報文里某個 code 可能是 0x80 甚至 0xFF。如果你寫int code buffer[index]你會得到一個負數(shù)比如 0xFF 變成 -1。正確做法是int code buffer[index] 0xFF。這一點不著重說明后面的報文解析一定會翻車。事務 ID 是 xid 字段4 字節(jié)由客戶端隨機生成。服務器在回復時原樣帶回 xid客戶端用它匹配請求和響應。在 Java 里你用SecureRandom.nextLong()然后截取低 32 位就可以。注意不要用Math.random()去生成因為它在高并發(fā)或多次快速重啟時可能重復導致客戶端把舊 Offer 當成新 Offer。2.3 租約時間、子網(wǎng)掩碼、網(wǎng)關和 DNS選項的讀寫順序決定兼容性拿到選項值之后你要按標準順序把它們編碼回去。常見的順序是53報文類型、 server identifier54、 lease time51、 subnet mask1、 router3、 dns6。有些舊客戶端對選項順序敏感比如 Windows 老版本 DHCP 客戶端必須把 53 號選項放在最前面否則直接丟棄報文。選項值里額外要留意的是 IP 地址數(shù)組的對齊router 選項3和 DNS 選項6都是可以包含多個 IP 的列表以 4 字節(jié)為間隔。讀取時要循環(huán)讀滿length才算完不能只讀第一個。寫入時同樣按 4 字節(jié)一組。租約時間51 號是 4 字節(jié)整數(shù)單位是秒不能錯成毫秒否則客戶端會在幾小時內(nèi)以為租約到期瘋狂續(xù)租。提示寫一個獨立的DhcpOption類字段包括 code、length、byte[] data。解析時先把 options 全部拆成若干 DhcpOption 對象再按 code 去查而不是在讀循環(huán)里當場做分支處理。這樣的設計避免后續(xù)新增選項時改一大段解析代碼。3. 從零寫最小 DHCP 服務器UDP 廣播收發(fā)與租約管理的完整 Java 代碼3.1 綁定 67 端口監(jiān)聽廣播Socket 選項和網(wǎng)絡接口選擇DHCP 服務器監(jiān)聽 UDP 67 端口客戶端從 68 端口發(fā)送。在 Java 里這不是普通的DatagramSocket因為你希望收到發(fā)往 255.255.255.255 的廣播包。先看最精簡的監(jiān)聽代碼import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class DhcpServerSocket { private DatagramSocket socket; private InetAddress broadcastAddress; public DhcpServerSocket(int port, String broadcastIp) throws SocketException { // 廣播地址由網(wǎng)卡配置決定通常取 255.255.255.255 或子網(wǎng)定向廣播 this.broadcastAddress InetAddress.getByName(broadcastIp); // 第一個參數(shù)為端口第二個參數(shù)為綁定的本地地址null 表示所有地址 this.socket new DatagramSocket(port, null); // 允許廣播這步不做會收不到 255.255.255.255 的報文 socket.setBroadcast(true); // 加大接收緩沖區(qū)防止瞬間大量 Discover 導致丟包 socket.setReceiveBufferSize(64 * 1024); } public DatagramPacket receive() throws Exception { byte[] buf new byte[1500]; DatagramPacket packet new DatagramPacket(buf, buf.length); socket.receive(packet); return packet; } public void send(byte[] data, int length, InetAddress destIp, int destPort) throws Exception { DatagramPacket reply new DatagramPacket(data, length, destIp, destPort); // 目標端口固定為 68客戶端監(jiān)聽端口 socket.send(reply); } }參數(shù)說明new DatagramSocket(port, null)中的 null 代表綁定到所有網(wǎng)卡。如果你的機器有多塊網(wǎng)卡只希望在特定網(wǎng)卡上服務這里可以傳InetAddress.getByName(192.168.1.100)。setBroadcast(true)是為了能夠向廣播地址發(fā)送回復包不設置就只能單播。監(jiān)聽端口時如果提示Address already in use在 Linux 上可以用setsockopt的 SO_REUSEADDR 解決但 Java 里沒有直接暴露這個選項最簡單的辦法是確認沒有其他 DHCP 服務占著 67 端口。3.2 解析 Discover 報文并組裝 Offer一個完整的請求處理鏈路收到 Discover 后你要做的是讀取客戶端 MACchaddr 字段從偏移 28 開始16 字節(jié)根據(jù) MAC 查租約表分配一個空閑地址然后組裝 Offer 報文。下面這段代碼集中展示了核心處理流程public class DhcpRequestHandler { // 租約表MAC - IP 和過期時間 private final MapString, Lease leaseMap new ConcurrentHashMap(); // 可用 IP 池用隊列模擬分配 private final QueueString addressPool; public DhcpRequestHandler(ListString poolAddresses) { addressPool new LinkedList(poolAddresses); // 啟動一個定時線程定期清理過期租約 Executors.newSingleThreadScheduledExecutor() .scheduleAtFixedRate(this::cleanupExpiredLeases, 60, 60, TimeUnit.SECONDS); } public byte[] handleDiscover(byte[] requestPacket) { // 1. 解析客戶端 MAC包偏移 28 處長度 6但 chaddr 字段是 16 字節(jié) byte[] chaddr Arrays.copyOfRange(requestPacket, 28, 44); String macKey toMacString(chaddr); String offeredIp leaseMap.containsKey(macKey) ? leaseMap.get(macKey).ipAddress : allocateIp(macKey); if (offeredIp null) { return null; // 地址池耗盡 } // 2. 構造 Offer 報文的基礎字段 byte[] response new byte[240]; // 只占固定頭選項在后面追加 response[0] (byte) 0x02; // op: BOOTREPLY response[1] (byte) 0x01; // htype: Ethernet response[2] (byte) 0x06; // hlen: MAC 地址長度 // 復制 xid客戶端用這個字段匹配 Offer System.arraycopy(requestPacket, 4, response, 4, 4); // yiaddr 字段從偏移 16 開始填入分配的 IP byte[] ipBytes ipToBytes(offeredIp); System.arraycopy(ipBytes, 0, response, 16, 4); // 復制客戶端 MAC 到 chaddr System.arraycopy(chaddr, 0, response, 28, 6); // 3. 追加 options53 號報文類型 Offer、54server id、1掩碼、51租約 ByteBuffer options ByteBuffer.allocate(256); options.put((byte) 53).put((byte) 1).put((byte) 2); // Offer 類型 options.put((byte) 54).put((byte) 4) .put(ipToBytes(192.168.1.1)); // 服務器自身 IP options.put((byte) 1).put((byte) 4) .put(ipToBytes(255.255.255.0)); options.put((byte) 51).put((byte) 4) .putInt(7200); // 租約 2 小時 options.put((byte) 255); // End 選項 byte[] responseWithOptions new byte[240 options.position()]; System.arraycopy(response, 0, responseWithOptions, 0, 240); System.arraycopy(options.array(), 0, responseWithOptions, 240, options.position()); return responseWithOptions; } private String allocateIp(String mac) { // 簡化實現(xiàn)從隊列取地址不考慮釋放問題 String ip addressPool.poll(); if (ip ! null) { leaseMap.put(mac, new Lease(ip, System.currentTimeMillis() 7200_000L)); } return ip; } }邏輯說明handleDiscover的輸入是整個 UDP 報文的有效載荷字節(jié)數(shù)組。第一步解析 chaddr 時注意只取前 6 字節(jié)做 MAC因為 Ethernet 的 hlen 是 6但報文里該字段長度是 16 字節(jié)剩余部分為零填充。response[0] 0x02表示這是 BOOTREPLY而請求包對應值是 0x01BOOTREQUEST。xid 必須從請求包偏移 4 的位置復制 4 字節(jié)否則響應對不上客戶端。Options 的組裝用了ByteBuffer且每個 option 的格式是 code length value。長度字段必須是實際字節(jié)數(shù)比如 51 號 option 的租約時間是 4所以先put((byte) 4)再putInt(7200)。positon()返回當前寫入位置作為 options 區(qū)總長度。這種寫法比逐字節(jié)往一個byte[]里塞要清晰調(diào)試時也方便中途打印。3.3 收到 Request 后回 Ack狀態(tài)機里的最后一步Offer 發(fā)出后客戶端會廣播一個 Request類型為 3。這時候服務器要做的是確認該 Request 中的 requested IP50 號選項確實是本服務器分配的然后回復 Ack。下面代碼展示如何處理 Requestpublic byte[] handleRequest(byte[] requestPacket) { // 1. 從 options 里找到 50 號選項取請求的 IP ByteBuffer options ByteBuffer.wrap(requestPacket, 240, requestPacket.length - 240); String requestedIp null; String serverIdentifier null; while (options.remaining() 0) { int code options.get() 0xFF; if (code 0) { continue; // padding } if (code 255) { break; } int len options.get() 0xFF; byte[] val new byte[len]; options.get(val); if (code 50) { requestedIp bytesToIp(val); // 客戶端請求的地址 } else if (code 54) { serverIdentifier bytesToIp(val); // 客戶端期望的服務器地址 } } // 2. 判斷是否應該由本服務器響應客戶端指定了其他 server id 則忽略 if (serverIdentifier ! null !serverIdentifier.equals(localServerIp)) { return null; } // 3. 校驗地址池里確實有這個地址且未分配給別人 if (!addressPool.contains(requestedIp) !isLeasedToClient(requestedIp)) { return null; } // 4. 組裝 Ack報文類型 5返回分配結(jié)果 byte[] ack buildReply(requestPacket, (byte) 5, requestedIp); return ack; }邏輯說明handleRequest里的循環(huán)解析 options特別要注意options.get()返回的是有符號字節(jié)這里用 0xFF規(guī)避負數(shù)問題。當客戶端拿到 Offer 后會發(fā) Request并把 50 號選項設成自己想要的 IP。如果網(wǎng)絡里有多個 DHCP 服務器同時收到了 Request客戶端會用 54 號選項指定它認可的服務器其他服務器看到 54 號不是自己就直接忽略。這一步邏輯不寫就會出現(xiàn)兩臺服務器同時回 Ack 的沖突場景。3.4 定時清理租約ConcurrentHashMap 怎么和地址池配合實際運行中客戶端釋放地址時的 Release 報文是單播發(fā)給服務器的所以handleRequest方法里還需要處理報文類型 7Release。Release 報文里含客戶端 IPciaddr 字段服務器拿到后把地址放回池子、從租約表刪除。但客戶端可能異常斷電永遠不發(fā) Release所以必須依賴租約過期機制。private void cleanupExpiredLeases() { long now System.currentTimeMillis(); for (Map.EntryString, Lease entry : leaseMap.entrySet()) { if (entry.getValue().expireTime now) { // 地址回收放回隊列尾部允許被重新分配 addressPool.offer(entry.getValue().ipAddress); leaseMap.remove(entry.getKey()); } } }這里的隱患是地址池用ConcurrentHashMap和LinkedList組合本身就不是線程安全的。cleanupExpiredLeases在獨立線程里跑而handleDiscover在主接收線程里也會操作addressPool。解決方式是給地址池操作加鎖或者直接用BlockingQueue并用ConcurrentHashMap記錄租約和到期時間。我在實際項目里會用ConcurrentHashMap存mac - ip的映射再用ConcurrentHashMapString, Long存ip - expireTime清理時同時刪兩個 map分配時用AtomicInteger做輪詢游標而不是直接 poll 隊列因為釋放和過期回收都會動態(tài)往隊列里放地址。private final AtomicInteger cursor new AtomicInteger(0); private final ListString allIps; // 固定列表初始化時排序好 private String allocateIp(String mac) { for (int i 0; i allIps.size(); i) { int idx Math.abs(cursor.getAndIncrement() % allIps.size()); String candidate allIps.get(idx); if (!leaseMap.containsKey(mac) !leasedIpSet.contains(candidate)) { leaseMap.put(mac, new Lease(candidate, System.currentTimeMillis() 7200_000L)); leasedIpSet.add(candidate); return candidate; } } return null; }參數(shù)說明allIps在初始化時從配置的網(wǎng)段展開比如192.168.1.100到192.168.1.200生成 101 個地址。cursor每次分配時累加再取模實現(xiàn)輪詢分配避免每次都從列表頭部開始找導致早期地址快被用光、后續(xù)地址閑置。leasedIpSet是一個SetString用來快速判斷地址是否已被占用否則每次都要遍歷租約表。4. 客戶端實現(xiàn)與抓包驗證三步確認你的 DHCP 協(xié)議棧沒寫歪4.1 構造 Discover 報文的細節(jié)68 端口和全零地址客戶端代碼比服務器少很多核心是構造 Discover 并發(fā)送到 255.255.255.255:67。關鍵約束是源端口必須是 68源 IP 可以是 0.0.0.0因為客戶端此時還沒有 IP。public class DhcpClient { private DatagramSocket socket; public void startDiscovery() throws Exception { socket new DatagramSocket(68, InetAddress.getByName(0.0.0.0)); socket.setBroadcast(true); socket.setSoTimeout(5000); // 5 秒收不到就超時 byte[] discover buildDiscoverPacket(); DatagramPacket pkt new DatagramPacket(discover, discover.length, InetAddress.getByName(255.255.255.255), 67); socket.send(pkt); // 等待 Offer,讀到報文后校驗 xid 與自己的匹配 byte[] buf new byte[1500]; DatagramPacket response new DatagramPacket(buf, buf.length); socket.receive(response); parseOffer(buf); } private byte[] buildDiscoverPacket() { byte[] packet new byte[240 4]; packet[0] (byte) 0x01; // BOOTREQUEST packet[1] (byte) 0x01; packet[2] (byte) 0x06; // xid: 4 字節(jié)隨機數(shù) int xid new SecureRandom().nextInt(); packet[4] (byte) (xid 24); packet[5] (byte) (xid 16); packet[6] (byte) (xid 8); packet[7] (byte) xid; // 自己的 MAC假設網(wǎng)卡 MAC 是 01:02:03:04:05:06 byte[] mac new byte[]{(byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06}; System.arraycopy(mac, 0, packet, 28, 6); // options53 號選項 Discover1 packet[240] (byte) 53; packet[241] (byte) 1; packet[242] (byte) 1; packet[243] (byte) 255; // End return packet; } }邏輯說明new DatagramSocket(68, 0.0.0.0)綁定到 68 端口這樣收到的 Offer 會被操作系統(tǒng)路由到該 socket。xid 的生成用SecureRandom.nextInt()而不是Math.random()是為了避免在多線程場景下的重復性。注意把 xid 拆成 4 個字節(jié)的順序——Java 的 byte 是有符號的xid 24的結(jié)果 0~255賦值給 byte 時 0xFF 會變成 -1但在傳輸中字節(jié)序列是正確的因為二進制表達沒變。實際解析時用 0xFF再拼回 int 即可。4.2 收到 Offer 后如何提取租約信息ip 和 options 的解析順序在parseOffer中要依次做檢查 op 字段是否為 2、xid 是否匹配、拿到 yiaddr偏移 16 起的 4 字節(jié)、掃描 options 找 51 號租約時間和 54 號服務器標識。解析順序別看反了很多人先處理 options 后取 IP就會發(fā)現(xiàn) options 區(qū)的偏移計算有誤。private void parseOffer(byte[] response) { if (response[0] ! (byte) 0x02) { throw new IllegalStateException(不是 BOOTREPLY); } // 檢查 xid 是否匹配這里略去與發(fā)送時保存的 xid 比較 byte[] yiaddr Arrays.copyOfRange(response, 16, 20); String assignedIp InetAddress.getByAddress(yiaddr).getHostAddress(); // 掃描 options int offset 240; while (offset response.length) { int code response[offset] 0xFF; if (code 0) { offset; continue; } if (code 255) break; int len response[offset 1] 0xFF; byte[] value Arrays.copyOfRange(response, offset 2, offset 2 len); if (code 1) { // 子網(wǎng)掩碼 String mask bytesToIp(value); // 后續(xù)計算可用地址范圍會用到 } else if (code 3) { // 網(wǎng)關列表一個選項可能包含多個 IP for (int i 0; i value.length; i 4) { String gateway bytesToIp(Arrays.copyOfRange(value, i, i 4)); } } else if (code 51) { long leaseTimeSec ((long) (value[0] 0xFF) 24) | ((value[1] 0xFF) 16) | ((value[2] 0xFF) 8) | (value[3] 0xFF); // leaseTimeSec 單位是秒 } offset 2 len; } }參數(shù)說明租約時間如果直接用ByteBuffer.wrap(value).getInt()也可以但要注意getInt()會得到有符號 int最長租約 0xFFFFFFFF 會變成 -1。這里我演示了手工拼接的方式結(jié)果用 long 承接。網(wǎng)關選項按 4 字節(jié)一組遍歷時要小心 len 不是 4 的倍數(shù)這種畸形包用value.length / 4作為循環(huán)次數(shù)更穩(wěn)妥。4.3 用 Wireshark 對照驗證你寫的源碼和標準報文差在哪代碼寫完后別急著部署先在本地起服務器再起客戶端用 Wireshark 抓bootp或dhcp過濾。如果要驗證 Java 客戶端發(fā)的 Discover 是否規(guī)范抓包后看這幾個點檢查項正確值/行為常見錯誤源端口68錯寫成 67 或隨機端口目標端口67錯寫成 68op 字段1請求/ 2響應兩個方向搞反xid 一致性請求與響應相同響應時復制偏移搞成 8 或 12options 的 End 標記必須有 255 結(jié)尾漏掉后服務端解析會越界chaddr 填充前 6 字節(jié) MAC后 10 字節(jié)補 0直接 copy 16 字節(jié)導致把雜數(shù)據(jù)帶進去我習慣在寫代碼時加一段 debug 日志每次收到 / 發(fā)出的報文用 HexFormat 或DatatypeConverter.printHexBinary()把前 40 字節(jié)打出來。這樣不依賴 Wireshark 也能在控制臺里對著報文字段偏移人工校驗。提示如果你在 Windows 上跑 Java 服務端收到的廣播包源地址可能是 0.0.0.0而目標地址是 255.255.255.255。如果綁定 67 端口時報SocketException: Permission denied是因為非管理員進程無權綁定 1024 以下端口。開發(fā)時用 6767 端口調(diào)試需要聯(lián)調(diào)時再以管理員權限啟動。5. Java 實現(xiàn) DHCP 的 5 個高頻踩坑點與對應排查手段5.1 報文里大于 127 的字節(jié)變成負數(shù)解析全盤錯亂現(xiàn)象客戶端發(fā)來的 Discover 包服務器讀到選項 code 是負數(shù)比如 -128實際是 0x80然后直接數(shù)組越界或走錯分支。原因Java byte 是有符號類型0x80 到 0xFF 會被解釋為 -128 到 -1。你在int code buffer[offset]時沒做掩碼處理。解決所有從報文里讀單字節(jié)并轉(zhuǎn)成「無符號整數(shù)」的地方統(tǒng)一寫成buffer[offset] 0xFF。不要覺得這行代碼多余特別是在 options 循環(huán)、長度字段和 IP 地址首字節(jié)處。另外在把 int 寫成 byte 時比如packet[240] (byte) 53如果 int 值超過 127必須強轉(zhuǎn)否則編譯不通過。寫一個toUnsignedByte(int)工具方法可以減少重復出錯。5.2 廣播包收不到setBroadcast(true) 漏了或者網(wǎng)卡綁定錯了現(xiàn)象服務器啟動后沒有任何日志客戶端一直顯示發(fā)送成功但等不到 Offer。用 Wireshark 看服務器所在機器發(fā)現(xiàn)根本沒有收到包。原因有兩類。第一類是 Java 的DatagramSocket默認不接收廣播地址的包必須顯式socket.setBroadcast(true)。第二類是服務器綁定的 IP 和客戶端廣播到達的網(wǎng)卡不是同一個。如果機器有 eth0 和 eth1客戶端廣播從 eth1 進來但你綁定的是 eth0 的 IP內(nèi)核同樣會丟包。排查方法先臨時寫一段代碼打印本機所有網(wǎng)卡地址然后把new DatagramSocket(port, null)改成new DatagramSocket(port, InetAddress.getByName(0.0.0.0))保證綁定到所有接口。如果還不行用tcpdump -i any port 67在 Linux 上確認報文是否到達內(nèi)核。5.3 Options 解析越界漏了 padding 和 End 選項的處理現(xiàn)象服務器解析某些客戶端比如老舊設備發(fā)來的請求時代碼直接拋ArrayIndexOutOfBoundsException或讀到一個巨大的 len 值。原因DHCP 報文 options 區(qū)不是每次都恰好填滿 64 字節(jié)。RFC 2131 規(guī)定 options 區(qū)末尾以 255 結(jié)束但在它之前可能有一串值為 0 的 padding 選項。你的循環(huán)如果只看了 255 沒看 0或者認為 len 字段一定是合理的遇到 0 時把 padding 當普通選項的 code 和 len 去讀就會讀到錯亂的字節(jié)。解決循環(huán)里的處理順序必須是讀 code如果 code 0跳過當前字節(jié)繼續(xù)下一個如果 code 255立即結(jié)束否則再讀 len 并跳過 len 字節(jié)。注意不能把 padding 當 code 為 0 的選項因為 padding 沒有 len 字段。另外解析時要用offset 2 len packet.length做邊界保護一旦條件不滿足直接丟棄該包并記日志。5.4 客戶端對 Ack 不買賬Server Identifier 選項寫錯地址現(xiàn)象服務器日志顯示已發(fā)出 AckWireshark 也看到了但客戶端就是報錯或者客戶端狀態(tài)停在 Request 階段不進入 Bound。原因Ack 里必須包含 54 號選項Server Identifier且該值必須是服務器自身的 IP 地址。如果寫成 255.255.255.255 或者 0.0.0.0客戶端按 RFC 就認為這個 Ack 不合法。還有一種情況是服務器有多個 IP寫成了其中某個不是客戶端網(wǎng)關所在網(wǎng)段的地址客戶端可能無法路由這個單播 Ack。解決在組裝 Ack 時用DatagramPacket的getLocalAddress()或提前從網(wǎng)卡讀到的地址確保54號選項的值與收包時客戶端發(fā)來的目標地址段匹配。實在無法確定時用收到 Discover 報文的源地址所在子網(wǎng)推斷服務器該用哪個地址回復。5.5 租約過期后地址沒釋放cleanup 線程跑飛或者占用檢查漏了現(xiàn)象地址池明明只有 50 個地址跑了幾天后全部被占用新設備拿不到 IP。但檢查 DHCP 租約表很多租約早已過期。原因cleanupExpiredLeases方法里刪除 map 條目時沒有同步更新地址池。比如你把leaseMap.remove(entry.getKey())寫了卻忘了把 IP 放回addressPool。還有可能是在移除租約時遍歷的是 entrySet但后面又有新請求往同一個 key 寫入導致 remove 和 put 競爭。解決清理邏輯要和分配邏輯用同一個鎖。我習慣做法是把租約表和地址池封裝成一個LeaseManager類所有方法加synchronized或者直接用ReentrantLock。清理時先標記 IP 釋放再刪租約順序不能反否則中間態(tài)有分配線程可能拿到這個 IP 又被后續(xù)刪除動作誤傷。提示這些坑里前三個是 Java 獨有的后兩個是 DHCP 協(xié)議實現(xiàn)共有的。如果你在做自己的項目建議每解決一個坑就補一條單測比如構造一個含 padding 的畸形報文驗證解析器是否崩潰覆蓋這些場景后改代碼會安心很多。6. 讓實現(xiàn)可以上生產(chǎn)報文一致性校驗與性能壓測的小工具我的習慣是給 DHCP 服務器代碼加一個獨立的「報文自檢」入口用真實的客戶端抓包文件回放而不是每次手動敲命令。流程是先用 Wireshark 把真實環(huán)境的 Discover 和 Request 報文導出為二進制文件然后用 Java 程序讀取每個包并調(diào)用你自己的解析邏輯最后把輸出的 Offer/Ack 再與 Wireshark 里抓到的真實響應逐字節(jié)對比。核心校驗代碼可以寫成一個獨立方法public boolean validatePacket(byte[] packet, int maxLength) { if (packet.length 240 || packet.length maxLength) { return false; } // op 只能是 1 或 2 if ((packet[0] 0xFF) ! 1 (packet[0] 0xFF) ! 2) { return false; } // htype 為 1 時 hlen 必須是 6 if (packet[1] 1 (packet[2] 0xFF) ! 6) { return false; } // 掃描 options驗證每個 option 都不越界 int offset 240; while (offset packet.length) { int code packet[offset] 0xFF; if (code 0) { offset; continue; } if (code 255) break; if (offset 1 packet.length) return false; int len packet[offset 1] 0xFF; if (offset 2 len packet.length) return false; offset 2 len; } return true; }運行單測時我把抓到的包分兩類合法報文和畸形報文。合法報文必須通過校驗畸形報文必須被拒絕。這個校驗器本質(zhì)上就是你的防御性編程的集中體現(xiàn)值很值得維護。有了能跑通的核心邏輯和校驗器下一步建議做一次壓力測試。用循環(huán)線程模擬 500 個客戶端同時啟動ExecutorService pool Executors.newFixedThreadPool(50); CountDownLatch startSignal new CountDownLatch(1); for (int i 0; i 500; i) { final int clientId i; pool.submit(() - { try { startSignal.await(); DhcpClient client new DhcpClient(); client.setMac(randomMac(clientId)); client.startDiscovery(); } catch (Exception e) { System.err.println(client clientId failed: e.getMessage()); } }); } startSignal.countDown(); pool.shutdown();注意這里每個線程都創(chuàng)建獨立DatagramSocket綁定 68 端口這本身就會遇到端口沖突——多個進程不能同時綁同一個端口。所以在壓測時要讓客戶端隨機使用 68 到 70 范圍內(nèi)的端口或者用同一個 socket 串行發(fā)。更實際的做法是直接用服務端日志里的xid去重統(tǒng)計單位時間收到多少個不同 xid 的 Discover再用單線程代碼往服務器灌大量手工構造的 Discover 報文來測試吞吐。最后一個技巧把核心的報文組裝和解析邏輯與網(wǎng)絡收發(fā)解耦。網(wǎng)絡層可以換 Netty 的 DatagramChannel 或者 OIO 實現(xiàn)但解析和組裝是純函數(shù)式的輸入 byte[] 輸出 byte[]。這樣將來想把服務跑在 Vert.x 上或者遷移到 GraalVM 原生鏡像都不需要動協(xié)議代碼。我的個人習慣是任何時候都會以 Wireshark 抓包為最終真理寫完代碼先抓包對比 20 個請求再談可靠性。DHCP 看起來簡單但報文里的每個字節(jié)都有自己的脾氣希望這套實現(xiàn)思路能幫你少走幾個彎路。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久草xx性爱视频| 国产乱子轮XXX农村| 99热欲| 99精品免费视频| 日本九九视频| 玖玖九九9999在线观看视频精品| 婷婷精品视频| 玖玖色综合| 综合狠狠干| 亚洲精品色| 日日干综合| 色情五月天导航| 色五月婷婷亚洲| 天天天天天天天操| 六月婷五月丁香| 夜夜大香蕉婷婷丁香| 无码少妇高潮喷水A片免费| 天天天天天天噜| 人人摸人人搞| 久色网址| www,色婷婷| va中文资源在线观看| 久久婷婷91| 久cao香蕉影院| 激情五月六月婷婷| 五月天婷婷丁香| 丁香五月婷婷综合精品素人| 六月丁香婷婷综合狠狠爱夜夜爱| 五月天 婷 欧美亚洲| 深爱激情五月天色婷婷| 日日夜夜青青草| 在线观看中文字幕亚洲| 亚洲综合1024| 看婷婷五月天网| 影音先锋偷偷色男人站| 久人操| 国产,欧美,学生妹,视频| 久久与婷婷| 五月天婷婷乱论小说| 少妇激情五月婷婷| 天天干肏夜夜| 婷婷五月天综合小说网| 久re热视频| 男人的天堂五月丁香| 五月激情另类| 99热99re6国产在线播放| 五月天色婷婷激情综合| 婷婷色色播五月天| 影音先锋777xfplay色资源网站| 欧美噜一噜| 色五月之第四色| www.yw尤物| 久久99网址| 久久精品系列| 99色综合网| 91 九色 熟女| 亚洲爱爱无码婷婷色五月| 啪啪啪大香蕉| 日本久久色| AⅤ网站在线看| 久久婷婷一级片| 色啪久 | 9久热| 超碰在线视屏| 激情婷婷五月天| 亚洲丁香花色| jiuse91在线| 色99无码| www.天天色综合| 深爱激情中文五月天av| 五月综合激情视频| 国产 亚洲 在线| 99综合视频| www99热| 精品国产乱码久久久久久免费| 五月婷庭丁香在线| 五月婷婷开心网| 婷婷九月亚洲| 激情五月天天| 日本色婷婷| 亚洲网站在线鸭子av| 丁香婷婷六月激情| 国产成人在线精品| 91久久18| 欧美天天综合网站上去吧| 亚洲激情区| 天天干天干| 五月婷婷五月色| 五月婷六月| 欧美精品在线观看| 午夜丁香| 99热综合网| 69热在线| 五月婷婷成人| 国产毛片欧美毛片久久久| 精品热九九| 伊人久久中文网| 久久九九视频网站| 婷婷久久五月天| 91精品综合久久久久久五月丁香| 午夜成人综合| 五月婷婷激情综合视频| 九九碰九九爱97| 月丁香久久久| 五月天伊人日日噜影片AV| 丁香六月婷婷色XXXXX| 97色婷婷| 婷婷人人操| 天天操天天操综合| 五月开心久久| 国产激情综合五月久久| 婷婷激情人妻| 九九色图| 99久久97久久欧美综合网| 亚洲国产精品成人免费一区久久久在线观看AAAA | 激情五月影院| 69人人操人人爽| 丁香婷婷激情综合五月激情| 99自拍视频网站| 精品热青草| 九九国产视频| 深爱激情六月天| 丁香五月123| 亚洲国产精品成人va在线观看| 9有码中文| 伊人婷婷大香蕉在线| 狠狠色丁香| 国产.亚洲.欧洲视频在线| 日在线V视频在线播放| 激情综合五月丁香| 91超级碰碰碰| 九九热精品| 国产免费av在线| 久久这里只有国产视频| 国产毛片操B| 色色色色色色色综合| 色综合中文| 无码AV大香线蕉伊人| jiujiu无码五区| 天天日天天爽夜夜爽| 超碰99热精品| www.zbzhongsen.com| 国产九九一区二区三区| www久久久久久久97| 婷婷九九视频| 五月丁香六月综合情在线观看 | 97碰碰视频| ou洲色吧| www.五月天婷婷| 婷婷玖玖丁香| 亚洲成人免费在线| 久久精品国产色| 国内外色色色色色成人视频| 欧美激情xxxXX| 99热这里只有精品3| 国产成人AV在线播放| 天天狠天天叉| 婷婷伊人綜合中文字幕| 99这里只有精品| 日本丁香五月婷婷| 婷婷五月天最新网址| 一区二区三区四区无码| 99热69| 啊V视频在线观看| 91久久五月天| 六月婷婷视频| 久草婷婷视频| 亚洲成人网站在线观看| 婷婷六月丁香色| 亚洲亚洲人成综合网络| 婷婷婷婷婷开心无码播放| 婷婷色资源| 五月久久婷婷成人网| 激情久久丁香| 婷婷久久五月| 六月综合婷婷开心伊人| 久久婷婷五月综合97色一本| 色婷婷六月| 亚洲激情综合免费| 99这里有精品视频3| 国产成人+综合亚洲+天堂| 五月天激情网图片 - 百度| 开心五月色婷婷综合开心网| 久久婷婷网站| 依人大香蕉在钱1| 色偷偷色婷婷| 婷婷基地成人五月天| A片试看120分钟做受图片| 天天舔天天摸天天透| 六月婷婷最新网址| 丁香五月影院| 久久五月天色婷婷| 婷婷爱婷婷| 综合激情sV| 成人网站在线观看视频| 狠色色狠网| 国产免费av在线| 99热这里都是精品| 五月婷婷激情日本| 日本在线噜噜| 国产特级毛片AAAAAAA高清| 久久综合天天综合| 99亚洲综合| 亚洲激情五月| 1024亚洲无码| 丁香五月天之婷婷影院| 91啪啪网| 婷婷开心激情五月激情网| 狠狠五月激情丁香六月| 丁香五月激情五月| 97人妻超级碰碰碰碰碰| 日本三级大片| 五月丁香六月色| 婷婷丁香六月影视| 亚洲人成网亚洲欧洲无码久久| 色啦啦视频| 久久久久9999| www.色综合.com| 牛牛碰免费| 婷婷五月天丁香花| 91九色精品熟女内射| wwwxxx五月婷婷小说| 狠狠人妻色综合| 久久久av久av久片一区二区| 亚洲激情网| 狠狠色噜噜狠狠| 丁香五月视频在线观看| 亚洲人人96@| 高清成人综合| 激情五月婷黄版| 国产成人精品一区二区三区视频| 六月婷婷激情| 99热这里只有精品8| 久久婷婷五月免费视频| 午夜色丁香| 九九综合精品| 色婷婷成人在线| 26uuu青青| 亚洲熟女色| 超碰97色| 亚州综合色| 亚洲AV成人精品网站在线播放| 欧美黑人巨大性生话| 狠狠综合| 99视频精品在线| 五月丁香婷婷色色| 激情五月婷婷五月| 综合婷婷六月| 国产热精品| 色六月天天激情综合网| 狠狠搞综合色| 五月天激情视频网站| 五月天开心色情网| 欧美婷婷五月丁香| 综合一区二区三区| 五月天大香蕉| 99久热| 色噜噜狠狠一区二区三区| 日韩色久| 色五月综合| 五月色亚洲| 夜夜爽天天爽| 韩国中文字幕91| 九九色婷婷五月天| 欧美六月婷婷| 99热国内精品| 这里只有精品热| 天天色天天爱天天舔| 国产成人VA| hd五月婷婷在线| 婷婷五月丁香五月天| www.丁香黄色五月天人与| 五月丁香久久久| 婷婷激情丁香六月| 婷婷五月丁香六月| m色激情网| 武汉美女啪啪视频免费一级片 | 日日综合网| 美国色五月天婷婷资源站| 五月丁香操亭亭网| 99色婷婷视频| 成人婷婷色综合| 久热精品9999| 五月天色色激情综合| 怕怕視頻| 婷婷5月九九| 天天做夜夜爽| 久/久精品99看9| 激情第四色| 婷婷五月激情黄色| 狠狠久久婷五月| 五月噜噜噜色综合| 开心激情网五月天| 丁香五月综合| 色播播婷婷| 婷婷五月小说色综合| 国产乱人偷精品人妻A片| AAA级久久久精品| 丁香婷婷激情四射五月| 色噜噜狠狠色综| 思思久久96热在精品国产,| 情久久综合五月天| 国产毛多水多女人A片| ZpRSw| 91狠狠综合网| 五月天激情网开心网| 五月婷精品| 第四色在线观看| 欧美网站视频4399| 99成人精品视频| 超碰久热| 久七香蕉| 99爱免费视频| 五月婷婷六月丁香| 亚洲av免费在线| 欧美丁香五月天| 中文字幕成人| 久草a片| 99精品国产在热久久| 婷婷九月狠狠色| 欧美综合丁香网| 欧美影院| 人妻六月天| 激情丁香五月婷| 婷婷久久五月天| 国产又爽又猛又粗的视频A片| 婷婷成人AV| 亚洲、热| 中文字幕日本最新乱码视频 | 亚洲色五月| 香蕉中文在线| 蜜乳中文字| 国产亚洲精品AAAAAAA片| 亚州第一A片| 99热久久这里只有精品| 色五月婷婷影院| 99视频在线观看网址| 开心五月丁香婷婷| 中文字幕免费高清电视剧| 婷婷丁香五月天大香蕉| 深爱五月网| 婷婷丁香五月综合| 看黄的网站18禁| 狠狠爱五月婷婷| 欧美日本另类| 精品动漫 无码av| 色大综合| 91大屁股在线| 五月丁香六月婷婷开心网| 夜精品无码A片一区二区蜜桃| 色情久久久| 日本五月婷婷| 日本丁香久在线| 欧美一级操逼视频| 丁香五月天社区婷婷| 天天插轮理| 天天干天天插| 深爱丁香激情| 天天插天天爱| 国产一级黄色影片,| 丁香五月瑟瑟| 亚洲国产精品二二三三区 | 激情五月婷婷丁香六月| 日本色五月| 欧美日韩成人在线| 久久五月丁香伊人青草| 99色在线| 岛国av电影网站| 日产精品久久久久久久蜜臀| 丁香五月激情性色郤| 嫩草AV久久伊人妇女超级A| 六月丁香成人| 黄色网址五月婷婷| 五月婷婷丁香俺日污视频| 伊人激情网| 天天澡天天狠天天天做| 97九色| 99免费| 99热思思在线观看| 九九综合网| www.五月天婷婷| 久青操| 日日操日日撸| 亚洲狠狠狠| 伊人久热91| 人妻综合网| 久久综合网免费视频| 射满了还射免费在线观看 -午夜版全集-新视觉影院| 免费试看小视频 99| 久久久久9久无码视频| 国产婷婷五月色情综合| 狠狠干综合| 色五月激情五月| 色六月视频| 狠狠色五月| 99ri精品| 五月丁香亚洲综合| 少妇丁香婷婷| 美国不卡视频| 欧美69久成人做爰视频| 99色在线观看视频| 蜜乳国产网站| 99视频久久| 96自拍视频九色在线观看| 丁香六月五月婷婷| 色综合夜夜| OYIWbGcPu8H| 午夜一区| 人人摸人人摸| 激情婷婷综合| 婷婷欧美激情综合| 啪啪日本欧美| 五月丁香啪啪网| 婷婷五月情天| 丁六月激情| 97热精品| 亚洲久艹| 婷婷狠狠干| 91超碰在线观看| 西瓜美女a片| 亚洲操精品| 丁香五月花影院| 久久最新色| 丁香五月狠狠综合欧美| 99热婷婷| 91碰| 日韩一级网站| 色综合五月| 激情五月天色网站| 天天激情欧美美女| 五月婷婷六月开心| 另类小说婷婷色| 超碰在线国产| 五月天婷婷基地综合网| 日韩免费99| 人人摸人人操人人爱| 久久婷婷影院| 色噜噜狠狠色综合成人网| 天天日天天日天天搞| 丁香婷婷六月激情文学 | 欧美丰满熟妇BBB久久久| 99九九视频精彩在线| 国际国外精品欧洲南美洲专区无码不卡| 啪啪丁香五月| 人人九色| 色哟哟www| 亚洲国产色婷婷| 丁香五月婷婷激情97| 99亚洲视频| 亚洲视频五区| 人人97碰| 成人视屏在线观看| 超碰久热| 激情综合婷婷| 成人精品视频99在线观看免费| 激情久久久| 伊人久久大香线蕉av最新| 噜噜噜噜综合在线| 婷婷色在线播放| 狠狠干天天日| 国产精品美女| 久久久久激情| 九九99精品视频在线观看| 婷婷综合色色| 婷婷天天色| 91狠狠综合久久| 久久久久亚洲AV无码网影音先锋| 色你久久| 日本丁香五月| 免费无码毛片一区二区A片| 五月天丁香网| 五月婷婷爽爽爽| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 激情五月天影院| 99啪啪视频| 婷婷久久五月天| 九九热99热| 婷婷在线播放| 美女久久婷婷| 偷偷操九九| 综合玖玖偷拍| 中文精品久久久久人妻不| 精品99这里有| 色五月丁香五月婷婷五月成人网| 久久这里只精品| 婷婷五月天激情综合| 色婷婷影视| 五月丁香啪啪| 九九精品少妇| 色五月婷婷久久| 丁香激惜男女| 色婷婷五月天激情在线观看| 五月丁香无码| 精品一二三区久久AAA片| 亚洲天堂AV综合网| 99re99在线看| 色婷婷五月天天天干天天操天天爽| 婷婷香五月天| 色五月五月婷婷| 色欧美色色色| Av九九| 2025中文在线视频字幕免费观看| 五月婷婷六月丁香综合在线| 99在线观看| 婷婷成人基地| 狠狠色97| 人人视频色| 久久与婷婷| 色色色综合网| 丁香婷婷91在线观看视频| 高清无码.com| 六月婷婷五月丁香| .青娱乐天天操B| 丁香五婷婷| 六月丁香成人| 色五月天丁香婷婷| 色综合久久久无码中文字幕999| 五月丁香婷婷婷激情爱爱| 在线观看熟女少妇| 丁香久月| 99热 日韩| 色婷婷综合网站| 天天做天天爱天天玩夜夜爽 | 九九色婷婷| 国产精品A片在线| 99精品视频免费在线播放| 久草五月天| 五月天激情视频| 久xxxx| 丁香五月综合图片在线观看| 狼人久草| 婷婷六月视频| 99九九视频| 97很鲁在线视频| 伊人久久婷婷| 91热网址| 色原狠狠综合| 亚洲丁香五月| 丁香色婷婷色手机免费在线| 色 免费网站视频| 日本色色视频| av操B网站| 有码人妻久久| 婷婷伊人网| 丁香久月婷| 日韩操逼小电影| 精品一二三区久久AAA片| 99 re视频一区| 99热99这里免费的精品| 国外亚洲成AV人片在线观看| 日日干综合| 九九热在线视频观看| 91日韩美女被插视频| 婷婷五月花西瓜| 日韩成人无码| 六月丁香激情最新更新| 无码激情AAAAA片-区区| 秋霞网在线观看理论91| 亚洲亚洲人成综合网络| 免費亭亭成人| 亚洲精品V天堂中文字幕| 婷婷丁香五月天综合AV| 99婷婷| 99在线观看视频| 国产精品电影网| 91在线日本| 97操碰在线视频| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 8区视频在线| 综合狠狠干| 伊人www22综合色| 婷婷操超碰| 亚洲综合视频网| 午夜九九九九九九九九九九九九九| 色综合av超碰| 9999三级片| 久久综合五月天| 无码激情| 亚洲激情图文小说| 电影91久久久| 六月丁香VA| 男人的天堂97| 色五月婷婷av| 亚洲激情无码久久| 五月综合激情久久| 激情婷婷五月| 99久在线观看| 69精品人人人人| 色色热日| 丁香五月天.com| 色五月色五天色情网| 91操操| 天天更新天天亚洲| 色婷婷AV久久| 色婷婷中文在线| 天天日天天做天天舔| 狠狠色综合网| 色播五月婷婷五月| 久久9视频| 午夜天堂一区人妻| 亚洲操操操| 九月婷婷久久久| 99亚洲精品| 99在这里有精品| 久久人人九| 五月婷婷久久综合| 欧美人妻一区二区| 久久五月天激情美女| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 91爱啪啪| 亚洲xx在线| 在线观看免费狠狠色丁香香综合| 日操| 偷偷操99| 亚洲亚洲人成综合网络| 六月丁香网| 婷婷久久五月| 久一网站| 久99婷婷色综合| 亚洲最大在线| 老司机伊人| 亚洲日本激情| 亚洲无码yw| 极品人妻VIDEOSSS人妻| 97色天堂| 欧美VA在线观看| 99久久精彩视频。| 2016日日夜夜操| 伊人在线视频| 欧洲亚洲精品| 婷婷午夜综合| 久久er99| 天堂五月婷婷| 异能之下短剧免费观看全集| 久久99免费视频| 五月天综合| 国产成人在线精品| 无人精品在线视频| 五月激情丁香| 中文无码精品一区二区三区| 久久激情视频99| 99热999| 91人在线观看| 丁香五月综合| 九九RE视频在线精品| 99狠狠色| 色婷婷色综合激情91| 婷婷婷狠狠| www.色综合| www.99婷婷| 色五月丁香五月| 99热国产在线| 久久成人天| 丁香色六月婷婷| 99黄色性生活| 日本不卡中文字幕| 99热综合网| www热久久yy9| 91色干| 97超碰色| 日本97人人| 久草x色在线观看99| 青青草视频免费观看| 爱射综合| 色婷婷五月天| 成人视频网| 五月天成人免费视频| 综合网色| 伊人五月天在线| 第四色激情网| 五月天婷婷视频| 大香蕉综合网| AV九九| 五月天婷婷综合网| 夫妇交换刺激做爰| 五月激香蕉网| 美女被肏网站在线看| 五月天丁香久久综合 | 婷婷婷婷婷婷婷婷| AV色婷婷| 六月丁香啪啪啪| 99热最新| 秋霞午夜理论| 天天操夜夜玩!| 26uuu欧美亚洲日韩| 天天射影视综合网| 五月婷婷综合精品| 亚洲精品大片| 色情久久久| 天天色综网| 久久香蕉网| 在线中文AV| 99视频日韩| 超碰99资源站| 99热 这里只有精品 国产 日韩| 国产日批视频免费播放| 久久99这里只有精品视频| 五月丁香六月欧美| 99热亚洲| 操碰97| 任你干aa| 五月丁香av中文| 爱之国产色情综合| 六月婷婷久久大全| 丁香六月啪| 亚洲欧洲中文日韩久久AV乱码| httpwww色com日本| 日韩狠狠色| 五月天婷婷在看| 六月综合在线| 婷婷丁香久久| 人人综合色| www.99久| 99人人操人人摸| 91碰超| 久热这里| 99视频在线观看视频| 婷婷六月色| www国产亚洲色婷婷com| 丁香五月婷婷啪啪啪| 三十熟女| 婷婷色情网| 狠狠色丁香婷婷综合久久97AV| 五月婷婷中文字幕| 婷婷五月花| 久久九精品| 五月婷婷 六月丁香| 日本美女五月天| 双性美人被调教到喷水A片| 五月婷婷黄| 久久五月网| 在线中文字幕视频| 97久久精品视频| 天天日天天干天天爱| 色婷婷亚洲六月婷婷中文字幕| 色欧洲| 色狠狠综合入口| 热久久66| 婷婷五月天激情网| av国产精品偷| 开心激情网在线| 成人精品视频99在线观看免费| 99精品久久久久| 色狠狠色噜噜噜a天堂一区| 丁香婷婷深情五月亚洲| 亚洲在线视频321| 六月色色婷婷| 91操碰| 91丨九色丨白浆| 九九视频这里只有精品| 变态 另类 在线| 丁香婷婷精品视频| 伊人激情综合网| 欧美婷婷丁香五月| 婷婷精品性性性性性性性| 狠狠操狠狠插| 久久只有精| 婷婷综合激情| 棕合影院色色| 日本色色网站| 91操屁股| 激情五月天婷婷五月天| 五月婷婷伊| 成人婷婷五月| 亚洲乱码日产精品BD| 激情丁香婷婷五月天| 在线日韩视频| 久9视频| 丁香五月区| 五月间天堂综合| 激情五月婷婷老师| 久热精品9999| 99色亚洲| 99资源在线| 国产精品VA在线| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 色色婷婷综合网| 精品人妻在线免费观看| 久久99久久99精品免观看软件 | 天天综合激情| 99爱在线视频| 狠狠色狠狠鲁| 综合在线观看99| 伊人婷婷五月天av| 国产av第一专区| 丁香六月在线| 91|九色|动漫| 夜夜资源站| www。五月天激情| 婷婷五月天久久久| 逼逼AV| 玖玖婷婷五月天毛片| 色五月丁香伊人五月| 伊人热婷婷| 九九热99免费视频| 色色婷| 无码色| 五月色俺婷婷| 六月丁香婷婷大香蕉| 色99在线| 91日本在线观看| www超碰| 伊人婷婷色激情丁香| 婷婷天天五月天| 九九在线视频| 99re6热在线精品视频播放速度| 色婷视频| 99亚洲无码| 激情av在线| 大香蕉人妻| 大地9中文在线观看免费高清| 色婷五月天网站| 久久五月情| 99这里只有| 俺去也在线官网| 第四色网婷婷| 五月婷婷激情综合| 天天摸色吧天天摸色吧| 九月丁香亭亭| 天久综合91综合首页| 婷婷丁香五月婷婷| 人人干天天舔| 丁香五月成人自拍| 欧美日韩999| 日本欧美国产| 中文字幕在线日亚洲9| 青青草视频免费观看| 激情五月天视频| 色久在| 日本97久久久精品| 人妻丰满精品一区二区A片| 深爱婷婷丁香五月激情| 秋霞免费三级片| 日本在线观看aaa 99| 91丨九色丨东北熟女| 丁香美女主播视频在线观看| 精品激情| 久久婷婷五月综合色天| 婷婷伊人网| 思思热在线观看| 在线综合婷婷| 丁香六月色婷婷| 久久看九九90| 五月天婷婷社区| 色婷婷五月天激情在线观看| 五月婷婷亚洲天堂激情在线| 啪啪六月婷婷| 日韩AC在线免费观看| 色综合天天综合成人网| 这里只有精品免费| 武则天精品久久| 性爱久久| 级人人91| 久久久97| 国产97色在线 | 日韩| 五月婷婷六月激情网| 97色婷| 色约约视频一区二区三区四区五区 | 久久色亭亭五月天| ss99热| 99在线观看亚洲| AV成人在线播放| 婷婷五月激情小说| 成人无码精品1区2区3区免费看| 久久人人九九| 99精品视频网| 可以免费看AV网站| xxx综合在线| 五月天丁香啪啪综合| 99热免费精品| 婷婷九月丁香天堂丁香天堂| 久月久在线视频| 亚洲经典三级| 精品一二三区久久AAA片| 久久99综合| 4399在线日本A片| 久久婷婷五月天激情| 天天天久久人人人合| 狠狠色噜噜狠狠狠888了| 热99这里只是精品| 狠狠色婷婷| 久久激情五月天| 国产成人AV在线播放| www,99色| 久久九九re热| 婷婷丁香视频| 激情性爱网站| 91无码高清| 在线99精品| 狠狠综合色网| 九九九午夜视频| 91嫩草久久| 亚洲国产网站| 99色在线观看视频| 久久婷婷丁香| 欧美精品999| 99热超碰在线| 九九热视频在线观看| 五月天开心网| 亚洲第一综合| 性色做爰片在线观看WW| 少妇性BBB搡BBB爽爽爽视頻| 香蕉人妻AV久久久久天天| 精品一二三区久久AAA片| 97操碰| 欧美成人AAA片一区国产精品| 日日干夜夜干| 99热在线观看| 一本婷婷丁香久久| 91精品综合久久久久久五月天| yirenjiqingshiping| 啪啪视频99| 婷婷五月激情综合啪啪| 99色中文| 激情综合青草| 另类激情五月| 精品久久久人妻| 欧美久久网| 色情五月综合婷婷| 免费做A爰片77777| 操逼亚洲天堂| 超碰在线观看9| 国产婷婷色五月| xxx综合在线| 91人人爽久久涩噜噜噜| 欧美三日本三级少妇三99| 亚洲精品视频在线| 亚洲经典三级| 精品无码片| WWW.久久久久久久| 99在线观看免费精品视频| 久久九精品| 香焦网五月天| 亚洲V国产V欧美V久久久久久| 狠狠爱成人综合网| 五月婷婷深深爱| 久久久久久久综合狠狠综合| 六月丁香婷婷开心综合基地| 操一操干一干| 天天爽夜夜操| 美女被肏网站在线看| 大香蕉婷婷丁香视频在线| 免费99情趣网视频| 久久婷婷成人综合色怡春院| 五月丁香六月激情欧美综合| 久cao香蕉影院| 国产精品人妻欲求不满| www.热99热| 国产婷婷五月天| 欧美大片| 狠狠爱婷婷爱| 丁香婷婷十月| 26uuu精品国产| www久久久久久久| 婷婷丁香视频在线观看免费| 五月婷婷第四色| 免费观看的av| 丁香六月青青草| 色网站99| 成人综合AV| 九九九九操逼| 99色在线| 五月婷视频在线| 婷婷五月色综合香五月| www99热| 婷婷五月天香蕉| 九九无码| 五月丁香婷婷色色色| 99国产小视频| 丁香激情网| 免费观看亚洲AV片| 2025色婷婷| 亚洲亚洲人成综合网络| 大香蕉人妻| 天天爽天天干| 亚洲AV成人一区二区在线观看| 九九色影院| 久久狼人天堂| 激情网婷婷五月天| 雪千夏麻豆| 婷婷在线五月天观看| 99九九久久| 97se视频在线| 天天做夜夜爽| 99操网站| 婷婷激情五月综合丁香社| 中文字幕在线观看视频www| 插逼综合网| 欧美综合激情丁香五月六月婷| 夜夜操加勒比| 少妇激情五月婷婷| 色欲天天综合网| 天堂A∨在线| 久久综合首页| 五月丁香综合中文| 色吧五月婷婷| 亚洲永远av在线播放| 久热这里只有精品视频6| 中文字幕网伦射乱中文| 色一区高清| 79精品视频在线观看,| 五月婷网| 色色婷婷丁香| 九九久久99| www狠狠| 久久久久久激情| 丁香五月首页| 九色视频91| 婷婷色五月天在线观看| 五月天激情国产综合婷婷婷就去爱| 久久伦乱| 99人人干| 久草热在线视频| 97婷婷色| 婷婷大香蕉| 五月丁香婷婷网网网网| 丁香婷婷激情| 五月亭亭激情综合| 99燥99日| 99热这里只有免费精品| 久久香蕉婷婷| 丁香五月日韩| 婷婷丁香六月综合激情站| 婷婷激情五月| WWW.开心五月天.COM| 五月久久丁香| 五月天狠狠| 91丨九色丨熟女丰满| 99热啪啪| 天天色伊人| 婷婷在线五月综合| 五月色色激情网| 任你操精品免费| 五月丁香婷婷综合| 狠狠色丁婷婷日日,伊人激情综合网| 国产亚洲成AV人片在线观黄桃| 丁香婷婷五月六月天| 日本97在线观看| 偷偷操99| 激情综合五月激情XXXX| 亚洲天堂婷婷丁香| 五月婷婷综合在线视频小说| 99久久www| 色婷婷久久| 五月丁香黄色| 五月天停停日日| 狠狠干婷婷| 欧美综合激情五月丁香| 丁香九色不卡aaa| 丁香六月久久| 久久女伦| 五月婷婷色播| 免费日韩99| 91操女| 99ri在线| www,五月丁,com| 国产黄色一级片| www.色五月| 天天插AV丝袜中| 色五月色五天色情网| 亚洲乱码日产精品BD| 99热精品无码| 26uuu国产色| 超碰在线观看caop| 91热爆在线| 五月丁香色| www.天天干.com| 婷婷性爱综合| 天天爽天天操| 一本色道久久综合狠狠躁小说| 久久伊人五月天| 久久婷婷五月综合色和| 婷婷丁香五月亚洲| 天天摸天天日天天舔| 丁香五月影院| 日本操B片| 天天爱天天爽| 日日夜夜狠狠| 在线综合婷婷| 婷婷午夜精品久久久| 日本44久久在线| 激情丁香五月天| 天天摸天天舔天天天天爽| 久久996re热这里只有精品无码| 免费播放片大片| 不卡在线超碰| 99在线观看精品视频| 综合色播| 99精品在线下载| 爱性综合网| 色欲影香| 新男人天堂人妻| 农村熟妇高潮精品A片| 九月丁香| 五月丁香六月婷婷激情视频在线观看免费| 九九sese| 人人操99| 99人人操人人操人人精| 国产九月婷婷| 97精品人人A片免费看| 超碰久热| 色色色婷| 亚洲综合五月| 五月色丁香激情| 亚洲日韩一页精品发布| 啊V视频在线观看| 婷婷国产成人| 丁香六月天堂| 国产一级婬片毛片| 婷婷六月丁香久| 九九精品在线视频观看| 婷婷综合97| 最新日韩久热免费视频看看| 色在线免费观看| 丁香婷婷成年| 9色91视频| 五月天综合在线| 可以看的AV| 久久久18| 色婷婷综合网站| 粉嫩av懂色av蜜臀av熟妇| 激情网五月天| 六月份天丁香婷婷| 五月婷婷在线视频观看| 日日夜夜爽| 婷婷六月激情在线视频| 色色亚卅| 五月婷婷狠狠干| 婷婷色五月情| 色五月综合网| 色 五月婷婷基地| 26UUU精品一区二区Com| 综合激情网| 久久香蕉婷婷五月天| 六月色婷婷欧美| 性婷婷| 五月天另类综合网| 五月社区婷婷激情| 色五月成人网| 999热在线视频| 人人草人| 日本欧美国产| 亭亭五月色男人| 亚洲综合另类| 日本欧美成人片AAAA| 欧美成人猛片AAAAAAA| 在线看九一V图片| 天天色凹凸| 狠狠久久婷婷| 99精品一二三四视频| 久久xxxx| 性爱在线播放av| 婷婷五月激情片| 五月丁香无码视频| 激情网五月| 超碰99在线观看| 丁香五月综合| 日韩在线视频9色| 九热电影av| 91AV婷婷| 亚洲婷婷丁香五月在线| 丁香六月视频| 五月婷婷天| 97在线精品视频| 日本99热| tingtingseav| 色老久久| 色情·com| 亚洲五月天婷婷在线| 五月天婷婷社区| 99热在线观看| 99年操人人爽| 丁香五婷| 日本乱子人伦在线视频| 日韩av高清| 激情久久久久| 久久av电影| 少妇综合网| 亚洲色久| 五月婷丁香久久综合| 五月丁香狠狠爱| 婷婷伊人五月| 婷婷99中文字幕| 色婷婷久久| 久婷自拍视频| 亚洲中文丁香| 久久人妻久久| 97福利视频| 色久一| 亚洲亚洲激情| www.99热| 久久精品99国产精品日本| 日本一级黄色电影| 99国产欧美视频| 中文字幕婷婷五月天| 婷婷激情五月天桃花网| 色色色色综合网| 国产真人做爰视频免费| 亚洲有码在线视频| 5月婷婷6月丁香aV| 婷婷久久精品| 播丁香五月婷婷欧美| 99ri国产在线| 久久久精品人妻录| 深爱开心激情| 婷婷五月超碰| 天天婷婷操| 啪啪99| 色色色九九九五月婷婷| WWW.99热| 婷婷香五月天| 亚洲无AV在线中文字幕| 久久久99视频| 99日这里只有精品| 亚洲另类在线观看| 热五月婷婷| 一起草性爱不卡视频| 99精品偷自拍| 五月婷精品| 5月婷婷激情在线| 中文字幕丰满孑伦无码专区| 五月丁香 啪啪| 五月婷亚洲精品| 久久精品国产精品| 99re这里只有精品99| 天天做天天爽| 丁香八月综合激情| 青青草蜜臀| 久久这里只有精品99| 日本97在线| 老司机伊人| 大香蕉AV电影在线| 久久与婷婷| 人妻内射视频| 久久久久激情| 色色色综合网| 玖玖综合色区在线观看| 五月亭亭六月激情| 丁香五月婷婷色| 插逼综合网| 色五月婷婷网| 日本理论久久| 久机视频这只有精品| 丁香五月瑟瑟| 国产精品蜜臀99| 日韩精品无码一区二区| 青青草a在线| 成人在线日韩| 综合激情五月丁香9999久久精| 色婷婷基地| 九月丁香亭亭| 在线观看的av| 任你日视频| 337p大胆噜噜噜噜噜91Av| 天天色丁香| 丁香大香蕉| 九九色影视| 色色色色色色色色综合网| 99视频久久| 玖玖热视频| 99re思思热在线视频| 99热这里只有精品66| 99热99网| 丰满老熟妇BBBBB搡BBB| 五月天婷婷色小说| 婷婷亚洲在线|