苏苏的博客

简约至极

关于HTTP协议的基本知识

http 状态码

101

204 206

304 301 302 307

404 413 416

502 503

nginx 444

http://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

使用CURL调试网络请求

copy as curl

curl 用法

curl -I url 发送一个HEAD请求,常用于查看HTTP消息头

有时候HEAD请求和GET请求后端的处理逻辑不一样,我们可以使用下面的命令

查看GET请求的响应头而忽略其响应体.在调试的时候非常有用.

普通get请求,

curl -o /dev/null url -v

curl -i url 完整输出响应头和响应正文.

curl -i https://www.baidu.com

http response

http 协议

第一部分:请求行,第一行明了是post请求,以及http1.1版本。

第二部分:请求头部,第二行至第六行。

第三部分:换行

第四部分:请求数据

返回

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。

手动拼接一个http协议

telnet test.share.ourwill.cn 80

打开一个tcp链接

最简单的GET请求

GET / HTTP/1.1
Host: test.share.ourwill.cn

Host 用于表明要请求的是哪个主机

Http1.1 默认是keep-alived 的, 一个TCP链接传送完一个完整的http请求后不会主动断开链接.

GET / HTTP/1.0
Host: test.share.ourwill.cn

而http1.0 会主动断开链接.

post

formdata

url-encode

json-data

https://github.com/koajs/bodyparser/blob/master/index.js

https://github.com/expressjs/body-parser/blob/master/lib/read.js

上传文件

form data 形式

upload file

这个Chrome 并没有全部显示上传文件的细节,下面一部我们抓包显示具体的数据.

curl 'http://media.suconghou.cn/upload.php' -H 'Origin: http://127.0.0.1:8088' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8,en;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryMMPAAfYDlAnUIPcT' -H 'Accept: text/html, */*; q=0.01' -H 'Referer: http://127.0.0.1:8088/' -H 'Connection: keep-alive' --data-binary $'------WebKitFormBoundaryMMPAAfYDlAnUIPcT\r\nContent-Disposition: form-data; name="file0"; filename="QQ20170526-172149@2x.png"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundaryMMPAAfYDlAnUIPcT\r\nContent-Disposition: form-data; name="filelist"\r\n\r\nfile0\r\n------WebKitFormBoundaryMMPAAfYDlAnUIPcT\r\nContent-Disposition: form-data; name="key"\r\n\r\nvalue\r\n------WebKitFormBoundaryMMPAAfYDlAnUIPcT\r\nContent-Disposition: form-data; name="data"\r\n\r\n["hi","hello","set new data"]\r\n------WebKitFormBoundaryMMPAAfYDlAnUIPcT--\r\n' --compressed

添加

keep-alive

range

http://s1.bdstatic.com/r/www/cache/static/home/css/index.css

telnet s1.bdstatic.com 80

GET /r/www/cache/static/home/css/index.css HTTP/1.1
Host: s1.bdstatic.com
Range: bytes=1024-1034

正确响应206

如何得出416响应?

range 的大小是 end-start+1

wget -c --limit-rate=1k http://s1.bdstatic.com/r/www/cache/static/home/css/index.css

结合抓包同样能够观察到.

缓存控制

Cache-Control 按相对时间,实用性好,优先级高.

Expires 按绝对时间

Last-Modified/If-Modified-Since 对于静态资源文件非常适用,只能精确到秒.

ETag/If-None-Match hash校验不仅能适用于静态文件还能适用于动态生成的内容

ETag 的计算规则并不在HTTP中规定.

ETag有两种类型:强ETag(strong ETag)与弱ETag(weak ETag)。

“123456789” – A strong ETag validator

W/“123456789” – A weak ETag validator

强ETag 表明两个资源是完全一样的.

弱ETag 表明两个资源使用起来是等价的.

消息会话

cookie

cookie 有哪些属性?

cookie

secure cookie

session

sessionid

https http2

HTTP/2 over TCP (h2c)

http抓包

ngrep

sudo ngrep -W byline "css"

tcpdump

sudo tcpdump host media.suconghou.cn -v

http server

thttpd 编译

https://acme.com/software/thttpd/

centos7

wget https://acme.com/software/thttpd/thttpd-2.27.tar.gz
tar zxvf thttpd-2.27.tar.gz && cd thttpd-2.27
./configure && make

不到一分钟即可编译好. strip 后86KB (非静态编译) , thttpd 内存占用较小,rss显示1.5MB

busybox httpd 占用内存只有几十KB,简单的golang http sever内存占用在2MB左右

darkhttpd

另一个十分小巧的http server

https://unix4lyfe.org/darkhttpd/

curl -L unix4lyfe.org/gitweb/darkhttpd/blob_plain/HEAD:/darkhttpd.c | cc -O2 -o darkhttpd -xc -
darkhttpd . --port 8000

http://linux.bytesex.org/misc/webfs.html

http://proxydb.net/

一个端口转发

https://unix4lyfe.org/portfwd/

其他c语言的简易 http server

https://github.com/ankushagarwal/nweb 采用fork形式处理并发

curl -L raw.githubusercontent.com/ankushagarwal/nweb/master/nweb23.c | cc -O2 -o nweb -xc -
nweb 8000 .

https://github.com/shenfeng/tiny-web-server

curl -L raw.githubusercontent.com/shenfeng/tiny-web-server/master/tiny.c | cc -O2 -o tiny -xc -
tiny 8000