-
Notifications
You must be signed in to change notification settings - Fork 0
/
GobackN.py
55 lines (44 loc) · 1.63 KB
/
GobackN.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import random
import time
random.seed(9821)
WINDOW_SIZE = 3 # Window size for the sender and receiver
MAX_FRAMES = 10 # Total number of frames to be sent
# Simulated network delay
def simulate_network_delay():
return random.randint(1, 3)
# Sender function
def sender(frames):
base = 0
next_seq_num = 0
buffer = frames[0:WINDOW_SIZE]
while base < len(frames):
for i in range(base, min(base + WINDOW_SIZE, len(frames))):
print(f"Sender: Sending frame {frames[i]}")
time.sleep(simulate_network_delay()) # Simulate network delay
temp = buffer
for i in range(base, min(base + WINDOW_SIZE, len(frames))):
ack_received = receiver(base, buffer)
if ack_received == base:
base += 1
buffer.pop(0)
if next_seq_num < len(frames):
buffer.append(frames[next_seq_num])
next_seq_num += 1
else:
buffer = temp
print(f"Sender: Timeout, resending frames [{base}:{base+WINDOW_SIZE-1}]")
break
# Receiver function
def receiver(expected_seq_num, buffer):
time.sleep(simulate_network_delay()) # Simulate network delay
received_frame = expected_seq_num if random.random() < 0.75 else None # Simulate packet loss
if received_frame is not None:
print(f"Receiver: Received frame {received_frame}")
if received_frame == expected_seq_num:
return received_frame
return None
def main():
frames_to_send = list(range(MAX_FRAMES))
sender(frames_to_send)
if __name__ == "__main__":
main()