陈日志 发布的文章

简介

抓包是分析网络协议、问题排查利器,tcpdump是Linux下的一款抓包工具。

分片

首先了解一个概念:MTU(最大传输单元),MTU是定义网络中报文的最大尺寸。如果报文大小超过MTU,则网络栈/网卡会自动将包拆分成多个分片进行发送,保证每个分片都小于MTU。

TCP协议会在三次握手时协商确认MSS(最大报文段长度),MSS选项是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。因此TCP报文通常不会被分片。

UDP协议面向无连接,没有协商等机制,依赖MTU来进行分片传输。当发送的数据大于MTU时,由网络栈/网卡会自动将包拆分成多个分片进行发送。

- 阅读剩余部分 -

import zipfile
import tools
import StringIO
import os


def zip_add_dir(handle, dirname):
    for root, dirs, fs in os.walk(dirname):
       for f in fs:
           if f.endswith(".py"):
               handle.write(os.path.join(root, f))

def pack():
    # toolname为项目名称,打包后会生成的文件
    toolname='ivrtool'
    buf_zip = StringIO.StringIO()
    buf_zip.write("#!/bin/env  python2\n")
                
    fzip= zipfile.ZipFile(buf_zip, "w")
    # 项目必须要有__main__.py,为执行入口
    fzip.write("__main__.py")
    # tools 为py源码目录,如有多个,需要都加入
    zip_add_dir(fzip, "tools")
    fzip.close()
    buf_zip.seek(0)
    handle=open(toolname, "w")
    while True:
        buf = buf_zip.read(1024)
        if not buf:
            break
        handle.write(buf)
    handle.close()
    buf_zip.close()
    print "%s pack success" % toolname

if __name__ == "__main__":
    pack()

我们知道在Windows下,默认文本文件的换行符为CRLF,即\r\n,人们称之为dos换行符。

这些文件在*nix(unix,Linux)系统中使用往往会报错,通常需要将dos换行符转换为*nix下能正常使用的unix换行符。

我们常常会使用dos2unix这个工具来完成转换工作,我们常常会遇到某些系统没有安装dos2unix工具,那么有没有其它工具可以实现相同效果呢?答案是有的,下面分享两个替代dos2unix的方法。

前置知识

  • dos换行符是\r\n,十六进制数值是:0D0A
  • unix换行符是\n,十六进制数值是:0A

方法一、使用sed替换法

sed -i 's/\r//g' path_to_file

sed -i 's/\x0d$//g' path_to_file

# 这两种写法都是一样的原理,都是把dos换行符\\r替换为空,即删除

方法二、cat+sed替换法

cat -vE path_to_file | sed 's/\^M\$$//g' > path_to_tmp_file
mv path_to_tmp_file path_to_file

# 这个方法是先把文件的换行符通过^M的方式显示出来,再把^M符号替换删除

方法三、vim替换法

vim path_to_file
:%s/^M//g
# 其中^M的输入方式为:先按Ctrl+V、再按Ctrl+M。这个方法只有当打开文件行尾显示^M时才有效,dos换行符和unix换行符混用的文件打开时会显示^M。

方法四、vim set ff法

vim path_to_file
:set ff=unix
:wq

# 这个是方法三的一个补充,用于纯dos文件

项目中使用到了RabbitMQ,使用了大量的一次性队列,然而没有设置自动过期、自动删除等特性。长期运行导致了大量的队列产生,非常影响性能及问题排查效率。这里收集了一些可以批量删除队列的方法,供参考。

方法一:设置过期策略

优点:操作简单,可针对有规律的队列进行策略设置
缺点:想不到有什么缺点

# 设置规则
rabbitmqctl set_policy delete_gen "amq.gen-.*" '{"expires":1}' --apply-to queues

# 取消规则
rabbitmqctl clear_policy delete_gen

# 如果要作用于所有队列
rabbitmqctl set_policy delete_all ".*" '{"expires":1}' --apply-to queues

方法二:重置数据库

优点:简单,删除全部队列
缺点:粗暴

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

方法三:删除vhost

优点:删除一个vhost的所有队列,包括Exchange
缺点:仅适用需要删除一个vhost的场景

curl -i -XDELETE http://USERNAME:[email protected]:15672/api/vhosts/VHOST_NAME
# 例子
curl -i -XDELETE http://admin:[email protected]:15672/api/vhosts/%2F

方法四:通过HTTP API删除

优点:HTTP API灵活
缺点:一次删一个

curl -i -XDELETE http://USERNAME:PASSWORD@HOST:PORT/api/queues/VHOST/QUEUE_NAME
# 例子:
curl -i -XDELETE http://admin:[email protected]:15672/api/queues/%2F/test_queue

方法五:使用rabbitmqadmin工具

优点:使用方便
缺点:底层也是使用HTTP API实现的

rabbitmqadmin --host=HOST --port=15672 --ssl --vhost=VHOST --username=USERNAME --password=PASSWORD delete queue name=QUEUE_NAME

tc命令——linux基于ip进行流量限制

原理部分参考多方文档进行整理,本文主要目的是记录几个限速的实例来进行直观认识和学习(git限速1、2)。

参考:

一、tc原理

Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。 接收包从输入接口进来后,经过流量限制丢弃不符合规定的数据包,由输入多路分配器进行判断选择:

  • 如果接收包的目的主机是本主机,那么将该包送给上层处理,否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。
  • 转发块同时也接收本主机上层(TCP、UDP等)产生的包,通过查看路由表,决定所处理包的下一跳。
  • 然后,对包进行排列以便将它们送到输出接口。

一般只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。

- 阅读剩余部分 -