計算機網絡自頂向下方法--第二章 應用層

1.應用程序體系結構:

客戶端-服務器體系結構

P2P體系結構

2.進程通信:

當進程運行在相同的端系統上時,它們使用進程間通訊機制互相通訊。進程間通訊的規則由端系統上的操作系統確定。

當進程運行在不同的端系統上時,它們使用計算機網絡交互報文而互相通信

進程通過套接字軟件接口向網絡發送報文和從網絡接收報文。

3.進程尋址

IP+端口號

端口號作用:用於標識一個唯一的進程。

https://www.iana.org/   可以用於查看一些比較出名的特定端口號。 

 

運輸層提供不止一種協議,當應用層要使用運輸層時,必須指明使用哪個協議。

應用程序服務要求:

可靠數據傳輸(對應:容忍丟失),

吞吐量(帶寬敏感應用,如多媒體應用。web應用,郵件應用屬於彈性應用)

定時:如保證從發送到接受的時延不超過100ms,對於視頻電話和遊戲很重要。

安全性:如加密,數據完整性,端點鑑別等

因特網爲應用程序提供兩個運輸層協議:TCP和UDP

4.TCP

面向連接的服務: 通信前的三次握手。這個連接時全雙工的(即連接雙方的進程可以在此連接上同時進行報文收發)。應用程序結束報文發送時的,必須拆除該連接。

可靠數據傳送服務:無差錯,按適當順序交付所有發送的數據,而沒有字節的丟失和冗餘。

擁塞控制機制:不一定能爲通訊進程帶來直接好處,但能爲因特網帶來整體好處。

安全性:無論TCP還是UDP都沒有提供任何加密機制。

SSL(Secure Sockets Layer):安全套接字層注意:SSL不是運輸層協議,它只是對TCP的一種增強,這種強化是在應用層上實現的。

如果一個應用要使用SSL,那麼該應用的客戶端和服務端都需要包括SSL的代碼。

發送進程(明文) --------->SSL 套接字-----加密------>TCP套接字------------因特網----------------->TCP套接字--------->SSL 套接字-----解密----->接收進程(明文)

5.UDP

6.運輸層提供的服務

TCP可以提供可靠數據傳輸服務,TCP+SSL可以提供安全性服務。吞吐量定時服務是運輸層沒有提供的保證。

7.一些應用使用的協議

因特網電話:一般是使用UDP進行通信,但使用UDP一般會被防火牆阻擋,所以當UDP通信失敗時,TCP作爲備用。

8.應用程序協議

定義了運行在不同端系統上的應用程序如何互相傳遞報文。

有些應用層協議是由RFC定義的,因此它被用在公共域中。如HTTP--->RFC 2616和RFC 1945

還有一些應用層協議是專用的,有意不被公共域使用。如:Skype

講解順序:HTTP---->FTP---->SMTP---->DNS---->P2P

web最具吸引力的地方:按需操作

二.HTTP

HTTP有兩個程序實現,一個是客戶端程序一個是服務器程序。

多數的web頁面包含一個HTML基本文件,已經幾個引用對象。

URL:由兩部分組成,存放對象的服務器主機名對象的路徑名

HTTP使用TCL作爲它的支撐運輸層協議。HTTP客戶端首先發起一個與服務器的TCP連接,一旦連接建立該客戶端和服務器進程就可以通過套接字接口訪問TCP。

HTTP是一個無狀態協議

2.非持續連接和持續連接

非持續連接:每個請求/響應對經一個單獨的TCP連接發送。

持續連接:所有的請求/響應經相同的TCP連接發送。

3.HTTP報文格式

請求報文:                                  

響應報文:

4.cookie

cookie技術有4個組件:

a.響應報文中的Set-cookie首部行

b.請求報文中的Cookie首部行

c.瀏覽器中的cookie文件

d.web站點的後端數據庫

可以使用cookie來實現購物車

5.web緩存器(又叫:代理服務器)

它能代表初始web服務器滿足HTTP請求的網絡實體。

web緩存器有自己的磁盤存儲空間,它能存儲最近請求過的對象副本。

web緩存器既是客戶端又是服務器。

web緩存器通常由ISP購買並安裝。

使用web緩存器的兩個原因:

a.直接從web緩存器中拿到對象,可以提高響應速度

b.可以大大減少一個機構的接入鏈路到因特網的通信量(可以減少流量強度),從而可以不必要求增加帶寬,降低了費用。

CDN(Content Distribution Network)內容分發網絡:使大量流量實現本地化。

CND的缺點:緩存的信息可能已經過時。

解決方案:使用條件GET方法(HTTP協議有一種機制,允許緩存器證實它的對象是最新的)。

步驟(代理服務器):1.使用get方法。2.發送請求報文中的首部行包含:If-Modified-Since(該值等於初始服務器響應報文中的Last-Modified的值)。3.初始服務器返回的響應報文的狀態行: 304 Not Modified說明沒有被修改過。

三.郵件協議

1.電子郵件是一種異步通信媒介

2.郵件系統的三個組成部分:用戶代理郵件服務器SMTP(簡單郵件傳輸協議:Simple Mail Transfer Protocol)。其中郵件服務器是核心,郵箱也是在郵件服務器上。

3.郵件服務器具有重試機制

4.SMTP:使用的是TCP連接,而且SMTP不使用中間郵件服務器進行轉發,而是直接的發送到對方的郵件服務器。

5.SMTP和HTTP的差別:

SMTP是推協議,HTTP是拉協議

6.郵件訪問協議:POP3 , IMAP,HTTP(這三種協議都是拉協議)

四.DNS

1.主機的標識方法:主機名 , IP地址

2.DNS的作用:將主機名和IP地址進行映射

3.何爲DNS服務器:運行BIND軟件的UNIX/Linux服務器。DNS協議運行在UDP之上,一般使用53端口號。

4.DNS還可以提供的其他服務:

主機別名,郵件服務器別名,負載分配

5.DNS的工作機制

DNS採用了分佈式的設計方案。沒有一臺DNS服務區上擁有所有的主機映射。DNS的層次結構分爲三種服務器:根DNS服務器頂級域DNS服務器權威DNS服務器。還有本地DNS服務器,雖然本地DNS服務器不屬於DNS的層次結構,但它的作用和重要。如訪問www.amazon.com工作流程大體如下:

客戶端--->本地DNS服務器--->根DNS服務器之一--->返回頂級域(com)DNS的ip

本地DNS服務器--->頂級域DNS服務器之一--->返回權威(amazon.com)DNS服務器的ip

本地DNS服務器--->權威DNS服務器之一--->返回最終的主機ip

本地DNS服務器--->把最終的ip地址放回給客戶端

客戶端--->最終的主機ip

6.DNS緩存

7.DNS的報文記錄:

格式:(Name,Value,Type,TTL)

TTL:該記錄的生存時間

Name和Value取決與Type,Type有四種類型分別爲A,NS,CNAME,MX

五.P2P

網絡體系結構除了客戶端-服務器之外的另一種--->P2P

使用P2P體系結構,對總是打開的服務器有最小(或沒有)依賴。成對間歇連接的主機(稱爲對等方)彼此直接通信。這些對等方不爲服務提供商所有,而是受用戶控制的計算機。

六.視頻流(事先錄製的流式視頻)

1.對視頻流最重要的性能度量是:平均端到端吞吐量。

2.DASH

DASH:(Dynamic Adaptive Streaming over HTTP)經HTTP的動態適應性流。該技術的出現是爲了解決HTTP的缺陷:所有客戶端接收到相同編碼的視頻。在DASH中,視頻編碼爲幾個不同的版本(有個告示文件),客戶端可以依據自己當前的網絡狀況來動態的請求不同版本的視頻。當網絡好的時候請求比特率高的視頻,網絡不好的時候請求比特率低的視頻。

七.CDN

內容分發網(Content Distribution Network,CDN)

解決的問題:

1.避免客戶端要經過過多的鏈路才能訪問的服務器上的內容

2.避免相同的內容重複經過相同的鏈路

3.避免單點故障

8.套接字編程

在寫客戶端-服務器代碼時,開發者首先需要決定是使用TCP還是UDP。

1.UDP套接字編程

客戶端

from socket import *

serverName = 'localhost'
serverPort = 12000

clientSocket = socket(AF_INET, SOCK_DGRAM)  # 第一個參數:指示了地址簇,AF_INET:表示使用IPv4,第二個參數:指示套接字類型爲UDP;客戶端端口操作系統自己會附上
message = input('Input lowercase sentence:')
clientSocket.sendto(message.encode("utf-8"), (serverName, serverPort))  # 發送分組
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)  # 等待接收服務器的數據,緩存長度爲2048
print(modifiedMessage.decode("utf-8"))
clientSocket.close()

服務端

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.upper()
    serverSocket.sendto(modifiedMessage, clientAddress)

2.TCP套接字編程

客戶端

from socket import *

serverName = 'localhost'
serverPort = 13000

clientSocket = socket(AF_INET, SOCK_STREAM)  # SOCK_STREAM 指明是TCP套接字,端口號操作系統自動指定
clientSocket.connect((serverName, serverPort))  # 三次握手,建立TCP連接
sentence = input('Input lowercase sentence:')
clientSocket.send(sentence.encode('utf-8'))  # 不需要再附上目的地址(UDP這裏是需要附上目的地址的)
modifiedSentence = clientSocket.recv(1024)
print('From Server:', modifiedSentence.decode('utf-8'))
clientSocket.close()  # 關閉TCP連接。它引起客戶端的TCP向服務端的TCP發送一條TCP報文

服務端

from socket import *

serverPort = 13000

serverSocket = socket(AF_INET, SOCK_STREAM)  # 歡迎套接字
serverSocket.bind(('', serverPort))
serverSocket.listen(100)  # 等待敲門,參數定義了請求連接的最大數(至少爲1)
print('The TCP server is ready to receive')
while True:
    # 使用TCP連接,從一側發送的所有字節不僅確保到的另一側,而且保證按序到達
    connectionSocket, address = serverSocket.accept()  # 連接套接字,由特定的客戶端專用。
    sentence = connectionSocket.recv(1024)
    capitalizedSentence = sentence.upper()
    connectionSocket.send(capitalizedSentence)
    connectionSocket.close()

 

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