Yifei Kong

Nov 15, 2018

HAR 格式解析

HAR(HTTP Archive) 文件是一种常见的用来保存 HTTP 请求和响应的格式。本质上,HAR 文件其实就是一个 JSON 文件。

每一个 HAR Entry 都可以有以下记录存在:

  • log
  • creator
  • browser
  • pages
    • pageTimings
  • entries
    • request
      • queryString
      • postData
      • params
    • response
      • cookies
      • headers
      • content
    • cache
    • timings

log

这个是一个 HAR 文件的根字段,其他字段都是该字段的子字段

{
    "log": {
        "version" : "1.2",
        "creator" : {},
        "browser" : {},
        "pages": [],
        "entries": [],
        "comment": ""
    }
}

creator

"creator": {
    "name": "Firebug",
    "version …

Aug 02, 2018

网络协议概述

网络每层的头部基本上就是添加上本层的地址,还有一些校验和控制位

运输层的 MAC 地址是点到点的,没传递一次就会把发送者和接受者用 ARP 转换,替换为经过的路由器的MAC地址。而 IP 层的地址和端口号是端到端,从发送到结束始终不变。除非经过上层协议改变了地址和端口号,比如代理服务器或者 NAPT 路由器。

交换机没有任何地址,只有端口的概念。内部有一个转发表,记录了物理端口和MAC的对应关系,通过自主学习来建立。每台主机上都有自己的高速 ARP 地址缓存和路由表。可以通过 ip nip r 命令查看。

VLAN 可以理解为逻辑上将一台交换机分割成数台虚拟交换机,且这些虚拟交换机互不相通。Vlan 是广播域,而通常两个广播域之间由路由器相连接,广播域之间来往的数据帧通过路由器中继。因此 Vlan间的通信也需要路由器(或者三层交换机)提供中继服务,即“Vlan间路由”。

Jul 15, 2018

OAuth2 协议详解

今天有个项目需要用到 OAuth2 来处理一些东西,然而中文互联网有时候真是很难找到像样的文档,搜索 “OAuth 教程” 的到排名前两位的都是翻译自一个英文教程,翻译质量奇差无比就不说了,这个英文教程本身就是有问题的,无奈只好搜索 “OAuth tutorial” 才找到几个看得过去的英文教程,总结一下放在这里,算是为中文互联网引入一些正确的知识。

看到 OAuth2 这个词,一般人肯定会想,是不是还有个 OAuth 1 协议呢?是的,有 OAuth 1 协议,但是因为协议搞得太复杂了,所以没人用,市面上的基本都是根据 OAuth 2 来的。既然实际只有一个 OAuth,以下就简称 OAuth 了。

为什么要使用 OAuth —— 一个例子

大家最熟悉的例子就是第三方登录了。假设有个论坛叫做“91论坛”你没有注册过 …

Jul 10, 2018

Get 和 Post 方法的选择和URL的设计

HTTP 中常用的方法有 GET/POST/PUT/DELETE 等,在设计API或者表单的时候我们需要选择合适的方法。一般有两种方案:

  1. 只使用 GET 和 POST,GET 主要用来读取数据,POST 用来创建或者更新数据。
  2. RESTful的方法,GET/POST/PUT/DELETE 分别用来增删改查。

URL 的设计

为了探讨两种方案,首先我们来看一下 URL 的设计。URL 是 Universal Resource Locator 的缩写,也就是一个 URL 表示的是唯一的一个资源,所以这个资源的 id 或者说主键应该是放在 URL 路径中的。

比如一个好的设计:

http://example.com/post/1234

不好的设计 …

Apr 13, 2018

Linux 上的 DNS 缓存

Linux 内核中没有 DNS 缓存

Firefox 内置了 DNS 缓存

nscd 可以提供本地的 DNS 缓存,好多机器开了,但是据说这个服务有很多问题。

Python 使用了 getaddrinfo 函数,会使用系统的 DNS 缓存

nslookup 和是dig这样的工具会 bypass 掉 DNS 缓存。

另外 Go 语言好像也不会使用本机的 DNS 缓存,即使开了

https://wiki.archlinux.org/index.php/dnsmasq 可以用来做本地缓存

还可以使用systemd提供的resolved

1 https://stackoverflow.com/questions/11020027/dns-caching-in-linux …

Apr 04, 2018

Linux 中的 epoll 和 nginx 中的应用

epoll 的优势

select 和 poll 每次获取可读写的描述符都需要遍历所有的文件描述符,它们的时间复杂度都是 O(n),而 epoll 是基于回调的,每个 socket 上有事件发生都会调用回调函数放到 epoll 的就序列表中,因此 epoll_wait 只需要简单地读取这个列表,所以epoll的时间复杂度是 O(1) 的。

添加监控的socket只需要使用 epoll_ctl 添加一次,而获取消息 epoll 使用 mmap 加速内核与用户态的消息传递,不需要每次都把 socket 在内核态和用户态之间考来考取。

epoll 的工作模式

epoll 中有两个模式,水平触发(LT)和边缘触发(ET)。其中水平触发如果不做任何操作,就会一直触发,而边缘触发只会触发一次。就好比电工电子里面的两种触发模式。默认模式是 LT

Level …

Sep 04, 2017

HTTP 认证介绍

周末给一个库添加http代理的支持,发现对http basic auth不甚了解,阅读了一下相关的文档,写篇备忘。

http 中的认证主要是 basic auth 和 digest auth 两种,其中 digest auth 比较复杂,而且也没有提升安全性,已经不建议使用了。

RFC 7235 [1] 描述了客户端(通常是浏览器)和服务器如何通过http进行身份认证的一些机制。客户端和 http代理之间也可以使用 http auth 来做验证。  

验证流程

  1. 当客户端访问一个页面时,如果只有验证后才能访问,或者验证后有更多内容,服务器应该发送 401 Unauthorized,提出一个chanllenge,设定 WWW-Authenticate header,并指定验证的 type 和 realm,具体定义下文有讲。
  2. 客户端这时通常应该提示用户输入密钥,一般是浏览器弹出用户名密码对话框供用户填写,然后使用 …

May 30, 2017

May 30, 2017

基础 socket 编程

创建与使用 socket, 一个 echo server 和 client

socket 客户端的四个步骤:

  1. 使用 socket 函数创建连接
  2. 使用 connect 连接到服务器
  3. 使用 send 和 recv 接收和发送消息
  4. 使用 close 关闭连接

第一步 创建一个 TCP socket int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 返回的 sock 可以看做一个 handle, 本质上是一个文件描述符( file descriptor) , 小于0表示错误

表示 socket 地址的结构 sockaddr_in, 其中 in 表示 internet, 不是input …

May 30, 2017

HTTP 缓存介绍

和缓存相关的 header 共有如下几种

  • Pragma
  • Cache-Control
  • Expires
  • Last-Modified
  • Etag
  • If-Modified-Since
  • If-Non-Match

Expires 由服务器返回,用于指定当前页面过期时间,使用绝对时间表示。

Cache-Control 指定了相对过期的时间,由当前时间多久后过期的秒数表示。

Cache-Control: max-age=86400

Last-Modified 是由服务器给出了文档的过期时间,当第二次请求该文档的时候,浏览器可以使用 If-Modified-Since 头部指定该过期时间,如果文档还没有过期,那么服务器应该返回 304,否则返回 200 和新文档。

Etag 是由服务器给出的文档的哈希值,当第二次请求该文档的时候,浏览器可以使用 If-None-Match 头部指定该哈希值,如果文档没有变动,那么服务器应该返回 304,如果有变动,那么哈希值也变了,应该返回 200 和新文档。

可以看出 Etag 相比 Last-Modified …

Next → Page 1 of 2