免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
思思热视频在线观看| 日噜噜色| 色久五月天| 人人肏逼视频在线一区二区| 久久九九热视频| 五月婷婷久久网| 一起草av在线观看| 婷婷五月丁香五月基地| 婷婷五月天久久久| 五月丁香六月婷婷激情视频在线观看免费 | 99热全是精品| 任你躁XXXXX麻豆精品| 久久婷婷五月综合啪| 狠狠色色| 久久婷婷六月| 婷色综合| 日韩人妻白浆视频系列| 婷婷性福五月天| 99热久只有| 婷婷五月欧美AA片免费| 深夜婷婷 丁香| 九九AV在线| 思思热再线视频| 九月丁香亭亭| 免费亚洲成人电影AV| 久色| 99日韩| 丁香五月婷婷激情中文| ss99热| 天天射美女| 九九色热视频| 精品99只有。| 激情五月天之五月婷婷| 亚洲综合激| 99久久.www| 成人无码髙潮喷水A片| 国产.亚洲.欧洲视频在线| 日本色婷婷五月天成人电影| 欧美欧盟性爱网| 九色在线观看91av| 九九久久偷拍| 秋霞av不能| 国产AV一区二区三区日韩| 免费啪啪亚州视频| 色狠狠999综合| 六月天六月婷| 婷婷情色激情| 婷婷香五月天| 婷婷六月综合基地| 97精品综合久久| 久久久这里有精品| 色五月丁香在线| 激情文学 综合 色| 十月丁香婷婷| site:feetmall.com| 操国产人妻| www久久99| 91色操| 国产av影片| 婷婷五月天AV在| 久久青青日本视频| 日韩高清成人| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 天天综合网网欲色| 五月天婷婷丁香| 久久欧洲综合网| www 五月天 com| 小视频一区| 激情综合网激情五月网| 婷婷王月天影院| 人人爱人人摸人人澡| 婷激情五月| 99爱免费视频| 久久久久9| 淫视馆aV二区一区| 久久婷婷五月综合色欧美| 性爱激情综合网| 爱操天堂| 日韩九区| 新五月天婷婷激情电影| 天天干天天干天天| 伊人婷婷五月天| 亚洲成av人影院| 99re欧美精品| 欧美日本国产欧美日本韩国99| 免费亚洲成人电影AV| 激情久久久久久久久久久| 狠狠爱综合| 欧美综合激情五月丁香| 能看的av网站| 五月婷在线| 香蕉97碰碰碰欧美| 成人 在线 日韩| 久久99激情| 任你擦免费视频| www色色com| 91九色丨国产丨爆乳| 色九区| 久久只有精| 六月婷婷色五月| 色五月丁香六月婷婷| av性爱网站| 99久超碰| 精品9l九九九九九77777| 特级操b片| www超碰| 丁香五月瑟瑟| 狠狠综合| 超碰在线网站| 婷婷婷五月天最新综合你懂的| 日本婷婷| 97人人妻人人艹| 国产精品色婷婷99久久精品| 婷婷五月天激情在线观看 | 99热久久这里只有精品| 丁香五月激情啪| 久久99婷婷| 先锋资源 996| 99精品无码| 午夜九九九九九九九九九九九九九| www.色9| 婷婷五月丁香色情| 五月丁香激情啪啪| 色九九综合| 色婷婷五月中文字幕在线dvd| 9精品在线| 九九在线热九九在线热99热| 人人色人人摸人人看| 丁香五月激情无码视频| 久久久天堂国产精品女人| 99WWW免费视频| 亚洲Av入口| 91成人电影| 婷婷视频在线| 九九久久99| 久9热| 超碰在线个人观看| 99热这里只有精品无码| 丁香五月狠狠在线观看| er99免费视频在线| 成人综合网站| 婷婷美女精品视频| www.超碰97| 另类小说五月天| 五月天色区| 操一区| 丁香五月婷婷激情四射| 色婷婷综合影院| 婷婷丁香六月天激情四射网| 在线1青婷| 五月天激情色色| 久久与婷婷| www狠狠| 久久图色4| 亚洲中文乱字字幕线在永久| 日韩99无码| 婷婷五月天另类视频| 99精品热| 青青草a在线| 色色五月天网站| 黄色五月婷| 五月天六月色| 99啪啪视频| 亚洲碰碰碰| yellow视频在线观看91| www.五月丁香| 91操在线视频| 激情五月综合网| 色婷婷影院| 五月丁香六月欧美综合网站| 色五月开心五月激情五月| 久久五月丁香| 丁香六月亚洲| 五月婷婷黄网站大全| 婷婷激情五月综合丁香社| www免费在线视频| 婷婷播播五月天| 五月美女婷婷风骚| 色婷婷888| 婷婷射图| 午夜天堂一区人妻| 精品人妻一区二区三区四区不卡在| 久久女人九九| 色色色无码| 丁香色五月 97干| 99色在线| 五月天六月色| 婷婷五月激情四月综合 | 亚洲一二三网| 99热久| 色情性爱视频网址| Www.久久| 激情深爱五月天| 五月天开心婷婷久久| 婷婷五月激情欧美大胆视频| 久久丁香五月| 狠狠色精品综合| 91九色成人原创视频| 99视频只有精品| 97久久超碰| 国产又黄又爽又色的免费| 日韩av干| 色99在线视频| 色啦啦视频| 六月丁香好婷婷| 日韩在线视频9色| 亚洲成人婷婷| 久久五月天黄色五月天色网址| 婷婷日韩| 思思热在线| 色五月丁香伊人| 日本熟妇精品99| 在线日韩视频| www.91.com黄| 五月婷婷片| 色区久久| 天天日天天操心| 亚洲综合五月天综合| 在线中文字幕免费视频| 狠狠狠狠狠狠色| 色色五月天网站| 成人精品视频99在线观看免费| 99热这里精品| 六月丁香五月激情婷婷| www.婷婷网| 精品操逼一区二区| 色青青电影色五月| 玖玖九九99| 婷婷久久精品| 婷婷五月天在线观看免费 | 丁香五月中文字幕| 亚洲无码AV片| Y11111111111少妇电影院| 婷婷五月天色色| 激情开心五月天婷婷基地丁香社区| 99色视频| 色婷婷久久综合久色综| 淫荡综合网| 欧美在线视频99| 综合激情肏逼网| www五月婷婷| 99玖玖在线视频| 99热99热不卡| 五月综合亚洲婷婷| 人妻肉射免费观看| 激情久久天天| 丁香六月久久| 无码人妻电影| 九九综合精品| 热的国产99热| 99热这里只有精品国产免费| 丁香五月天无码AV| 激情综合自拍五月婷婷色五月| 婷婷五月精品中文字幕| 中文字幕av亚洲| www.韩日视频| 日韩久久欧亚| 国产无人区大片| 亚洲国产另类av| 超碰免费人人肏| 国产AV一区二区三区最新精品| 五月丁香黄色视频| 丁香五月电影| 五月丁香激情综合| 全部老头和老太XXXXX| 人人播| 超碰人人在线| 久久久人妻| 日韩九九| 亚洲亚洲人成综合网络| 日韩在线观看网址| 中文成人在线| 激情六月丁香| 色五月xxx| 99大香蕉| 婷婷,五月天,丁香,第一| 日日干天天射| 丁香五月在线伊人| 99热只有精品在线播放| 亚洲操B| 草AV9999| 天天五月情| 天天爽曰日爽| 日本色狠狠| 天天舔天天爽| 99在线免费观看| 激情5月天天天| 丁香五月亚洲激情婷婷射| 久久久色婷婷五月天| 亚洲区视频| 天天狠狠婷婷在线| 呦呦视频无码播放| 久久玖玖综合| 99热成人| 色yeye色综合| 97成人丁香婷婷| 狠狠五月丁香色婷| 免费亚洲婷婷五月| 高清无码网址| 狠狠干五月| 五月天婷婷激情网| 五月天色婷婷激情综合| 五月天激情网开心网| 五月婷婷激情综合网| 热这里| 另类图片 五月激情| 色五月婷婷啪啪五月| 五月丁香中文字幕| 99久热这里只有精品| 人妻aV在线| 任你爽视频| a性生活久久无| 亚洲XX网| 婷婷六月伊人| 欧美精品999| 伊人五月婷| 男人視頻站| 99er日韩| 国产精品热搜丁香五月婷婷| www夜夜| 天天干天天日蜜臀av| 九九性爱网| 五月天色婷好好| 国产精品色婷婷AV综合色色| 色优久久| 五月天色色网站| 精品无码人妻一区| 99热老网站| 99视频只有精品| 97超碰婷婷五月天| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 久这里只有精品| 婷婷五月天狠狠| 丁香五月激情网| www免费在线视频| 久久久五月五丁香| 夜夜撸夜夜骑| 丁香婷婷久久五月天| 淫视馆aV二区一区| 婷婷五月丁香手机在线视频| 婷婷D区| 网色99| 97色色色色色| 国成人网| 凹凸操Av| 97爱艹婷婷开心丁香激情综合| 九九色综合| 久久只这里有精品| 俺也去五月婷婷丁| 激情色播| 久99久在线| 久热在线观看视频9| 婷婷五月激情的图片| 亚洲欧美另类在线23p| 六月丁香婷| 久久久精品99| 99综合网| 一区二区免费看| 天天狠狠夜夜狠狠2023| 久久全色| 日日操夜夜操狠狠操| 影音先锋色婷婷| 黄久久久| 色情婷婷五月天| 婷五月天影院| 97亚洲色 torrent magnet| 色婷婷88| 婷婷五月丁香久久| 热久久99热欧美国产亚洲| 久综合九综合99| 亚洲综合婷婷| 天天肏在线视频| 精品久久久久久久人妻| 色玖玖网| 丁香五月成人婷婷| 99综合久久| 五月婷婷激情综合视频| 丁香五月很很肏| 99热6精品| www亚洲无码| 99无码精品| 大香蕉婷婷久久| 色播五月天激情| 琪琪理论片| 国产伦亲子伦亲子视频观看| 精品无码99| 久久日韩婷婷五月| 青青草激情网| 伊人丁香婷婷东京| 激情综合网站| 六月丁香久久| 嫩草综合网| 亚洲成人AV电影在线| 婷婷深爱网| 九一九九黄色| 五月丁香六月婷综合成人综合| 婷婷丁香人妻天久久| 亚洲精品视频在线播放| 亚洲小视频| 综合网啪| 99国产精品久久久久久久久久久| 激情婷婷五月社区| 婷婷九月| 免费碰碰视频久| 爱婷婷都市激情| 激情婷婷色色| 久久婷婷一级片| 国产精品色| 激情网第九色| 九月婷婷激情久久| 狼人久草| 9色在线视频| 久色视频首页| 玖玖99免费视频| 99久在线精品99re8热| 五月婷婷六月丁香激情| 欧美色播综合在线观看| 成人在线综合| 射婷婷中文字幕| 激情五月综合婷婷| 丁香五月骚喷水视频| sewuyuetingtingiii| 久久婷婷综合五月天| 亚洲综合婷婷五月天| 97成人丁香| 狠狠综合| 五月婷婷综合丁香视频| 天天干天天干天天干天天干天天| 激情另类综合| 亚洲视频一区| 色综合伊人网| 五月天婷婷乱| 亚洲五月天第一综合干| 九九热10| 91丨九色丨老农村| 久9久视频精品| 大香蕉综合网| 任你日视频| 久久免费视频62| 99在线观看视频免费| 日本人妻操| 99年操人人爽| 大地9中文在线观看免费高清| 九九综合精品| 五月婷婷在线丁香| 久久九九精彩| 91聚色综合网| 亚洲精品a成人在线播放| 婷婷综合亚洲| 五月婷婷激情中文字幕| 久久99综合| 亚洲欧洲午夜成人精品av| 婷婷五月性感| 综合色图婷婷| 日韩AAA| 亚洲精品国产成人AV在线| 色综合五月| 老美AA片| 久久综合五月天| 婷婷五月激情视频在线| 婷婷五月天六月| 这里只有精品99视频| 国产成人综合网| 五月天婷婷色情| 免费无码毛片一区二区A片| 丁香六月色情| 丁香五月AV综合激情| 影音先锋一区| 天天看A片| 亚洲天堂爱爱| 青青操绿aaa一区日v| 久思思热视频在线观看| 久久婷婷五月天激情新地址| 97精品综合| 五月深情久久| 美日韩成人| 色播五月婷婷| 五月天色综合| 色婷网站| 久久婷婷大香蕉| 丁香五月玖玖| www.99日本| 五月婷婷婷| 99综合熟女| 激情五月丁香六月综合AVXXXX| 毛片蕉地一二| 五月天婷婷操逼视频| 久久婷婷久久| 亚州激情网| 麻豆123区| 亚洲综合婷婷六月丁香五月| 狠狠草狠狠草| 精品婷婷| 婷婷中文字幕网站| 婷婷综合九月| 丁香六月啪| 91色涩| 丁香六月婷婷开心| 乱精品一区字幕二区| 疯狂做受XXXX高潮A片动画| 久久人妻精品| 玖久久网站| 色婷成人狠干| 玖玖在线视频福利| 婷婷五月天,影院| 六月合五月婷| 超碰AV在线| 99热这里只有精品8| 日韩专区五月天婷婷丁香| 丁香五月97视频| 97香蕉久久超级碰碰高清版| 另类小说五月天综合| 操熟女成人网| 日本九九九九| 最新婷婷五月丁香| 九月婷婷| 天天综合中文| 五月综合无码| 色99超碰| 思思久久精品视频| 五月丁香亭亭| 一级片操逼视频| 天堂资源欧日浪女在线播放| 婷婷五月天激情视频| 99热国产免费| 国产午夜成人AV在线播放| 婷婷中文网站| 日本成人噜噜噜噜噜| 无码色| 色婷婷色99国产综合精品| 五月激情四射网站| 丁香五月天啪啪| 免费视频这里只有精品| 日本99久久| 琪琪色网在线| 性爱动图国产麻豆一区二区三区| 激情五月天com| 性爱综合网| 婷婷色偷拍| 色色色99韩| 五月天色色婷婷| 男人大jjc女人免费视频| 67194成I人在线观看线路1| 精品一区二区三区木瓜| 五月综合久久| 六月婷婷激情图片| 五月婷婷在线视频观看| 99热国品| 亚色网站小视频| 亚洲激情综| 亚洲精品另类| 天天色综网| 少妇性按摩无码中文A片 | www久久久| 色欲久久久久久综合网综合网| 婷婷五月婷婷五月天| 99热九九热| 99久精品| 狠狠干婷婷| 性爱技巧五月| 婷婷之六月丁香| 五月综合久久| 婷婷 久综合| 久久99久久99精品免观看粉嫩| 真实熟女-91九色| 六月丁香婷婷色69| 99热在线观看| 四五月婷婷| 99热在线观看| 五月婷婷中文网| 色五月综合| 99色综合网| 九月激情网| 99久久www| 久草狼人| 碰碰91| www.超碰在线| 思思久久网| 996热| 色999五月色| 五月色网| 五月丁香六月婷婷色| 中国女人做爰A片| 五月激情四射婷婷丁香| 97久久久久| α久久| 久操婷婷| 丁香六月激情综合| 婷婷五月情| 欧美天天草人人草| 粉嫩AV久久一区二区三区| 亚洲丁香五月综合| 丁香五月婷婷图片综合| 久久久久人妻| 丁香五月天啪啪| 五月亭亭开心网| 色欲婷婷夜夜| 五月天大香蕉av| 六月丁香五月激情婷婷| 欧美成人精品A片免费一区99| 伊人丁香花综合影院| 91综合视频丁香| 丁香成人视频| 99激情网| 国产精品18久久久| AV性爱在线| 激情伊人| 超碰免费人| 99免费| 久久99久久久| 色婷婷六月| 欧美成人网婷婷综合在线| 中文字幕无码AV| 天天操天天曰| 欧韩性爱| 婷婷丁香五月视频| 婷婷九月色| 东北婷婷五月天| 久久综合网桃花| 99热这里只有精品在线| 中文字幕综合| 欧美丁香五月| 久久国产成人9999久久久久| 97丁香视频| 综合性爱网| 激情涩涩网| 99ri精品在线观看| 欧美va在线| 性天天中文网| 五月色情婷婷开心五月天| 丁香花综合永久入口| 日韩久热| 欧美欧盟性爱网| 激情婷婷丁香色五月| 99精品热| 99精彩视频| 婷婷播播五月天| 国产免费一区二区三区三州老师F1F1.CC | 色噜噜狠狠色综合成人网| 久一这里有精品国产| www.九九婷婷| 国产伦亲子伦亲子视频观看| 九九五月天| 99热这里只有精品国产首页| 狠狠狠婷婷五月综合| 日韩情色在线观看| 色婷婷综合久久| 久久大香蕉| 思思热99热| 五月丁香综合伦理片| 成人五月天丁香| 亚洲AV成人在线观看| 亚洲成人五月天| 射久久丁香五月| 这里只有精品69| 婷婷六月网| www.激情.com.| 五月亭大香蕉| 婷婷狠狠97| chaopeng在线人人| 激情玖玖sh| www.夜夜| 九九这里有精品| 翔田千里 50岁 无码| 五月综合婷婷五月| 六月天六月婷| 天天天添天天操| 开心深爱五月天| 五月天色色激情综合| 伊人五月婷婷| 婷婷97碰碰| 懂色av蜜臀av粉嫩av永陈冠希| AAA久久| 丁香五月天综合| 九九色热| 天天色色天天| 99网| 黄色国久久| 可以直接看的AV| 狠狠高潮精品亚洲1| 婷婷色激情五月天| 婷婷五月天偷拍| 激情五月婷婷中文字幕| 狠狠久久婷五月综合色| 99热精品少| 青青操绿aaa一区日v| www.99婷婷| 久9久9热久热| 熟女色专区| 丁香六月婷婷缴情欧美| 99热久久这里只有精品| 五月天成人伊人| 色综合久久天天综合网| 色综合久久久久久久久五月| 激情五月天综合| 人人草人人看| 久久久久久9| 成功精品影院| 欧美性生交XXXXX无码小说| 狠狠精品干练久久久无码中文字幕 | 丁香婷婷六月| www.色婷婷| 99操网站| 丁香五月综合激情性爱| 99操逼| 99视频久久免费视频| 综合激情深爱| 99色在线观看视频| 天天日天天干天天爽| 免费亚洲婷婷中文字幕| 亚洲99热| 婷婷五月天免费99| 久re热视频| 91碰碰| 九九久久这里只有精品XB| 久热网站| Av九九| 无码AV久久久久久久久| 日韩三级视频一区二区| 久热爱大香蕉在线蜜臀悦色 | 五月丁香婷婷成人综合网| 中文字幕成人影视| 99操99| 久久性爱激情| 亚洲午夜精品久久久久久人妖| 丁香五月婷婷精品视频| 色五月婷婷九月| 国产67194| 日本高清不卡免费一区二区三区| 日本三级中国三级99| 亚洲avjiujiur91| 婷婷色在线视频| 久久精品99国产精品日本| 成人片在线免费看| 日韩av大全| 国产精品国产| 97亚洲视频在线| 亚洲激情综合网| 五月综合精品| 狠狠色综合网站久久久久| 婷婷色色欧美综合网| 久婷| www.99热这里只有精品| 99热免费| 婷婷色情网| 开心五月综合激情综合五月| 色综合久久888| WWW.五月com| 天天做天天爱天天日| 妻久久人久久| 婷婷丁香五月社区亚洲| 色婷婷五月天天天天天| 六月丁香五月婷婷| www.激情五月天.com| 全网最新网黄大秀直播高清,主播国产录屏在线 | 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 风流少妇A片一区二区蜜桃 | 成人精品人妻| 久久丁香九| 色五月天激情| 亚洲综合激情五月久久| 99人碰碰碰| 色九月婷婷丁香| 无毒黄色网址| 无码激情精品色婷婷久久久久| 26uuu在线观看| 亚洲六月婷婷| 久热精品9999| 操逼在线视频| 在线观看国产高清视频免费网站 | 99在线观看精品视频| 七月婷婷色香综合网| 5月婷婷视频网站综合| 另类激情五月| 2017人人操| 天天插综合网| 色人久夂| 欧美乱码国产一级A片| 中文AV网站| 丁香五月婷婷色| 成人 在线观看国产| 思思热在线视频观看精品| 五月天久久久| 在线日韩视频| 五月婷婷深深爱| 香蕉综合网| 天天干天天干天天干天天干天| 猫咪伊人久久| 久99久在线观看| 丁香五月另类色婷婷麻豆| 婷婷五月色激情欧美激情| 青草青草视频2免费观看| 99惹| 国产无遮挡又黄又爽免费网站| www。88热在线视频免费观看| 99久久婷婷国产综合| 99色这里| 国产在线网| 色五月成人在线| 99ri网站在线观看| 丁香五月婷婷视频| 久久婷综合网| 丁香五月婷婷视频| 狠狠干婷婷| 午夜69成人做爰视频| 久久国产精品乱子伦_靑青草…| 天天肏夜夜肏| 五月亭亭激情综合| 国产首页在线| 天天日天天爽| www久久久久久久97| 9l视频自拍9l九色成人| 精品色情一区二区三区四区| 亚洲无码另类| 插插干干干色| 免费观看日韩成人av| 99久久er| 99色五月| 婷婷另类小说| 五月丁香影院| 成人AV在线中文版| 天天日,天天插| 久久综合99| 色综合综合网| 九热免费视频| 五月天婷婷在线观看| 五月天天天开心激情网| 少妇2做爰HD韩国电影| 吉澤明步Av一區二區| 五月丁香六月激情综合| 婷婷五月天AV| 婷婷六月情| 日韩影院三级| 亚洲色图欧美色图日本视频| 99免费| 久热大香蕉| 夜夜嗨一区二区三区直播内容| 色五XX| 丁香五月天啪啪| 欧美 色婷婷| 五月天婷婷久久| 丁香婷婷啪啪啪| 1024欧美看片| 婷婷99狠狠| 热久久99热欧美国产亚洲| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 精品九九在线观看| 亚洲视频码| 久久免费精彩视频| 激情五月丁香六月| 大香蕉九操| 日本www免费九九| 色色五月天丁香| 婷婷色情小说| a色色色色色| 国产五月视频| 久久九九99| 五月天开心激情综合网| 午夜 外网 精品 在线| 久久婷婷五月综合啪| 91超碰人人操| 久久综合影院| 丁香婷婷中文字幕| 五月丁香色五月| www久| 丁香五月激情月| 免费做A爰片77777| 91九色首页| 久草热在线视频| 内射丰满人妻| 天天日天天添| 成人电影在线免费试看| 熟女国产在线一区二区三区四区| 极品少妇XXXX精品少妇偷拍| 激情久久丁香| 婷婷六月视频| 就爱啪啪婷婷| 日日夜夜青青草| 人妻操逼视频。| 97黑人精品区| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 久操人妻| 久操香蕉| 九九在线精品| 日韩狠狠色| 婷婷社区五月天| 亚洲人成人五月天| 日夜夜天天| 天天草天天舔| 777精品成人a v久久| 99久久婷婷国产综合精品青桔| 亚洲黄色操逼| 久9草在线观看视频| 九九九九精品精| 九九碰九九爱97超碰| 四色永久成人网站| 成人综合视频在线| 综合伊人久久| 天堂久久性| 亚洲六月婷婷| 丁五月激情视频免费| 色色射| 99热在线精品观看| 久久538| 五月丁香六月激情在线| 九九九成人在线视频| 色狠狠六月| 五月丁香少妇网| 五月丁香黄色| 婷婷射图五月天| 丁香婷婷色五月天| 色99热| 五月天婷婷视频| 啪啪 综合网| 丁香五月首页| 深爱婷婷网| 99碰碰| 亚洲精品又粗又大又爽A片| 99久久国产宗和精品1上映| 人人色人人弄人人操| 婷婷五月丁香综合网| 颜射 精品性爱av| 五六月丁香激情视频| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 337p午夜影院| 99亚洲色| 九九热这里只有精品6| 丁香五月先锋| 伊人婷婷五月天| 婷婷五月AV| 99色在线| 狠狠干狠狠色| 丁香九色不卡aaa| 婷婷五月天精品| 五月丁香久久精品在线观看| 色五月av伊人| 99这里只有精品99| 综合网啪| 120分钟婬片免费看| 另类小说五月天| 97涩婷婷| 91色五月| 久久久婷丁香五月| 午夜丁香婷婷| 久久九九免费视频| 91久久精品国产91性色TV| 久久婷婷色综合老司机| 嫩草AV久久伊人妇女超级A| 精品综合久久久久久五月天| 五月婷婷影视| 五月丁香在线| 九九Av| 97婷婷在线视频| 99热大全在线观看| 色综合天天综合成人网| 开心五月深爱五月| 玖玖综合色区在线观看| 色婷精品91| 狠狠色五月| 亚州操操| 婷婷综合视频| 97碰操| 亚洲成人网无码| 天天婷婷色六月| 久久激情网| 人人草碰| 色六月丁香婷婷狠狠干| 婷婷97碰碰| 亚洲综合色成丁香五月色| 啪啪啪大香蕉| 欧美25p| 五月丁香色色网| 五月情涩综合婷婷| 色五月天综合| 日本激情91| 97日本操| 开心深爱五月天| 色婷婷裸体色性在线| 狠狠搞狠狠操| 成人色图情色成人网 www.5b5b5bcom 五月天| 99热99在线| 综合XX网| 97干在线视频精品店| 日韩免费乱轮网站| AAA久久久| 人妻中文字幕精品| 狠狠色精品综合| 中文字幕在线免费观看视频| 99大香蕉| 亚洲色优| 丁香五月婷婷动漫视频| 亚洲无码另类| 五月婷婷综合性爱噜噜| 99久久思思| 性爱视频久久| 超级碰碰碰久久网站| 婷婷亚洲丁香五月| 五月丁香在线观看| av人人操| 激情五月亚洲| 成人做爰高潮A片免费视频| 狠狠色丁香| 六月婷婷在线| 婷婷激情综合色五月久久91| 亚洲十月婷婷综合| 精品成人在线| 99r这里只有精品哦| 五月天色综合| 久久全色| 婷婷丁香五月综合网上| 婷婷五月天综合亚洲| 天天肏天天插| 少妇高潮呻吟A片免费看软件| 久久香蕉网| 亚洲男女激情| 九九99免费视频| 99精品在线播放| 久久五月网| 天天天天天天天操| 99热久久这里只有精品| 热热久久精品视频| 99re这里只有| 开心六月婷| 99热97| 色色自拍视频网站| 久久多色| 婷婷五月激情四月综合 | 色五月激情五月| 五月色婷婷影视在线电影| 免费无码毛片一区二区A片| 亚洲亚洲激情| 九月丁香久久网| 天堂AV在线看| 久久婷婷亚洲无码一起| 色无码| 91欧美| 九九Av| 超碰在线观看99| 婷婷狠狠干| 日韩抽插操逼| 三级毛片视频| 丁香六月婷婷综合啪啪| 综合九九久久| 五月天丁香综合| 五月色综合网欧美网| 成人精品在线| 丁香五月婷婷激情视频播放| 99欧美精品99日本精品| www.sd-xiangsu.cpm| AV亚洲在线| 丁香六月婷婷| 免费AAAAA网| 极品人妻VIDEOSSS人妻| 丁香五月综合AV在线| 久久久久98| 性做久久久久久久免费看| 六月丁香婷婷在线波多| 色99在线看| 丁香五月人妻| 丁香五月开心五月激情| WWW色五月| 3www激情| 色天堂A| 99色色网| 天天透天天爱| 色一情一乱一乱一区91Av| 亚洲人操亚洲人| 婷婷色色丁香五月天| 综合久色五月| 人人操人人添人人摸97| 丁香五月天之婷婷影院| 99热九九在线| 色婷婷狠狠爱| 五月婷婷色在线| 丁香六月色婷婷| 97涩涩丁香五月天| 婷婷丁香九月| 免看黄大片AA | 99热在线精品播放| 亚洲激情久久| 99热只有精品在线观看| 婷综合| 五月婷婷av在线| 人人爱国产| 九九免费精品| 侠女刀之记忆电影在线看免费| 日本操B片| 国产精品美女久久久久AV超清| 99免费| 天天操天天日天天爽| 九九热99视频在线| 色五月色开心开心五月| 激情六月天| 激情五月丁香激情综合网 | 真实的国产乱XXXX在线91| 色综合九九| 日韩九九| 热久久成人| 欧美99视频| 99久久97| 激情五月天丁香| www,天天干| 丁香婷婷五月天色播| 色色五月丁香| 日本在线观看91| 黄网在线免费| 激情五月天 婷婷| 久久狠狠干| 亚洲bt丁香五月天婷婷激情小说| 思思热在线视频观看精品| 天堂综合久| 欧美久久久久久久久中文字幕| 九九这里只有精品| 婷婷五月丁香网| 久久久月丁香| 久9热视频| 97操碰免费视频| 思思久久99热只有频精品66| 9色在线| 色日本网| 五月天婷婷伊人| 人人亚洲| 亚洲中文字幕av| 97人人干人人操| 久久9热| 99日精品视频| 51XX嘿嘿午夜无码| 久久五月情| 超碰人人摸AV| 久久久久久婷| 最新无码专区| 成人亚洲精品久久久久| 婷婷五月天色色| 99热精品在线播放| 五月停停色色丁香| 久久久噜噜噜久久人妻| 26uuu国产激情视频| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 婷婷五月,偷窥偷拍网| 一级操逼内射在线视频| 99性感视频| 婷婷色五月情| 青草热视频这里只有精品| 五月天色婷婷av| 婷婷色播综合五月| www.99热视频| 干一干xxxx| 色婷婷性爱| 99热国内精品| 超碰免费大香蕉| 猫咪伊人久久| 久久五月激情综合| 婷婷丁香激情综合色情| 日韩成人精品中文字幕| 色婷婷五月天av在线| 欧洲婷婷五月天| 日本www五月婷婷| 热99热9| 停停五月丁香| 午夜成人天堂久久无码日韩久久| 91avse| 久久久久人妻网址| 黄色成人网站在线播放| 91九色精品女同系列| 91蜜桃婷婷狠狠久久综合9色| 思思re99视频在线观看| 婷婷精品视频| 午夜无码熟熟妇丰满人妻| 婷婷丁香红五月91C| 日韩AV在线免费| 99色久| 久久婷婷影院| 色 丁香婷婷| 日日爱699| 日本超碰在线| A片一曲| 日本操B视频| 久久香蕉丁香| 欧美性猛交99久久久99| 亚洲天堂无码| 久er免费视频| 激情亚洲五月| 操人精品| 亚洲一个色| 激情五月婷婷中文字幕| 久久99网| 婷婷免费视频| 色婷婷狠狠久久综合五月 | 日本久久网| 日韩啪啪网| 啪啪啪综合网| 欧美猛片| 超碰色综合| 337p大胆噜噜噜噜噜91Av| 岛囯综合激情网| 一区二区免费看| 婷婷色五月天第7色| 五月天社区狠狠| 久久 婷婷 五月天| 全部老头和老太XXXXX| 艹色18p| 97在线精品视频| 开心五月综合激情综合五月| 色婷婷精品视频| 精品一二三区久久AAA片| 国内久久久精品99| 九九99视频精品| 99精品无码| 办公室少妇激情呻吟A片在线观看| 综合五月丁香六月婷婷| 99热www| 丁香五月AV综合| 婷婷情色五月天| 黄色视频网站在线播放| wwwss在线观看| 亚州色色色| 色色国产| 婷婷六月综合基地| 91啪啪视频| 五月天激情亚洲| 婷婷五月花| 在线观看欧美| 免费播放99性爱视频| 爱射综合| 91婷婷伊人牛牛| 欧美25p| AV在线免费网站| 国产精品黑丝| 婷婷六月色情| 丁香婷婷基地| 婷婷99中文字幕| 骚。com| 国产精产国品一二三在观看| 五月丁香六月色婷婷综合五月天| 五月婷婷六月丁香激情| 图片区 小说区 区 亚洲五月| www.99婷婷| 99色精品| 97在线99| 开心五月天私房婷婷| 美国十月色婷婷在线观看| 蜜臀久久99精品久久久久久酒店| 《战争与艾拉》完整版| 91久久1118| 性视频久久| 日日噜噜夜夜狠狠久久丁香六月| 日本操B视频| 少妇久久诱惑视频| 五月婷婷开心网| 性爱综合网| 99热这里只有精品66| 九热视频在线精品15| 婷丁香五月天| 97香蕉人人在线观看| 五月丁香六月婷综合成人综合| 9色91视频| 色九月激情综合网| 九热视频| 天天弄天天爽| 蜜桃五月天| 夜夜嗨一区二区三区直播内容 | 婷婷五月丁香婷婷| 99精彩视频网站在线| 久久久这里都是精品| 啪啪啪大香蕉| 婷婷色色狠狠|