linux发包流程

转载: http://www.verydemo.com/demo_c167_i125773.html

sendto-->sys_sendto(socket.c)-->sock_sendmsg(socket.c)-->__sock_sendmsg(socket.c)-->sendmsg(socket.c)这个调用是通过sock->ops->sendmsg实现的,sock是socket结构类型,
socket->ops(inet_dgram_ops)->sendmsg(Af_inet.c上定义) UDP报文是sendmsg = inet_sendmsg
调用inet_sendmsg--> (调用sk->sk_prot->sendmsg(udp.c)) sk->sk_prot->sendmsg在udp.c上定义,此处sendmsg=udp_sendmsg-->udp_push_pending_frames-->ip_push_pending_frames-->
ip_local_out-->dst_output-->(skb_dst(skb)->output(skb))skb_dst(skb)得到struct dst_entry,路由顶层?? (route.c 定义了output = ip_output input = ip_forward)  此处output = ip_output(Ip_output.c)-->ip_finish_output-->ip_finish_output2-->dst->neighbour->output or neigh_hh_output

dst->neighbour->output = neigh_resolve_output(arp.c指向neighbour中实现)-->(neigh->ops->queue_xmit)实际queue_xmit = dev_queue_xmit(arp.c)
neigh_hh_output-->hh->hh_output = dev_queue_xmit(arp.c,dev.c实现)

dev_queue_xmit(dev.c)-->dev_hard_start_xmit-->ops->ndo_start_xmit(ops->ndo_start_xmitstruct net_device_ops *ops = dev->netdev_ops)
到达网卡将数据包发送出去

转载于:https://www.cnblogs.com/listenerln/p/6867914.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值