diff --git a/.idea/Python-web-communicate.iml b/.idea/Python-web-communicate.iml
index 8a32af1..b6731d8 100644
--- a/.idea/Python-web-communicate.iml
+++ b/.idea/Python-web-communicate.iml
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/main.py b/main.py
index 9128c73..10934eb 100644
--- a/main.py
+++ b/main.py
@@ -6,12 +6,38 @@ import re
import time
+# 计算校验和
+def calculate_checksum(data):
+ checksum = 0
+ n = len(data)
+
+ # 按 16 位块划分
+ for i in range(0, n - 1, 2):
+ chunk = (data[i] << 8) + data[i + 1]
+ checksum += chunk
+
+ # 如果长度为奇数,补零
+ if n % 2 == 1:
+ checksum += data[-1] << 8
+
+ # 将 32 位总和折叠为 16 位
+ checksum = (checksum >> 16) + (checksum & 0xFFFF)
+ checksum += (checksum >> 16)
+
+ # 对总和取反
+ return ~checksum & 0xFFFF
+
+
# 构造 ICMP 报文
def construct_icmp():
+ # ICMP 报文头部: 类型(8), 代码(0), 校验和(0), 标识符(1), 序列号(1)
icmp_header = struct.pack('!BBHHH', 8, 0, 0, 1, 1)
- checksum = ~sum(icmp_header) & 0xFFFF
+ data = b'Ping'
+ # 计算校验和
+ checksum = calculate_checksum(icmp_header + data)
+ # 填充校验和字段
icmp_header = struct.pack('!BBHHH', 8, 0, checksum, 1, 1)
- return icmp_header
+ return icmp_header + data
# 构造 UDP 报文