这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记。
HTTP协议基础
HTTP协议是什么
HTTP:超文本传输协议 HTTP 超文本传输协议
超文本 传输 协议 三部分
-
协议:HTTP是用在计算机中的协议 使用计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上参与者),以及==相关控制和错误处理的方式(行为约定和规范)
-
传输: HTTP 双向协议 数据两端之间传输 允许中转与接力
HTTP是一个在计算机世界里面专门用来在
两点间传输数据的约定和规范 -
超文本 -> 超越普通文本的文字 -> 典型HTML
为什么需要协议
- 需要明确的边界,协议何时开始,协议何时结束
- 需要知道协议能够携带哪些信息,和信息的消息类型
协议里面有什么
请求行/状态行
请求头/响应头
请求体/响应体
- 请求行:方法名,url,协议版本
- 状态行:协议版本,状态码,状态码描述(1XX:信息类,2XX:成功,3XX:重定向,4XX:客户端错误,5XX:服务端错误)
- 请求头:请求的元数据,包括长度或者业务逻辑所需要的数据等
- 响应头:响应的元数据
- 请求体:请求的数据内容
- 响应体:响应的数据内容
HTTP常见状态码
HTTP常见字段
host字段
有了 Host 字段,就可以将请求发往「同一台」服务器上的不同网站。
Content-Length
表示本次回应的数据长度
Connection
常用于客户端要求服务器使用TCP持久连接 以便其他请求复用
HTTP/1.1 默认持久连接 ->兼容老版本
Connection: keep-alive
Content-Type
说明客户端发送的格式
Content-Type: text/html; charset=utf-8
上面的类型表明,发送的是网页,而且编码是UTF-8。
客户端请求的时候,可以使用 Accept 字段声明自己可以接受哪些数据格式。
Accept: */*
Content-Encoding
表明服务器数据的压缩方式
Content-Encoding: gzip
上面表示服务器返回的数据采用了 gzip 方式压缩,告知客户端需要用此方式解压。
客户端在请求时,用 Accept-Encoding 字段说明自己可以接受哪些压缩方法。
text Accept-Encoding: gzip, deflate
HTTP协议的请求流程
路由层的作用是将请求分发给对应的处理函数
传输层是进行数据的传输
HTTP框架的设计与实现
分层设计
优点:高内聚,低耦合,易复用,高扩展性
性能修炼之路
针对网络库的优化
go net:存下全部Header,系统调用次数多,不能复用内存,不能多次读(header过大,一次读不完)
优点:对于流式友好,小包性能高
netpoll:存下全部Header,拷贝出完整的Body
优点:由底层进行buffer管理,所以中大包性能高,时延低