Linux网络包发送过程

在遇到服务网络超时时,一般会通过 监控平台、Metric、Trace、ErrorLog来观察系统状态,来判断问题在哪里。

曾经有一次,负责的交易系统-下单模块调用下游的开城服务判断自提点是否在开城范围内,通过日志发现调他们超时了。

从日志监控概览看,有大量超时
日志dltag监控

从日志看,调运营单元确实超时了
日志监控-下单校验运营单元异常

但是他们却告诉我,他们接口耗时只有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是如何为网络包分配内存的