放在前面的结论:按照通常方式(本文中的脚本的那种方式),tc只能在出口限制带宽、时延、丢包率,不能在入口限制。

本文若有内容不严谨或不对,欢迎批评,欢迎指正

tc脚本内容

#!/bin/bash
echo "add tbf and netem to eth0..."
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 5:0 tbf rate $1mbit burst 100k limit 75k
if (($3=='0'))
thentc qdisc add dev eth0 parent 5:0 handle 10:0 netem delay $2ms
elsetc qdisc add dev eth0 parent 5:0 handle 10:0 netem delay $2ms loss $3
fi
tc qdisc show dev eth0

该脚本用于快速设置tc至网卡eth0,建议保存为文件tc_X_Mbps_Y_ms_Z_%loss.sh,使用时需加三个参数,即

./tc_X_Mbps_Y_ms_Z_%loss.sh {带宽(Mbps)} {时延(Mbps)} {丢包率(%)}

带宽

1.使用docker+ovs设置两个相连的主机,首先对主机1的网卡使用tbf+netem设置为5Mbps带宽,30ms时延    2.在两台主机上分别启动iperf服务端(收)和客户端(发),测试吞吐量,测试完成后交换服务端和客户端所在主机,再测试一遍,以测试tc对入口和出口流量的限制。
   主机1收,主机2发。   主机2收,主机1发。
   结论:以此脚本的方式使用tc,只能限制出口带宽,不能限制入口带宽。

丢包

将主机1的丢包率设置为100%,然后使用UDP发包程序发包,同样是两个主机分别往对端发以进行测试。
   UDP发包程序的逻辑是有一个服务端(收)负责接收UDP数据包,收到一个包后程序结束,调用linux的date命令打印出当前时间。有一个客户端(发)负责发送数据包,发一个包后程序结束,调用linux的date命令打印出当前时间。具体程序见附录。
   这里不使用iperf进行测试的原因是TCP建立链接的过程是双向发包的,导致分不清是发出去的包在出口被丢掉还是回来的包在入口被丢掉。
   1.首先将主机1的网卡用tc设置为100%丢包。   2.主机1发,主机2收。(这里虽然只测试了3个包,但其实多少个包都是一样的)

主机2发,主机1收。

   3.将主机1上的丢包率恢复为0%,然后主机1发,主机2收

结论:以此脚本的方式使用tc,只能在出口丢包,不能在入口丢包。

时延

同样为了避免双向发包问题,使用上述UDP程序进行实验。
   1.为了便于观察结果,将主机1的时延设置为10s。

   2.主机1发,主机2收


   主机2发,主机1收

   结论:以此脚本的方式使用tc,只能在出口加时延,不能在入口加时延。

相关资料收集

之所以前面强调“以此脚本的方式”、“通常方式”,是因为看完资料后仍然不是特别清楚tc的出口入口作用情况,故列举一些资料在这。
   1.参考资料https://lartc.org/lartc.html#LARTC.QDISC,9.4节

  • qdisc可以作用于入口或出口。
  • tc在内核态长这样
  • shaping作用在出口

       2.参考资料https://linux.die.net/man/8/tc
  • 各个控制的可作用范围
       3.参考资料https://tonydeng.github.io/sdn-handbook/linux/tc.html

附录:UDP发包收包程序

服务端(收)

# -*- coding: utf-8 -*-import socket
import time
import commandsPORT = 8000server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ("172.17.0.3", PORT)   # 服务器的ip地址和端口号,这里ip地址懒得以参数的方式传入,实际做实验时是手动改的ip
server_socket.bind(address)  # 为服务器绑定一个固定的地址,ip和端口receive_data, client = server_socket.recvfrom(1024)
print("来自客户端%s,发送的%s\n" % (client, receive_data))  #打印接收的内容
print(commands.getstatusoutput('date'))

客户端(发)

# -*- coding: utf-8 -*-
import socket
import commands#client 发送端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
PORT = 8000msg= b"hello"
server_address = ("172.17.0.3", PORT)  # 接收方 服务器的ip地址和端口号,这里ip地址懒得以参数的方式传入,实际做实验时是手动改的ip
client_socket.sendto(msg, server_address) #将msg内容发送给指定接收方
print(commands.getstatusoutput('date'))

关于tc作用在入口(ingress)和出口(egress)效果的调研相关推荐

  1. php文件的作用,php入口文件的作用-PHP问题

    php入口文件的作用 php入口文件能够完成主动加载性能. 解析PHP入口文件的主动加载性能 php的主动加载: 正在php5之前,咱们要用某个类或类的办法,那必需include或许require,之 ...

  2. 如果在高速免费前上高速怎么计算机,高速免费etc可以提前上高速吗?免费时间是按入口算还是出口算?...

    每到国庆.过年期间,我国高速公路都是车云马龙,堵得水泄不通,有的人为了避免堵塞,专门提前上高速,但自从安了etc后,很多人表示会扣费,那高速免费etc可以提前上高速吗?免费时间是按入口算还是出口算? ...

  3. 【数据结构与算法】之深入解析“迷宫中离入口最近的出口”的求解思路与算法示例

    一.题目要求 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示).同时给你迷宫的入口 entrance ,用 entrance ...

  4. LeetCode 1926. 迷宫中离入口最近的出口(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示). 同时给你迷宫的入口 ent ...

  5. 迷宫中离入口最近的出口问题

    最近在刷力扣,遇到了这么一个问题跟大家分享一下 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示).同时给你迷宫的入口 ent ...

  6. c语言入口及出口参数说明,麻烦帮忙指出一下这个函数的入口参数和出口参数呀!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 void Delete(student_info * * Head) { int flag=1; int number; student_info * p ...

  7. c语言入口参数和出口参数,麻烦帮忙指出一下这个函数的入口参数和出口参数呀!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 void Delete(student_info * * Head) { int flag=1; int number; student_info * p ...

  8. C语言子程序调用的入口参数和出口参数,C语言与DOS系统接口技术

    C语言与DOS系统接口技术 C语言是中级语言,用C语言实现DCB系统功能调用接口较简单.本文介绍C语言与DOS系统接口实用技术的几个关键问 (本文共2页) 阅读全文>> 介绍了一种用CPL ...

  9. 在阿里云容器服务上基于Istio实现出口Egress流量管理

    概述 在前面的文章中,介绍了在阿里云容器服务上基于Istio如何实现东西向流量管理. 回顾下引用的示例: 该样例应用由四个单独的微服务构成,用来演示多种 Istio 特性.该应用模仿某银行金融产品的一 ...

最新文章

  1. WebConfig自定义节点并读取
  2. 微信网页授权功能来获取用户信息(昵称或头像)之php实现
  3. 基于GCCAVR的TLC2543读写程序----模拟SPI方式实现
  4. 您是否敢更改HashMap实现?
  5. sql where 1=1 妙用之一方面
  6. 被全球 iPhone 用户讨伐 49 天后,苹果终于为 iOS 带来手动关闭降频功能!
  7. shallow clone
  8. ArcGIS API For JS 之Symbol
  9. 第四十二节,configparser特定格式的ini配置文件模块
  10. MySQL — 创建表,插入数据,更新数据,删除数据
  11. Java prepare
  12. 关于javascript中时间格式和时间戳的转换
  13. 多投资机构点评神州信息2019业绩:看好金融信创,给出增持评级!
  14. 将本地数据库中的数据上传到云服务器数据库
  15. 美容院管理系统高效管理门店店务?
  16. kindle索引_Kindle 卡索引问题解决方法汇总
  17. 《爱的五种能力》读书笔记
  18. useragent android,获取android默认的useragent
  19. 关于Unity下载资源默认下载到C盘,更改到其他盘的方法
  20. python 窗体控件_python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐(二)...

热门文章

  1. arcgis10之生成无背景色的png图片
  2. 74LVC245电平转换电路
  3. C语言实现根据考试成绩等级,打印百分制分数段
  4. 当你已经25:男生女生都该看
  5. 网易汪源:网易产品体验好,离不开AI驱动
  6. 区块链再度走入沉寂期,下一个撬动行业的支点会在哪里?
  7. OCSP 在SSL证书中起什么作用
  8. Linux 桌面玩家指南:02. 以最简洁的方式打造实用的 Vim 环境
  9. Java Grammar(二):运算符
  10. English - Grammar(未完)