网络基础
1、七层网络模型与常见协议
2、网络架构图
3、互联网通讯协议架构
4、TCP / UDP
TCP:面向连接、错误重传、拥塞控制、适用于可靠性高的场景
UDP:不需要提前建立连接,实现简单,适用于实时性高的场景
5、Restful 软件架构风格
借助于 http 协议的基本请求方法代表资源的状态切换
get:获取资源
post:新增或更新资源
put:更新资源
delete:删除资源
6、RPC 协议
Remote Procedure Call,以本地调用的方式实现远程执行
Dubbo(阿里)
java 上高性能 RPC 协议,Apache 开源项目,由阿里捐赠
底层应用层协议支持 dubbo 缺省 tcp 协议、http、hessian、thrift、grpc 等
Dubbo 接口本质上也是属于 TCP/IP 技术栈
gRPC(Google)
高性能通用 RPC 框架,基于 Protocol Buffers(Google)
PB 是一个语言中立、平台中立的数据序列化框架,谷歌开源项目
Thrift(Facebook)
与 gRPC 类似的多语言 RPC 框架,Apache 开源项目
协议分析工具
网络监听(偏向于网络层)
TcpDump(命令行) + WireShark
代理 Proxy(代理应用层协议分析)
Charles(全平台)、安全测试 burpsuite(全平台 java)
mitmproxy(自动化测试 python)
fiddelr(windows)、AnyProxy(全平台)
协议客户端工具(主动发起请求)
curl(命令行)
postman(Chrome 插件&客户端 全平台)
1、网络监听
使用场景:用 tcpdump 抓包保存以后,使用 wireshark 界面工具分析。
tcpdump
$ sudo tcpdump -Al host www.baidu.com
参数
-x 十六进制展示
-w file 保存文件
表达式
ip tcp 协议
host 主机名
port 80 端口号
src(来源)& dst(目的地) 过滤
and or () 逻辑表达式
wireshark
wireshark Download[1]
界面展示
示例:请求百度后, TCP 连接建立过程
$ sudo tcpdump host www.baidu.com -w /tmp/tcpdump.log
# 需要输入电脑密码,开启新窗口发送请求
$ curl http://www.baidu.com
# 停止 tcpdump
# 启动 wireshark,点击文件夹图标,打开 tcpdump.log
三次握手与四次挥手
2、使用 chrome 开发者工具分析网络请求
Elements:抓取页面元素,做自动化测试经常使用
Console:控制台,可以在页面上与 JavaScript 交互
Sources:源代码面板,可以设置断点调试 JavaScript
Network:网络面板,用于 web 抓包,记录了每条网络操作的相关信息
Performance:录制页面性能数据
Memory:排查代码内存分配问题
Application:应用面板,使用资源面板检查加载的所有资源,包括 IndexedDB 与 Web SQL 数据库,本地和会话存储,cookie,应用程序缓存,图像,字体和样式表
Security:安全面板,用于调试混合内容、证书等问题
Lighthouse:用于提高网页质量,能够针对性能、可访问性、渐进式 Web 应用等进行审核
下图为 network 面板的功能注解。
3、curl 常见用法
# get
$ curl $url | jq
# post
$ curl -d '$body' $url
# proxy 代理网络请求
$ curl -x 'http://localhost:8080' $url
-H:消息头设置
-u:username:password 用户认证
-d:要发送的 post 数据,@file 表示来自于文件
--data-urlencode 'page_size=50':对内容进行编码
-G:把 data 数据当成 get 请求的参数发送,常与 --data-urlencode 结合使用
-o:写文件,用于下载
-x:代理 http、socks5
-v:verbose 打印更详细的日志
-s:关闭一些提示输出
通过 jq[2] 可以格式化 json 的输出内容,更加优雅。
4、Charles
过滤请求:Proxy - Recording Settings
弱网设置:Proxy - Throttle Settings
断点请求:Proxy - Breakpoint Settings
映射请求:Tools - Map Remote&Local
重写请求:Tools - Rewrite
5、mitmproxy
演示:当请求百度域名的时候,会自动打印信息。
import mitmproxy.http
from mitmproxy.tools.main import mitmdump
class Events:
def request(self, flow: mitmproxy.http.HTTPFlow):
"""
The full HTTP request has been read.
"""
flow_url = flow.request.url
if "baidu" in flow_url:
# 还可以做其他操作,比如修改搜索词 等
print(f"{'-'*10} 哈哈哈 {'-'*10}")
addons = [
Events()
]
if __name__ == '__main__':
# 使用 debug 模式启动 mitmdump
# 端口需要使用字符串
mitmdump(['-p', '8080', '-s', __file__])
不仅可以代理请求,最重要的是可以自定义脚本进行二次开发,实现很多代理工具做不到的事情。
参考资料
[1]
wireshark download: https://wireshark.en.softonic.com
[2]jq: https://github.com/stedolan/jq
end