首页 > 编程语言 >使用Python模拟TCP/IP协议栈

使用Python模拟TCP/IP协议栈

时间:2024-09-04 19:14:30浏览次数:8  
标签:Python IP self segment packet parts TCP data frame

1. 代码如下


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")
        source_port = random.randint(1024, 65535)
        dest_port = 80  # Assuming HTTP
        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}\n")
        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, TCP/IP!")
	stack.receive_message(sent_frame)
	
	
if __name__ == "__main__":
	main()
	

2. 运行结果

3. TCP/IP协议栈中数据封装的过程:数据的四种形态

标签:Python,IP,self,segment,packet,parts,TCP,data,frame
From: https://www.cnblogs.com/gjsun/p/18397210

相关文章

  • 【Python基础】数据格式化
    1.1数据的分类(基于维度)根据组织数据时与数据有联系的参数的数量,数据可以分为以下三类。(1)一维数据1.一维数据是具有对等关系的一组线性数据,对应数学中的集合、一维数组。2.在Python中,一维列表、一维元组、一维集合都是一维数据。3.可通过逗号、空格等符号分隔一维......
  • 使用python虚拟环境相关的一点建议
    1.不要直接使用base虚拟环境为某个项目所用。理由如下:全局依赖:base环境中的包是全局的,所有项目都会共享这些包。如果不同项目需要不同版本的同一个包,可能会导致依赖冲突。版本控制:在base环境中,更新一个包可能会影响其他项目的正常运行。或者删除一个包,也可能对其他项目造成......
  • 正式收官!阿里云函数计算携手优酷,用 AI 重塑影视 IP 创新边界
    影视行业的新一轮创作风潮,将由AI掀起GPT和Sora等先进AI模型的出现,带动影视行业进入一场前所未有的创意变革。当前,在角色创作、脚本生成、营销策略等方面,AI已经展现了强大的潜力。而作为影视创作的“灵魂”,影视IP包含了丰富的故事场景和角色设定,具有无限的延展可能,影视IP......
  • 计算机毕业设计推荐-基于python的协同过滤算法音乐推荐系统
    精彩专栏推荐订阅:在下方主页......
  • [Python图论]在用图nx.shortest_path求解最短路径时,节点之间有多条边edge,会如何处理?
    问:在使用图求最短路径时,如果节点之间有多条路径,shortest_route=nx.shortest_path(G,source=start_node,target=end_node,weight='length')会如何处理,会自动选择最短那条吗?#输出图G各节点之间有多少条边edge,并给出其长度Edgesbetween103928and25508583:共2条Edge......
  • 探秘JavaScript深度领域:精通面向对象编程、虚拟DOM等核心技术
    JaScript作为前端开发的核心技术之一,凭借其强大的灵活性和广泛的应用场景,吸引了大量开发者深入学习。在探秘JaScript的深度领域时,面向对象编程和虚拟DOM等核心技术无疑是两个重要的学习方向。面向对象编程(OOP)在JaScript中扮演着重要角色。虽然JaScript是一种基于原型的语言,而非传......
  • python_August(函数对象、功能选择)
    目录python中一切皆对象功能选择函数的嵌套功能选择增加内容版python中一切皆对象#python中一切皆对象#print(self_max)#<functionself_maxat0x0000020E4456CF28>#print(id(self_max))#print(type(self_max))#print(type([1,2]))#print(type(1))#print(type(......
  • 深入理解JavaScript类与对象:揭秘类字段和静态属性的妙用,js静态属性和实例属性
    在深入理解JaScript类与对象的过程中,类字段和静态属性是两个关键的概念,掌握它们的用法可以让你在实际开发中更加得心应手。虽然JaScript在ES6之前并没有类的概念,但通过ES6及以后的版本,引入了类语法糖,使得我们能够更直观地定义和使用类。类字段是指在类中直接定义的属性,而不是在构......
  • python 绘制折线图包括设置字体折线粗细以及标题立方m等
    #!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Suyue@file:flyzhexian.py@time:2024/09/04@desc:"""importpandasaspdimportmatplotlibimportmatplotlib.pyplotaspltimportmatplotlib.tickerastickermatplot......
  • Python基础 5 - 类、对象、注解
    文章目录一、初识对象1、什么是面向对象?2、成员方法1)类的定义和使用2)成员方法的定义3、类和方法面向对象编程4、属性(成员变量)的赋值5、其他类内置方法1)__str__字符串方法2)__lt__小于符号比较方法3)__le__小于等于符号比较方法4)__eq__等于符号比较方法......