| import random |
| |
| class ApplicationLayer: |
| def send_data(self, data): |
| print(f"Application Layer: Sending data: {data}") |
| return data |
| |
| def receive_data(self, data): |
| print(f"Application Layer: Received data: {data}") |
| |
| class TransportLayer: |
| def send_segment(self, data): |
| print("Transport Layer: Creating TCP segment") |
| random.seed(100) |
| source_port = random.randint(1024, 65535) |
| dest_port = 80 |
| segment = f"TCP|{source_port}|{dest_port}|{data}" |
| return segment |
| |
| def receive_segment(self, segment): |
| print("Transport Layer: Receiving TCP segment") |
| parts = segment.split("|") |
| if len(parts) >= 4 and parts[0] == "TCP": |
| data = "|".join(parts[3:]) |
| print(f"From port {parts[1]} to port {parts[2]}") |
| return data |
| else: |
| print("Invalid TCP segment") |
| return None |
| |
| class InternetLayer: |
| def send_packet(self, segment): |
| print("Internet Layer: Creating IP packet") |
| source_ip = "192.168.1.1" |
| dest_ip = "10.0.0.1" |
| packet = f"IP|{source_ip}|{dest_ip}|{segment}" |
| return packet |
| |
| def receive_packet(self, packet): |
| print("Internet Layer: Receiving IP packet") |
| parts = packet.split("|") |
| if len(parts) >= 4 and parts[0] == "IP": |
| segment = "|".join(parts[3:]) |
| print(f"From IP {parts[1]} to IP {parts[2]}") |
| return segment |
| else: |
| print("Invalid IP packet") |
| return None |
| |
| class LinkLayer: |
| def send_frame(self, packet): |
| print("Link Layer: Creating Ethernet frame") |
| mac_source = "00:1A:2B:3C:4D:5E" |
| mac_dest = "A1:B2:C3:D4:E5:F6" |
| frame = f"ETH|{mac_source}|{mac_dest}|{packet}" |
| return frame |
| |
| def receive_frame(self, frame): |
| print("Link Layer: Receiving Ethernet frame") |
| parts = frame.split("|") |
| if len(parts) >= 4 and parts[0] == "ETH": |
| packet = "|".join(parts[3:]) |
| print(f"From MAC {parts[1]} to MAC {parts[2]}") |
| return packet |
| else: |
| print("Invalid Ethernet frame") |
| return None |
| |
| class TCPIPStack: |
| def __init__(self): |
| self.application = ApplicationLayer() |
| self.transport = TransportLayer() |
| self.internet = InternetLayer() |
| self.link = LinkLayer() |
| |
| def send_message(self, message): |
| print("\n--- Sending Message ---") |
| |
| data = self.application.send_data(message) |
| |
| |
| segment = self.transport.send_segment(data) |
| |
| |
| packet = self.internet.send_packet(segment) |
| |
| |
| frame = self.link.send_frame(packet) |
| |
| print(f"Final Frame: {frame}") |
| return frame |
| |
| def receive_message(self, frame): |
| print("\n--- Receiving Message ---") |
| packet = self.link.receive_frame(frame) |
| if packet: |
| segment = self.internet.receive_packet(packet) |
| if segment: |
| data = self.transport.receive_segment(segment) |
| if data: |
| self.application.receive_data(data) |
| |
| |
| def main(): |
| stack = TCPIPStack() |
| sent_frame = stack.send_message("Hello, World!") |
| stack.receive_message(sent_frame) |
| |
| |
| if __name__ == "__main__": |
| main() |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话