CSMA/CD协议模拟实验代码
时间: 2023-11-15 09:06:07 浏览: 29
以下是一个简单的CSMA/CD协议模拟实验代码,使用Python语言实现:
```python
import random
# 定义节点类
class Node:
def __init__(self, id):
self.id = id
self.bus = None
self.backoff = 0
self.collisions = 0
def send(self, msg):
self.bus.send(msg, self)
def receive(self, msg):
print("Node", self.id, "received message:", msg)
def transmit(self, msg):
if self.bus.is_idle():
self.send(msg)
else:
self.backoff = random.randint(1, 10)
print("Node", self.id, "backing off for", self.backoff, "time units")
def collision(self):
self.collisions += 1
if self.collisions == 16:
print("Node", self.id, "exceeded maximum collisions")
return False
self.backoff = random.randint(1, 2 ** self.collisions)
print("Node", self.id, "collided, backing off for", self.backoff, "time units")
return True
def run(self):
while True:
msg = "Hello, world!"
self.transmit(msg)
for i in range(self.backoff):
if self.bus.is_idle():
break
self.bus.tick()
if not self.bus.is_idle():
if self.collision():
continue
else:
break
self.bus.tick()
# 定义总线类
class Bus:
def __init__(self, nodes):
self.nodes = nodes
self.msg = None
def send(self, msg, sender):
self.msg = (msg, sender)
for node in self.nodes:
if node != sender:
node.receive(msg)
def tick(self):
if self.msg is not None:
for node in self.nodes:
if node != self.msg[1]:
node.collision()
self.msg = None
def is_idle(self):
return self.msg is None
# 创建节点和总线
nodes = [Node(i) for i in range(5)]
bus = Bus(nodes)
# 运行节点
for node in nodes:
node.bus = bus
node.run()
```
此代码实现了一个包含5个节点的简单网络,每个节点会定期发送消息到总线上。如果总线上有其他节点正在发送消息,则该节点会进行退避,并在一定时间后重新尝试发送。如果同时有多个节点在同一时间尝试发送消息,则会发生碰撞,导致所有节点都需要进行退避。如果一个节点在连续发送16次仍然发生碰撞,则会放弃发送消息。