diff --git a/OralNotes.md b/OralNotes.md new file mode 100644 index 0000000..639128a --- /dev/null +++ b/OralNotes.md @@ -0,0 +1,337 @@ +[toc] + + + +## 什么是一个自治系统?(Autonome Systeme) + +自治系统(Autonomous System,AS)指的是在互联网中由单一管理实体(如网络运营商、企业、大学等)控制的一组IP网络和路由器集合。每个自治系统都有一个唯一的自治系统号码(ASN),用于在边界网关协议(BGP)中标识和交换路由信息。自治系统内部使用统一的路由策略管理数据流,而各AS之间则通过BGP互联,从而构成全球互联网的基础架构。 + +## 自治系统语境下的对等关系和传输关系各是什么意思? + +**Peering relationship(对等互联关系):** + 在这种关系中,两家或多家网络通常规模相近且流量互补,它们直接互联并交换彼此的流量,而不收取费用或仅象征性收取费用。这种方式旨在优化数据传输路径和提高网络效率,同时降低运营成本。 + +**Transit relationship(传递关系):** + 这种关系通常涉及付费,指的是一个网络(客户网络)向一个规模更大、覆盖范围更广的网络(提供商网络)支付费用,以获得对整个互联网或更大部分网络的连接。通过 Transit 关系,客户网络可以访问那些没有与之直接对等互联的其他网络。 + +## 网络层和数据链路层的作用各是什么? + +- **网络层(Network Layer):** + - **主要作用:** 负责在不同网络之间传输数据包,确定数据从源到目的地的最佳路径。 + - 关键功能: + - **逻辑寻址:** 使用IP地址标识各个网络设备。 + - **路由选择:** 通过路由协议(如OSPF、BGP等)决定数据包的转发路径。 + - **数据包转发:** 在各个网络间将数据包从一跳转发到下一跳。 + - **分片与重组:** 当数据包在传输中需要跨越不同MTU的网络时进行分片,并在目的地重组数据包。 +- **数据链路层(Data Link Layer):** + - **主要作用:** 负责在相邻网络节点之间进行可靠的数据传输,确保物理传输过程中数据的完整性。 + - 关键功能: + - **帧封装:** 将网络层传来的数据封装成帧,并在接收端进行解封装。 + - **物理地址:** 使用MAC地址来唯一标识局域网中的设备。 + - **错误检测与纠正:** 通过校验和等机制检测传输错误,并在必要时进行纠正。 + - **流量控制:** 管理数据传输速率,避免网络拥塞。 + +## 不同子网的不同的第二层实现指的是什么? + +以太网,WiFi + +## CIDR出现前是怎么划分子网的? + +IPv4 地址被划分为五类,每类的网络部分和主机部分的长度不同: + +| **类别** | **地址范围** | **网络部分长度** | **主机部分长度** | **用途** | +| :------- | :-------------------------- | :--------------- | :--------------- | :------------------- | +| A | 0.0.0.0 - 127.255.255.255 | 8 位 | 24 位 | 大型网络 | +| B | 128.0.0.0 - 191.255.255.255 | 16 位 | 16 位 | 中型网络 | +| C | 192.0.0.0 - 223.255.255.255 | 24 位 | 8 位 | 小型网络 | +| D | 224.0.0.0 - 239.255.255.255 | N/A | N/A | 多播地址 | +| E | 240.0.0.0 - 255.255.255.255 | N/A | N/A | 保留地址(实验用途) | + +RFC 1918 定义了以下私有地址范围,这些地址用于本地网络(如企业内部网络),不会在公共互联网上路由: + +| **类别** | **私有地址范围** | **默认子网掩码** | +| :------- | :---------------------------- | :---------------- | +| A | 10.0.0.0 - 10.255.255.255 | 255.0.0.0 (/8) | +| B | 172.16.0.0 - 172.31.255.255 | 255.240.0.0 (/12) | +| C | 192.168.0.0 - 192.168.255.255 | 255.255.0.0 (/16) | + +6. IPv6协议有多长? + 128位 +| **字段** | **长度(比特)** | **描述** | + | :-------------------------------- | :--------------- | :--------------------------------------------------------- | + | **FP(Format Prefix)** | 3 | 格式前缀,用于标识地址类型(如全局单播地址、本地地址等)。 | + | **TLA(Top-Level Aggregation)** | 13 | 顶级聚合标识符,用于标识顶级 ISP 或大型组织。 | + | **RES(Reserved)** | 8 | 保留字段,用于未来扩展。 | + | **NLA(Next-Level Aggregation)** | 24 | 下一级聚合标识符,用于标识下级 ISP 或组织。 | + | **SLA(Site-Level Aggregation)** | 16 | 站点级聚合标识符,用于标识组织内部的子网。 | + | **Interface ID** | 64 | 接口标识符,用于标识网络接口。 | + +## IPv6地址的构成?(子网和主机ID各有多少位?) + +各64位 + +## IPv6的头部是固定的还是变长的?如果是固定的,如何添加额外的信息? + +固定的,存在header-extension +IPv6 头部固定为 **40 字节**,包含以下字段: + +| **字段** | **长度(比特)** | **描述** | +| :---------------------- | :--------------- | :----------------------------------------------------------- | +| **Version** | 4 | 版本号,IPv6 的值为 `6`。 | +| **Traffic Class** | 8 | 流量类别,用于区分不同类型的流量(类似于 IPv4 的 TOS 字段)。 | +| **Flow Label** | 20 | 流标签,用于标识属于同一流的数据包(用于 QoS 和实时应用)。 | +| **Payload Length** | 16 | 有效载荷长度,表示 IPv6 头部之后的数据长度(不包括头部本身)。 | +| **Next Header** | 8 | 下一个头部类型,标识紧接在 IPv6 头部之后的扩展头部或上层协议(如 TCP/UDP)。 | +| **Hop Limit** | 8 | 跳数限制,类似于 IPv4 的 TTL,每经过一个路由器减 1,减到 0 时丢弃数据包。 | +| **Source Address** | 128 | 源 IPv6 地址。 | +| **Destination Address** | 128 | 目的 IPv6 地址。 | + +在next header处添加扩展信息 + +每个扩展头部都包含以下两个关键字段: + +1. **Next Header**(8 位):指示下一个扩展头部或上层协议的类型。 + +2. **Header Extension Length**(8 位):指示当前扩展头部的长度(以 8 字节为单位,不包括前 8 字节)。 + +## 什么是IPsec? + +**IPsec(Internet Protocol Security)** 是一种用于保护 IP 通信的安全协议套件。它通过在 IP 层提供加密、认证和完整性保护,确保数据在传输过程中的机密性、完整性和真实性。IPsec 广泛应用于虚拟专用网络(VPN)、远程访问、站点到站点连接等场景。 + +传输模式(Transport Mode) + +- 仅保护 IP 数据包的有效载荷(Payload),不修改原始 IP 头部。 +- 适用于端到端通信(如主机到主机)。 +- 示例: + - 原始数据包:`[IP Header][TCP/UDP Header][Data]` + - IPsec 保护后:`[IP Header][AH/ESP Header][TCP/UDP Header][Data][ESP Trailer][ICV]` + +**隧道模式(Tunnel Mode)** + +- 保护整个 IP 数据包(包括 IP 头部和有效载荷),并封装在新的 IP 数据包中。 +- 适用于站点到站点 VPN 或远程访问 VPN。 +- 示例: + - 原始数据包:`[IP Header][TCP/UDP Header][Data]` + - IPsec 保护后:`[New IP Header][AH/ESP Header][Original IP Header][TCP/UDP Header][Data][ESP Trailer][ICV]` + +## IPv6是怎么区分本地和全局地址的? + +1. script里主要写分为两类:**全局地址**和**链路本地地址** +2. 需要注意的是**链路本地地址不能跨路由器** +3. IPv6 地址主要分为以下几类: + 1. **全局单播地址(Global Unicast Address)**: + 1. 用于公共互联网,全球唯一。 + 2. 前缀通常为 `2000::/3`(即 `2000::` 到 `3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF`)。 + 2. **唯一本地地址(Unique Local Address, ULA)**: + 1. 用于本地网络,类似于 IPv4 的私有地址。 + 2. 前缀为 `FC00::/7`(即 `FC00::` 到 `FDFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF`)。 + 3. **链路本地地址(Link-Local Address)**: + 1. 用于同一链路上的设备通信,不能跨路由器。 + 2. 前缀为 `FE80::/10`(即 `FE80::` 到 `FEBF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF`)。 + 4. **多播地址(Multicast Address)**: + 1. 用于一对多通信。 + 2. 前缀为 `FF00::/8`(即 `FF00::` 到 `FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF`)。 + 5. **回环地址(Loopback Address)**: + 1. 用于本地回环测试。 + 2. 地址为 `::1`。 + 6. **未指定地址(Unspecified Address)**: + 1. 用于表示地址未指定。 + 2. 地址为 `::`。 + +## 实现IPv4和IPv6两个协议版本共存的方法: + +1. 双栈 +2. 隧道技术 + +## 讲一讲ICMPv6 + +ICMPv6 的主要功能包括: + +1. **错误报告**: + + - 当数据包传输过程中发生错误时,ICMPv6 会生成错误消息并发送给源节点。 + - 例如,目标不可达、数据包过大、超时等。 + +2. **诊断功能**: + + - 提供网络诊断工具,如 **Ping** 和 **Traceroute**。 + - 用于测试网络连通性和路径。 + +3. **邻居发现协议(NDP)**: + + - 用于 IPv6 中的地址解析、邻居状态跟踪和路由器发现。 + - 替代了 IPv4 中的 **ARP(Address Resolution Protocol)**。 + +4. **多播监听发现协议(MLD)**: + + - 用于管理多播组成员关系。 + - 替代了 IPv4 中的 **IGMP(Internet Group Management Protocol)**。 + + + **2. ICMPv6 的消息类型** + + ICMPv6 消息分为两大类:**错误消息** 和 **信息消息**。每种消息类型由一个唯一的类型值标识。 + + **2.1 错误消息** + + 错误消息用于报告数据包传输过程中的问题。常见的错误消息类型包括: + + | **类型值** | **消息类型** | **描述** | + | :--------- | :------------------------------------ | :------------------------------------------- | + | 1 | 目标不可达(Destination Unreachable) | 数据包无法到达目标节点。 | + | 2 | 数据包过大(Packet Too Big) | 数据包超过链路的 MTU,无法传输。 | + | 3 | 超时(Time Exceeded) | 数据包的 TTL(跳数限制)减到 0,或重组超时。 | + | 4 | 参数问题(Parameter Problem) | 数据包头部字段有错误。 | + +**2.2 信息消息** + + 信息消息用于网络诊断和管理。常见的信息消息类型包括: + + | **类型值** | **消息类型** | **描述** | + | :--------- | :---------------------------------------- | :--------------------------------------- | + | 128 | 回显请求(Echo Request) | 用于 Ping 测试,请求目标节点回复。 | + | 129 | 回显应答(Echo Reply) | 目标节点对回显请求的响应。 | + | 133 | 路由器请求(Router Solicitation) | 主机请求路由器发送路由器通告。 | + | 134 | 路由器通告(Router Advertisement) | 路由器发送的通告消息,包含网络配置信息。 | + | 135 | 邻居请求(Neighbor Solicitation) | 用于地址解析和邻居状态跟踪。 | + | 136 | 邻居通告(Neighbor Advertisement) | 对邻居请求的响应,包含链路层地址。 | + | 130 | 多播监听查询(Multicast Listener Query) | 用于查询多播组成员。 | + | 131 | 多播监听报告(Multicast Listener Report) | 主机报告其多播组成员关系。 | + | 132 | 多播监听完成(Multicast Listener Done) | 主机离开多播组时发送的消息。 | + +------ + +**3. ICMPv6 的消息格式** + + ICMPv6 消息的通用格式如下: + + | **字段** | **长度(字节)** | **描述** | + | :------------------------- | :--------------- | :-------------------------------------------------- | + | **类型(Type)** | 1 | 消息类型(如 1 表示目标不可达,128 表示回显请求)。 | + | **代码(Code)** | 1 | 消息子类型,提供更详细的错误分类。 | + | **校验和(Checksum)** | 2 | 用于检测消息在传输过程中是否损坏。 | + | **消息体(Message Body)** | 可变 | 包含具体的消息数据,如错误信息、诊断数据等。 | + +------ + +**4. ICMPv6 的关键功能** + +**4.1 邻居发现协议(NDP)** + + NDP 是 ICMPv6 的核心功能之一,用于替代 IPv4 中的 ARP。它通过以下消息实现: + + - **路由器请求(Router Solicitation, RS)**: + - 主机发送 RS 消息,请求路由器发送路由器通告。 + - **路由器通告(Router Advertisement, RA)**: + - 路由器发送 RA 消息,包含网络配置信息(如前缀、MTU 等)。 + - **邻居请求(Neighbor Solicitation, NS)**: + - 用于地址解析(将 IPv6 地址解析为链路层地址)。 + - **邻居通告(Neighbor Advertisement, NA)**: + - 对 NS 消息的响应,包含链路层地址。 + +**4.2 多播监听发现协议(MLD)** + + MLD 用于管理多播组成员关系,替代了 IPv4 中的 IGMP。它通过以下消息实现: + + - **多播监听查询(Multicast Listener Query)**: + - 路由器发送查询消息,询问哪些主机加入了多播组。 + - **多播监听报告(Multicast Listener Report)**: + - 主机发送报告消息,声明其加入的多播组。 + - **多播监听完成(Multicast Listener Done)**: + - 主机发送完成消息,声明其离开多播组。 + +## 描述一下NDP的过程? + +**NDP(Neighbor Discovery Protocol,邻居发现协议)** 是 IPv6 中的一个关键协议,用于替代 IPv4 中的 **ARP(Address Resolution Protocol)**。NDP 不仅支持地址解析,还提供了路由器发现、邻居状态跟踪、重复地址检测等功能。以下是 NDP 的工作过程及其主要功能的详细说明: + +**2. NDP 的工作过程** + +**2.1 路由器发现(Router Discovery)** + +当主机加入网络时,它需要发现本地网络中的路由器并获取网络配置信息(如前缀、MTU 等)。这个过程通过 **RS** 和 **RA** 消息实现。 + +1. **主机发送 RS 消息**: + - 主机发送 **Router Solicitation(RS)** 消息,请求路由器发送路由器通告。 + - RS 消息的目标地址为 **所有路由器多播地址(FF02::2)**。 + +2. **路由器发送 RA 消息**: + - 路由器收到 RS 消息后,发送 **Router Advertisement(RA)** 消息。 + - RA 消息包含以下信息: + - 网络前缀(用于地址自动配置)。 + - 默认路由器的链路层地址。 + - MTU(最大传输单元)。 + - RA 消息可以定期发送,也可以响应 RS 消息发送。 + +--- + +**2.2 地址解析(Address Resolution)** + +当主机需要将 IPv6 地址解析为链路层地址时,使用 **NS** 和 **NA** 消息。 + +1. **主机发送 NS 消息**: + - 主机发送 **Neighbor Solicitation(NS)** 消息,请求目标 IPv6 地址对应的链路层地址。 + - NS 消息的目标地址为 **请求节点多播地址(Solicited-Node Multicast Address)**,格式为 `FF02::1:FFXX:XXXX`,其中 `XX:XXXX` 是目标 IPv6 地址的最后 24 位。 + +2. **目标主机发送 NA 消息**: + - 目标主机收到 NS 消息后,发送 **Neighbor Advertisement(NA)** 消息,包含其链路层地址。 + - NA 消息的目标地址为请求主机的单播地址。 + +--- + +**2.3 邻居状态跟踪(Neighbor State Tracking)** + +NDP 维护一个 **邻居缓存表(Neighbor Cache)**,用于跟踪邻居的状态。邻居状态包括: +- **INCOMPLETE**:正在解析地址。 +- **REACHABLE**:邻居可达。 +- **STALE**:邻居状态未知,需要验证。 +- **DELAY**:延迟验证。 +- **PROBE**:正在验证邻居的可达性。 + +--- + +**2.4 重复地址检测(Duplicate Address Detection, DAD)** + +在主机配置 IPv6 地址之前,需要确保该地址在本地链路上是唯一的。这个过程通过 **NS** 和 **NA** 消息实现。 + +1. **主机发送 NS 消息**: + - 主机发送 **Neighbor Solicitation(NS)** 消息,目标地址为待检测的 IPv6 地址。 + - 如果收到 **Neighbor Advertisement(NA)** 消息,说明地址已被占用。 + +2. **地址可用**: + - 如果没有收到 NA 消息,主机可以安全地使用该地址。 + +--- + +**2.5 重定向(Redirect)** + +当路由器发现主机选择的下一跳不是最优路径时,会发送 **Redirect** 消息,通知主机有更好的下一跳地址。 + +1. **路由器发送 Redirect 消息**: + - 路由器发送 **Redirect** 消息,包含更好的下一跳地址。 + - 主机更新其路由表,使用新的下一跳地址。 + + + +## 路由协议的主要功能是什么?最优路径用在哪里? + + 路由协议的主要功能是让每个路由器将其已知的子网信息传递给其他路由器。 + 最优路径用在计算两个设备之间的最优距离 + +## 如何计算最优路径? + +1. 网络可以看成是在生成的加权边图上(generated weighted graph),规划算法为路由器寻找一条最优路径(plan algorithm finds an optimal path for the router.) +2. 一般存在一个成本函数,成本函数会计算包离开网络的代价。离开网络既可以指送到指定设备,也可以是送到对应的运营商(自治系统 ) + +## 自适应路由方法的分类? + +1. 集中式 +2. 分布式 + +## 路由协议一般使用哪两种方法 + +1. 自适应距离向量方法 + 1. **距离向量(Distance Vector)**:每个路由器维护一个路由表,表中包含到每个目标网络的距离(通常以跳数或成本度量)和下一跳路由器。 + 2. **自适应(Adaptive)**:路由器根据网络拓扑的变化动态更新路由表。 +2. 自适应链路状态方法 + 1. **链路状态(Link State)**:每个路由器维护整个网络的拓扑图,包含所有路由器和链路的状态。 + 2. **自适应(Adaptive)**:路由器根据网络拓扑的变化动态更新链路状态数据库。 diff --git a/RESTful-APIs.md b/RESTful-APIs.md new file mode 100644 index 0000000..187adc8 --- /dev/null +++ b/RESTful-APIs.md @@ -0,0 +1,290 @@ +# RESTful APIs Documentation + +These APIs are designed to control **TCP** traffic. + +--- + +## Policy Endpoints + +Policy rules determine whether to **allow** or **deny** connections between two IP addresses and a specific destination port. + +--- + +### **1. Add a Policy Rule** +Add a new policy rule to allow or deny traffic. + +- **HTTP Method**: `POST` +- **URL Path**: `/policies` +- **Request Body**: + - `src_ip` (string): Source IP address. + - `dst_ip` (string): Destination IP address. + - `dst_port` (string): Destination port. + - `action` (string): Must be either `allow` or `deny`. + +#### **Example** +- **Request**: + ```bash + curl -X POST -H "Content-Type: application/json" -d '{"src_ip": "172.16.1.1", "dst_ip": "172.16.1.2", "dst_port": "5201", "action": "allow"}' http://localhost:8080/policies + ``` + +- **Response**: + ```json + { + "action": "allow", + "dst_ip": "172.16.1.2", + "dst_port": "5201", + "id": 0, + "src_ip": "172.16.1.1" + } + ``` + +- **Status Codes**: + - `201 Created`: Policy rule added successfully. + - `400 Bad Request`: Invalid input data. + - `409 Conflict`: Rule already exists. + +--- + +### **2. Retrieve Policy Rules** +Fetch all existing policy rules. + +- **HTTP Method**: `GET` +- **URL Path**: `/policies` + +#### **Example** +- **Request**: + ```bash + curl -X GET http://localhost:8080/policies + ``` + +- **Response**: + ```json + [ + { + "action": "allow", + "dst_ip": "172.16.1.2", + "dst_port": "5201", + "id": 0, + "src_ip": "172.16.1.1" + }, + { + "action": "allow", + "dst_ip": "172.16.1.2", + "dst_port": "5202", + "id": 1, + "src_ip": "172.16.1.1" + } + ] + ``` + +- **Status Codes**: + - `200 OK`: Returns the list of policy rules. + +--- + +### **3. Update a Policy Rule** +Modify an existing policy rule. + +- **HTTP Method**: `PUT` +- **URL Path**: `/policies` +- **Request Body**: + - `src_ip` (string): Source IP address. + - `dst_ip` (string): Destination IP address. + - `dst_port` (string): Destination port. + - `action` (string): Must be either `allow` or `deny`. + +#### **Example** +- **Request**: + ```bash + curl -X PUT -H "Content-Type: application/json" -d '{"src_ip": "172.16.1.1", "dst_ip": "172.16.1.2", "dst_port": "5201", "action": "allow"}' http://localhost:8080/policies + ``` + +- **Response**: + ```json + { + "action": "allow", + "dst_ip": "172.16.1.2", + "dst_port": "5201", + "id": 0, + "src_ip": "172.16.1.1" + } + ``` + +- **Status Codes**: + - `201 Updated`: Policy rule updated successfully. + - `400 Bad Request`: Invalid input data. + +--- + +### **4. Delete a Policy Rule** +Remove a policy rule by its ID. + +- **HTTP Method**: `DELETE` +- **URL Path**: `/policies/{id}` + +#### **Example** +- **Request**: + ```bash + curl -X DELETE http://localhost:8080/policies/1 + ``` + +- **Response**: + ```json + { + "message": "Policy deleted" + } + ``` + +- **Status Codes**: + - `201 Deleted`: Policy rule deleted successfully. + - `404 Not Found`: Rule does not exist. + +--- + +## Bandwidth Control Endpoints + +These endpoints manage bandwidth control rules using **P4 meter**. They regulate traffic bandwidth between two IP addresses and a specific destination port. + +Bandwidth is controlled using four parameters: +- **CIR (Committed Information Rate)**: Guaranteed minimum bandwidth. +- **Cburst (Committed Burst Size)**: Maximum allowed burst above CIR. +- **PIR (Peak Information Rate)**: Maximum allowed bandwidth. +- **Pburst (Peak Burst Size)**: Maximum allowed burst above PIR. + +**Note**: During testing with `iperf3`, the actual bandwidth was observed to be approximately half of the configured value. + +--- + +### **1. Add a Bandwidth Control Rule** +Add a new bandwidth control rule. + +- **HTTP Method**: `POST` +- **URL Path**: `/bandwidth` +- **Request Body**: + - `src_ip` (string): Source IP address. + - `dst_ip` (string): Destination IP address. + - `rates` (list): A list containing two lists: + - `[[CIR (bytes), Cburst (bytes)], [PIR (bytes), Pburst (bytes)]]` + - `dst_port` (string): Destination port. + +#### **Example** +- **Request**: + ```bash + curl -X POST -H "Content-Type: application/json" -d '{"src_ip": "172.16.1.1", "dst_ip": "172.16.1.2", "rates": [[100000, 10000], [100000, 10000]], "dst_port": "5201"}' http://localhost:8080/bandwidth + ``` + +- **Response**: + ```json + { + "dst_ip": "172.16.1.2", + "dst_port": "5201", + "path": ["s1", "s2"], + "rates": [[100000, 10000], [100000, 10000]], + "src_ip": "172.16.1.1" + } + ``` + +- **Status Codes**: + - `201 Created`: Bandwidth control rule added successfully. + - `400 Bad Request`: Invalid input data. + - `409 Conflict`: Rule already exists. + +--- + +### **2. Retrieve Bandwidth Control Rules** +Fetch all existing bandwidth control rules. + +- **HTTP Method**: `GET` +- **URL Path**: `/bandwidth` + +#### **Example** +- **Request**: + ```bash + curl -X GET http://localhost:8080/bandwidth + ``` + +- **Response**: + ```json + [ + { + "dst_ip": "172.16.1.2", + "dst_port": "5201", + "id": 0, + "path": ["s1", "s2"], + "rates": [[100000, 10000], [100000, 10000]], + "src_ip": "172.16.1.1" + }, + { + "dst_ip": "172.16.1.2", + "dst_port": "5202", + "id": 1, + "path": ["s1", "s2"], + "rates": [[100000, 10000], [100000, 10000]], + "src_ip": "172.16.1.1" + } + ] + ``` + +- **Status Codes**: + - `200 OK`: Returns the list of bandwidth control rules. + +--- + +### **3. Update a Bandwidth Control Rule** +Modify an existing bandwidth control rule. If the rule does not exist, it will be created. + +- **HTTP Method**: `PUT` +- **URL Path**: `/bandwidth` +- **Request Body**: + - `src_ip` (string): Source IP address. + - `dst_ip` (string): Destination IP address. + - `rates` (list): A list containing two lists: + - `[[CIR (bytes), Cburst (bytes)], [PIR (bytes), Pburst (bytes)]]` + - `dst_port` (string): Destination port. + +#### **Example** +- **Request**: + ```bash + curl -X PUT -H "Content-Type: application/json" -d '{"src_ip": "172.16.1.1", "dst_ip": "172.16.1.2", "rates": [[150000, 10000], [150000, 10000]], "dst_port": "5201"}' http://localhost:8080/bandwidth + ``` + +- **Response**: + ```json + { + "dst_ip": "172.16.1.2", + "dst_port": "5201", + "path": ["s1", "s2"], + "rates": [[150000, 10000], [150000, 10000]], + "src_ip": "172.16.1.1" + } + ``` + +- **Status Codes**: + - `201 Updated`: Bandwidth control rule updated successfully. + - `400 Bad Request`: Invalid input data. + +--- + +### **4. Delete a Bandwidth Control Rule** +Remove a bandwidth control rule by its ID. + +- **HTTP Method**: `DELETE` +- **URL Path**: `/bandwidth/{id}` + +#### **Example** +- **Request**: + ```bash + curl -X DELETE http://localhost:8080/bandwidth/1 + ``` + +- **Response**: + ```json + { + "message": "Bandwidth rule deleted" + } + ``` + +- **Status Codes**: + - `201 Deleted`: Bandwidth control rule deleted successfully. + - `404 Not Found`: Rule does not exist. +