tcp_sendmsg
tcp_write_xmit
tcp_mtu_probe(palyload checksum)
tcp_transmit_skb
ip_queue_xmit
__sk_dst_check
ipv4_dst_check
rt_is_expired(当路由信息有变化时,会通过rt_cache_flush更新net->rt_genid,每次发skb包时,都会校验下路由信息是否有效,如果有变化,则通过sk_setup_caps->sk_dst_set将新的路由信息dst_entry设置到skb->sk里,一个新的tcp连接在tcp_v4_connect->sk_setup_caps就事先将该连接的路由信息设置好)
ip_route_output_ports(ip路由选择,设置output=ip_output)
ip_route_output_flow
__ip_route_output_key_hash
__mkroute_output(设置dst.output = ip_output)
设置ip头信息
ip_local_out
__ip_local_out_sk(执行netfilter子系统的NF_INET_LOCAL_OUT过滤链)
dst_output_sk(执行skb_dst(skb)->output,这里的output即为__mkroute_output里设置的ip_output)
ip_output(执行netfilter子系统的NF_INET_POST_ROUTING过滤链)
ip_finish_output(判断是否需要ip分片,有与tcp有mss的限制,因此tcp报文不需要分片)
dst_neigh_output
dev_queue_xmit
__dev_queue_xmit(选择发送队列txq)
__dev_xmit_skb(将skb加入到txq的qdisc队列里)
__qdisc_run
qdisc_restart
dequeue_skb(从qdisc缓存队列里获取skb)
sch_direct_xmit
validate_xmit_skb_list(判断是否需要gso分片,tcp的gso就在这里完成)
dev_hard_start_xmit
xmit_one
netdev_start_xmit
__netdev_start_xmit(调用驱动完成skb的发送)
__netif_schedule(如果一次发送不完,则启用软中断,在软中断处理里继续发送)
协议发送流程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.