Socket数据发送调用流程
2021-05-21 12:43:40 0 举报
Socket数据发送调用流程
作者其他创作
大纲/内容
neigh_resolve_output
struct file
struct proto sk_prot
NET_TX_SOFTIRQ
arp_constructor
tcp_write_xmit
IP层
raise_softirq_irqoff
ip_finish_output
struct socket
private_data
IP层调用ip_finish_output后会进入MAC层。MAC层需要ARP获得MAC地址,因而要调用__neigh_lookup_noref查找属于同一个网段的邻居,它会调用neigh_probe发送ARP广播包。有了MAC地址,就可以调用dev_queue_xmit发送二层网络包了,它会调用__dev_xmit_skb会将请求放入队列。
Socket层
网络包的发送会触发一个软中断NET_TX_SOFTIRQ来处理队列中的数据。这个软中断的处理函数是net_tx_action。在软中断处理函数中,会将网络包从队列中拿下来,调用网络设备的传输函数ix_gb_xmit_frame,将网络包发到设备的队列上去。
__neigh_lookup_noref
netdev_start_xmit
sch_direct_xmit
neigh_event_send
Sock层
dst_output
MAC层
从struct file里面的private_data得到struct socket,根据里面ops的定义,调用inet_sendmsg函数。
fib_lookup
ip_tables
ip_route_output_ports
struct sock
write
封装IP头
wirte系统函数调用找到struct file,根据里面的file_operations的定义,调用sock_write_iter函数。sock_write_iter函数调用sock_sendmsg函数。
arp_send_dst
ixgb_xmit_frame
file_operation
tcp_transmit_skb
dev_queue_xmit
struct sock *sk
从struct socket里面的sk得到struct sock,根据里面sk_prot的定义,调用tcp_sendmsg函数。
neigh_probe
TCP层
VFS层
struct proto_ops *ops
tcp_sendmsg函数会调用tcp_write_xmit函数,tcp_write_xmit函数会调用tcp_transmit_skb,在这里面实现了TCP层面向连接的逻辑。
sock_sendmsg
__neigh_create
选举路由
封装TCP头
__netif_reschedule
扩展struct sock,得到struc inet_connection_sock,根据里面icsk_af_ops,调用ip_queue_xmit函数。ip_route_output_ports函数里面会调用fib_lookup查找路由表。FIB全称是Forwarding Information Base,转发信息表,也就是路由表。在IP层里面要做的另外一个事情就是封装IP头。在IP层还要做的一件事情就是通过hook函数执行iptables规则。
struct inet_connection_sock_af_ops
ip_local_out
ip_output
struct proto tcp_prot={.name=\"TCP\
拥塞控制
neigh_output
net_tx_action
__dev_xmit_skb
滑动窗口
收藏
收藏
0 条评论
回复 删除
下一页