應(yīng)用層協(xié)議原理
- 客戶-服務(wù)器體系結(jié)構(gòu):
特點:客戶之間不能直接通信;服務(wù)器具有周知的,固定的地址,該地址稱為IP地址。
配備大量主機的數(shù)據(jù)中心常被用于創(chuàng)建強大的虛擬服務(wù)器; - P2P體系結(jié)構(gòu):
特點:對位于數(shù)據(jù)中心的專用服務(wù)器有最小(或者沒有)依賴
P2P最引人入勝的特征之一是它具自擴展性:盡管每個對等方都由于請求文件產(chǎn)生工作負荷,但是每個對等方通過向其他對等方發(fā)送文件也為系統(tǒng)增加服務(wù)能力。 - 進程通信:
套接字是同一臺主機內(nèi)應(yīng)用層與運輸層之間的接口,也被稱為應(yīng)用程序和網(wǎng)絡(luò)之間的應(yīng)用程序編程接口(API)。 - 進程尋址:
在因特網(wǎng)中,主機由其IP地址標識,而目的主機中到底是哪個應(yīng)用程序?它由端口號表示。 - 可供應(yīng)用程序使用的運輸服務(wù):
- 可靠數(shù)據(jù)傳輸:
應(yīng)用程序的一端發(fā)送的數(shù)據(jù)正確,完全地交付給該應(yīng)用程序的另一端,如果一個協(xié)議提供了這樣的確保數(shù)據(jù)交付服務(wù),我們就認為提供了可靠數(shù)據(jù)傳輸服務(wù)。 - 吞吐量
- 定時
- 安全性
- 可靠數(shù)據(jù)傳輸:
- 因特網(wǎng)提供的運輸服務(wù):
- TCP服務(wù):
TCP服務(wù)模型包括面向連接服務(wù)和可靠數(shù)據(jù)傳輸服務(wù)。除此之外,TCP還提供擁塞控制機制。
SSL:安全套接字層 - UDP服務(wù):
UDP是一種不提供不必要服務(wù)輕量級運輸協(xié)議。
- TCP服務(wù):
Web和HTTP
Web的應(yīng)用層協(xié)議是HTTP(超文本傳輸協(xié)議)協(xié)議,它是Web的核心。
HTTP使用TCP作為它的支撐運輸協(xié)議
HTTP是一個無狀態(tài)協(xié)議。
HTTP在默認情況下使用持續(xù)連接。
1.HTTP報文格式
-
HTTP請求報文:
GET /somedir/page.html HTTP/1.1 Host:www.someschool.edu Connection:close Uset-agent:Mozilla/5.0 Accept-language:fr
HTTP請求報文的第一行被稱作請求行,其后繼的行叫做首部行。
請求行有三個字段:方法字段,URL字段和HTTP版本字段。
在方法字段中是,可以包括GET,POST,HEAD,PUT和DELETE,絕大部分的HTTP請求報文都使用GET方法。
URL字段中包含了請求對象的標識。
版本字段是自解釋的。
首部行Host:www.someschool.edu指明了對象所在的主機。
通過包含Connection:close首部行,告訴服務(wù)器不必要使用持續(xù)鏈接,在發(fā)送完被請求的對象之后就關(guān)閉連接。
User-agent:向服務(wù)器指明用戶代理,即瀏覽器類型,以便于服務(wù)器發(fā)送對象的不同版本(如果有的話)。
Accept-language:告訴瀏覽器用戶想得到的對象的語法版本(如果有的話)。
-
其中,使用POST方法的時候才使用實體體,例如,用戶向搜索引擎搜索關(guān)鍵詞時,實體體中就是用戶在表單字段輸入的值。
用表單生成的請求報文不是必須使用POST方法!,例如www.somesite.com/animalsearch?monkes&bananas
這時用戶輸入的內(nèi)容就是moknkey和banana。 -
HEAD方法類似與GET方法,但是服務(wù)器不返回請求對象,應(yīng)用程序開發(fā)者通常使用HEAD方法進行調(diào)試跟蹤。
-
PUT方法通常與web發(fā)行工具聯(lián)合使用,它允許用戶上傳對象到指定的Web服務(wù)器上的指定路徑(目錄)。
-
PUT也常被那些需要向Web服務(wù)器上傳對象的一個用程序使用。
-
DELETE方法允許用戶或者應(yīng)用程序傷處Web服務(wù)器上的對象。
-
HTTP響應(yīng)報文
HTTP/1.1 OK Connection:close Date:Tue,18 Aug 2015 15:11:33 GMT Sever:Apache/2.2.3 (CentOS) Last-Modified:Tue,18 Aug 2015 15:11:03 GTM Content-Length:6821 Contect-Type:text/html (data data data data ... )
我們來看看這個響應(yīng)報文:它有三個部分:狀態(tài)行,首部行和實體體,這是上面那個請求報文的響應(yīng)報文。
我們來看看首部行:- Connection close:服務(wù)器用這個首部行告訴客戶:發(fā)送完報文后,我將關(guān)閉TCP連接
- Dtae:指示服務(wù)器產(chǎn)生并且發(fā)送該報文的日期和時間
- Sercer:服務(wù)器的版本,這里指示該服務(wù)器時Apache Web服務(wù)器
- Last-Modified:所請求的對象創(chuàng)建或者最后修改的時間
- Content-Length:指示了被發(fā)送對象中的字節(jié)數(shù)
- Content-Type:指示了實體體中的對象是什么類型,對象類型應(yīng)該正式地由該首部行指示,而不是根據(jù)文件擴展名來展示
- 響應(yīng)報文格式:
2.cookie:
cookie技術(shù)含有四個組件:
- 在HTTP響應(yīng)報文中的一個cookie首部行
- 在HTTP請求報文中的一個cookie首部行
- 在用戶端系統(tǒng)中有一個cookie文件,并且由用戶瀏覽器管理
- 位于Web站點的一個后端數(shù)據(jù)庫
3.Web緩存:
Web緩存器也叫做代理服務(wù)器。簡單來說,就是在客戶端與服務(wù)器之間,安裝一個Web緩存器,該緩存器靠近客戶端,當(dāng)客戶訪問一個Web頁面時,HTTP請求報文被Web緩存服務(wù)器接收,如果該Web緩存服務(wù)器上有客戶請求的對象,則直接返回給客戶,如果沒有的話,則由該Web緩存服務(wù)器向Web服務(wù)器發(fā)送HTTP請求,Web服務(wù)器返回的對象由該Web緩存服務(wù)器接受并保存,然后返回給客戶,這樣,當(dāng)?shù)诙卧L問或者被配置到該Web緩存服務(wù)器的客戶訪問該站點的時候,Web緩存服務(wù)器就能快速做出回應(yīng)。
Web緩存服務(wù)器的優(yōu)勢:
- 大大減少客戶請求響應(yīng)的時間。
- 大大減少一個機構(gòu)的介入鏈路到互聯(lián)網(wǎng)的通信量。
4.條件GET方法:
回想我們上面講過的Web緩存,你有沒有發(fā)現(xiàn)一個問題?就是如果一個Web頁面被Web緩存器保存了,如果說,Web服務(wù)器后來更新了該頁面,那么不是會出現(xiàn)問題嗎?
解決這個問題的方法就是條件GET方法:
當(dāng)用戶請求某個頁面的時候(正好該Web緩存服務(wù)器上有緩存),那么該Web緩存服務(wù)器就向Web服務(wù)器發(fā)送一個條件GET報文:
GET /fruit/kiwi.gif HTTP/1.1
Host:www.exotiquecuisine.com
If-modified-since:Wed,9 Sep 2015 09:23:24
這里需要注意:這里的If-Modified_since首部行的值,就是該Web緩存服務(wù)器中,上一次接收到該對象的Last-Modified時間,也就是說,該Web緩存器告訴Web服務(wù)器:如果這個時間之后你們改變了對象,那么你就把新的給我發(fā)過來。
如果該對象沒有被改變,則Web服務(wù)器發(fā)送響應(yīng)報文:
HTTP/1l1 304 Not Modified
Date:Sat,10 Oct 2015 15:39:29
Server:Apache/1.3.0(Unix)
(empty extity body)
注意該響應(yīng)報文中并沒有包含對象,如果說,Web服務(wù)器上沒有更新該對象的話,那么此報文中包含對象只會浪費帶寬。
英特網(wǎng)中的電子郵件
郵箱系統(tǒng)的組成部分:用戶代理,郵件服務(wù)器,簡單郵件傳輸協(xié)議(STMP),信箱
- STMP與HTTP的對比:
- HTTP是一個“拉協(xié)議”,而STMP是一個“推協(xié)議”
- STMP要求每個報文使用7字節(jié)ASCII碼形式,而HTTP數(shù)據(jù)不受這個限制
- 郵件訪問協(xié)議:
用戶之間發(fā)送郵件的時候,郵件被保存在了我的郵箱代理中了,但是我怎么查看郵件?STMP是一個推協(xié)議,我不能拉回來呀,所以就出現(xiàn)了郵件訪問協(xié)議,目前流行的郵件訪問協(xié)議有:第三版的郵局協(xié)議(POP3),因特網(wǎng)郵件訪問協(xié)議(IMAP)以及HTTP。
DNS(域名系統(tǒng)):英特網(wǎng)的目錄服務(wù)
因特網(wǎng)上的主機像人一樣,我們也希望標識,主機可以使用主機名和IP地址來標識,但是我們更傾向于記住它的主機名而不是IP地址,所以,需要在主機名和IP地址之間進行轉(zhuǎn)化,DNS就承擔(dān)了這項任務(wù)。
DNS是:①一個有分層的DNS服務(wù)器實現(xiàn)的分布式數(shù)據(jù)庫,②一個使得主機能夠查詢分布式數(shù)據(jù)庫的應(yīng)用層協(xié)議。
DNS協(xié)議運行在UDP之上,使用53號端口。
除了進行主機名到IP地址的轉(zhuǎn)換之外,DNS還提供了一些重要的任務(wù):
- 主機別名
- 郵件服務(wù)器別名
- 負載分配
DNS工作機理概述:
- DNS一種簡單的設(shè)計是在英特網(wǎng)上只用一個DNS服務(wù)器,該服務(wù)器包含所有的映射。
但是這種設(shè)計肯定存在很多問題:- 單點故障:如果說這個服務(wù)器發(fā)生了故障,整個因特網(wǎng)將癱瘓!
- 通信容量:這個服務(wù)器要處理來自因特網(wǎng)上所有的DNS查詢。
- 遠距離的集中式數(shù)據(jù)庫:有時候真的可能要跨越半個地球!這中間可能有低俗的擁塞鏈路,那將會特別慢!
- 維護:如果說出現(xiàn)了一個新的主機,他就要維護。
那么解決方法有哪些?我們來看看:
- 分布式,層次數(shù)據(jù)庫:
其中包括:根DNS服務(wù)器,頂級域(DNS)服務(wù)器,權(quán)威DNS服務(wù)器,還包括本地DNS服務(wù)器,但是要注意本地DNS服務(wù)器不屬于該服務(wù)器的層次結(jié)構(gòu)!
在實踐中,通常從請求主機到本地DNS服務(wù)器的查詢是遞歸查詢,其他的查詢都是迭代查詢。 - DNS緩存
因為有緩存機制的存在,除了少數(shù)DNS查詢以外,跟服務(wù)器都被繞過了。
P2P文件分發(fā)
我們之前講述的客戶-服務(wù)器的體系結(jié)構(gòu),總是要求服務(wù)器是打開的,使用P2P體系結(jié)構(gòu),能夠?qū)偸谴蜷_的基礎(chǔ)設(shè)置服務(wù)器有最小的(甚至沒有)依賴。
對等方不僅是比特的消費者,還是它們的重新分發(fā)者。
視頻流和文件分發(fā)網(wǎng)
HTTP
經(jīng)HTTP的動態(tài)適應(yīng)性流(Dynamic Adaptive Streaming over HTTP)(DASH)
- 內(nèi)容分發(fā)網(wǎng)(CDN)
專用CND和第三方CND
套接字編程
-
UDP套接字編程:
UDPClient.py:from socket import * serverName = 'hostname' serverPort = 12000 clientSocket = socket(AF_INET,SOCK_DGRAM) message = raw_input('Input lowercase sentencte:') clientSocket.sendto(message.encode(),(serverName,serverPort)) modifiedMessage,serverAddress = clientSocket.recvfrom(2048) print(modifiedMessage.decode()) clientSocket.close()
UDPServer.py:
from socket import * serverPort = 12000 serverSocket = socket(AF_INET,SOCK_DGRAM) serverSocket.bind('',serverPort) print("The server is ready to receive") while True: message,clientAddress = serverSocket.recvfrom(2048) modifiedMessage = message.decode().upper() serverSocket.sendto(modifiedMessage.encode(),clientAddress)
-
TCP套接字編程:
TCPClient.py:文章來源:http://www.zghlxwxcb.cn/news/detail-741115.htmlfrom socket import * serverName = 'servername' serverPort = 12000 clientSocket = socket(AF_INET,SOCK_STREAM) clientSocket.connect((serverName,serverPort)) sentence = raw_input('Input lowercase sentence') clientSocket.send(sentence.encode()) modifiedSentence = clientSocket.recv(1024) print('From Server: ',modifiedSentence.decode()) clientSocket.close()
TCPServer.py:文章來源地址http://www.zghlxwxcb.cn/news/detail-741115.html
from socket import * serverPort = 12000 serverSocket = socket(AF_INET,SOCK_STREAM) serverSocket.bind(('',serverPort)) serverSocket.listen(1) print('The Server is ready to receive') while True: connectionSocket,addr = serverSocket.accept() sentence = connectionSocket.recv(1024).decode() capitalizedSentence = sentence.upper() connectionSocket.send(capitalizedSentence.encode()) connectionSocket.close()
到了這里,關(guān)于【計算機網(wǎng)絡(luò)】應(yīng)用層的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!