tcp 连接的整个过程如图所示:
-
客户端发出SYNC包:客户端一般是通过connect系统调用来发出 SYN 的,这里牵涉到本机的系统调用和软中断的 CPU 耗时开销
-
SYN传到服务器:SYN从客户端网卡被发出,这是一次长途远距离的网络传输
-
服务器处理SYN包:内核通过软中断来收包,然后放到半连接队列中,然后再发出SYN/ACK响应。主要是 CPU 耗时开销
-
SYC/ACK传到客户端:长途网络跋涉
-
客户端处理SYN/ACK:客户端内核收包并处理SYN后,经过几us的CPU处理,接着发出ACK。同样是软中断处理开销
-
ACK传到服务器:长途网络跋涉
-
服务端收到ACK:服务器端内核收到并处理ACK,然后把对应的连接从半连接队列中取出来,然后放到全连接队列中。一次软中断CPU开销
-
服务器端用户进程唤醒:正在被accpet系统调用阻塞的用户进程被唤醒,然后从全连接队列中取出来已经建立好的连接。一次上下文切换的CPU开销
参考
https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/13-tcpconnlat