socket編程原理(二)

nbsp; (協議,本地地址,本地端口號,遠地地址,遠地端口號)
     這樣一個五元組,叫做一個相關(association),即兩個協議相同的半相關才能組合成一個合適的相關,或完全指定組成一連接。
2.2.2 服務方式
    在網絡分層結構中,各層之間是嚴格單向依賴的,各層次的分工和協作集中體現在相鄰層之間的界面上。"服務"是描述相鄰層之間關係的抽象概念,即網絡中各層向緊鄰上層提供的一組操作。下層是服務提供者,上層是請求服務的用戶。服務的表現形式是原語(primitive),如系統調用或庫函數。系統調用是操作系統內核向網絡應用程序或高層協議提供的服務原語。網絡中的n層總要向n+1層提供比n-1層更完備的服務,否則n層就沒有存在的價值。
    在OSI的術語中,網絡層及其以下各層又稱爲通信子網,只提供點到點通信,沒有程序或進程的概念。而傳輸層實現的是"端到端"通信,引進網間進程通信概念,同時也要解決差錯控制,流量控制,數據排序(報文排序),連接管理等問題,爲此提供不同的服務方式:
面向連接(虛電路)或無連接
    面向連接服務是電話系統服務模式的抽象,即每一次完整的數據傳輸都要經過建立連接,使用連接,終止連接的過程。在數據傳輸過程中,各數據分組不攜帶目的地址,而使用連接號(connect ID)。本質上,連接是一個管道,收發數據不但順序一致,而且內容相同。TCP協議提供面向連接的虛電路。
    無連接服務是郵政系統服務的抽象,每個分組都攜帶完整的目的地址,各分組在系統中獨立傳送。無連接服務不能保證分組的先後順序,不進行分組出錯的恢復與重傳,不保證傳輸的可靠性。UDP協議提供無連接的數據報服務。
下面給出這兩種服務的類型及應用中的例子:
服務類型
服 務
例 子

面向連接
可靠的報文流
可靠的字節流
不可靠的連接
文件傳輸(FTP)
遠程登錄(Telnet)
數字話音

無連接
不可靠的數據報
有確認的數據報
請求-應答
電子郵件(E-mail)
電子郵件中的掛號信
網絡數據庫查詢
順序
在網絡傳輸中,兩個連續報文在端-端通信中可能經過不同路徑,這樣到達目的地時的順序可能會與發送時不同。"順序"是指接收數據順序與發送數據順序相同。TCP協議提供這項服務。
差錯控制
保證應用程序接收的數據無差錯的一種機制。檢查差錯的方法一般是採用檢驗"檢查和(Checksum)"的方法。而保證傳送無差錯的方法是雙方採用確認應答技術。TCP協議提供這項服務。
流控制
在數據傳輸過程中控制數據傳輸速率的一種機制,以保證數據不被丟失。TCP協議提供這項服務。
字節流
字節流方式指的是僅把傳輸中的報文看作是一個字節序列,不提供數據流的任何邊界。TCP協議提供字節流服務。
報文
接收方要保存發送方的報文邊界。UDP協議提供報文服務。
全雙工/半雙工
端-端間數據同時以兩個方向/一個方向傳送。
緩存/帶外數據
在字節流服務中,由於沒有報文邊界,用戶進程在某一時刻可以讀或寫任意數量的字節。爲保證傳輸正確或採用有流控制的協議時,都要進行緩存。但對某些特殊的需求,如交互式應用程序,又會要求取消這種緩存。
在數據傳送過程中,希望不通過常規傳輸方式傳送給用戶以便及時處理的某一類信息,如UNIX系統的中斷鍵(Delete或Control-c)、終端流控制符(Control-s和Control-q),稱爲帶外數據。邏輯上看,好象用戶進程使用了一個獨立的通道傳輸這些數據。該通道與每對連接的流相聯繫。由於Berkeley Software Distribution中對帶外數據的實現與RFC 1122中規定的Host Agreement不一致,爲了將互操作中的問題減到最小,應用程序編寫者除非與現有服務互操作時要求帶外數據外,最好不使用它。
2.2.3 客戶/服務器模式
在TCP/IP網絡應用中,通信的兩個進程間相互作用的主要模式是客戶/服務器模式(Client/Server model),即客戶向服務器發出服務請求,服務器接收到請求後,提供相應的服務。客戶/服務器模式的建立基於以下兩點:首先,建立網絡的起因是網絡中軟硬件資源、運算能力和信息不均等,需要共享,從而造就擁有衆多資源的主機提供服務,資源較少的客戶請求服務這一非對等作用。其次,網間進程通信完全是異步的,相互通信的進程間既不存在父子關係,又不共享內存緩衝區,因此需要一種機制爲希望通信的進程間建立聯繫,爲二者的數據交換提供同步,這就是基於客戶/服務器模式的TCP/IP。
客戶/服務器模式在操作過程中採取的是主動請求方式:
首先服務器方要先啓動,並根據請求提供相應服務:
1. 打開一通信通道並告知本地主機,它願意在某一公認地址上(周知口,如FTP爲21)接收客戶請求;
2. 等待客戶請求到達該端口;
3. 接收到重複服務請求,處理該請求併發送應答信號。接收到併發服務請求,要激活一新進程來處理這個客戶請求(如UNIX系統中用fork、exec)。新進程處理此客戶請求,並不需要對其它請求作出應答。服務完成後,關閉此新進程與客戶的通信鏈路,並終止。
4. 返回第二步,等待另一客戶請求。
5. 關閉服務器
客戶方:
1. 打開一通信通道,並連接到服務器所在主機的特定端口;
2. 向服務器發服務請求報文,等待並接收應答;繼續提出請求......
3. 請求結束後關閉通信通道並終止。
從上面所描述過程可知:
1. 客戶與服務器進程的作用是非對稱的,因此編碼不同。
2. 服務進程一般是先於客戶請求而啓動的。只要系統運行,該服務進程一直存在,直到正常或強迫終止。
2.2.4 套接字類型
TCP/IP的socket提供下列三種類型套接字。
流式套接字(SOCK_STREAM)
提供了一個面向連接、可靠的數據傳輸服務,數據無差錯、無重複地發送,且按發送順序接收。內設流量控制,避免數據流超限;數據被看作是字節流,無長度限制。文件傳送協議(FTP)即使用流式套接字。
數據報式套接字(SOCK_DGRAM)
提供了一個無連接服務。數據包以獨立包形式被髮送,不提供無錯保證,數據可能丟失或重複,並且接收順序混亂。網絡文件系統(NFS)使用數據報式套接字。
原始式套接字(SOCK_RAW)
該接口允許對較低層協議,如IP、ICMP直接訪問。常用於檢驗新的協議實現或訪問現有服務中配置的新設備。
2.3 基本套接字系統調用
爲了更好地說明套接字編程原理,下面給出幾個基本套接字系統調用說明。
2.3.1 創建套接字──socket()
應用

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