版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1,網絡編程語言,2,應用程序程序編程接口(套接字),實現(xiàn)網絡應用時,要從由網絡輸出的接口開始。既然大多數(shù)網絡協(xié)議都是由軟件實現(xiàn)的(特別是協(xié)議棧中的高層協(xié)議),而且?guī)缀跛械挠嬎銠C系統(tǒng)都將網絡協(xié)議的實現(xiàn)作為操作系統(tǒng)的一部分,因而我們說“由網絡輸出的”接口時,通常指的是操作系統(tǒng)為它的網絡子系統(tǒng)提供的接口。這個接口叫做網絡的應用程序編程接口(A P I )。 雖然每個操作系統(tǒng)都可以自由地定義自己的A P I ,但隨著時間的推
2、移,有些A P I 已獲得了廣泛的支持;也就是說,除了它們原始的系統(tǒng)外,它們還被移植到操作系統(tǒng)中。,3,應用程序程序編程接口(套接字),套接字接(socket interface )口:它最初是由加州大學伯克利分校的U n i x 小組開發(fā),而現(xiàn)在幾乎所有流行的操作系統(tǒng)都支持它。業(yè)界支持單一A P I 的優(yōu)點是使得應用程序可以很簡單地從一個操作系統(tǒng)移植到另一個操作系統(tǒng)。但是我們得記住一點,通常應用程序與操作系統(tǒng)許多部分相互作用,而不僅
3、僅與網絡相互作用。例如,讀寫文件,產生并行進程和輸出圖形顯示。 每個協(xié)議提供了一系列服務(s e rv i c e ),A P I 則提供了特定操作系統(tǒng)中調用這些服務所用的語法(s y n t a x )。然后,實現(xiàn)的作用是把A P I 定義的具體操作和對象映射到協(xié)議定義的抽象服務集上。,4,應用程序程序編程接口(套接字),套接字接口的主要概念是套接字(s o c k e t )。理解套接字的好方法是把它看作本地應用進程與網
4、絡的接入點。接口定義了各種操作,包括創(chuàng)建套接字、將套接字連到網上、通過套接字發(fā)送/接收消息,關閉套接字。為了簡化討論,我們在此只討論T C P 中如何使用套接字。 第一步是創(chuàng)建套接字,用如下操作實現(xiàn): 該操作有三個參數(shù)是因為套接字接口被設計成通用的,定義支持任意的底層協(xié)議集。,,5,應用程序程序編程接口(套接字),,2.t y p e 參數(shù)表明通信的語義。 S O C K _ S T R E A M 說明是字節(jié)流。 S
5、 O C K _ D G R A M則表明是面向消息的服務,像U D P 提供的一樣。,,3.p r o t o c o l 參數(shù)則指明將要用到的特定協(xié)議。,,s o c k e t 返回值是新創(chuàng)建套接字的句柄(h a n d l e ),即以后引用該套接字時使用的標識符。在套接字的其他操作中,它也將作為一個參數(shù)。,,1.d o m a i n 參數(shù)描述將使用的協(xié)議族。 A F _ I N E T 用于表示因特網協(xié)議族。
6、 A F _ U N I X 用于表示U n i x 管道功能,6,客戶/服務器模式,在TCP/IP網絡應用中,通信的兩個進程間相互作用的主要模式是客戶/服務器模式(Client/Server model),即客戶向服務器發(fā)出服務請求,服務器接收到請求后,提供相應的服務。 客戶/服務器模式的建立基于以下兩點: 首先,建立網絡的起因是網絡中軟硬件資源、運算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機提供服務,
7、資源較少的客戶請求服務這一非對等作用。 其次,網間進程通信完全是異步的,相互通信的進程間既不存在父子關系,又不共享內存緩沖區(qū),因此需要一種機制為希望通信的進程間建立聯(lián)系,為二者的數(shù)據(jù)交換提供同步,這就是基于客戶/服務器模式的TCP/IP。,,7,客戶/服務器模式,客戶/服務器模式在操作過程中采取的是主動請求方式: 首先服務器方要先啟動,并根據(jù)請求提供相應服務:1.打開一通信通道并告知本地主機,它愿意在某一公認地址上(周知
8、口,如FTP為21)接收客戶請求;2.等待客戶請求到達該端口;3.接收到重復服務請求,處理該請求并發(fā)送應答信號。接收到并發(fā)服務請求,要激活一新進程來處理這個客戶請求(如UNIX系統(tǒng)中用fork、exec)。新進程處理此客戶請求,并不需要對其它請求作出應答。服務完成后,關閉此新進程與客戶的通信鏈路,并終止。4. 返回第二步,等待另一客戶請求。5. 關閉服務器,8,客戶/服務器模式,客戶方:1.
9、160;打開一通信通道,并連接到服務器所在主機的特定端口;2. 向服務器發(fā)服務請求報文,等待并接收應答;繼續(xù)提出請求......3. 請求結束后關閉通信通道并終止。 從上面所描述過程可知:1. 客戶與服務器進程的作用是非對稱的,因此編碼不同。2. 服務進程一般是先于客戶請求而啟動的。只要系統(tǒng)運行,該服務進程一直存在,直到正?;驈?/p>
10、迫終止。,9,應用程序程序編程接口(套接字),下一步看你是客戶還是服務器。 如果是服務器:在服務器主機上,應用進程執(zhí)行一個被動的打開,即服務器表明它已準備好接受連接,但并沒有真正建立連接。服務器通過調用以下三個操作來完成打開:,10,套接字類型,TCP/IP的socket提供下列三種類型套接字。(1)流式套接字(SOCK_STREAM)提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯、無重復地發(fā)送,且按發(fā)送順序接收。內
11、設流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。文件傳送協(xié)議(FTP)即使用流式套接字。 (2)數(shù)據(jù)報式套接字(SOCK_DGRAM)提供了一個無連接服務。數(shù)據(jù)包以獨立包形式被發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復,并且接收順序混亂。網絡文件系統(tǒng)(NFS)使用數(shù)據(jù)報式套接字。 (3)原始式套接字(SOCK_RAW)該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。常用于檢驗新的協(xié)議實現(xiàn)或訪問
12、現(xiàn)有服務中配置的新設備。,11,典型套接字調用過程舉例,如前所述,TCP/IP協(xié)議的應用一般采用客戶/服務器模式,因此在實際應用中,必須有客戶和服務器兩個進程,并且首先啟動服務器,其系統(tǒng)調用時序圖如下。面向連接的協(xié)議(如TCP)的套接字系統(tǒng)調用如下圖所示:服務器必須首先啟動,直到它執(zhí)行完accept()調用,進入等待狀態(tài)后,方能接收客戶請求。假如客戶在此前啟動,則connect()將返回出錯代碼,連接不成功。,見下圖,12,服務器方
13、 客戶方,13,Status of parent and child processes with respect to the socket,,,,,,,,14,典型套接字調用過程舉例,無連接協(xié)議的套接字調用如下圖所示: 無連接服務器也必須先啟動,否則客戶請求傳不到服務進程。無連接客戶不調用connect()。因此在數(shù)據(jù)發(fā)送之前,客戶與服務
14、器之間尚未建立完全相關,但各自通過socket()和bind()建立了半相關。發(fā)送數(shù)據(jù)時,發(fā)送方除指定本地套接字號外,還需指定接收方套接字號,從而在數(shù)據(jù)收發(fā)過程中動態(tài)地建立了全相關。,見下圖,15,,16,應用程序程序編程接口(套接字),1.b i n d 操作:如其名字一樣,是將新創(chuàng)建的s o c k e t 與a d d r e s s 綁定。這是本地參與者(即服務器)的網絡地址。 注意,a d d r e s s 在因
15、特網協(xié)議中使用時是表示一個數(shù)據(jù)結構,其中包括服務器的I P 地址和T C P 端口號。端口號通常是一些眾所周知的、專門提供給服務的號嗎;例如,We b 服務器通常在端口8 0 上接受連接。,2.l i s t e n 操作:定義在指定的s o c k e t 上可以有多少個待處理的連接。,3.a c c e p t 操作:完成被動打開。它是一個阻塞的操作,在遠程參與者沒有建立起連接前,它不會返回任何參數(shù),一旦連接成功,它將返回一個表示這
16、個新建連接的新的套接字,并且a d d r e s s 參數(shù)還包括了遠程參與者的地址。,注意,當a c c e p t 返回時,以前作為參數(shù)給定的原始套接字依然存在并依然對應于被動打開;在以后調用a c c e p t 時它仍作為參數(shù)。,17,應用程序程序編程接口(套接字),在客戶機上,應用程序執(zhí)行主動打開;也就是,它通過調用如下的一個操作來表明它希望與誰通信:,該操作直至T C P 成功建立連接后才返回,此時應用程序就可以開始發(fā)送數(shù)
17、據(jù)。a d d r e s s 中包括了遠程參與者的地址。 實際上,客戶機通常只描述遠程參與者的地址,讓系統(tǒng)自動填寫本地信息。鑒于服務器通常在共知的端口監(jiān)聽消息,一般地,客戶機并不關心它自己用哪個端口;操作系統(tǒng)簡單地選一個未用端口即可。,18,應用程序程序編程接口(套接字),一旦連接建立,應用進程將調用以下兩個操作來發(fā)送和接收數(shù)據(jù):,這個操作在指定的s o c k e t 上發(fā)送m e s s a g e,這個操作則是將從指定
18、的s o c k e t 上收到的消息放入指定的b u ff e r 。它們都使用一系列f l a g s 來控制操作的特定細節(jié)。,19,應用實例,現(xiàn)在,我們來看一個簡單的客戶機/服務器程序的實現(xiàn),它用套接字接口在一個T C P 連接上發(fā)送消息。這個程序還用到了其他的U n i x 網絡功能,我們將逐個介紹。我們的應用允許用戶在一端的機器上輸入并把文本發(fā)送給另一端機器的用戶。它是U n i x 中t a l k 程序的一個簡化版本,類似
19、于We b 聊天室的核心程序。,20,應用實例,1.客戶端 我們先從客戶端開始,它用遠端的機器名作為參數(shù)。它調用U n i x 程序g e t h o s t b y n a m e 把該名字翻譯為遠端主機的I P 地址。 下一步是構造套接字接口所需的地址數(shù)據(jù)結構(s i n )。 注意這個數(shù)據(jù)結構表明我們將一直用套接字與因特網連接(A F _ I N E T )。 在以下例子中,我們用T C P
20、 端口號5 4 3 2 作為共知的服務器端口號;它恰好不是分配給其他因特網服務的端口號。 建立連接的最后一步是調用s o c k e t 和c o n n e c t 。一旦c o n n e c t 操作返回,建立起連接,客戶機程序將進入主循環(huán),不斷從標準輸入讀取文本并通過套接字發(fā)送。,21,客戶端程序,22,應用實例,2. 服務器 服務器的實現(xiàn)也很簡單。首先,它填入自己的端口號(S E RV E R _
21、P O RT )構造地址數(shù)據(jù)結構。 其次,它并不指明I P地址,從而使應用程序可以接受來自本地任一I P 地址的連接。 然后,服務器執(zhí)行與被動打開有關的初始步驟: 創(chuàng)建一個套接字,將它綁定到本地地址。 然后設置允許同時連接的最大數(shù)。 最后,主循環(huán)等待遠端主機與它連接,當遠端有一臺主機試圖與它連接時,它就接收并輸出連接上送來的字符。,23,服務器程序,24,協(xié)議實現(xiàn)的問題,應用程序與底層網絡交互
22、的方式類似于高層協(xié)議與低層協(xié)議交互的方式。例如,T C P 需要一個接口向I P 發(fā)送消息,同時也需要I P 能向T C P 傳送消息。這就是服務接口。 既然我們已經有了網絡的A P I (如套接字),或許我們可以在協(xié)議棧的每一對協(xié)議間使用同樣的接口。盡管這只是一種選擇,但在實際中我們并不這樣使用套接字接口。原因在于套接字接口在協(xié)議實現(xiàn)方面的低效是協(xié)議實現(xiàn)者所不能忍受的。應用編程人員之所以能忍受是因為它簡化了編程工作,而且畢竟
23、他對低效只需忍受一次就夠了,而協(xié)議實現(xiàn)者卻要常常被它們的性能所困擾,總擔心穿過幾層協(xié)議是否能得到一條消息。 本節(jié)的其余部分將討論網絡A P I 和位于協(xié)議圖下方的協(xié)議到協(xié)議接口的兩點主要不同。同時介紹協(xié)議實現(xiàn)常用到的庫例程。,25,協(xié)議實現(xiàn)的問題,1. 進程模型 大多數(shù)操作系統(tǒng)都提供一種抽象概念叫進程(p ro c e s s ),或叫線程(t h re a d )。每個進程的運行很大程度上獨立于其他進程,操作系統(tǒng)負責
24、確保給所有當前的進程分配如地址空間和C P U 周期這樣的資源。 進程這一抽象概念使得在一臺機器上并發(fā)運行多個事件變得相當簡單;例如,每個用戶的應用程序可以在自己的進程中執(zhí)行,操作系統(tǒng)中的各種事件可以作為其他進程執(zhí)行。 操作系統(tǒng)將正在C P U 上運行的進程停止并啟動另一進程時,我們稱這一轉換為上下文切換(context switch )。,26,協(xié)議實現(xiàn)的問題,在設計一個網絡子系統(tǒng)時,首先要回答的問題之一是,“進程在
25、哪兒?”基本上有兩種選擇,如圖所示。 第一種選擇,我們稱為進程/協(xié)議(p ro c e s s - p e r- p ro t o c o l )模型,每個協(xié)議由一個獨立的進程實現(xiàn)。這就意味著當一條消息向協(xié)議棧的上方或下方移動時,它被從一個進程/協(xié)議傳送到另一個進程/協(xié)議,即實現(xiàn)協(xié)議i 的進程處理這個消息,然后把它傳給協(xié)議i -1 ,以此類推。一個進程/協(xié)議如何向下一個進程/協(xié)議傳遞消息依賴于主機操作系統(tǒng)提供的進程間通信的支持。
26、通常有一個簡單的機制把消息與進程排隊。然而,重要的一點是,協(xié)議圖的每一層都要求上下文切換,這是一個典型的耗時操作。,27,協(xié)議實現(xiàn)的問題,我們把另一種稱為進程/消息(p ro c e s s - p e r-me s s a g e )模型,它把每個協(xié)議當做一段靜態(tài)編碼并把進程同消息聯(lián)系起來。也就是說,當網絡送來一條消息時,操作系統(tǒng)調度一個進程,使之負責消息在協(xié)議圖中向上移動。在每一層,調用實現(xiàn)該協(xié)議的過程,然后調用實現(xiàn)下一個協(xié)議的過程
27、,以此類推。對于輸出的消息,應用程序調用必要的過程,直到消息被送入網絡。在兩個方向中,協(xié)議圖都被一系列過程調用一遍。,28,協(xié)議實現(xiàn)的問題,結論: 雖然有時感覺進程/協(xié)議模型比較容易,即我在我的進程中實現(xiàn)我的協(xié)議,而你在你的進程中實現(xiàn)你的協(xié)議。 但由于一個簡單的原因,進程/消息模型通常更有效:即在大多數(shù)計算機上,過程調用的效率比上下文切換高一個數(shù)量級。 第一種模型要求每一層有一個上下文切換,而第二種模型只要求每一
28、層有一個進程調用。,29,協(xié)議實現(xiàn)的問題,大多數(shù)協(xié)議實現(xiàn)用d e l i v e r 操作代替r e c e i v e 操作。也就是低層協(xié)議做向上調用(u p c a l l ),它是一個向上調用協(xié)議棧的過程,將消息傳送到高層協(xié)議。圖顯示了兩個相鄰協(xié)議(本例中為T C P 和I P )的接口。 一般情況下,消息向協(xié)議棧的下方移動調用一系列s e n d 操作,向協(xié)議圖上方移動則調用一系列d e l i v e r 操作。,代碼段
29、用下列操作:,其中:l l p 表示低層協(xié)議,其上的正在調用它的協(xié)議已被配置;h l p 表示正在調用協(xié)議之上配置的高層協(xié)議。注意,我們用P r o t o c o l 這一變量類型和變量l l p 和h l p 簡化了使用,它們隱藏了協(xié)議圖中如何配置協(xié)議、高層協(xié)議如何在低層協(xié)議上打開一個連接的細節(jié)。,30,協(xié)議實現(xiàn)的問題,2. 消息緩沖區(qū) 套接字接口的第二個低效之處在于當調用s e n d 時應用進程提供緩沖區(qū),保存向外發(fā)送
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論