Linux网络包发送过程
在遇到服务网络超时时,一般会通过 监控平台、Metric、Trace、ErrorLog来观察系统状态,来判断问题在哪里。
曾经有一次,负责的交易系统-下单模块调用下游的开城服务判断自提点是否在开城范围内,通过日志发现调他们超时了。
从日志监控概览看,有大量超时
从日志看,调运营单元确实超时了
但是他们却告诉我,他们接口耗时只有3ms,而且日志有记录,日志里确实只有3ms
这个问题由多个原因导致,其中一个原因和网络发包有关,今天咱们来探讨一下,如果是交易系统-下单模块发包出现问题,怎么去排查并且定位问题?
先从一段简单的网络调用代码作为切入。
int main(){
//
fd = socket(AF_INET, SOCK_STREAM, 0);
// 绑定端口
bind(fd, ...);
// 监听
listen(fd, ...);
// 接收请求
cfd = accept(fd, ...);
// 接收用户请求
read(cfd, ...);
// 用户请求处理
process();
// 返回结果
send(cfd, buf, sizeof(buf), 0);
}
参考资料
[1] 开发内功修炼 - 25 张图,一万字,拆解 Linux 网络包发送过程
[2] 趣谈Linux操作系统 - 45 | 发送网络包(上):如何表达我们想让合作伙伴做什么?
[3] 趣谈Linux操作系统 - 46 | 发送网络包(下):如何表达我们想让合作伙伴做什么?
[4] 网络问题排查思路-网络链路篇
[5] Linux中一个网络包的发送/接收流程
[6] Linux内核中是如何表示网络包
[7] Linux是如何为网络包分配内存的