【筆記】謝希仁—計網五版:chapter six 應用層(二)

五、電子郵件

1.電子郵件概述

一個電子郵件系統應具有三個主要組成構件:用戶代理、郵件服務器、郵件發送協議(如SMTP,simple mail transfer protocol)和郵件讀取協議(POP3,post office protocol的版本3)。

用戶代理UA(User Agent)——

就是用戶與電子郵件系統的接口,在大多數情況下它就是運行在用戶PC機中的一個程序,因此用戶代理又稱為電子郵件客戶端軟件。它向用戶提供一個很友好的接口(目前主要是窗口界面)來發送和接收郵件。

包括以下四個功能

①撰寫:給用戶提供編輯信息的環境。例如通信錄。

②顯示:能方便地在計算機屏幕上顯示出來信。

③處理:包括發送郵件和接收郵件,收件人應能根據情況按不同方式對來信進行處理,如閱讀后刪除、存盤、打印、轉發。

④通信

郵件服務器——

24小時不間斷工作。功能是發送和接收郵件,同時還要向發件人報告郵件傳送的結果(已交付、被拒絕、丟失等)。按照客戶服務器方式工作,需要使用兩種不同協議:用于用戶代理向郵件服務器發送郵件或在郵件服務器之間發送郵件,如SMTP協議;用于用戶代理從郵件服務器讀取郵件,如郵局協議POP3。它要同時充當客戶和服務器。

兩種不同通信方式——①“推”,SMTP客戶把郵件“推”給SMTP服務器。②“拉”,POP3客戶把郵件從POP3服務器“拉”過來。

為什么郵件服務器程序不能在發送方和接收方的PC機中運行?——有些計算機可能沒有足夠的存儲器來運行允許程序在后臺運行的操作系統,或是可能沒有足夠的CPU能力來運行郵件服務器程序。PC機也不是24小時開著。

電子郵件由信封和內容組成。TCP/IP體系的電子郵件系統規定電子郵件地址的格式為:收件人郵箱名@郵箱所在主機的域名。

2.簡單郵件傳送協議SMTP

主要特點:規定了在兩個相互通信的SMTP進程之間應如何交換信息。郵件內部格式、如何存儲未規定。

下面介紹通信三個階段的命令和相應信息。

Ⅰ、連接建立

發件人的郵件送到發送方郵件服務器的郵件緩存后,SMTTP客戶就每隔一定時間(例如30分鐘)對郵件緩存掃描一次。如發現有郵件,就使用SMTP的熟知端口號碼(25)與接收方郵件服務器的SMTP服務器建立TCP連接。在連接建立后,接收方SMTP服務器要發出“220 Sever ready”(服務就緒)。然后SMTP客戶向SMTP服務器發送HELO命令,附上發送方的主機名。SMTP服務器有能力接收,則回答“250 OK”,表示已準備好接收。不可用則回答“421 Sever not available”(服務不可用)。一定時間內發送不了郵件,則把這個情況通知發件人。

SMTP不使用中間的郵件服務器。不管發送方和接收方的郵件服務器相隔多遠,都用發送方和接收方兩個郵件服務器之間直接建立。當出現故障時,發送方服務器等一段時間后再嘗試建立TCP連接,而不能先找一個中間的郵件服務器建立TCP連接。

Ⅱ、郵件傳送

開始:MAIL命令mail命令后面有發件人的地址。如:MAIL FROM:。若SMTP服務器已準備好接收郵件,則回答“250 OK”。否則,返回一個代碼,指出原因。如:451(處理時出錯)、452(存儲空間不夠)、500(命令無法識別)等。

然后:RCPT命令取決于把同一個郵件發送給一個或多個收件人,其格式為RCPT TO:<收件人地址>。RCPT是recipient(收件人)縮寫。每發送一個RCPT命令,都應當有相應的信息從SMTP服務器返回。如:“250 OK”,表明指明的郵箱在接收方的系統中,或“550 No such user here”(無此用戶),即不存在此郵箱。作用:先弄清接收方系統是否已做好接收郵件的準備,然后才發送郵件,這樣做是為了避免浪費通信資源,不致于發送很長郵件后才知道是因地址錯誤。

最后:DATA命令表示要開始傳送郵件的內容了。SMTP服務器返回的信息是:“354 Start mail input;end with.”。不接收郵件,則返回421(服務器不可用等)。接著SMTP客戶就發送郵件的內容,發送完畢后,則發送.(兩個回車換行中間用一個點隔開)表示郵件內容結束。實際上在服務器端看到的可打印字符只是一個英文的句點。若郵件收到了,則SMTP服務器返回信息“250 OK”,或返回差錯代碼。

注意:

雖然SMTP使用TCP連接試圖使郵件的傳送可靠,但它不能保證不丟失郵件。接收方的郵件服務器也許會出故障,使收到的郵件全部丟失(在收件人讀取信息之前),然而基于SMTP的電子郵件都通常被認為是可靠的。

Ⅲ、連接釋放

郵件發送完畢后,SMTP客戶發送QUIT命令。SMTP服務器返回的信息是“221(服務關閉)”,表示SMTP同意釋放TCP連接。

用戶看不見以上過程,全被電子郵件的用戶代理屏蔽了。

3.電子郵件的信息格式

分為信封和內容。內容有首部和主體。首部有很多關鍵字:

To:后面接一個或多個收件人的電子郵件地址

Subject:主題,反映了郵件的主要內容,便于用戶查找郵件

抄送Cc:carborn copy,意思是留下一個“復寫副本”

Bcc:盲復寫副本,使發件人能將郵件的副本送給某某人,但不希望此事為收件人知道,又叫“暗送”

From、Date:發件人的電子郵件地址和發信日期,由郵件系統自動填入

Reply-To:即對方回信所用的地址,這個地址可與發件人發信時所用的地址不同

4.郵件讀取協議POP3和IMAP

Ⅰ、郵件讀取協議POP3

工作原理:是一個非常簡單、但功能有限的郵件讀取協議。使用客戶服務器方式,在接收郵件的用戶PC機中的用戶代理必須運行POP客戶程序,而在收件人所連接的ISP的郵件服務器中則運行POP服務器程序。當然,這個ISP的郵件服務器還必須運行SMTP服務器程序,以便接收發送方郵件服務器的SMTP客戶程序發來的郵件。POP服務器只有在用戶輸入鑒別信息(用戶名和口令)后,才允許對郵箱進行讀取。

特點:只要用戶從POP服務器讀取了郵件,POP服務器就把該郵件刪除。這樣很不方便,所以POP3進行了一些功能擴充,如讓用戶事先設置郵件讀取后仍在POP服務器中存放的時間。

Ⅱ、網際報文存取協議IMAP

工作原理:用戶的PC機運行IMAP客戶程序,然后與接收方的郵件服務器上的IMAP服務器程序建立TCP連接。用戶在自己的PC機上就可以操縱郵件服務器的郵箱,就像在本地操縱一樣,因此IMAP是一個聯機協議。當用戶PC機上的IMAP客戶程序打開IMAP服務器的郵箱時,用戶就可看到郵件的首部。若用戶需要打開某個郵件,則該郵件才傳到用戶的計算機上。用戶未發出刪除郵件的命令之前,IMAP服務器郵箱中的郵件一直保存著。

好處:①用戶可在不同地方使用不同的計算機;②允許收件人只讀取郵件中的某一部分。

缺點:如果用戶沒有將郵件復制到自己的PC機上,則郵件一直是存放在IMAP服務器上。因此,用戶需要經常與IMAP服務器建立連接(因為許多用戶要考慮所花費的上網費)。

Ⅲ、POP、IMAP與SMTP不同

POP和IMAP是用戶代理從接收方郵件服務器上讀取郵件所使用的協議

SMTP協議是用于:發件人的用戶代理向發送方郵件服務器發送郵件,以及發送方郵件服務器向接收方郵件服務器發送郵件。

5.基于萬維網的電子郵件

6.通用因特網郵件擴充MIME

Ⅰ、MIME概述

(1)SMTP缺點

①不能傳送可執行文件或其他的二進制對象;

②限于傳送7位的ASCII碼,許多其他非英語國家的文字無法傳送,即使在SMTP網關將EBCDIC碼(即擴充的二/十進制交換碼轉換為ASCII碼)時也會遇到一些麻煩;

③SMTP服務器會拒絕超過一定長度的郵件;

④某些SMTP的實現并沒有完全按照SMTP的因特網標準,問題有如回車換行的刪除和增加、后面多余空格的刪除等。

(2)通用因特網郵件擴充MIME

增加了郵件主體的結構,并定義了傳送非ASCII碼的編碼規則。

包含三部分內容:

①5個新的郵件首部字段

1.MIME-Version:標志MIME的版本,現在版本號是1.0,如無此行,則為英文版本;

2.Content-Description:可讀字符串,說明郵件主體是否是圖像、音頻或視頻;

3.Content-Id:郵件的唯一標識符

4.Content-Transfer-Encoding:在傳送時郵件的主體是如何編碼的

5.Content-Type:說明郵件主體的數據類型和子類型

下面對后兩項介紹

②定義了很多郵件內容的格式,對多媒體電子郵件的表示方法進行了標準化

③定義了傳送編碼,可對任何內容格式進行轉換,而不會被郵件系統改變

Ⅱ、內容傳送編碼

有三種。

(1)7位ASCII碼

每行不超過1000個字符,MIME對這種由ASCII碼構成的郵件主體不進行任何轉換

(2)quoted-printable

適用:傳送的數據中只有少量的非ASCII碼,如漢字

要點:對于所有可打印的ASCII碼,除特殊字符等號“=”外,都不改變。等號和不可打印的ASCII碼以及非ASCII碼的數據的編碼方法是:先將每個字節的二進制代碼用兩個十六進制數字表示,然后在前面再加上一個等號“=”。

“=”的二進制代碼為00111101,即十六進制的3D,因此等號的quoted-printable編碼為“=3D”

(3)base64編碼

做法:先將二進制代碼劃分為一個個24位長的單元,然后把每一個24位單元劃分為4個6位組。每一個6位組按以下方法轉換成ASCII碼。6位的二進制代碼共有64種不同的值,從0到63。用A表示0,用B表示1,等等。26個大寫字母排列完畢后,接下去再排26個小寫字母,再后面是10個數字,最后用+表示62,用/表示63。再用“==”和“=”分別表示最后一組的代碼只有8位或16位?;剀嚭蛽Q行都忽略,它們可在任何地方插入。

Ⅲ、內容類型

MIME標準規定內容類型必須含有兩個標識符,即內容類型和子類型,中間用/分開。MIME允許發件人和收件人自己定義專用的內容類型,但為避免可能出現名字沖突,標準要求為專用的內容類型選擇的名字要以字符串X-開始。

六、動態主機配置協議DHCP

背景:為了把協議軟件做成通用的和便于移植,協議軟件的編寫者不會把所有細節都固定在源代碼中,而是把協議軟件參數化,使得在很多臺計算機上有可能使用同一個經過編譯的二進制代碼。計算機之間的區別可通過一些不同參數來實現,在協議軟件運行前,要給每一個參數賦值。

協議配置:在協議軟件中給參數賦值。協議軟件在使用前已正確配置,具體配置信息有哪些取決于協議棧。連接到因特網的計算機的協議軟件需要配置的項目包括:IP地址、子網掩碼、默認路由器的IP地址、域名服務器的IP地址。

DHCP:提供了一種機制,叫即插即用連網,允許一臺計算機加入新的網絡和獲取IP地址而不用手工參與。

適用范圍:對客戶軟件和服務軟件都適用,當運行客戶軟件的計算機移至一個新的網絡時,就可使用DHCP獲取其配置信息而不需要手工干預;DHCP給運行服務器軟件而位置固定的計算機指派一個永久地址,而當這計算機重新啟動時其地址不改變。

工作原理:采用客戶服務器方式,需要IP地址的主機在啟動時向DHCP服務器廣播發送發現報文(DHCPDISCOVER)(將目的IP地址置為全1,即255.255.255.255),這時該主機就成為DHCP客戶。發送廣播報文是因為還不知道DHCP服務器在什么地方,因此要發現DHCP服務器的IP地址。這個主機目前還沒有自己的IP地址,因此它將IP數據報的源IP地址設為全0。這樣,在本地網絡上的所有主機都能收到這個廣播報文,但只有DHCP服務器才對此廣播報文進行回答。DHCP服務器先在其數據庫中查找該計算機的配置信息。若找到,則返回找到的信息。若找不到,則從服務器的IP地址池(address pool)中取一個地址分配給該計算機,DHCP服務器的回答報文叫做提供報文(DHCPOFFER),表示“提供”了IP地址等配置信息。

DHCP中繼代理:代替了DHCP服務器,配置了DHCP服務器的IP地址信息。當DHCP中繼代理收到主機A以廣播形式發送的發現報文后,就以單播方式向DHCP服務器轉發此報文,并等待其回答。收到DHCP服務器回答的提供報文后,DHCP中繼代理再把此提供報文發回給主機A。實際上,DHCP報文只是UDP用戶數據報的數據,它還要加上UDP首部、IP數據報首部、以太網的MAC幀的首部和尾部后,才能在鏈路上傳送。

DHCP服務器分配給DHCP客戶的IP地址是臨時的,因此DHCP客戶只能在一段有限時間內使用這個分配到的IP地址。這段時間叫租用期

DHCP適合于經常移動位置的計算機,當計算機使用windows操作系統時,若點擊控制面板的網絡圖標就可以找到某個連接中的“網絡”下面的菜單,找到TCP/IP協議后點擊“屬性”,選擇“自動獲得IP地址”和“自動獲得DNS服務器地址”,就表示是使用DHCP協議。

七、簡單網絡管理協議SNMP

1.網絡管理的基本概念

網絡管理包括對硬件、軟件和人力的使用、綜合與協調,以便對網絡資源進行監視、測試、配置、分析、評價和控制,這樣就能以合理的價格滿足網絡的一些需求,如實時運行性能、服務質量等。簡稱網管。

管理站又稱管理器,是整個網絡管理系統的核心,所在部門叫作網絡運行中心NOC,關鍵構件是管理程序。管理程序在運行時就稱為管理進程。管理站(硬件)或管理程序(軟件)都可稱為管理者或管理器。

被管設備可以是主機、路由器、打印機、集線器、網橋、調制解調器等。被管設備的某個硬件、軟件等叫作被管對象。在每一個被管設備中都要運行一個程序以便和管理站中的管理程序進行通信,這些運行著的程序叫作網絡管理代理程序,或簡稱代理。代理程序在管理程序的命令和控制下在被管設備上采取本地的行動。

簡單網絡管理協議SNMP中的管理程序和代理程序按客戶服務器方式工作,管理程序運行SNMP客戶程序,代理程序運行SNMP服務器程序。

網絡管理的基本原理:若要管理某個對象,就必然會對該對象添加一些軟件或硬件,但這種“添加”必須對原有對象的影響盡量小些。

若網絡元素使用的不是SNMP協議而是另一種網絡管理協議,那么SNMP協議就無法控制該網絡元素,這時可使用委托代理。委托代理能夠提供如協議轉換和過濾操作等功能對被管對象進行管理。

SNMP的網絡管理由三個部分組成,即SNMP本身、管理信息結構SMI(structure of management information)、管理信息庫MIB(management information base)。

SNMP定義了管理站和代理之間所交換的分組格式,所交換的分組包含各代理中的對象(變量)名及其狀態(值)。SNMP負責讀取和改變這些數值。

SMI定義了命名對象和定義對象類型(包括范圍和長度)的通用規則,以及把對象和對象的值進行編碼的規則。這樣做可確保網絡管理數據的語法和語義的無二義性。

SMI建立規則,MIB對變量進行說明,SNMP完成網管的動作。

2.管理信息結構SMI

功能有三:①被管對象怎樣命名;

②用來存儲被管對象的數據類型有哪些;

③在網絡上傳送的管理數據應如何編碼。

Ⅰ、被管對象的命名

SMI規定,所有的被管對象都必須在對象命名樹上。在只討論internet中的對象時,可只畫出internet以下的字符,并在internet節點旁邊寫上對象標識符1.3.6.1即可。

Ⅱ、被管對象的數據類型

SMI使用基本的抽象語法記法1(即ISO制定的ASN.1)來定義數據類型,但又增加了一些新的定義。因此SMI既是ASN.1的子集,又是ASN.1的超集。ASN.1記法嚴格,使得數據的含義不存在任何可能的二義性。

任何數據都具有兩種重要屬性,即值與類型?!爸怠笔悄硞€值集合中的一個元素,“類型”是值集合的名字。SMI把數據類型分為兩大類:簡單類型和結構化類型。

結構化類型有兩種:sequence(簡單數據類型的組合,不一定要相同類型)和sequence of(同樣類型的簡單數據類型的組合,或同類型的sequence數據類型的組合)。

Ⅲ、編碼方法

SMI使用ASN.1制定的基本編碼規則BER進行數據的編碼。BER指明了每種數據的類型和值。在發送端用BER編碼,可把用ASN.1所表述的報文轉換成唯一的比特序列。在接收端用BER編碼,就可得到該比特序列所表示的ASN.1報文。

ASN.1把所有的數據元素都表示為T-L-V三個字段組成的序列。

(1)T字段

又叫標記字段,分為類別、格式、編號。

類別共四種:通用類(00),即ASN.1定義的類型;應用類(01),即SMI定義的類型;上下文類(10),即上下文所定義的類型;專用類(11),保留為特定廠商定義的類型。

格式共兩種,指出數據類型的種類:簡單數據類型(0),結構化數據類型(1)。

編號用來標志不同的數據類型。編號范圍一般為0~30,編號大于30時,T字段就要擴展為多個字節。

(2)L字段

又叫做長度字段(單字節或多字節)。為單字節時,最高位為0,后面的7位定義V字段的長度。為多字節時,最高位為1,后面的7位定義后續字節的字節數(用二進制整數表示)。

(3)V字段

叫作值字段,用于定義數據元素的值。

舉例:INTEGER 15,根據表6-4,其T字段是02,再根據表6-3,INTEGER類型要用4字節編碼。最后得出TLV編碼為02 04 00 00 00 0F。

3.管理信息庫MIB

“管理信息”是在因特網的網管框架中被管對象的集合,被管對象必須維持可供管理程序讀寫的若干控制和狀態信息。這些被管對象構成了一個虛擬的信息存儲器,所以才稱為管理信息庫MIB。管理程序就是用MIB中這些信息的值對網絡進行管理(如讀取或重新設定這些值)。只有在MIB中的對象才是SNMP所能夠管理的。

例如調制解調器應維持發送和接收的字符數、碼元傳輸速率和接受的呼叫等統計信息。

舉例——從圖6-23可看出,對象IP的標號是4,因此所有與IP有關的對象都從前綴1.3.6.1.2.1.4開始。

(1)在節點IP下面有個名為ipInRecevies的MIB變量(圖6-23),表示收到的IP數據報數。這個變量的標號是3,變量的名字是:iso.org.dod.internet.mgmt.mib.ipInReceives,而相應的數值表示是:1.3.6.1.2.1.4.3。

(2)當SNMP在報文使用MIB變量時,對于簡單類型的變量,后綴0指具有該名字的變量的實例。因此,當這個變量出現在發送給路由器的報文中時,ipInReceives的數值表示(即變量的一個實例)就是1.3.6.1.2.1.4.3.0。

(3)請注意,對于分配給一個MIB變量的數值或后綴是完全沒有辦法進行推算的,必須查找已發布的標準。


MIB變量只給出了每個數據項的邏輯定義,而一個路由器使用的內部數據結構可能與MIB的定義不同。當一個查詢到達路由器時,路由器上的代理軟件負責MIB變量和路由器用于存儲信息的數據結構之間的映射。

4.SNMP的協議數據單元和報文

Ⅰ、探詢和陷阱

SNMP的操作只有兩種基本的管理功能,即“讀”操作(用Get報文來檢測各被管對象的狀況)和“寫”操作(用Set報文來改變各被管對象的狀況)。

探詢:實現上面的功能,即SNMP管理進程定時向被管理設備周期性地發送探詢信息,上述時間間隔可通過SNMP的管理信息庫MIB來建立。

探詢好處是:一來可使系統相對簡單,二來能限制通過網絡所產生的管理信息的通信量。

探詢缺點是:一來不夠靈活,而且所管理的設備數目不能太多;二來開銷大。

陷阱:不通過探詢就能發送某些信息,能夠捕捉“事件”。但陷阱的參數是受限制的。當被管對象的代理檢測到有事件發生時,就檢查其門限值。代理只向管理進程報告達到某些門限值的事件(叫過濾),這樣好處:一來只在嚴重事件發生時才發送陷阱;二來陷阱信息很簡單且所需字節數很少。

總之,使用探詢(至少是周期性地)以維持網絡資源的實時監視,同時也采用陷阱機制報告特殊事件,使得SNMP成為一種有效的網絡管理協議。

Ⅱ、結構

使用無連接的UDP,因此在網絡上傳送SNMP報文的開銷較小,但不保證可靠支付。在運行代理程序的服務器端用熟知端口161來接收Get或Set報文和發送響應報文(與熟知端口通用的客戶端使用臨時窗口),但運行管理程序的客戶端則使用熟知端口162來接收來自各代理的trap報文。

和大多數TCP/IP協議不一樣,SNMP報文沒有固定的字段,想反它們使用標準ASN.1編碼,因此SNMP報文用人工進行編碼和理解時都比較困難??聪聢D結構,首部包括報文標識、最大報文長度、報文標志。報文標志占1字節,其中的每一位定義安全類型或其他信息,安全參數用來產生報文摘要(見7.4節)

PDU前面的兩個加密字段在數據部分需要加密時才使用。與網絡管理直接相關的是后面的SNMP PDU部分,對于表6-7給出的前四種PDU的格式都是相同的,即由PDU類型、請求ID、差錯狀態、差錯索引以及變量綁定這幾個字段組成。PDU類型以及類型編號、T字段的編碼已在表6-7中給出。

(1)請求標識符

由管理進程設置的4字節整數值。代理進程在發送響應報文時也要返回此請求標識符。由于管理進程可同時向許多代理發出請求讀取變量值的報文,因此設置了請求標識符可使管理進程能夠識別返回的響應是對應于哪一個請求報文。

(2)差錯狀態

在請求報文中,這個字段是零。當代理進程響應時,就填入0-18中的一個數字,例如0表示noError,1表示tooBig等等。

(3)差錯索引

在請求報文中,這個字段是零。當代理進程響應時,若出現noSuchName、badValue、readOnly的差錯,代理進程就設置一個整數,指明有差錯的變量在變量列表中的偏移。

(4)變量綁定

指明一個或多個變量的名和對應的值。在請求報文中,變量的值應忽略。(類型是NULL)

下圖舉例:


八、應用進程跨越網絡的通信

還有一些特定的應用需要因特網的支持,但這些應用又不能直接使用已經標準化的因特網應用協議,就要進行下面工作。

1.系統調用和應用編程接口

大多數操作系統使用系統調用的機制在應用程序和操作系統之間傳遞控制權。應用進程啟動時,控制權傳遞:應用進程→系統調用接口→操作系統,操作系統的內部過程完畢,就返回給應用功能進程。

由于應用程序在使用系統調用之前要編寫一些程序,特別是需要設置系統調用中的許多參數,因此這種系統調用接口又稱為應用編程接口API(application programming interface)。API從程序設計的角度定義了許多標準的系統調用函數。應用進程只要使用標準的系統調用函數就可得到操作系統的服務,因此從程序設計的角度看,也可以把API看成是應用程序和操作系統之間的接口。

現在TCP/IP協議軟件已駐留在操作系統中。由于TCP/IP協議族被設計成能運行在多種操作系統的環境中,因此TCP/IP標準沒有規定應用程序與TCP/IP協議軟件如何接口的細節,而是允許系統設計者能夠選擇有關API的具體實現細節。目前,只有幾種可供應用程序使用TCP/IP的應用編程接口API,著名的一種叫套接字接口(socket interface,或插口接口)。

只要應用程序使用TCP/IP協議進行通信,它就必須通過套接字與操作系統交互(這就要使用系統調用函數)并請求其服務。

應用進程(客戶或服務器)需要使用網絡進行通信時,必須首先發出socket系統調用,請求操作系統為創建一個套接字。這種調用的實際效果是請求操作系統把網絡通信所需要的一些系統資源(如存儲器空間、CPU時間、網絡帶寬)分配給該應用進程。操作系統為這些資源的總和用一個叫作套接字描述符的號碼(小的整數)來表示,然后把這個套接字描述符返回給應用進程。此后,應用進程所進行的網絡操作(建立數據、收發數據、調整網絡通信參數等)都必須使用這個套接字描述符。所以,幾乎所有的網絡系統條用都把這個套接字描述符作為套接字的許多參數中的第一個參數。在處理系統調用的時候,通過套接字描述符,操作系統就可以識別出應該使用哪些資源來完成應用進程所請求的服務。通信完畢后,應用進程通過一個關閉套接字的close系統調用通知操作系統回收與該套接字描述符相關的所有資源。由此可見,套接字是應用進程為了獲得網絡通信服務而與操作系統進行交互時使用的一種機制

由于在一個機器中可能同時出現多個套接字,因此需要有一個存放套接字描述符的表,而每一個套接字描述符有一個指針指向存放套接字的地址。

2.幾種常用的系統調用

以使用TCP的服務為例介紹。

Ⅰ、連接建立階段

服務器端把本地地址綁定到套接字:套接字被創立后,它端口號和IP地址都是空的,因此在服務器端調用bind以把熟知端口號和本地IP地址填寫到已創建的套接字中。

客戶端可不調用bind,是由操作系統內核自動分配一個動態端口號(通信結束后由系統收回)。

①服務器為了接受客戶端發起的連接請求而進行的一些系統調用

服務器在調用bind后,還使用listen把套接字設置為被動方式,以便隨時接受客戶的服務請求。UDP服務器由于只提供無連接服務,不使用listen系統調用。

接著調用accept,以便把遠地客戶進程發來的連接請求提取出來,系統調用accept的一個變量就是要指明從哪一個套接字發起的連接。accept要完成的動作較多,這是因為一個服務器必須能夠同時處理多個連接(并發方式工作的服務器),可以由多種方式實現這種并發方式。下圖是一種。

主服務器進程M一調用accept,就為每一個新的連接請求創建一個新的套接字,并把這個新創建的套接字的標識符返回給發起連接的客戶方。與此同時,主服務器進程還要創建一個從屬服務器進程S1來處理新建立的連接。從屬服務器用這個新創建的套接字和客戶進程建立連接,而主服務器進程用原來的套接字重新調用accept,繼續接受下一個連接請求。在已建立的連接上,從屬服務器進程就用這個新創建的套接字傳送和接收數據。數據通信結束后,從屬服務器進程就關閉這個新創建的套接字,同時這個從屬服務器也被撤銷。

總之,在任一時刻,服務器中總是有一個主服務器進程和零個或多個從屬服務器進程。主服務器進程用原來的套接字接收連接請求,而從屬服務器進程用新創建的套接字和相應的客戶建立連接并可進行雙向傳送數據。

②客戶端的系統調用

當使用TCP協議的客戶已經用調用socket創建了套接字后,客戶進程就調用connect,以便和遠地服務器建立連接(這就是主動打開,相當客戶發出的連接請求)。在connect系統調用中,客戶必須指明遠地端點(即遠地服務器的IP地址和端口號)。

Ⅱ、數據傳送階段

客戶和服務器都在TCP連接上使用send系統調用傳送數據,使用recv系統調用接收數據。

調用send需要三個變量:數據要發往的套接字的描述符、要發送的數據的地址以及數據的長度。通常send調用把數據復制到操作系統內核的緩存中。若系統調用的緩存已滿,send就暫時阻塞,直到緩存有空間存放新的數據。

調用recv也要三個變量:要使用的套接字的描述符、緩存的地址以及緩存空間的長度。

Ⅲ、連接釋放階段

調用close釋放連接和撤銷套接字。有些系統調用在一個TCP連接中可能會循環使用。UDP服務器由于只提供無連接服務,因此不使用listen和accept系統調用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容