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()