您的位置:首页 > 运维架构 > Linux

linux IP包收发流程

2016-01-19 14:07 471 查看
本文介绍的是linux下收发网络数据包的流程,传输层有TCP,UDP,网络层IPV4,IPV6,这里以TCP、IPV4为例

发送流程:

Step 1: socket:sock_sendmsg, socket层: 调用的是_sock_sendmsg,这一步先检查权限security_socket_sendmsg,接着调下一步_sock_sendmsg_nosec,这一步根据是TCP还是UDP的协议,调对应的sendmsg方法

Step 2:Tcp: tcp_sendmsg, 传输层, 下一步Tcp_output的 __tcp_push_pending_frames -> tcp_write_xmit -> tcp_transmit_skb 最后一步会调用网络层的queue_xmit

step 3:Ip_output:ip_queue_xmit, 网络层, 下一步ip_local_out -> __ip_local_out ->dst_output->ip_finish_output->ip_finish_output2

step 4: Neighbour:neigh_output, 下一步Neigh_resolve_output->dev_queue_xmit->

step 5 dev:dev_hard_start_xmit,调用的是ndo_start_xmit,根据不同的网卡驱动调用对应的网络设备把数据发出去,如高通的rmnet_xmit

接收流程:

Step 1: Dev: netif_rx, 下一步 enqueue_to_backlog-> __napi_schedule触发中断,在net_rx_action处理中断

Step 2: ip_input: ip_rcv,下一步ip_rcv_finish->dst_input,根据不同的目的调用不同的方法,如果是发给本机的,调ip_local_deliver->ip_local_deliver_finish

step 3: Tcp_ipv4:tcp_v4_rcv, 把数据存放到队列中,有3个队列prequeue,sk_receive_queue和sk_backlog

最后通知应用层读取队列中的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: