当前位置: 首页 > news >正文

TCP通信

A

from scapy.all import *

网络配置常量

A_IP = "192.168.17.157"
B_IP = "192.168.17.154"
A_PORT = 50002
B_PORT = 8888

✅ 步骤 1(A → B):SYN(第一次握手)

syn = IP(dst=B_IP)/TCP(sport=A_PORT, dport=B_PORT, flags="S", seq=1000)
send(syn)

等待SYN-ACK

syn_filter = f"host {B_IP} and tcp port {A_PORT} and tcp[13] & 18 == 18"  # SYN+ACK
syn_pkts = sniff(filter=syn_filter, count=1, timeout=5)syn_ack = syn_pkts[0]
print(f"✅ 收到SYN-ACK: seq={syn_ack[TCP].seq}, ack={syn_ack[TCP].ack}")

✅ 步骤 3(A → B):ACK(第三次握手,完成连接)

send(IP(dst=B_IP)/TCP(sport=A_PORT, dport=B_PORT, flags="A", seq=1001, ack=2001))

✅ 步骤 5(A → B):A 发送第一条聊天消息

msg_a = "[1] Hi B!\n"
pkt_a = IP(dst=B_IP)/TCP(sport=A_PORT, dport=B_PORT, flags="PA", seq=1001, ack=2001)/Raw(load=msg_a)
send(pkt_a)## 等待B的回复(等待20秒)
## 监听B的回复(PSH+ACK包)
resp_filter = f"host {B_IP} and tcp port {A_PORT} and tcp[13] & 24 == 24"  # PSH+ACK
resp_pkts = sniff(filter=resp_filter, count=1, timeout=30)resp_b = resp_pkts[0]

✅ 步骤 6(A → B):A 发送第二条消息

msg_b_len = len(resp_b[Raw])
b_msg_content = resp_b[Raw].load.decode('utf-8', errors='ignore')## 计算下一个序列号和确认号
next_seq = 1001 + len(msg_a)      # A的下一个序列号
next_ack = resp_b[TCP].seq + msg_b_len  # 期望B的下一个序列号
## A发送对B回复的ACK确认
ack_pkt = IP(dst=B_IP)/TCP(sport=A_PORT, dport=B_PORT, flags="A", seq=next_seq, ack=next_ack)
send(ack_pkt)

A发送第二条消息

msg2 = "[2] How are you?\n"pkt2 = IP(dst=B_IP)/TCP(sport=A_PORT, dport=B_PORT, flags="PA", seq=next_seq, ack=next_ack)/Raw(load=msg2)
send(pkt2)

等待B对第二条消息的ACK

ack_filter = f"host {B_IP} and tcp port {A_PORT} and tcp[13] & 16 == 16"  # ACK
ack_pkts = sniff(filter=ack_filter, count=1, timeout=10)

B

from scapy.all import *## 网络配置常量
A_IP = "192.168.17.157"
B_IP = "192.168.17.154"
A_PORT = 50002
B_PORT = 8888

✅ 步骤 2(B → A):SYN+ACK(第二次握手)

syn_ack_pkt = IP(dst=A_IP)/TCP(sport=B_PORT, dport=A_PORT, flags="SA", seq=2000, ack=1001)
send(syn_ack_pkt)

✅ 步骤 4 B计算机等A的数据包,并且

filter_str = f"host {A_IP} and tcp port {B_PORT} and tcp[13] & 24 == 24"  # PSH+ACK
pkts = sniff(filter=filter_str, count=1, timeout=30)
pkt_from_a = pkts[0]msg_a_len = len(pkt_from_a[Raw]) if Raw in pkt_from_a else 0
msg_content = pkt_from_a[Raw].load.decode('utf-8', errors='ignore') if Raw in pkt_from_a else "无数据"

✅ 步骤 6(B → A):B 回复 ACK + 聊天消息

6a. 先单独 ACK A 的消息, 6b. B 发送自己的回复消息

ack_seq = pkt_from_a[TCP].ack
ack_ack = pkt_from_a[TCP].seq + msg_a_lenack_pkt = IP(dst=A_IP)/TCP(sport=B_PORT, dport=A_PORT, flags="A", seq=ack_seq, ack=ack_ack)
send(ack_pkt)## 6b
msg_b = "[1] Hello A!\n"
msg_b_len = len(msg_b)## 计算序列号:继续使用之前的序列号
## 确认号:期望A的下一个序列号
data_pkt = IP(dst=A_IP)/TCP(sport=B_PORT, dport=A_PORT, flags="PA", seq=ack_seq, ack=ack_ack)/Raw(load=msg_b)
send(data_pkt)
http://www.gsyq.cn/news/77892.html

相关文章:

  • 关于“京城爱加陪诊”官方联系渠道与服务的严正声明
  • htd1的新生教程 题解
  • JEnv for Windows
  • 京城信德斋官方公告|认准正品,谨防仿冒
  • 2025年如何选择适合的二次元测量仪品牌?
  • go缓存设计 redis 发布订阅
  • npm几个实用命令
  • 产品研发管理 : 构建世界一流的产品研发管理体系
  • 2025.12.8
  • (最新)2025实测!这11款免费降AI率工具,哪款能救你论文?
  • LLM应用剖析: 小红书AI图文生成器-红墨
  • 17.Mybatis之代理对象的执行
  • 哥大与某机构共建AI研究中心,五年投资500万美元
  • 中国电子学会全国机器人技术等级考试(一级)2019年12月 - 详解
  • IDEA源码阅读神器-Diagram专业的工具
  • 读书笔记 XILINX ug1137-Zynq UltraScale+ MPSoC Software Developer Guide 软件开发者指南 Chapter7
  • 2025 年优质服装批发市场推荐:精准适配需求,解锁高效采批新体验
  • thinkphp6 request /i /s等转换
  • An Explainable KG-RAG-Based Approach to Evidence-Based Fake News Detection Using LLMs
  • 10 种低情商行为
  • 男士洗面奶哪个牌子最好?露卡菲娅山茶花洗面奶,排行榜单热销款揭秘!
  • flex布局精进: align-items: stretch;属性
  • v-if
  • langchain4j 学习系列(6)-结构化输出(参数提取)
  • if 的虚拟语气和省略形式
  • 【论术】项目复盘总结-响应式界面
  • 高级语程序设计第八次作业
  • cs61a-36链表的练习
  • 数据库操控与数据管理——Rust 与 SQLite 的集成
  • 20232315 2025-2026-1 《网络与系统攻防技术》实验八实验报告