透彻理解Socket网络编程
所謂的Socket(套接字),是進程通訊的一種方式,即調用這個網絡庫的一些API函數實現分布在不同主機的相關進程之間的數據交換。需要滿足三元組------(協議,本地地址,本地端口號)
在《計算機網絡:自頂向下方法》中,作者把socket比作門——門外是郵局,你要送信就要通過門,把信從門送出去到郵局,然后由郵局幫你送達目標的門,目的地主人再打開門,從門取出郵局送過來的信。
socket位于應用層與傳輸層之間,所以可以認為上述的比喻中,郵局就是傳輸層(及更下面的層),而門內就是應用。這樣,socket的本意,“套接字”應該也比較容易理解。
我們可以把房子比作內核,那么門(socket)就是房子之間交流的endpoint。重要的是,因為一個房子有很多個門(不同的端口),而每個門對于門后面的應用,是唯一的。在這里,一個房子是內核,里面有很多個小人(進程),而每個想與其他房子的小人溝通的小人,都要在自己住的房間開一個門,內核會給這個門分配一個門牌號(端口),這扇門這就是socket。
如果門的比喻還是不夠形象,那么想象這樣兩棟房子——兩棟房子被很多根管道連接在一起,而這些管道和房子連接起來的部分就是socket。管道是傳輸層(以及更下層),用來傳輸應用層的message。
---------------------------------------------------------------------言歸正傳--------------------------------------------------
Socket簡介
Socket是進程通訊的一種方式,即調用這個網絡庫的一些API函數實現分布在不同主機的相關進程之間的數據交換。
幾個定義:
(1)IP地址:即依照TCP/IP協議分配給本地主機的網絡地址,兩個進程要通訊,任一進程首先要知道通訊對方的位置,即對方的IP。
(2)端口號:用來辨別本地通訊進程,一個本地的進程在通訊時均會占用一個端口號,不同的進程端口號不同,因此在通訊前必須要分配一個沒有被訪問的端口號。
(3)連接:指兩個進程間的通訊鏈路。
(4)半相關:網絡中用一個三元組可以在全局唯一標志一個進程:
(協議,本地地址,本地端口號)
這樣一個三元組,叫做一個半相關,它指定連接的每半部分。
(4)全相關:一個完整的網間進程通信需要由兩個進程組成,并且只能使用同一種高層協議。也就是說,不可能通信的一端用TCP協議,而另一端用UDP協議。因此一個完整的網間通信需要一個五元組來標識:
(協議,本地地址,本地端口號,遠地地址,遠地端口號)
這樣一個五元組,叫做一個相關(association),即兩個協議相同的半相關才能組合成一個合適的相關,或完全指定組成一連接。
二、客戶/服務器模式
在TCP/IP網絡應用中,通信的兩個進程間相互作用的主要模式是客戶/服務器(Client/Server,
C/S)模式,即客戶向服務器發出服務請求,服務器接收到請求后,提供相應的服務。客戶/服務器模式的建立基于以下兩點:
(1)首先,建立網絡的起因是網絡中軟硬件資源、運算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機提供服務,資源較少的客戶請求服務這一非對等作用。
(2)其次,網間進程通信完全是異步的,相互通信的進程間既不存在父子關系,又不共享內存緩沖區,因此需要一種機制為希望通信的進程間建立聯系,為二者的數據交換提供同步,這就是基于客戶/服務器模式的TCP/IP。
服務器端:
其過程是首先服務器方要先啟動,并根據請求提供相應服務:
(1)打開一通信通道并告知本地主機,它愿意在某一公認地址上的某端口(如FTP的端口可能為21)接收客戶請求;
(2)等待客戶請求到達該端口;
(3)接收到客戶端的服務請求時,處理該請求并發送應答信號。接收到并發服務請求,要激活一新進程來處理這個客戶請求(如UNIX系統中用fork、exec)。新進程處理此客戶請求,并不需要對其它請求作出應答。服務完成后,關閉此新進程與客戶的通信鏈路,并終止。
(4)返回第(2)步,等待另一客戶請求。
(5)關閉服務器
客戶端:
(1)打開一通信通道,并連接到服務器所在主機的特定端口;
(2)向服務器發服務請求報文,等待并接收應答;繼續提出請求......
(3)請求結束后關閉通信通道并終止。
從上面所描述過程可知:
(1)客戶與服務器進程的作用是非對稱的,因此代碼不同。
(2)服務器進程一般是先啟動的。只要系統運行,該服務進程一直存在,直到正常或強迫終止。
----------------------------------------------------------------------------------------------------------------------------大家可以看看知乎這個回答,寫的比較生動具體https://www.zhihu.com/question/29637351
總結
以上是生活随笔為你收集整理的透彻理解Socket网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据包分片和重组 MTU与MSS
- 下一篇: vim三种模式切换