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
最后通知应用层读取队列中的数据
发送流程:
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
最后通知应用层读取队列中的数据
相关文章推荐
- linux mysql 更改MySQL数据库目录位置
- linux C获取进程的CPU和内存
- Linux kill multi processes
- 最适合和最不适合新手使用的几款Linux发行版
- linux 进程间通信 pipe
- Linux学习 -- Vi命令
- centos7修改时区
- linux-0.12/boot/bootsect.S源代码阅读
- LINUX 笔记5
- Wind River Linux 6 Security Profile
- linux后台运行和关闭、查看后台任务
- linux 取消控制台报警音
- Linux下Java进程占用CPU超较高原因分析
- linux --vsftpd虚拟用户登录时 530 Login incorrect排错
- ArchLinux安裝SecureCRT破解版
- Java开发必会的Linux命令
- CentOS 国内yum源
- Linux系统中SSH命令的使用教程
- 64位centos 下编译 hadoop 2.6.0 源码
- Go语言daemon启动的解决方法.linux平台