Nov 15, 2018
HAR(HTTP Archive) 文件是一种常见的用来保存 HTTP 请求和响应的格式。本质上,HAR 文件其实就是一个 JSON 文件。
每一个 HAR Entry 都可以有以下记录存在:
- log
- creator
- browser
- pages
- entries
- request
- queryString
- postData
- params
- response
- 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 n
和 ip r
命令查看。
VLAN 可以理解为逻辑上将一台交换机分割成数台虚拟交换机,且这些虚拟交换机互不相通。Vlan 是广播域,而通常两个广播域之间由路由器相连接,广播域之间来往的数据帧通过路由器中继。因此 Vlan间的通信也需要路由器(或者三层交换机)提供中继服务,即“Vlan间路由”。
Jul 15, 2018
今天有个项目需要用到 OAuth2 来处理一些东西,然而中文互联网有时候真是很难找到像样的文档,搜索 “OAuth 教程” 的到排名前两位的教程都是翻译自一个英文教程,翻译质量奇差无比就不说了,这个英文教程本身就是有问题的,无奈只好搜索 “OAuth tutorial” 才找到几个看得过去的英文教程,总结一下放在这里,算是为中文互联网引入一些正确的知识。
看到 OAuth2 这个词,一般人肯定会想,是不是还有个 OAuth 1 协议呢?是的,有 OAuth 1 协议,但是因为协议搞得太复杂了,所以没人用,市面上的基本都是根据 OAuth 2 来的。既然实际只有一个 OAuth,以下就简称 OAuth 了。
为什么要使用 OAuth —— 一个例子
大家最熟悉的例子就是第三方登录了。假设有个论坛叫做“91论坛”你没有注册过 …
Jul 10, 2018
HTTP 中常用的方法有 GET/POST/PUT/DELETE 等,在设计API或者表单的时候我们需要选择合适的方法。一般有两种方案:
- 只使用 GET 和 POST,GET 主要用来读取数据,POST 用来创建或者更新数据。
- RESTful的方法,GET/POST/PUT/DELETE 分别用来增删改查。
URL 的设计
为了探讨两种方案,首先我们来看一下 URL 的设计。URL 是 Universal Resource Locator 的缩写,也就是一个 URL 表示的是唯一的一个资源,所以这个资源的 id 或者说主键应该是放在 URL 路径中的。
比如一个好的设计:
http://example.com/post/1234
不好的设计 …
Apr 13, 2018
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
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 basic auth不甚了解,阅读了一下相关的文档,写篇备忘。
http 中的认证主要是 basic auth 和 digest auth 两种,其中 digest auth 比较复杂,而且也没有提升安全性,已经不建议使用了。
RFC 7235 [1] 描述了客户端(通常是浏览器)和服务器如何通过http进行身份认证的一些机制。客户端和 http代理之间也可以使用 http auth 来做验证。
验证流程
- 当客户端访问一个页面时,如果只有验证后才能访问,或者验证后有更多内容,服务器应该发送 401 Unauthorized,提出一个chanllenge,设定
WWW-Authenticate
header,并指定验证的 type 和 realm,具体定义下文有讲。
- 客户端这时通常应该提示用户输入密钥,一般是浏览器弹出用户名密码对话框供用户填写,然后使用 …
May 30, 2017
证书文件
the de facto SSL certs format is X.509 v3
it contains:
- version
- serial number
- algoirthm
- authority
- validate date
- orgnisation
- pubkey
- etc.
- sign, the ca signs the cert using its private key
May 30, 2017
创建与使用 socket, 一个 echo server 和 client
socket 客户端的四个步骤:
- 使用 socket 函数创建连接
- 使用 connect 连接到服务器
- 使用 send 和 recv 接收和发送消息
- 使用 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
和缓存相关的 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 …