自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(107)
  • 资源 (3)
  • 收藏
  • 关注

原创 chromium源码学习-调试日志 LOG

ClassName 是 LogMessage,因此这里 COMPACT_GOOGLE_LOG_EX_INFO 代表的是 ::logging::LogMessage 类的构造方法,构造方法里调用 Init 方法初始化了一些调试信息比如文件名,行号,时间戳等,保存在 std::ostringstream 类型的成员变量 stream_ 中,LOG_STREAM 这个宏最中就是返回了这个 stream_对象。在学习 chromium 源码时,我们经常需要增加调试日志,常见的用法一般是。二、进阶用法【未完待续】

2024-04-02 17:40:46 833

原创 详解 gQUIC 加密握手算法(quic-crypto)中共享密钥的生成过程

1、基本概要QUIC 传输的数据几乎都是要加密的,关于加密算法这里不做介绍,加密必然需要用到密钥;QUIC 中的加密密钥有两个 initial key 和 forword-secure key。前者用于实现 0-RTT 的握手,后者则用于握手成功以后整个会话的数据加密;QUIC 的密钥使用 Diffe-Hellman 算法生成;2、解析Diffe-Hellman 算法的密钥生成过...

2019-12-17 23:14:21 7745 4

原创 【翻译】Chromium 网络栈 disk cache 设计原理

原文链接1、概览The disk cache stores resources fetched from the web so that they can be accessed quickly at a latter time if needed. The main characteristics of Chromium disk cache are: ·The cache s...

2019-12-02 21:17:46 879

原创 手机移动端网卡信息获取原理分析

有些场景我们需要获取当前手机上的网卡信息(如双卡双待、Wifi等)。本文准备研究一下这块的原理,以便更好的掌握相关技术原理。1、底层系统接口 getifaddrs使用 getifaddrs 接口可以达到我们的目的,该接口会返回本地所有网卡的信息,详细介绍可以查阅官方文档:https://man7.org/linux/man-pages/man3/getifaddrs.3.html。2、存在的问题-虚拟网卡虚拟网卡是什么, 怎么去掉返回结果中的虚拟网卡3、关于网卡的常识3.1 网卡名称,对应 if

2024-04-15 16:18:06 449 1

原创 移动端网络库行业动态-整理

cronet 裁剪,quic 包加解密的 hook,2021.12。cronet 多端统一,2021.11。cronet 接入实践,2023.10。

2024-04-11 17:45:34 244

原创 ubuntu 更改 ssh 默认端口 22 以加固安全

进入台式机,修改 /etc/ssh/sshd_config 文件中的 Port 配置行,将 22 改为 8022,保存修改后,重启 ssh 服务。出于加固安全考虑,一般公司会禁用 ssh 的 22 端口号,因此我们需要改为其他端口。在家(非办公网)也可以登录了。1、ssh 命令行登录。2、vscode 登录。3、scp 拷贝文件。

2024-04-11 12:01:20 360

原创 chromium 协议栈 cronet ios 开启 H3

ma=2592000’,代表 h3 的版本为 h3-29,支持 h3 的域名为h3.baidu.com,端口为 443,该 header 有效期为 2592000 秒(30天),如果 enable_quic 为 true,该 alt-svc 配置则会保存供对应域名(www.example.com)的后续请求使用,如果为 false,则该配置则被忽略,即无效。cronet 原生代码有一个 h3 开启的全局开关,开启后,只需要服务端下发 h3 的域名和版本信息,即可开始与 tcp 竞速开启。

2024-04-10 15:30:33 252

原创 chromium 协议栈 cronet ios 踩坑案例

修改 ios/net/protocol_handler_util.mm 的 GetNSURLResponseForRequest 方法中处理 content-type 的部分,针对域名分策略处理,比如策略一,cronet 将 server 下发的所有 content-type 返回给上层;cronet 官方源码:https://source.chromium.org/chromium/chromium/src/+/main:ios/net/protocol_handler_util.mm;

2024-04-10 15:03:06 1257

原创 HarmonyOS 和 OpenHarmony

HarmonyOS 和 OpenHarmony 支持的 shell 命令不同,因此有时候需要做一做区分,目前有些文档上没有标注,因此可能产生歧义。

2024-04-02 17:27:19 474

原创 chromium 源码学习笔记

什么时候该配置块生效,查找代码发现 src/build/config/BUILDCONFIG.gn 中通过 //build/config:release 引用了该配置块,使得它生效,而生效前提是 is_debug 为 false。位置:src/build/config/BUILD.gn,定义在 “release” 的 config 配置块中。is_official_build 也定义在 BUILDCONFIG.gn 中,默认值为 false。1、NDEBUG 宏。

2024-03-28 16:53:30 287

原创 cronet 网络库 oc c++ 类交互过程

2024-03-22 11:42:05 110

原创 ios 错误码上报调用栈

【代码】ios 错误码上报调用栈。

2024-03-20 14:56:59 94

原创 cronet 库各个调用栈记录

【代码】cronet 库各个调用栈记录。

2023-11-06 19:08:27 191

原创 chromium 项目单测调试经验

1、单测chromium 原生的单测程序能尽早地暴露我们在对网络库进行定制化开发过程中会引发的 Bug,因此认真对待单测可为网络库定制化开发保驾护航。1.1 确认代码迁移引起的 case跑 NQE、QUIC 迁移后的统一网络库的单测程序 net_unittests,出现较多 fail 和 少数 crash 的 case; 从 fail case 看,与迁移的代码看起来无直接关联,因此直接阅读源码来定位原因显得较为困难且耗时可能比较长;那么首先要做的是,确认这些 case 是因为代码迁移引起的,所以需

2021-06-19 12:22:02 1017 2

原创 Quic 客户端加密握手写流程及 QUIC packet 的构造过程

先来看 2:WriteOrBufferData()该函数在三种情况下无动作,即非 fin 包,但是待发数据为空fin 包已经缓存了,说明理论上不再有数据需要发送了写端已经关闭从名字可以看出,该函数要么写数据要么缓存数据。实际上是先将待发数据缓存到 stream 对象的 send_buffer 中,然后再发送。这里用到了宏 GetQuicReloadableFlag(flag),它又用到了另一个宏 RELOADABLE(flag):GetQuicReloadableFlag(flag) .

2021-02-02 17:24:57 1908

原创 chromium 中 quic 模块警报器 QuicAlarm 介绍

1. 位置2. 构成3. 用法3.1 测试用例3.2 实际应用——以 QuicConnection 类为例3.2.1 ack_alarm_ 构建3.2.2 QuicConnection 的使用4. 总结1. 位置该类的定义在 quic/src/net/quic/core/quic_alarm.h 中。2. 构成该类是一个虚基类。构造函数只有一个:explicit QuicAlarm(QuicArenaScopedPtr delegate);上面 explicit .

2021-02-02 17:08:00 528

原创 相关编译参数用途介绍

fvisibility-inlines-hidden:由于 inline 标识的函数不一定可用,因此需要将标识为 inline 的方法隐藏,从而不可被外部访问。比如在生成静态库的头文件时,不会有 inline 标识的方法。fno-rtti:rtti(运行时类型识别)用于识别基类指针所指向的实际派生类类别,该功能需要在编译阶段输出相关信息来实现这一功能,而 no-rtti 可以减少不必要的编译工作。std=gnu++14,同 std=c++14,但前者支持 GNU extensions,两..

2021-02-02 16:59:22 749

原创 在 Ubuntu 虚拟机上编译 libquic 遇到的错误及解决过程记录

编译命令: -DCMAKE_BUILD_TYPE=Debug …问题:1、当前 cmake 版本:2.8.12.2在位置 libquic/src/third_party/boringssl/src/CMakeLists.txt:403 出现错误:Parse error. Expected “(”, got newline with text "".原因:该位置用了多行注释的语法 “#[[]]”,该语法在 cmake3.0+ 中才支持。解决:手动使用单行注释 #。2、Could not .

2021-02-02 16:53:55 1298

原创 CMake 编译错误:Objects of target “ssl“ referenced but is not an OBJECT library

1、问题描述libquic 支持最新 chromium 代码的过程中,发现 boringssl 库编译错误。2、解决过程下载最新的 boringssl 代码,在本地成功编译,因此可尝试用最新的 boringssl 代码替换现有代码来编译,但是在编译 libquic 时,出现如下错误:CMake Error at CMakeLists.txt:925 (add_library): Error evaluating generator expression: $<TARGET_O

2021-02-02 16:41:59 1259

原创 文件打开:open,出现 EACCES:permission denied

今天在 mac 上测试下载服务端的一个图片文件,发现之前能成功创建本地文件的代码,突然出现拒绝访问的错误,此时文件打开的代码如下:int fd = open("./test.jpg", O_RDWR|O_APPEND|O_CREAT);int errnum = errno;if(fd < 0) {LOG(ERROR) << "file ./test.jpg open failed, errno is: " << errnum << ", details:

2021-01-26 17:15:25 3133

原创 ffmpeg 拉流出现 Name or service not known

最近发现线上华为云机器出现拉流失败的日志,拉取的是 flv 流,即走的是 http 协议:错误日志:[tcp @ 0x49f85c0] Failed to resolve hostname proxy-hls.duowan.com: Name or service not known通过在机器上抓包 dns 数据发现,在 dns 响应到达之前 ffmpeg 出现了上述错误,显然 ffmpeg 中出现了超时,从抓包数据看,dns 响应超过 2 秒 ffmpeg 就会出现超时;翻阅 ffmpeg 文

2021-01-15 18:58:54 1798 2

原创 centos7.6 拉取 chromium 源码仓库记录

centos 7.6,内存 1G,4核cpu,64 位1、安装 depot_toolsgit clone https://chromium.googlesource.com/chromium/tools/depot_tools.gitexport PATH="$PATH:/path/to/depot_tools"mkdir ~/chromium && cd ~/chromiumfetch --nohooks chromium // 编译 linux 平台库时使用这个命令拉取代码,

2020-09-16 19:38:32 641

原创 安卓 Cronet 库关键类继承关系图

cronet 库 java 层主要的三个关键类分别如下图,梳理了类的继承关系:

2020-08-17 15:58:57 350

原创 QUIC BBR Cubic 效果对比【无线场景】

【兄弟篇:有线场景下的对比】TCP 在较高丢包率场景不能较好的工作,因此对比试验不包含 TCP,只对比 QUIC-cubic 和 QUIC BBR 在不同丢包率、延时场景下的上传时长(单位:秒),上传文件大小为 7.6M,网络环境为办公室无线网络,测试机器为 17 款 MacBook pro 13-inch。实验数据分析:1、在无丢包且延时小于 10ms 场景下,bbr 相比 cubic 并不占优势;2、根据实验 3,在无丢包、高延时场景下,bbr 与 cubic 都变得较差,但 bbr 较好于 c

2020-06-18 16:55:28 2309

原创 QUIC BBR Cubic 效果对比【有线场景】

TCP 在较高丢包率场景不能较好的工作,因此对比试验不包含 TCP,只对比 QUIC-cubic 和 QUIC BBR 在不同丢包率、延时场景下的上传时长(单位:秒),上传文件大小为 7.6M,网络环境为北京7层办公室有线网络。实验数据分析:1、根据实验 1,未设置丢包模拟时,quic bbr 的稳定性和上传速度均好于 quic cubic;2、根据实验 2,在丢包率和延时均增大时,quic bbr 和 quic cubic 表现均变差,但前者的稳定性和速度仍优于后者3、对比实验 2 和实验 4

2020-06-18 16:39:24 2350 6

原创 shell 脚本易错点记录

今天需要完成一个 nginx 服务的启停控制脚本,是服务可以一键完成启动、停止、重载等功能。完成脚本的过程中会遇到一些老朋友, 但许久不见再见面还是会感到陌生,因此记录一下以加深记忆。1. “[: =: unary operator expected”看下我这里出错的脚本行. /etc/sysconfig/network# Check that networking is up.[ ${NETWORKING} = "no" ] && exit 0这几行的目的是,source

2020-05-27 15:49:23 303

原创 安卓 cronet 库 JNI ERROR (app bug): local reference table overflow (max=512)

1、问题背景由于定位问题需要,将 cronet 库中 quic 部分的 LOG_LEVEL 为 -3 级别的日志一并通过回调函数输出了,但导致了 cronet 库的崩溃,崩溃的直接原因是输出日志过多,导致了 jni 层的局部引用表溢出。那么肯定是代码中使用局部引用的次数过多、过频繁,并且未及时释放这些局部引用,从而导致了崩溃。2、问题定位、解决2.1 问题分析首先需要了解什么样的局部引用会导致这样的问题,以及这些局部引用如何释放,以及合适的释放时间点局部引用包括 FindClass 返回的

2020-05-14 19:54:41 595

原创 服务器上很多 ffmpeg 进程未及时结束导致大量占用内存

最近在 pre 机器上过滤 ffmpeg 进程时,发现有 200 多个 ffmpeg 进程,立即去线上看了下,发现线上机器没有该现象, 仔细看了下这些进程在做的事,完整命令如下:/usr//bin/ffmpeg -fflags nobuffer -i rtmp://127.0.0.1:1938/biz-live-pre/23b526a7ae60ce1589278154368 -vframes 1 -an -f rawvideo -ss 0 -y -f image2 /www/live/biz-live

2020-05-13 10:32:45 3976

原创 执行命令时加 sudo 出现 error while loading shared libraries: cannot open shared object file

最近在为直播系统增加三方转推功能时, 发现服务在执行转推命令时出现错误:/usr/local/ffmpeg/3.1.2/bin/ffmpeg: error while loading shared libraries: liblenthevcenc.so: cannot open shared object file: No such file or directory当时登录物理机,执行上面的 ffmpeg 命令,并未有错,如图:但注意到我登录时执行的身份是普通用户, 而服务是以 sudo 方式

2020-05-11 14:09:55 2447

原创 golang runtime.Caller(skip int) 介绍

函数原型,及官方描述:func Caller(skip int) (pc uintptr, file string, line int, ok bool)// 函数用途Caller reports file and line number information about function invocations on the calling goroutine's stack. 参数:The argument skip is the number of stack frames to as

2020-05-10 16:52:23 1569

原创 编译 cronet android 库时出现 Template collision【contains a template "split_static_library"】

该错误出现在执行 ./components/cronet/tools/cr_cronet.py gn --debug --out_dir=out/debug-Cronet 时,错误提示已经比较明显了, 就是在两个不同的文件中定义了相同的模板,通过对比这两个文件可知,v8/gni/split_static_library.gni 和 build/split_static_library.g...

2020-04-27 19:12:01 1960 2

原创 梳理 golang 项目源码时的几点收获

今天在看一个 golang 项目的源码时,有几个地方没明白,然后顺手谷歌了一会,初步知道了原因。1、验证结构体是否实现了某个接口假设接口如下:type IModule interface { Name() string Version() string}某个需要实现该接口的结构体如下:type StatModule struct {}现在的问题是,如何确保 StatModu...

2020-04-16 11:00:56 209

原创 业务反馈服务内网地址出现 502 错误问题排查

有业务端反馈直播建流服务内网地址出现 502 Bad Gateway 错误,并且公网访问是正常的。502 错误是服务端未及时响应导致客户端出现超时,在有代理的情况下,是代理访问后端服务出现超时,业务端请求的访问路径如下:业务端 ——> nginx 代理 ——> 建流服务超时有两种可能,建流服务忙碌,未及时响应;另外就是没有访问到正确的建流服务,而是一个监听相同端口的其他服务。...

2020-03-29 22:23:40 1032

原创 在 jenkins 环境源码编译 nginx 时提示 PCRE not found

跟 jenkins 维护同事确认了 pcre 库已安装,但是仍然出现该错误,后 google 到可能是因为缺少 pcre-devel 库导致,安装 xxx-devel 会安装相应库的头文件目录,如果没有 pcre-devel 包,即使安装了 pcre 库也会提示找不到该库,后联系同事帮忙安装后,编译 nginx 成功。检查是否安装相应软件:rpm -qa | grep pcre参考链接...

2020-03-23 15:01:47 665

原创 chromium 源码赏析之委托模式

在阅读 chromium 网络栈源码时,经常需要去跟踪类中的 delegate_ 成员具体的类别,后来发现这应该是某种设计模式,因此拿出设计模式书籍看了下经典的 23 种设计模式,发现有可能相关的是观察者模式和访问者模式,但在仔细了解了这两种模式后,发现 delegate_的设计并不属于这两种,而跟委托模式比较像:先来看 delegate_ 的设计方式,下面是 chromium 的源码:...

2020-03-14 15:52:33 337

原创 使用 logrotate 切割服务日志

后端开发常遇到的一个问题是,服务产生的日志文件过大,在使用日志文件排查问题时,如果文件过大,会降低排查问题的效率;而且不对文件进行切割,就没法单独的压缩较久远的日志,浪费磁盘空间下面介绍 linux 下常用的日志切割工具 logrotate 的使用。linux 系统默认安装了 logrotate,通常由 cron 程序定时执行,执行周期是一天;可以查看 cron 的执行日志来确认 logr...

2020-02-13 12:47:48 466

原创 控制 nginx 启停的两种方式以及二进制 nginx 文件升级介绍

nginx 启动时会启动一个主进程,和一个或多个工作进程,前者主要是读取并检查配置文件的合法性;后者则处理实际的请求。控制 nginx 有两种方式,一种是用 kill 发送信号到 nginx 的主进程(即 nginx.pid 中保存的进程号);另一种则是使用 nginx -s signal;1. 方式一:kill -s signal PID主进程和工作进程都可以接收 kill 发送的信号,区...

2020-02-08 16:37:11 919

原创 改造 cronet 库使得 安卓 release SDK 可以捕获 cronet 库 QUIC 相关日志实践

1、背景介绍在我们移动端文件上传场景中,尝试使用 QUIC 协议来优化上传效果,为了准确的分析上传失败的任务,需要建立上传任务与 QUIC 连接的关联性,当前每个上传任务结束时,或失败或成功都会上报一条日志,我们打算在启用了 QUIC 的上传任务中,增加一个字段保存 QUIC 相关信息,比如连接 ID、连接建立的日志、连接关闭的日志等,QUIC 连接关闭时会带上详细的关闭原因,帮助分析 QUIC...

2020-01-14 16:33:50 931

原创 【翻译】ietf-quic-draft-24: 9. Connection Migration

英文原文链接: 9. Connection Migration 连接 ID 的使用允许连接在端点改变地址(IP和端口)时可以继续使用,比如发生了网络切换。这一节描述发生地址改变的一端的处理过程。 QUIC 的设计依赖与在握手期间保持一个固定的地址。端点不可以在握手完成之前开始连接迁移(详见 QUIC-TLS 4.1.2)。 如果在握手期间对端发送了传输参数 disable_ac...

2020-01-11 14:34:11 468

原创 理解传输协议支持更多选择确认段时能 keep more bytes on the wire

最近重读谷歌 2017 年发表的 QUIC 论文时,针对 QUIC 支持更多选择确认段这一特性,提到由于该特性 QUIC 可以 keep more bytes on the wire,我一开始的理解是更多选择确认段应该是让发送端能更具体的知道哪些包丢了,从而重发这些包,避免重发冗余的包,因而觉得应该是 less bytes 而不是 more bytes。因此尝试搜索资料或者想前辈请教,最后得知...

2020-01-09 13:57:04 265

shell、UNIX、GNU、Posix、BSD、SVR 4 相关概念梳理图

shell、UNIX、GNU、Posix、BSD、SVR 4 相关概念梳理图。

2018-11-17

libevent和http服务端

http服务端, 解析客户端上传的资源类型,并在本地保存相应类型及名称的文件,

2016-12-26

Linux的高级路由和流量控制

当你根据这篇文档大致了解了Linux在IP方面的功能后,绝对是“it really blew me away!”。会发现以前一直是把Linux当成UNIX来用,Linux本身很多精彩的功能都被忽略了。Linux在路由方面的设计的确非常独到。 但愿这篇文章的内容能够对您应用Linux有所帮助。

2014-09-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除