欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
色婷婷操逼| 久草五月婷婷| 婷婷五月天堂| 热热久久久久久久久| 九九亚洲天堂| 狼友视频在线观看18| 丁香五月婷婷久久综合激情网 | www.婷婷| 99热无码首页| 天天综合图片| 51成人| 狠狠色成人影片| 9999热这里只有精品| 丁香熟女乱| 色婷视频| 色激情五月| 五月婷婷综合激情| 九九精品热| www.丁香六月婷婷久久天堂影院.con| 久99热| 天天综合干| 9|在线观看视频| 99热啪啪| 性欧美日本| 五月婷婷六月丁香激情综合网| 99久久高清视频| 色色操| 丁香五月激情综合啪啪| 操笔无码| WWW色综合| 色婷婷AV在线观看| 成人网在线观看视频| 五月色婷婷影院| 色五月丁香婷婷综合| 69综合在线| 日韩中文字幕| 欧美成人精品A片免费一区99| 色日本五月天| 婷婷五月天开心激情网| 五月天激情婷婷丁香| 超碰在线人人| 91超碰在线观看| 99热香港| 91国产精品视频播放| 国产午夜一区二区三区| 六月婷婷九月丁香亚洲综合| 狠狠色狠狠色综合日日91| 九色91视频| 久婷婷视平| 激情五月天在线视频| 五月天婷婷影院| 久热这里精品免费| 亚洲激情97五月天| 五月亭亭性| 五月之婷婷| 九九热视频网站| 99久久99久久| 66精品国产成人| 天堂爱啪啪| 久热精品9999| 日本99视频精品免费播放| 国产一区二区av免费| 91九色在线| 色色亚洲五月天| 丁香五月亚综合图片| 白天AV月月| 婷婷欧美色| 8区视频在线| 亚洲亚洲人成综合网络| 欧洲第一无人区观看| 色五月综合| www.91色| 日产精品久久久久久久蜜臀| 婷婷五月丁香第四色超碰在线| 99精品偷自拍| 婷婷五月丁香性爱| 九九99九九99偷拍视频免费看| 婷婷五月丁香A∨| 欧美一级毛卡片无码| 丁香五月狠狠综合欧美| 婷婷丁香基地在线| 色噜噜狠狠色综合日日| 婷婷五月香蕉| 99欧美| 97综合在线| 五月玖玖| 亚洲性爱AV在线| 99热在线观看成人| 日本操碰碰| 丁香婷婷激情综合五月激情 | 色婷婷五月天激情久久| 色色 亚洲| 《蜘蛛女》梁铮1995| 婷婷性爱五月天| 怡红院视频| 青草五月天| 五月丁香精品| 精品少妇人妻AV无码专区偷人 | 激情六月日韩| www超碰| 久热9| 免费无码毛片一区二区A片| 成人无码免费一区二区中文| 在线视频婷婷| 九九色逼| 日韩色五月| 1024操逼视频| 七月丁香婷婷 色色| 综久久久| 伊人在线视频| 久久久久久久久久久久63| 国产五月天婷婷| 日本熟女视频一区二区| 精品人妻一区二区三区四区不卡在| 亚洲人人操BD| 午夜丁香| 综合激情婷婷| 五月天桃色深爱网| 99久久国产宗和精品1上映| 五月丁香花成人社区| 日日噜噜久久婷婷五月天| 狠狠爱综合网| 激情五月久久| 色婷婷狠狠禁久久| 月婷婷亚洲| 天天干夜夜谢| 婷婷色五月综合| 一本九九色| 九九热这里只有精品5| 五月婷婷狠狠干| 日本久久爱| 99热国产精品| 婷婷伊人视婷婷婷| 五月亭亭六月激情| 亚洲色另类| 婷婷丁香五月天大香蕉| 色 五月婷婷基地| 婷婷开心六月| 五月Huangsewang| 亚洲综合草草| 在线视频99| 99久久久久| 欧美伊人9| 四川BBB搡BBB爽爽视频| 蜜桃婷婷狠狠久久| 激情五月天视频| 丰满少妇猛烈A片免费看观看| 色99免费视频中文| 色噜噜狠狠一区二区三区| 91操人视频| 婷婷五月天久久综合88| 五月天激情网图片| 99免费偷拍视频| 五月激情综合婷婷| 国产成人精品一区二三区熟女在线| 婷婷丁香色五月天| 天天干夜夜b| 色色丁香婷婷综合| 九九久久99精品免费观看www| 伊人狠狠操| 色999五月色| 干一干xxxx| 欧洲免费视频色| 五月丁香成人网| 五月丁香91| 激情五月天影院| 国产av网| 丁香婷婷激情六月五月开心| 碰97久久| 99热这里只有精品99| 久9精品视频在线| 亚洲色图81p| 五月婷六月婷婷| 久久九色| 欧美人人女女精品综合五月天| 第六色在线| ay2区| 婷婷夜夜夜夜| 色欲天天综合网| 五月天婷婷爱丁香中文字幕| 黄色成人网站在线播放| 九九热欧美| 青青草五月天| 五月天婷婷五月| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 免费人人操| 成人做爰A片免费看网站找不到了| 婷婷五月在线播放| 综合另类视频| 五月激情婷婷丁香天堂| 色九九综合色| 色九区| 免费成人va| 9 大屁股在线视频精品| 婷婷综合激情| 欧美成人色婷婷| 色色色地址| 99aese| 亚洲AV综合网| 色婷婷综合久久| 天天操天天操天天操天天操天天操| Av大香蕉| 丁香久月| 中文av网| 婷婷五月天激情五月天深爱五月天| 丁香五月综合狠狠| 成人网在线视频| 五月天丁香成人| 五月色婷婷影院| 五月婷婷黄| 色九月婷婷综合| 99色免费在线观看| 激情网五月| 三区激情四射av| 色五月综合网| 激情婷婷综合| 亚洲av午夜精品一区二区| 五月婷婷开心爱| 99久久九九| anquye五月| 黄页免费一级视频懂色| 婷婷丁香六月| 色综合伊人网| 一根材五月婷成人| 激情六月天婷婷| 九九成人| 丁香五月色色| 婷婷五月情天| 色婷丁香五月| 天天操加勒比| 久久九九激情五月天 | 日韩成人中文字幕| 婷婷丁香五月社区亚洲| 人妻久久婷婷| 人人天堂操| www.九九婷婷| 怎么样可以看免费的一级av| 丁香五月天网站| 五月激情婷婷色| 日本人妻操| 婷婷五月影院| 婷婷五月天综合在线| 丁香五月亚洲激情婷婷射| 丁香婷婷五月激情四射网| 久久九区| 五月天激情久久| 久久久精品99亚洲综合| 成人欧美日韩| 国产资源在线视频| 婷婷国产五月天17c| 久久精彩视频| 婷婷激情四射| 亚洲色模骚货| 99热日韩| 中文不卡一二区| 午夜丁香综合婷婷| 亚洲黄3级片网站欧美| 五月在线| 色五月天堂| 久久色这里只有精品| 99开心五月五月丁香激情| www.天天干| 超碰色综合| 综合综合网| 3pAV| 色婷婷香蕉| 天天爽综合网| 五月天玖玖狠狠色色| AV伊人青草丁香六月| 国产亚洲99久久| 亚洲综合色激情色五月| 日逼影音先锋AV男人资源站| 亚洲图片 丁香婷婷| 99人人干| 狼人婷婷综合| 婷婷色丁香五月| 天天狠狠夜夜狠狠2023| 色五月第四色| 激情文学五月丁香六月婷婷| 五月婷婷丁香俺日污视频| 久久婷婷五月综合色播| 五月天激情婷婷小说| 欧洲精品欧洲情| 区区久久妻| 日韩九区| 国产精品久久久99视频| 丁香婷婷九月| 色色无码日韩| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 五月停停色色丁香| 丁香色五月直播| 国产脫衣舞一区二区三区| 欧美性爱中文字幕| 中文字幕av在线| 婷婷久久亚洲| 极品人妻videosss人妻| www.ppypp| 丁香五月天激情视频| 噜噜视频| 九九成人| 久久久久久久久久久久久久久久久精典| 丁香六月天婷婷色| 五月婷婷综合成人| 九九自拍网| 五月天色色色| 五月丁香婷中文字幕| 人人干Av| 五月婷婷亚洲| 少妇AB又爽又紧无码网站| 97在线观看| 狠狠噪| 五他月天啪啪啪| 五月婷婷婷综合网| 九月激情网| 亚洲色色在线| 无码区婷婷五月花开| 激情五月婷| 色五月激情综合网| 日本大人久久| av大香蕉| 五月激情网站| 色婷婷丁香五月天| 第四色网婷婷| 久久五月天黄色五月天色网址| 天天射色五月天| 色婷婷小说| 9999三级片| 欧美色五月| 五月丁香综合网| 五月天综合在线| 综合激情网五月激情| 色五月丁香伊人| 伊人狠狠丁香婷婷综合尤物| 亚洲123区高清入口| 日日干天天射| 六月色播| 成人精品视频99在线观看免费| 亚洲色就是色色色| 狠狠干五月天婷婷网| 狠狠插狠狠| 51国精产品自偷自偷综合| 久久机热/这里只有精品| 激情小说色五月| 丁香五月激情综合婷综| 天天色天天噜| 五月婷婷深深爱| 成人超碰网| 97色永久免费视频| 免费观看欧美成人AA片爱我多深 | 日韩婷婷| 亚洲有码在线视频| 99热这里有精品24| 五月婷婷五月| www.99婷婷| 五月婷丁香亚洲| 99热这里只有精品22| 热久久这里只有三级视频| 激情婷婷五月天。| 日韩五月丁香| 一本色道久久综合狠狠躁一二三| 爱爱色五月天| 99这里只有精| 综合久久综合| Av九九| 热婷婷在线视频| 337p午夜影院| 免费无码毛片一区二区A片 | 99er6热在线观看精品6| 国产肥白大熟妇BBBB视频| 人人操AV| 婷婷五月丁香五月| av大香蕉| 欧美99热| 中文人妻主播久久| 人与禽A片啪啪| xxxx五月激情| 欧美一级色| 在线成人网站| 亚洲综合另类| 99热播放| 深爱激情综合网| 五月婷婷综合久久| 色色五月婷婷| 婷婷她六月天| 蜜桃五月天| 久久久久久久久久久久久久人妻视频| 国产精品电影| 丁香六月婷婷综合麻豆| 九色亚洲| 26uuu精品一区二区| Aα在线免费观看| 只有久久精品免费| 99热在线网站| 色五月色图| 碰人人97| 激情六月综合| 欧美六月| 国产成人AV| 婷婷日日天天| 日本三级毛片| 久操热| 婷婷五月天激情综合婷婷五月天激情综合| 日韩成人中文| 日本色五月婷婷| 色玖玖导航| 99色在线视频| 热99国产精品| www.9操| 天天高潮夜夜爽| 成人在线视频一区| 婷婷五月天在线观看| 色婷五月婷婷| 另类图片五月天激情| 色五月五月天色婷婷色五月| 婷婷色五月噜噜| www.91色| 狠狠操.COM| 我淫我色婷婷五月天激情四射| 夜夜天天久久婷婷| 久久久jd| 又大又粗九一在线| 99热这里都是精品| 天天天日天天天干| 色婷婷电影网| 婷婷综合在线| 99亚洲视频| 婷婷操超碰| 日本狠狠爽| 婷婷色色综合| 4399在线日本A片| 色婷婷精品小视频| 黄网免费观看| 99碰在线视频| 性做爰1一7伦| 人妻久久久久久久 | 亚洲另类电影| av中文网站| 中文字幕视频在线播放| 五月婷婷av在线| 影音先锋色婷婷| 日日肏夜夜干| 色五月天中文字幕| 久久ww| 涩丁香91| 三级毛片视频| 欧美色色色色色| 色99热| 丁香五月天导航| 97色色色色色| 91精品熟女| 色综合色色色色| 婷婷五月丁香香蕉| 亚洲婷婷欧美婷婷| 婷五月天在线草| 精品99在线| 久久ri精品| 天天操夜夜操| 婷婷久久综合| 色情综合| 亚洲操逼片| 婷婷五月天免费视频| 琪琪理论片| 亚洲成人av在线播放| 五月丁香六月片| 婷婷深爱五月天| 久操97| 五月丁香基地| 97五月天婷婷| 日本va视频| 丁香五月视频在线观看| 日韩 欧美 国产 一区 二区| www.99视频| 狠狠色丁香婷婷久久综合| 啪啪啪五月天| 天天操九九插| 五月深爱婷婷| 婷婷激情肏屄网| 97在线刺激| 久久新| 夜色综合网| 久久九⑨| 久久伦乱| 色五月婷色彩免播放器| 婷婷久久五月| 人人添人人| 亚洲欧洲自拍图片专区五月天| 五月丁香久久精品在线观看| 五月婷婷深深爱爱| 伊人网色婷婷五月天| 噜噜噜噜在线| 久久这里都是精品| 色天堂A| AV在线大香蕉| 丁香六月激情| 婷婷六月成人| 香蕉操亚洲| 色五月五月婷婷| 九月影院義母在线播放| 99热情这里只有精品在线播放| 色狠狠色综合久久久绯色AⅤ影视| 亚洲另类av| 婷婷五月天综合久久| 超碰91人人操| 五月婷婷久久激情| 五月丁香婷婷三级| 啪啪99| 五月婷婷六月丁香综合在线| 97很鲁在线视频| 日本波多野结衣视频| 亚洲乱码日产精品BD| 男女啪啪做爰高潮无遮挡 | 亚洲综合在线播放| 九九伊人网| 青草视频在线播放| 97九色视频| 激情综合自拍五月婷婷色五月| 综合激情五月丁香| 免费亚洲婷婷| 极品少妇XXXX精品少妇偷拍| 人妻在线网站| 国产日韩欧美性生活| 色欲婷婷五月天| 五月激情精品视频| 丁香五月香蕉| 99只有精品| 色色草97| 久久9精品视频| 亚洲中文无码成人| 丁香六月婷| 99热免费| 久久亚洲婷婷| 六月天丁婷婷| 夜色综合网| 丁香五月社区| 铁牛TV人妻| 天天网站天天爽| 男人综合网| 色五月丁香婷婷| 色综合久久综合中文综合网| 亚洲欧洲自拍图片专区五月天| 成人五月天视频| 99视频内射三四| 四季AV综合网| 乱轮A片| 亚洲精品亚洲人成人网| 九九久久久综合| 激情图片99| 色必久悠悠影院| 五月天影院| 五月丁香色综合| 久久久久久久久久久月丁| 亚洲一色色色色色色色色| 丁香六月激情| 久久婷婷超碰| wwW天天干| 九色91视频| 亚洲日韩操B| 丁香五月亚洲激情婷婷射| 五月婷婷丁香俺日污视频| 婷婷色导航| 久热婷婷在线视频| WWW,婷婷,COM| 激情婷婷丁香| 五月综合激情图片| 国产精品18久久久| 婷婷和五月天| 国产成人99久久亚洲综合精品| 99综合熟女| 婷婷五月花西瓜| 99色性爰网络| 五月色网| 操99| 97久久久久| 久久婷婷五月天蜜桃| 亚洲综合五月天婷婷| 婷婷六月综合| 激情丁香五月| 丁香婷婷色色| 色狠狠999综合| 亚洲9久久精品| 色婷婷丁香特级性爱视频| 天天天天操| 欧美婷婷综合| 婷婷五月天成人网| 99日精品视频| 91九色精品| 久久久99日本大片| 久久久www| 人操综合| 日日干天天| 亚洲AV第二区国产精品| 成人AV免费观看| 天天久久婷婷| 天天综合五月天| www.97碰碰com| 六月婷婷七月丁香| 天天色视频| 丁香五月婷婷欧美成人色图| 丁香 久久| www999日韩精品| 成人AV免费观看| 丁香五月激情婷婷视频| http:色情日本com| 久久小片| 99re在线精品视频| 五月色综合| 91啪级电影| 俺去婷婷 丁香| 人人综合久| 天天操天天日天天爱| 噼里啪啦在线观看免费完整版视频| 丁香婷婷综合五月天| 欧美成人AAA片一区国产精品| 亚洲色综合性| 婷婷操久久| 三级三久久线久久99久目本WW| 99思思在线视频| AV在线不卡播放| 天天色99| 大波美女VA网站| 奇米色大香蕉| 色5月婷婷| 丁香六月av| 久久综合综合综合| 99久久99九九99九九九| 深爱激情网综合| 97自拍99| 中文字幕日产A片在线看| va中文资源在线观看| 久99久视频精选| 99热精品在线播放| 九九综合久久| 26UUU一区二区| 色色丁香婷婷五月天| 天堂久久精品| 亚洲精品国产精品乱码不99| 激情综合五月| 欧亚中文A V| 99色色网| 六月色婷婷| 狠狠色综合777| 欧美日韩成人在线网站| 婷婷.com| 婷婷久热| 色五月婷婷91| 色色综合网络| 婷婷五月色影视先锋| 亚洲性爱电影| 丁香婷婷五月天成人| 婷婷五月天基地| 另类小说色婷婷| 亚洲精品久久久无码| 日日夜夜噜噜爽爽| 色情·com| 久久婷婷五月综合啪| Av狠狠色丁香婷| www夜夜| 激情五月天小说网| 亚洲色综合性| 五月色丁香国产在线视频| 色综合com| 亚洲色图五月丁香| 色色丁香五月天社区| 国产欧美精品AAAAAA片| 六月久久婷婷| 九九成人| www.日韩艹| 婷婷欧美色| 丁香激情网| 色九月婷婷丁香| 综合久久综合五月天婷婷| 久热91| 思思re99视频在线观看| 在线成人网站| 丁香五月综合婷婷| 久久狼人天堂| 96精品久久久久久久久| 婷婷的久久网站| 日本色色网站| 91婷婷色| 狠狠人妻色综合| 天天综合久久| 丁香婷婷色九月| www婷婷| 这里只有精品1| 激情五月天婷婷丁香 | 99re热久久| WWW、日本色丁香、co m| 琪琪理论片| 激情五月丁香综合蜜桃| 99 福利 导航| WWW久| 超碰猛烈的性猛交| aa久久| 欧美精品A片一区在线观看| 五月婷婷黄网站大全| 五月丁香六月激情综合| 国产亚洲精品久久久久久郑州| 久99| 99热久久这里只有精品| 热热色色五月天婷婷| 国产成人片| 中国丰满熟女A片免费观| 少妇性BBB搡BBB爽爽爽视頻 | 丁香婷婷噜噜| 亚洲免费av在线| 婷婷丁香97| 精品人妻一区二区| 内射干少妇亚洲69XXX| 国产成人精品123区免费视频| 五月天伊人| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 青柠影视免费高清电视剧| 婷婷综合性爱网| www,久久久人人| 日本啪啪网| 欧美噜噜免费观看| 伊人午夜综合色啪| 免费视频无码| 任你日视频| 婷婷成人五月天| 色操综合| 91热爆在线| 丁香五月天婷婷久久| 五月婷婷无码| 99爱视频免费| 九九热免费视频| 国产成人AV| 大天天伊人| 欧美群妇大交乱婬网| 五月久久亚洲| 五月婷精品| 中文字幕有多少字| 97干在线播放| 操操操操操电影网| 五月婷婷,六月丁香| 五月天丁香婷婷视频网址| 99热销国产这里有精品| 色色婷五月天| 综合网啪| 国产日产亚洲系列最新| 色天堂在线| 精品九九视频| 99热超碰| 秋霞少妇AV网站| 碰超99| 久久激情五月网| 五月婷婷色色| 丁香五月激情欧美| 五月人妻婷婷| 色五月首页| 丁香五月综合激情久久潮喷| 婷婷六月爽| 婷婷色爱| 国产偷人爽久久久久久老妇APP| 日本在线99| 西瓜美女a片| 黄色片精品| 丁香六月婷婷姐网| 成人做爰A片免费看网站找不到了| 亚洲色婷婷五月天| 噜噜噜噜噜色| 精品久久久人妻| 丁香花操逼| 开心五月综合激情综合五月| 综合五月婷婷| 无码啪啪| av在线中文| 九九九AAA热视频| 婷婷一本和五月丁香| 99热这里只有精品22| 精品一二三区久久AAA片| 六月99天天婷婷激情综合| 激情小说五月天| 大大香蕉综合在线| 色婷婷色五月综合| 五月天婷婷色| 欧美色色色| 色婷婷伊人| 黑人无码一区| 天天摸天天透天天舔| 婷婷色婷婷| 在线视频色五月| www.99热这里只有精品| 日韩无码专区| 丁香五月久久| 丁香色五月 97干| 婷婷五月激情图片| 婷婷爱爱蜜臀天天操| 五月天桃色深爱网| 久热伊人9| 久久人妻人人| 五月婷婷日本| 欧美在线视频免费播放| 欧美人人女女精品综合五月天| 色色亚洲视频| 丁香六月激情国产| 五月六月婷| 日韩五月婷婷久久| 丁香色婷婷五月天| 色九九丁香九月色九九色| 日本五月婷婷| 色吧网综合| 狠狠狠狠狠狠狠狠| 97电影99热| 另类激情五月| 五月婷婷丁香啪啪| 精品国产乱码久久久久夜深人妻| 99热首页在线30| 91精品91久久久久77777| 女人天堂 AV| 99热插| 超碰人人艹| 久久精彩免费视频精彩免费视频| 五月丁香成人| 五月婷成人| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 欧美六月| 久久激情综合| 欧美操人| 成人婷婷五月天| 性爱激情五月| 日日夜夜天天| 五月天久久www| 久久久久人妻网址| 婷婷六月天亚州| 狠狠情色| 婷婷综合网站| VfJxEwPH| 九九青青草成人| 无遮挡国产高潮视频免费观看| 激情久久四色| 婷色天堂| 五月丁香久久| 国产色色网站网址| 夜夜爱爱亚洲| 五月丁香影院| 99久久综合| 九九热在线观看6| 丁香五月激情综合| 天天日天天草| 久热这里这里有精品| 日本丰满久久| 99爱精品| 激情综合网 激情五月天| 狼人婷婷久久| 激情五月成年| 五月丁香激情综合| 久久久久人妻中文| 亚洲激情六月| 99精品在线| 婷婷激情五月天小说| 亚洲AV成人精品日韩在线播放| 99热在线观看| 另类A片| 欧美日本VA| 9 1 A v久久久| 六月天婷婷| 涩五月婷婷| 天天撸夜夜爽| 超碰成人免费| 亚洲情综合五月天| 欧美狠狠色| 人人干人人操人人摸人人做| 成人 视频免费观看网站| 综合色七七| 99re在线精品视频| 丁香六月情| www.操逼comm| 五月色婷婷在线观看| 五月婷婷,狠狠操| 久久91久久精品久久| 激情五月天电影| 天天日天天爽| 五月婷婷激情四月| 丁香五色月婷婷网| 97干在线| 囯产精品久久欠久久久久久九大| 人妻尝试久久久久久久久久久久| 一级片sese片.COM| 8区视频在线| 色99免费视频中文| 五月天婷婷Av| 成人国产欧美大片一区| 天天爽人人综合免费7799| 六月丁香五月天| 欧美视频在线观看噜噜| 五月丁香六月日逼| 婷婷五月天AV网| 9 1在线视频| 五月丁香狠狠爱婷婷综合| 久久小说网| 日本三级中国三级99人妇网站| 99久久综合网| 丁香五月婷婷激情尤物| 伊人五月天婷婷| 26uuuavcom| 亚洲久久婷婷丁香五月天| 99热无码精品| site:xiongshengzz.com| 在线成人网站| 视频这里只有精品| 无码地址| 亚洲色色图片| 亚洲精99| 狠狠色狠狠鲁| 色婷婷丁香五月丁香| 五月网激情| 亚洲性图一区二区三区| 狠狠干2007| 夜夜www| 精品五月丁香| 九九热10| 五月久久亚洲| 深爱激情网综合| 成人电影丁香六月天| 婷婷综合五月激情| 色婷婷AV五月天| 久久综合网免费视频| 99热精在线九九久久保| 四虎婷婷五月天| 丁香五月天啪啪激情综合网| www,天天干| 狠狠干狠狠干| 久久婷婷精品| 高清无码网址| 影音先锋自拍网| 久久亭亭电影| 婷婷情色五月天| 日本色色色| 五月夜丁香| 亚洲亚洲永久无码777777| 国产成人在线精品| 九九aV| 婷婷五月丁香第四色超碰在线| 最近中文字幕2019视频1| 91热久88| 九热久| 色婷婷基地在线| 六月丁香婷婷尤物| 婷婷五月天堂| 色五月综合| 丁香激情久久| 最近中文字幕2019视频1| 五月婷婷碰碰| 色婷婷88| 操九色| 久热免费视频| 秋霞九九无码| 五月丁香六月婷婷啪啪| 激情五月天啪啪视频| 丁香五月激情视频| 99爱这里只有精品免费视频| 日本色婷婷| 久久婷婷视频| 97se在线视频| 欧美色色色色色色色色色色| 久热这里有精品视频| 九九久久这里只有精品XB| 99久视频| 亚洲妇女熟BBW| 色www99| 色噜噜夜夜夜综合网| 综合在线丁香五月| 国产免费AV网站| 99ree6| 91avse| 婷婷精品性性性性性性性| 色婷婷综合网站| 99视频精品在线| 色色图五月天| 日日日日做夜夜夜夜无码| 久热视频这里只有精品| 婷婷激情综合网| 99热久97| 久热大香蕉| 丁香五月婷婷色情综合| 大香蕉啪啪啪| 精品人妻在线| 亭亭社区五月天| 青青草成人网| www91色网站| 亚州激情网站无码| 五月婷婷深深爱| 天天综合网~91| 亚洲射激情| 色欲一区二区三区精品A片| 青青999| 婷婷久久六月费| 色婷婷88| 久9热插入| 5月丁香综合网| 色五月六月| 91|九色|动漫| 丁五月激情视频免费| 色五月婷婷7777| 亚洲综合色网站| 婷婷六月久久综合导航| 中文字幕精品推荐免费在线观| 伊人丁香五月| 色色99| 婷婷色色色| 丁香综合伊人AV| 九九久久精品| 一月婷婷色色| 亚洲VA口| 最近中文字幕2019视频1| 日韩在线观看亚洲| 色天五月天在线观看视频| 天天干天天做| 成人五月天婷婷| 伊人99热| 久久性视频| 性视频久久| 人人操女人| 五月花婷婷丁香| 操人无码| 夜夜人妻五月天| 丁香六月激情| 最新热中文字幕| 中文字幕丰满人妻无码专区| 免费人人操| 噜噜视频| www.97干视频| 99热的无码| 五月丁香最新| 日本五月天网站| 男人天堂AV在线一区二区| 婷婷五月婷婷五月天| 久久综合久色欧美综合狠狠 | 激情婷婷丁香| 亚洲性爱电影| 这里只有精品在线观看视频| 九九无毛| 丁香五月婷婷天| 91久久网站| 狠狠做深爱婷婷久久综合一区| 激情婷婷22月间| 五月开心激情| 婷婷网影院| 五月色网| 99小精品| 婷婷五月欧美综合| 婷婷性爱五月天| 中日韩狠狠色| 久久性视频| 久久99久久99精品免观看粉嫩| www婷婷| 婷色人人狠| 97精品人人A片免费看| 免费色色色| 日韩中出视频| 五月天激情网图片| 99操逼| 色爱综合网| 色操b| 婷婷综合色网| 婷婷丁香宗合888| 日本天堂免费99| 丁香五月电影| 久热这里只有国产| 大香伊人久色| 蜜桃人妻无码AV天堂三区| 密黄站| 99@久久@99精品视频| 激情丁香五月| 五月激情婷婷六月丁香| 99热久久日本| 五月丁香综合激情| 99免费视频精品| 婷婷丁香五月色偷偷| 婷婷另类小说| 操逼棍操逼| 婷婷中文无码| 成人综合网站| 婷婷丁香五月天激情| 九九热这里只有精品556| 日本狠狠干| 色五月丁香伊人五月| www色色色com| 六月丁香婷婷爱| 超碰免费99| 免费试看小视频 99| 天天综合久久| 久草热8精品视频在线观看| 性生活久久人妻| 五月丁香婷婷色色| 久久五月天影院| 色色色成人网| 这里只有精品免费| 小视频aaa久久久| 色色婷婷丁香五月天| 婷婷五月丁香基地| 中国激情网| 婷婷色播色五月五色五月天色妇| 999精品久久久久久久| 色婷婷亚洲婷婷| 色婷婷基地| 伍月激情天| 九九九九九九九九九九九九九国产精品| 人人操五月天| 激情丁香五月| 情涩婷婷五月天| 美女天天久久| 97色女人在线| 亚洲av另类在线观看| 亚洲激情综合| 久久怕怕视频| 97影院一级片| 熟女激情五月天| 热这里| 六月丁香啪| 婷婷综合色色| 伊人在线视频| 亚洲成人网在线观看| 色综合激情| 婷婷激情丁五月| 日日干夜夜撸夜夜骑| 久久婷婷五月| 在线观看av网站| 婷婷色五月综合| 免费精品99| 狠狠插狠狠操| 国産精品| 丁香婷婷五月综合| 色色色.COM| 免费观看的AV| 天天成人综合视频| 五月社区婷婷激情| 超碰免费人妻| 欧美日韩国产一区| Www.狠狠| 伊人久久大香| 1级欧美日韩| 九九色婷婷五月天| 亚洲精品国产A久久久久久| 日本三级韩三级99久久| 日韩九区| 久久性视频| 婷婷射丁香| 日韩爱操视频| 79精品视频在线观看,| 日日舔夜夜操| 九九精品网| 色五月激情五月开心五月| 丁香五月成人社区| 日日噜狠狠色综合久| 色五月婷婷九月| 五月激情综合美女久久| 色五月婷婷久久| www.狠狠艹| 色五月无码| 99色播| 青青草原99热| 人妻肉射免费观看| 亚洲VA在线| 99热无码| 五日激情综合| 欧美久久网| 在线播放中文字幕| 久久这里只有精品99| 国产这里只有精品| 日韩在线观看网址| 99热在线观看成人| 婷婷狠狠爱| 丁香五月婷婷国产在线| 一级黄色操B| 六月婷婷综合久久| 99久久久久| 热久久思思热思思| 婷婷五月美女直播| 久久香蕉丁香| 91久久婷婷| 男妓跪趴把舌头伸进我的嘴巴| 亚洲综合网在线| 99啪视频在线观看| 伊人网碰碰| www.99热日韩.com| 五月丁香六月婷婷a v| 这里只有精品视频在线| 激情性爱五月天| 五月丁香香蕉| 色综合激情图区| 五月婷婷综合影院| 91操碰| 丁香婷婷久久老熟女综合网| 五六月丁香激情视频| 色综合网综合| 91丨九色丨丰满人妖| 激情第四色| 日韩黄在免| 五月天婷婷激情网| 亚洲人成网亚洲欧洲无码久久| 影音先锋 91工厂| 五月天婷婷AV| 91精品综合久久久久久五月丁香| 亚洲欧洲美女在线观| 久久久ww| 成人网站免费sxj| 五月天婷婷成人| 久久综合九九| 激情图片亚洲| 大香蕉综合视频在线| 月丁香久久久| 久久综合五月天激情小说网站 | 五月丁香色情| 噜噜噜色噜噜| 日本不卡中文字幕| 婷婷五月天久草在线| 成人丁香色| 五月综合在线婷婷图片| 狠狠色综合网| 丁香五月影院| 亚洲Av成人在线观看| 丁香五月宝贝激情网| www久热com| 91五月天| 伊综合蕉| 五月天伊人av| 先锋资源婷婷| 综合色图婷婷| wwwss在线观看| 色色网站| 久久婷婷青青草| 99热精品在线| 91凹凸在线| avh片在线观看| 六月丁香五月激情亚洲AV| 五月天激情小说| 色婷婷激情Av久久久| 99热亚洲| 26UUU欧美| 男男野外做爰全过程69| 《久久综合九色综合97婷婷| 五月丁香网中文字幕| 天天肏高清在线| 9999综合99综合人| 狠狠色狠狠鲁| 五月天激情久久| 91操在线| 色色色色av777| 丁香五月婷婷五月| 色九月婷婷综合| 丁香婷婷视频在线| 亚洲成人av在线观看| 爱的综合网| 欧美三级巜人妻互换| 婷婷五月天av网| 99在线播放视频| 丁香五月天激情四射网| 激情开心五月天婷婷基地丁香社区| 99亚洲精品| 性色欲情 网站| Av大香蕉| 99黄色性生活| 五月天久久婷婷| 婷婷伊人中文字幕| 九九99热| 91丨九色熟女丨首页| 婷婷六月激情丁香| AA片在线观看视频在线播放| site:901-07.com| 亚洲六月色| 97色色婷婷五月天| www.五月天色色.com| 久热婷婷综合|