協議發送流程

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(如果一次發送不完,則啓用軟中斷,在軟中斷處理裏繼續發送)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章