linux 核心網路,資料接收流程圖

來源:互聯網
上載者:User
4.3 資料接收流程圖

各層主要函數以及位置功能說明:

         1)sock_read:初始化msghdr{}的結構類型變數msg,並且將需要接收的資料存放的地址傳給msg.msg_iov->iov_base.      net/socket.c         2)sock_recvmsg: 調用函數指標sock->ops->recvmsg()完成在INET Socket層的資料接收過程.其中sock->ops被初始化為inet_stream_ops,其成員recvmsg對應的函數實現為inet_recvmsg()函數. net/socket.c         3)sys_recv()/sys_recvfrom():分別對應著連線導向和面向不需連線的協議兩種情況. net/socket.c         4)inet_recvmsg:調用sk->prot->recvmsg函數完成資料接收,這個函數對於tcp協議便是tcp_recvmsg net/ipv4/af_net.c         5)tcp_recvmsg:從網路通訊協定棧接收資料的動作,自上而下的觸發動作一直到這個函數為止,出現了一次等待的過程.函數tcp_recvmsg可能會被動地等待在sk的接收資料隊列上,也就是說,系統中肯定有其他地方會去修改這個隊列使得tcp_recvmsg可以進行下去.入口參數sk是這個網路連接對應的sock{}指標,msg用於存放接收到的資料.接收資料的時候會去遍曆接收隊列中的資料,找到序號合適的.         但讀取隊列為空白時tcp_recvmsg就會調用tcp_v4_do_rcv使用backlog隊列填充接收隊列.         6)tcp_v4_rcv:tcp_v4_rcv被ip_local_deliver函數調用,是從IP層協議向INET Socket層提交的"資料到"請求,入口參數skb存放接收到的資料,len是接收的資料的長度,這個函數首先移動skb->data指標,讓它指向tcp頭,然後更新tcp層的一些資料統計,然後進行tcp的一些值的校正.再從INET Socket層中已經建立的sock{}結構變數中尋找正在等待當前到達資料的哪一項.可能這個sock{}結構已經建立,或者還處於監聽連接埠、等待資料連線的狀態。返回的sock結構指標存放在sk中。然後根據其他進程對sk的操作情況,將skb發送到合適的位置.調用如下:

         TCP包接收器(tcp_v4_rcv)將TCP包投遞到目的通訊端進行接收處理. 當通訊端正被使用者鎖定,TCP包將暫時排入該通訊端的後備隊列(sk_add_backlog).這時如果某一使用者線程企圖鎖定該通訊端(lock_sock),該線程被排入通訊端的後備處理等待隊列(sk->lock.wq).當使用者釋放上鎖的通訊端時(release_sock,在tcp_recvmsg中調用),後備隊列中的TCP包被立即注入TCP包處理器(tcp_v4_do_rcv)進行處理,然後喚醒等待隊列中最先的一個使用者來獲得其鎖定權.
如果通訊端未被上鎖,當使用者正在讀取該通訊端時, TCP包將被排入通訊端的預備隊列(tcp_prequeue),將其傳遞到該使用者線程上下文中進行處理.如果添加到sk->prequeue不成功,便可以添加到 sk->receive_queue隊列中(使用者線程可以登記到預備隊列,當預備隊列中出現第一個包時就喚醒等待線程.)   /net/tcp_ipv4.c

         7)ip_rcv、ip_rcv_finish:從乙太網路接收資料,放到skb裡,作ip層的一些資料及選項檢查,調用ip_route_input()做路由處理,判斷是進行ip轉寄還是將資料傳遞到高一層的協議.調用skb->dst->input函數指標,這個指標的實現可能有多種情況,如果路由得到的結果說明這個資料包應該轉寄到其他主機,這裡的input便是ip_forward;如果資料包是給原生,那麼input指標初始化為ip_local_deliver函數./net/ipv4/ip_input.c

         8)ip_local_deliver、ip_local_deliver_finish:入口參數skb存放需要傳送到上層協議的資料,從ip頭中擷取是否已經分拆的資訊,如果已經分拆,則調用函數ip_defrag將資料包重組。然後通過調用ip_prot->handler指標調用tcp_v4_rcv(tcp)。ip_prot是inet_protocol結構指標,是用來ip層登記協議的,比如由udp,tcp,icmp等協議。 /net/ipv4/ip_input.c

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.