網路通訊協定棧10:connect()函數之前之整體框圖

來源:互聯網
上載者:User

 

Connect函數的執行流程,就是按照的順序,一步一步的由各個協議層來封裝或解鎖資料的而構成的,所以這些資料,都是在分配skb_buff這個結構體空間時加入的資料空間中,按照MAC/IP/TCP的先後順序,把資料封裝好,而不是按照TCP/IP/MAC的順序來的,在connect中,系統會調用ip_send()的函數,返回MAC的資料,此時,有可能遠端地址還沒有知道(本地路由是否有記錄),那麼在資料即將發送之前,系統還會調用ARP協議,來解析地址並填充相應欄位,如果ARP發送沒有結果,就會調用ICMP協議還報告錯誤。建立完MAC首部之後,在把指標移動IP首部位置,填充IP地址,其中的IP資料,有一些在建立socket時就已經準備好,此時只需要複製過來即可,而TCP首部是connect函數最後填充的。

從傳輸層(TCP)下傳到網路層(TP)的資料,不是能夠直接調用函數就直達的,資料先要在網路層的指定隊列進行排列,即資料首先被插入到等待下傳到鏈路層(IP)的等待隊列的尾部,而下傳到鏈路層的資料時從等待隊列的首部中提取的,因此,此時,如果傳輸層到網路層的資料大於網路層到鏈路層的資料,資料就會在等待隊列中暫時滯留。

資料下傳到鏈路層後,此時,會判斷資料是否大於指定的最大傳送資料,如果大於,則資料會被分區,然後調用分區函數來傳送資料。

從鏈路層到網卡的資料,又被分成優先順序別遞減的三個隊列,來區分從鏈路層來的資料的優先順序別,一般的原則是先把優先順序別最高的隊列中的資料都發送完了,才會把次層級的資料發送,因此,鏈路層的資料也是需要按照指定的優先順序進行排列的,這些排列的目的,都是為了資源的公平利用,不會出現後來先到的現象。

Connect函數會傳送所有網路通訊協定棧,直到到資料由網卡送到網路,然後睡眠等待遠方傳輸回來的確認訊號,再發送一個收到確認訊號的訊號給遠端,從而完成了一個鏈路的建立,此後,這個通訊端的所有資料,就可以在這個鏈路上進行傳輸了。

注意,鏈路的建立成功,並不是只鏈路是唯一不變的,而是說鏈路的兩端是確認了,好比從你家到你家所在的城市的飛機場,可能可以乘坐好多路公用汽車,也可以打租出車,也可以做地鐵,也可能做船,有時,你為了趕時間,還可能轉乘多路公交車(每次轉乘可能都不同),即從你家到機場的路線,可以有很多條,每次你到達機場的路線有可能都不相同,但是,你家和機場都是不變的,不管其中的過程如何變化。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.