Udp Checksum Offload

在服务端抓包,然后在wireshark上分析,发现wireshark提示:udp checksum字段有问题 checksum 0x… incrorect should be 0x.. (maybe caused by udp checksum offload) 以前我从未遇到过udp checksum的问题。所以这次是第一次遇到,所以需要学习一下。 首先udp checksum是什么? 我们看下udp的协议组成的字段,其中就有16位的校验和 校验和一般都是为了检验数据包在传输过程中是否出现变动的。 如果接受端收到的udp消息校验和错误,将会被悄悄的丢弃 udp校验和是一个端到端的校验和。端到端意味它不会在中间网络设备上校验。 校验和由发送方负责计算,接收端负责验证。目的是为了发现udp首部和和数据在发送端和接受端之间是否发生了变动 udp校验和是可选的功能,但是总是应该被默认启用。 如果发送方设置了udp校验和,则接受方必须验证 发送方负责计算?具体是谁负责计算 计算一般都是CPU的工作,但是有些网卡也是支持checksum offload的。 所谓offload, 是指本来可以由cpu计算的,改变由网卡硬件负责计算。 这样做有很多好处, 可以降低cpu的负载,提高系统的性能 网卡的硬件checksum, 效率更高 为什么只有发送方出现udp checksum 错误? 我在接受方和放松方都进行了抓包,一个比较特殊的特征是,只有发送方发现了udp checksum的错误,在接受方,同样的包,udp checksum的值却是正确的。 一句话的解释:tcpdump在接收方抓到的包,本身checksum字段还没有被计算,在后续的步骤,这个包才会被交给NIC, NIC来负责计算。 结论 maybe caused by udp checksum offload 这个报错并没有什么问题。 参考 ● 《tcp/ip 详解》 ● https://www.kernel.org/doc/html/latest/networking/checksum-offloads.html ● https://dominikrys.com/posts/disable-udp-checksum-validation/ ● https://sokratisg.net/2012/04/01/udp-tcp-checksum-errors-from-tcpdump-nic-hardware-offloading/

2022-06-30 00:00:00 · 1 min · Eddie Wang

Wireshark 附带的19命令行程序

大多数时候我们都是图形界面的方式使用wireshak, 其实一般只要你安装了wireshark,同时也附带安装了一些命令行工具。 这些工具也可以极大的提高生产效率。 本文只是对工具的功能简介,可以使用命令 -h, 查看命令的具体使用文档。 1. editcap 编辑抓包文件 Editcap (Wireshark) 3.6.1 (v3.6.1-0-ga0a473c7c1ba) Edit and/or translate the format of capture files. 举例: 按照时间范围从input.pcap文件中拿出指定时间范围的包 editcap -A '2014-12-10 10:11:01' -B '2014-12-10 10:21:01' input.pcap output.pcap 2. androiddump 这个命令似乎可以用来对安卓系统进行抓包,没玩过安卓,不再多说。 Wireshark - androiddump v1.1.0 Usage: androiddump --extcap-interfaces [--adb-server-ip=<arg>] [--adb-server-tcp-port=<arg>] androiddump --extcap-interface=INTERFACE --extcap-dlts androiddump --extcap-interface=INTERFACE --extcap-config androiddump --extcap-interface=INTERFACE --fifo=PATH_FILENAME --capture 3. ciscodump 似乎是对思科的网络进行抓包的,没用过 Wireshark - ciscodump v1.0.0 Usage: ciscodump –extcap-interfaces ciscodump –extcap-interface=ciscodump –extcap-dlts ciscodump –extcap-interface=ciscodump –extcap-config ciscodump –extcap-interface=ciscodump –remote-host myhost –remote-port 22222 –remote-username myuser –remote-interface gigabit0/0 –fifo=FILENAME –capture ...

2022-06-30 00:00:00 · 3 min · Eddie Wang

vfs_cache_pressure和min_free_kbytes对cache的影响

环境 kernal Linux 5.15.48-1-MANJARO #1 SMP PREEMPT Thu Jun 16 12:33:56 UTC 2022 x86_64 GNU/Linux docker 20.10.16 初始内存 total used free shared buff/cache available 内存: 30Gi 1.9Gi 19Gi 2.0Mi 9.6Gi 28Gi 交换: 0B 0B 0B 初始配置 sysctl -n vm.min_free_kbytes 67584 sysctl -n vm.vfs_cache_pressure 200 vfs_cache_pressure的对内存的影响 vfs_cache_pressure设置为200, 理论系统倾向于回收内存

2022-06-29 06:57:56 · 1 min · Eddie Wang

manjaro 安装 packettracer

# 将会下载packettracer到当前目录下 yay -G packettracer cd packettracer # Download PacketTracer_731_amd64.deb to this folder makepkg sudo pacman -U packettracer-7.3.1-2-x86_64.pkg.tar.xz 注意,如果下载的packetraacer包不是PacketTracer_731_amd64.deb, 则需要修改PKGBUILD文件中的, souce对应的文件名。 例如我下载的packettracer是Cisco_Packet_Tracer_811_Ubuntu_64bit_cf200f5851.deb source=('local://Cisco_Packet_Tracer_811_Ubuntu_64bit_cf200f5851.deb' 'packettracer.sh') 注意:最新版的packertracer打开后,必须登陆账号才能使用,有点坑。 花费点时间注册了账号后,才能用。 参考 https://forum.manjaro.org/t/how-to-get-cisco-packet-tracer-on-manjaro/25506/5

2022-06-15 18:54:11 · 1 min · Eddie Wang

Linux内核参数rp_filter

问题现象 主机上有两个网卡ens192和ens224。ens129网卡是对内网络的网卡,ens224是对网网络的网卡。 SIP信令阶段都是正常的,但是发现,对于来自node3的RTP流, 并没有从ens192网卡转发给node1上。 sequenceDiagram title network autonumber node1->>ens192: INVITE ens224->>node2: INVITE node2->>ens224: 200 ok ens192->>node1: 200 ok node1->>ens192: ACK ens224->>node2: ACK node1-->>ens192: RTP out ens224-->>node3: RTP out node3-->>ens224: RTP in 抓包程序抓到了node3发送到ens224上的包,但是排查应用服务器的日志发现,似乎应用服务器根本没有收到node3上过来的包, 所以也就无法转发。 因而怀疑是不是在内核上被拦截了。 后来通过将rp_filter设置为0, 然后语音流的转发就正常了。 事后复盘 node3的这个IP直接往应用服务器上发包,可能会被拦截。因为在信令建立的阶段,应用服务器并没有主动发 在kernel文档上 rp_filter - INTEGER 0 - No source validation. 1 - Strict mode as defined in RFC3704 Strict Reverse Path Each incoming packet is tested against the FIB and if the interface is not the best reverse path the packet check will fail. By default failed packets are discarded. 2 - Loose mode as defined in RFC3704 Loose Reverse Path Each incoming packet's source address is also tested against the FIB and if the source address is not reachable via any interface the packet check will fail. Current recommended practice in RFC3704 is to enable strict mode to prevent IP spoofing from DDos attacks. If using asymmetric routing or other complicated routing, then loose mode is recommended. The max value from conf/{all,interface}/rp_filter is used when doing source validation on the {interface}. Default value is 0. Note that some distributions enable it in startup scripts. 参考 https://www.jianshu.com/p/717e6cd9d2bb https://www.jianshu.com/p/16d5c130670b https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

2022-06-13 00:00:00 · 1 min · Eddie Wang

mysql placeholder的错误使用方式

Error EXTRA *mysql.MySQLError=Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘? ( 然而我仔细看了看sql语句,没有看出来究竟哪里有sql报错。 然而当我把作为placeholder的问号去掉,直接用表的名字,sql是可以直接执行的。我意识到这个可能是和placeholder有关。 搜索了一下,看到一个链接 https://github.com/go-sql-driver/mysql/issues/848 Placeholder can’t be used for table name or column name. It’s MySQL spec. Not bug of this project. 大意是说,placeholder是不能作为表名或者列名的。 在mysql关于prepared文档介绍中,在允许使用prepared的语句里,没有看到create table可以用placeholderhttps://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html prepared语句的优点有以下几个 优化查询速度 防止sql注入 但是也有一些限制 不是所有语句都能用prepared语句。常见的用法应该是作为select where之后的条件,或者INSERT语句之后的值 不支持一个sql中多条查询语句的形式

2022-06-11 23:51:34 · 1 min · Eddie Wang

WebRTC 人声检测与舒适噪音

人声检测 VAD 人声检测(VAD: Voice Activity Detection)是区分语音中是人说话的声音,还是其他例如环境音的一种功能。 除此以外,人声检测还能用于减少网络中语音包传输的数据量,从而极大的降低语音的带宽,极限情况下能降低50%的带宽。 在一个通话中,一般都是只有一个人说话,另一人听。很少可能是两个人都说话的。 例如A在说话的时候,B可能在等待。 虽然B在等待过程中,B的语音流依然再按照原始速度和编码再发给A, 即使这里面是环境噪音或者是无声。 A ----> B # A在说话 A <--- B # B在等待过程中,B的语音流依然再按照原始速度和编码再发给A 如果B具有VAD检测功能,那么B就可以在不说话的时候,发送特殊标记的语音流或者通过减少语音流发送的频率,来减少无意义语音的发送。 从而极大的降低B->A的语音流。 下图是Wireshark抓包的两种RTP包,g711编码的占214字节,但是用舒适噪音编码的只有63字节。将近减少了4倍的带宽。 舒适噪音生成器 CNG 舒适噪音(CN stands for Comfort Noise), 是一种模拟的背景环境音。舒适噪音生成器在接收端根据发送到给的参数,来产生类似接收端的舒适噪音, 用来模拟发送方的噪音环境。 CN也是一种RTP包的格式,定义在RFC 3389 舒适噪音的payload, 也被称作静音插入描述帧(SID: a Silence Insertion Descriptor frame), 包括一个字节的数据,用来描述噪音的级别。也可以包含其他的额外的数据。早期版本的舒适噪音的格式定义在RFC 1890中,这个版本的格式只包含一个字段,就是噪音级别。 噪音级别占用一个字节,其中第一个bit必须是0, 因此噪音级别有127中可能。 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ |0| level | +-+-+-+-+-+-+-+-+ 跟着噪音级别的后续字节都是声音的频谱信息。 Byte 1 2 3 ... M+1 +-----+-----+-----+-----+-----+ |level| N1 | N2 | ... | NM | +-----+-----+-----+-----+-----+ Figure 2: CN Payload Packing Format 在SIP INVITE的SDP中也可以看到编码,如下面的CN ...

2022-06-01 08:27:53 · 2 min · Eddie Wang
千与千寻

Hugo博客常见问题以及解决方案

如何在markdown中插入图片 在static 目录中创建 images 目录,然后把图片放到images目录中。 在文章中引用的时候 ![](/images/qianxun.jpeg#center) Warning 我之前创建的文件夹的名字叫做 img, 本地可以正常显示,但是部署之后,就无法显示图片了。 最后我把img改成images才能正常在网页上显示。

2022-05-28 21:08:43 · 1 min · Eddie Wang

Shell 教程技巧

复制文本到剪贴板 sudo apt install xclip vim ~/.zshrc alias copy='xclip -selection clipboard' 这样我们就可以用copy命令来考本文件内容到系统剪贴板了。 copy aaa.txt 判断工作区是否clean if [ -z "$(git status --porcelain)" ]; then # Working directory clean else # Uncommitted changes fi

2022-05-28 12:39:50 · 1 min · Eddie Wang

C和gdb调试

开启coredump #如果该命令的返回值是0,则表示不开启coredump ulimit -c # 开启coredump ulimit -c unlimited 准备c文件 #include<stdio.h> void crash() { char * p = NULL; *p = 0; } int main(){ printf("hello world 1"); int phone [4]; phone[232] = 12; crash(); return 0; } 编译执行 gcc -g hello.c -o hello ./hello 之后程序崩溃,产生core文件。 gdb分析 gdb 启动的二进制文件 core文件 gdb ./hello ./core 之后输入: bt full 可以查看到更详细的信息 ➜ c-sandbox gdb ./hello ./core GNU gdb (Raspbian 7.12-6) 7.12.0.20161007-git Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "arm-linux-gnueabihf". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./hello...done. [New LWP 25571] Core was generated by `./hello'. Program terminated with signal SIGSEGV, Segmentation fault. #0 0x0001045c in crash () at hello.c:6 6 *p = 0; (gdb) bt full #0 0x0001045c in crash () at hello.c:6 p = 0x0 #1 0x00010490 in main () at hello.c:13 phone = {66328, 0, 0, 0}

2022-05-28 12:35:26 · 1 min · Eddie Wang