這篇文章我打算先丟出一個引子來引發各位讀者對於網絡思考,而後慢慢聊到網絡鏈接的程序,這跟socket 又有什麼關係,操做 socket 時咱們須要瞭解的通訊規則以及通訊數據會產生的幾種狀態例如:同步、異步、死鎖、解鎖、阻塞。
有一個經典的問題:當你在瀏覽器輸入一個網址後,你是如何獲取到了想要的內容,這其中發生了什麼?html
若是要完整的回答這個問題,恐怕寫一本書都不算多,這裏大體說說有幾個環節和裏面的點:編程
1.瀏覽器會根據通訊協議解析 uri 生成請求消息
2.瀏覽器訪問 DNS 服務器解析請求 uri 爲 ip 地址
3.瀏覽器調用 socket 庫委託操做系統中的協議棧發送請求消息
4.網卡將數字信號轉換爲電信號輸出網線
5.交換機將電信號再次轉換爲數字信號
6.解包
7.根據 socket 控制信息(ip、端口、狀態)到達應用程序瀏覽器
上面有幾個注意的問題:服務器
a. 一、2 順序不能顛倒,網上有說先 DNS 解析是錯誤的
b. 庫就是一組程序的集合,socket 庫是讓其餘應用可使用操做系統的網絡功能
c. 協議棧包括 Tcp、Udp、Ip、Arp...各類協議網絡
能夠看到一個簡單的網絡鏈接是須要不少網絡部件參與才能正常工做,咱們主要關心第三步的實現即這個 socket 程序組件的運用,對於開發者來講這個 socket 是網絡鏈接的關鍵也是咱們網絡編程的關鍵。併發
一句話: 經過 coding 實現網絡通訊的的行爲異步
一句話: 收發通訊數據的管道(請求|響應消息都要經過 socket)socket
有些東西在網絡鏈接過程當中咱們是看不到的或者說在編寫程序的時候不會直接使用,可是在實際編寫網絡程序的時候咱們必須遵照其中的規則,因此咱們仍是頗有必要了解的。ide
先看一個有趣的解釋:函數
咱們舉一個現實生活中兩我的進行語言溝通的例子來模擬三次握手。 第一次對話: 老婆讓甲出去打醬油,半路碰到一個朋友乙,甲問了一句:哥們你吃飯了麼? 結果乙帶着耳機聽歌呢,根本沒聽到,沒反應。甲內心想:跟你說話也沒個音,不跟你說了,溝通失 敗。說明乙接受不到甲傳過來的信息的狀況下溝通確定是失敗的。 若是乙聽到了甲說的話,那麼第一次對話成功,接下來進行第二次對話。 第二次對話: 乙聽到了甲說的話,可是他是老外,中文很差,不知道甲說的啥意思也不知道怎樣回答,因而隨便回答了一句學過的中文 :我去廁所了。甲一聽馬上笑噴了,「去廁所吃飯」?道不一樣不相爲謀,離你遠點吧,溝通失敗。說明乙沒法作出正確應答的狀況下溝通失敗。 若是乙聽到了甲的話,作出了正確的應答,而且還進行了反問:我吃飯了,你呢?那麼第二次握手成功。 經過前兩次對話證實了乙可以聽懂甲說的話,而且能作出正確的應答。接下來進行第三次對話。 第三次對話: 甲剛和乙打了個招呼,忽然老婆喊他,「你個死鬼,打個醬油咋這麼半天,看我回家咋收拾你」,甲是個妻管嚴,聽完嚇得二話不說就跑回家了,把乙本身晾那了。乙心想:這什麼人啊,得,我也回家吧,溝通失敗。說明甲沒法作出應答的狀況下溝通失敗。 若是甲也作出了正確的應答:我也吃了。那麼第三次對話成功,兩人已經創建起了順暢的溝通渠道,接下來開始持續的聊天。 經過第二次和第三次的對話證實了甲可以聽懂乙說的話,而且能作出正確的應答。 可見,兩我的進行有效的語言溝通,這三次對話的過程是必須的。 同理,鏈接拆除時須要兩方都肯定才能真正拆除,因此須要四次揮手
再具體看看圖示:
這兩個概念是針對 IO 過程當中進程的狀態來講的,阻塞 IO 是指調用結果返回以前,當前線程會被掛起;相反,非阻塞指在不能馬上獲得結果以前,該函數不會阻塞當前線程,而會馬上返回。
這兩個概念是針對調用若是返回結果來講的,所謂同步,就是在發出一個功能調用時,在沒有獲得結果以前,該調用就不返回;相反,當一個異步過程調用發出後,調用者不能馬上獲得結果,實際處理這個調用的部件在完成後,經過狀態、通知和回調來通知調用者。
多路複用(IO/Multiplexing):爲了提升數據信息在網絡通訊線路中傳輸的效率,在一條物理通訊線路上創建多條邏輯通訊信道,同時傳輸若干路信號的技術就叫作多路複用技術。對於 Socket 來講,應該說能同時處理多個鏈接的模型都應該被稱爲多路複用,目前比較經常使用的有 select/poll/epoll/kqueue 這些 IO 模型(目前也有像 Apache 這種每一個鏈接用單獨的進程/線程來處理的 IO 模型,可是效率相對比較差,也很容易出問題,因此暫時不作介紹了)。在這些多路複用的模式中,異步阻塞/非阻塞模式的擴展性和性能最好。
改變世界的TCP/IP協議
What is socket?
《網絡是怎麼鏈接的》
簡單說明網絡編程就是利用 socket 程序組件實現網絡鏈接的,在具體操做 socket 的時候會涉及一些額外的知識點,整篇文章很簡單沒有深刻探究某個點,天然也不會很完備,這也是對本系列文章的定位,以後寫網絡通訊模型的時候會結合具體例子來闡述涉及到的知識點。下一節主要結合 PHP 介紹一下 socket 的相關函數。