一、HTTP协议描述
在OSI网络模型,HTTP协议运行于网络层,交换数据由以下几步
- client向server发送request
- server从socket里读取request
- server生成response
- server将response写入socket
- client从socket里读取response
socket由二元组 (ip, port) 组成,client, server端各自管理一个socket, 使用这个socket发送消息;因为总是client先发出request,server才会回复response,所以
- server必须一直运行(因此得名server)
- client必须知道server的(ip, port)
二、HTTP协议内容
request和response是具有一定格式的信息,计算机通过网络传输的为01011101这样的二进制串,它们是有意义的字符串(图片、视频等)通过编码得到的,HTTP协议的实现,从socket里读取信息的时候,一般将其解码为人类可读的字符串,字符串的格式和部分内容,由HTTP协议规定。
# Request内容如下
GET / HTTP/1.1 # 请求行 Request-Line
Host: www.hello.com # 请求头 headers(CRLF*2)
# Response内容如下
HTTP/1.1 200 OK # response-line
Content-Length: 3059 # headers
Server: whttp/1.0
Date: Sat, 11 Jan 2003 02:44:04 GMT
Content-Type: text/plain
Cache-control: private
Connection: keep-alive
hello world! # response body
关于request:
请求方法,method,常用的有 get, post, put, delele, options, head, 亦可以定制;method 表示 client希望对资源做什么操作,一般来说,get表示查看资源,post表示建立新资源,每个method都有约定适应的场合。
请求的资源位置,由URL标志,URL格式如下
"http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
其中 host, port 体现再headers中,请求时,host首先转变为ip;之后的abs_path体现在 request-line 中
关于response:
状态码,status code,三位的数字,表示server对client所请求的资源的简略回复。200一般表示请求到了,404则表示未找到,500表示这个请求把server弄乱了。
response body,表示server回复的实际内容。
至此,client取得了server的回应,不管client是否满足,HTTP这个工具兢兢业业地发挥了自己地作用。满足client,是server的事情,可能server可以满足,但不想满足;也可能server鞠躬尽瘁,也满足不了client。
三、HTTP协议的实现
空谈误国,实干兴邦。HTTP只有用在实践中,才能在人民群众里实现它的价值,哇哈哈。
选择golang语言来实现。
HTTP协议的实现,一般包含常用的功能,大家称之为框架。这个框架取名为 whttp 因为我姓王wang : )
四、HTTP实现测试
功能测试
telnet localhost 80 (回车)
GET /questions HTTP/1.0
Host: localhost(两次回车)
查看返回的内容
也可以通过浏览器打开 localhost 查看
性能测试
待议
五、参考
HTTP协议标准 https://tools.ietf.org/html/rfc2616
Gin框架 gin-gonic/gin
golang相关源代码