自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(232)
  • 资源 (11)
  • 收藏
  • 关注

原创 在C代码调用C++代码

由于历史原因,以及不同开发人员的技术偏好,C语言和C++语言都有一些独有的非常有价值的项目,因而两种语言的互操作,充分利用前人造的轮子是一件非常有价值的事情。C++代码调用C代码很简单,只要分别在包含的C头文件的开头和结尾加上如下的两个块:#ifdef __cplusplusextern "C" {#endif和#ifdef __cplusplus}#endif即可。然而为了支

2017-08-17 10:38:16 410

原创 UDT协议实现分析——连接的建立

UDT Server在执行UDT::listen()之后,就可以接受其它节点的连接请求了。这里我们研究一下UDT连接建立的过程。连接的发起来看连接的发起方。如前面我们看到的那样,UDT Client创建一个Socket,可以将该Socket绑定到某个端口,也可以不绑定,然后就可以调用UDT::connect()将这个Socket连接到UDT Server了。来看UDT::connect()的定

2017-08-17 10:38:13 1850

原创 UDT协议实现分析——bind、listen与accept

UDT Server启动之后,基于UDT协议的UDP数据可靠传输才成为可能,因而接下来分析与UDT Server有关的几个主要API的实现,来了解下UDT Server是如何listening在特定UDP端口上的。主要有UDT::bind(),UDT::listen()和UDT::accept()等几个函数。bind过程通常UDT Server在创建UDT Socket之后,首先就要调用UDT

2017-08-17 10:38:10 770

原创 UDT协议实现分析——UDT Socket的创建

UDT API的用法在分析 连接的建立过程 之前,先来看一下UDT API的用法。在UDT网络中,通常要有一个UDT Server监听在某台机器的某个UDP端口上,等待客户端的连接;有一个或多个客户端连接UDT Server;UDT Server接收到来自客户端的连接请求后,创建另外一个单独的UDT Socket用于与该客户端进行通信。先来看一下UDT Server的简单的实现,UDT的开发者

2017-08-17 10:38:07 3259 1

原创 UDT协议实现分析——UDT初始化和销毁

UDT协议是一个用于在高速Internet上传输大量数据的基于UDP的可靠传输协议。我们可以将UDT协议的实现看作一个比较复杂的状态机。更准确的说,是一个主状态机,外加多个子状态机。主状态机是指协议实现中全局唯一、全局共享的状态与数据结构,主要对应于CUDTUnited类。子状态机则是对于一次UDT连接或一个Listening的UDT Server的抽象,是UDT自己创建的Socket抽象,一个

2017-08-17 10:38:04 561

原创 Chromium Android开发的Eclipse配置

单次的Eclipse配置这一节包含第一次启动Eclipse时需要的设置步骤。你应该只需浏览这个部分一次,即使你切换了workspaces。启动Eclipse。它可以通过如下的两种方式启动:在Ubuntu的主菜单,选择 Applications > Programming > Eclipse 4.5在命令行中,输入 eclipse45选择你硬盘上的某个位置作为 workspac

2017-08-17 10:38:01 246

原创 使用LeakTracer检测android NDK C/C++代码中的memory leak

Memory issue是C/C++开发中比较常遇到,经常带给人比较大困扰,debug起来又常常让人无从下手的一类问题,memory issue主要又分为memory leak,野指针,及其它非法访问等问题。在android平台上,使用NDK开发C/C++ code,由于没有其它成熟的平台,如Windows,Linux等上面可用的许多工具,使得memory issue变得更为棘手。问题存在,那解

2017-08-17 10:37:58 984 1

原创 OkHttp3中的HTTP/2首部压缩

当前网络环境中,同一个页面发出几十个HTTP请求已经是司空见惯的事情了。在HTTP/1.1中,请求之间完全相互独立,使得请求中冗余的首部字段不必要地浪费了大量的网络带宽,并增加了网络延时。以对某站点的一次页面访问为例,直观地看一下这种状况:Header 1Header 2如上图,同一个页面中对两个资源的请求,请求中的头部字段绝大部分是完全相同的。"User-Agent" 等头部字段通

2017-08-17 10:37:55 2034 1

原创 Caddy Web服务器QUIC部署

Caddy 简介Caddy是一个Go语言写的,易于使用的通用Web服务器。它具有如下的一些功能:配置简单:Caddy服务器的运行可以通过Caddyfile配置文件进行配置,Web服务配置起来非常简单。自动的HTTPS:它可以自动地为我们申请 Let's Encrypt 域名证书,管理所有的密码学设施,并进行配置。HTTP/2:默认支持HTTP/2(由Go标准库支持)虚拟主机托管

2017-08-17 10:37:52 5547

原创 在Android中使用FlatBuffers

总览先来看一下 FlatBuffers 项目已经为我们提供了什么,而我们在将 FlatBuffers 用到我们的项目中时又需要做什么的整体流程。如下图::.jpg在使用 FlatBuffers 时,我们需要以特殊的格式定义我们的结构化数据,保存为 .fbs 文件。FlatBuffers 项目为我们提供了编译器,可用于将 .fbs 文件编译为Java文件,C++文件等,以用于我们的项目。F

2017-08-17 10:37:49 1510

原创 在Android中使用Protocol Buffers

网络性能优化的终极手法就是不通过网络传输,但这常常是不可能的。但我们还是可以通过对网络传输的数据本身做优化,来获得更好的性能,性能就应该从每一个可能的地方榨取。这里来看一下 Protocol Buffers 。Protocol Buffers 是一个序列化结构数据的灵活、高效且自动化的机制——类似于XML,但更小,更快,更简单。定义一次结构化数据的方式,然后就可以使用专门生成的代码简单地写入,或

2017-08-17 10:37:46 923

原创 在Java中使用Protocol Buffers

这份教程为Java开发者提供了使用 Protocol Buffer 的基本介绍。通过创建一个简单的示例应用,它展示了在 .proto 文件中定义消息格式。使用 Protocol Buffer 编译器。使用Java Protocol Buffer API读写消息。这不是一个在Java中使用 Protocol Buffer 的全面指南。更多详细的信息,请参考Protocol Buffer

2017-08-17 10:37:43 2035

原创 在C++中使用Protocol Buffers

下载并编译Protocol Buffer这份教程为C++开发者提供了使用 Protocol Buffer 的基本介绍。通过创建一个简单应用,它展示了在 .proto 文件中定义消息格式。使用 Protocol Buffer 编译器。使用C++ Protocol Buffer API读写消息。这不是一个在C++中使用 Protocol Buffer 的全面指南。更多详细的信息,请参考

2017-08-17 10:37:41 1205

原创 Protobuf开发者指南

欢迎访问 Protocol Buffers ——一个用于通信协议、数据存储及其它场景中,语言无关、平台无关、可扩展的结构化数据序列化方法——的开发者文档。本文档是为那些想要在自己的应用中使用 Protocol Buffers 的Java、C++或Python开发者而写的。这份概述介绍 Protocol Buffers ,并告诉你如何将它用起来——然后你可以通过 教程 继续学习,或深入了解 Pr

2017-08-17 10:37:38 255

原创 HTTP/2 流量调试

当前主要可以通过浏览器和Wireshark等工具调试HTTP/2流量。使用浏览器调试HTTP/2流量HTTP/2 引入二进制分帧层(Binary Framing),将每个请求和响应分割为更小的帧,并对它们进行二进制编码。与此同时,HTTP/2 沿用之前 HTTP/1.1中的绝大部分语义,上层应用基本上感知不到 HTTP/2 的存在。通过浏览器提供的网络调试工具我们可以清晰地看到请求和响应的详细

2017-08-17 10:37:35 1650

原创 非对称加密与证书

SSL/TLS是一个密码学协议,它的目标并不仅仅是网页内容的加密传输。SSL/TLS的主要目标有四个:加密安全、互操作性、可扩展性和效率。对于安全性的保障,它还会从多个方面进行,包括机密性,真实性以及完整性。机密性是指,传输的内容不被除通信的双方外的第三方获取;真实性是指,通信的对端正是期待的对端,而不是其它第三方冒充的;完整性则是指,传输的数据是完整的,数据没有被篡改或丢失。为了平衡多种需求,S

2017-08-17 10:37:32 5032

原创 OkHttp3的连接池及连接建立过程分析

如我们前面在 OkHttp3 HTTP请求执行流程分析 中的分析,OkHttp3通过Interceptor链来执行HTTP请求,整体的执行过程大体如下:OkHttp Flow这些Interceptor中每一个的职责,这里不再赘述。在OkHttp3中,StreamAllocation是用来建立执行HTTP请求所需网络设施的组件,如其名字所显示的那样,分配Stream。但它具体做的事情根据是

2017-08-17 10:37:29 3236 1

原创 Cronet android 设计与实现分析——备选服务机制

前面我们分析到,在URLRequestHttpJob::StartTransactionInternal()中,会通过URLRequestContext的HttpTransactionFactory创建HttpTransaction,在URLRequestContextBuilder::Build()中创建HttpTransactionFactory的过程如下: storage->set_ht

2017-08-17 10:37:26 1320

原创 使用QUIC

QUIC是Google新开发的一个基于UDP的协议,它提供了像TCP一样的传输可靠性保证,可以实现数据传输的0-RTT延迟,灵活的设计使我们可以对它的拥塞控制及流量控制做更多的定制,它还提供了传输的安全性保障,以及像HTTP/2一样的应用数据二进制分帧传输。而QUIC协议最最吸引人的特性有两点,一是对队首阻塞问题的解决更为彻底。基于TCP的HTTP/2,尽管从逻辑上来说,不同的流之间相互独立,不

2017-08-17 10:37:23 3241

原创 OkHttp3中的代理与路由

HTTP请求的整体处理过程大体可以理解为,建立TCP连接。如果是HTTPS的话,完成SSL/TLS的协商。发送请求。获取响应。结束请求,关闭连接。然而,当为系统设置了代理的时候,整个数据流都会经过代理服务器。那么代理设置究竟是如何工作的呢?它是如何影响我们上面看到的HTTP请求的处理过程的呢?是在操作系统内核的TCP实现中的策略呢,还是HTTP stack中的机制?这里我们通过Ok

2017-08-17 10:37:20 3765

原创 用FlatBuffers提升Android平台上Facebook的性能

在Facebook上,人们可以通过阅读状态更新和查看照片同他们的家人和朋友来往。在我们的后端,我们保存了组成这些连接的社交图谱的所有数据。在我们的移动客户端,我们不能下载完整的图谱,而是以一个本地的树结构的形式下载一个节点及它的一些连接。下面的图片描述了在一个含有照片附件的story中这是如何工作的。在这个例子中,John创建了一个story,他的朋友们很喜欢它并加了评论。图片的左边是社交图谱,

2017-08-17 10:37:17 417

原创 在Android中使用FlatBuffers - 简介

JSON - 可能每个人都知道这个轻量的数据格式几乎被用在了所有的现代服务器中。相对于过去流行的一些东西,如可怕的XML,它更轻量,更可读,对开发更友好。JSON是语言独立的数据格式,但解析和格式转化,比如转为Java对象,耗费了我们的时间和内存资源。几天以前,Facebook宣布,在它的Android app中的数据处理部分获得了巨大的性能提升。那与 几乎在整个app中丢弃JSON格式,而用F

2017-08-17 10:37:14 425

原创 懒人chromium net android移植指南

Chromium浏览器的网络库是一个功能非常强大的网络库,它支持的网络协议非常多,除了常见的HTTP/1.1,它还支持HTTP/2,QUIC等比较新的协议。这里我们尝试将Chromium net网络库移植到Android平台,在我们的Android应用中跑起来。移植Chromium net网络库有两种方式,一是将Chromium net网络库及其依赖的所有其它库编译为动态链接库,将这些so导入我

2017-08-17 10:37:11 2940

原创 chromium net android移植

Chromium net是chromium浏览器及ChromeOS中,用于从网络获取资源的模块。这个网络库是用C++编写的,且用了大量的C++11特性。它广泛地支持当前互联网环境中用到的大量的网络协议,如HTTP/1.1,SPDY,HTTP/2,FTP,QUIC,WebSockets等;在安全性方面也有良好的支持,如SSL等;同时,针对性能,它也有诸多的优化,如引入libevent的基于事件驱动的

2017-08-17 10:37:08 2422

原创 Netty HTTP on Android

Netty是一个NIO的客户端服务器框架,它使我们可以快速而简单地开发网络应用程序,比如协议服务器和客户端。它大大简化了网络编程,比如TCP和UDP socket服务器。“快速而简单”并不意味着开发出来的应用可维护性或性能不好。Netty已经实现了大量的协议,比如FTP,SMTP,HTTP,以及各种基于二进制和文本的传统协议。可以说Netty已经找到了一种方法来实现简单的开发,高性能,稳定性,灵

2017-08-17 10:37:05 946

原创 chromium net库设计

总览网络栈主要地是一个单线程跨平台的库,主要负责资源获取。它的主要接口是URLRequest和URLRequestContext。URLRequest,正如它的名字所表明的那样,表示一个URL的请求。URLRequestContext包含实现URL请求所需的所有相关上下文,比如cookies,主机解析器,代理解析器,cache,等等。多个URLRequest对象可以共享相同的URLRequest

2017-08-17 10:37:02 761

原创 Chromium Android编译指南

先决条件需要有一台装有Linux操作系统环境的主机来做编译,这个环境的搭建配置方法可以参考Linux-specific build instructions。目前还不支持在其它(Mac/Windows)平台上来为Android编译Chromium。获取代码首先需要下载并安装depot_tools包。在一个适当得目录下clone depot_tools包:$ git clone https:

2017-08-17 10:36:59 684

原创 EventBus设计与实现分析——订阅者的注册

前面在 EventBus设计与实现分析——特性介绍 一文中介绍了EventBus的基本用法,及其提供的大多数特性的用法,这让我们对EventBus为用户提供的主要功能有了大体的了解,为我们后续理解EventBus的设计决策提供了良好的基础。这里我们就开始深入到EventBus的实现细节,先来了解其中的订阅者注册的过程。订阅者的注册EventBus使用了一种类似于闭包的机制来描述订阅者。即对于E

2017-08-17 10:36:56 258

原创 OkHttp3 HTTP请求执行流程分析

OkHttp3的基本用法使用OkHttp3发送Http请求并获得响应的过程大体为:创建OkHttpClient对象。OkHttpClient为网络请求执行的一个中心,它会管理连接池,缓存,SocketFactory,代理,各种超时时间,DNS,请求执行结果的分发等许多内容。创建Request对象。Request用于描述一个HTTP请求,比如请求的方法是"GET"还是"POST",请求的UR

2017-08-17 10:36:53 3497

原创 EventBus设计与实现分析——事件的发布

前面在 EventBus设计与实现分析——特性介绍中介绍了EventBus的基本用法,及其提供的大多数特性的用法;在EventBus设计与实现分析——订阅者的注册 中介绍了EventBus中订阅者注册的过程。这里就继续分析EventBus的代码,来了解其事件发布的过程。事件的发布如我们前面已经了解到的,在EventBus中,有两种不同类型得事件,一种是普通事件,事件被通知给订阅者之后即被丢弃,

2017-08-17 10:35:51 227

原创 EventBus设计与实现分析——特性介绍

EventBus是一个 发布/订阅 模式的消息总线库,它简化了应用程序内各组件间、组件与后台线程间的通信,解耦了事件的发送者和接收者,避免了复杂的、易于出错的依赖及生命周期问题,可以使我们的代码更加简洁、健壮。在不使用EventBus的情况下,我们也可能会使用诸如 Observable/Observer 这样得一些机制来处理事件的监听/发布。如果在我们的应用程序中,有许多地方需要使用事件的监听/

2017-08-17 10:35:48 336

翻译 JNI 技巧

JNI 是指 Java 本地层接口(Java Native Interface)。它为用 Java 语言编写的受控代码定义了一种与本地层代码(用 C/C++ 编写)交互的方式。它是厂商无关的,其支持从动态共享库加载代码,尽管有时笨重,但它仍是有效的。如果你对它还不熟悉,可以阅读 JNI规范(Java Native Interface Specification) 来获得对它的更多了解,了解 JNI

2017-08-16 19:51:02 1549

QUIC 加密协议规范中文版

QUIC 是一种新型的高效的安全的网络协议。这份文档是 QUIC 的加密协议的规范中文版翻译。

2018-07-23

HPACK 协议规范中文版

HTTP/2 协议的一些关键特性包括:二进制分帧,连接复用,首部压缩等。首部压缩是 HTTP/2 用于减少多请求执行时数据传输量的方法。这份文档是 HTTP/2 首部压缩部分,即 HPACK 的协议规范。

2018-07-23

HTTP/2规范中文版

这份文档是 HTTP/2 协议 RFC 规范的中文版翻译,协议规范完整定义了 HTTP/2 协议的行为和特性。

2018-07-23

Real-Time Streaming Protocol Version 2.0

Real-Time Streaming Protocol Version 2.0 协议规范

2017-08-19

RTP Payload Format for H.264 Video

RTP 传输 H.264 视频的 IETF 规范。

2017-08-19

OpenGL ES 2 for Android

OpenGL ES应用开发实践指南 的英文原版

2017-08-19

Advance Bash Scripting Guide

Advance Bash Scripting Guide

2007-11-04

Programming Perl

Programming PerlProgramming PerlProgramming Perl

2007-11-04

GNU Linux Tools Summary

GNU Linux Tools GNU Linux Tools SummarySummaryGNU Linux Tools Summary

2007-11-04

BSD Hacks

BSD HacksBSD HacksBSD Hacks

2007-11-04

空空如也

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

TA关注的人

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