week02-應用層

本週進入到第二章應用層的學習,不得不說自頂向下學習果真能激發興趣,由於平時開發工做常常也就是和應用層打交道,可是對具體原理老是隻知其一;不知其二,隨着這章的閱讀,能讓本身對咱們開發的應用程序,是怎樣利用網絡實現其功能的,有了更深刻的瞭解。html

咱們平常中所用到的,開發的軟件基本都是基於應用層的軟件。不須要關心數據包究竟是如何傳輸的,只須要按照應用層對接下一層的協議接口進行開發就能夠了。數據庫

應用程序體系結構,咱們最經常使用的是客戶-服務器體系結構,好比生活中最經常使用的瀏覽器就是這種模式的。有一個老是打開的服務器用來接收各個客戶端的請求,返回對應的數據。 另外一個就是P2P 體系結構,和客戶-服務器相反,這些應用程序在間斷鏈接的主機之間使用直接通訊,這些主機也被稱爲對等方。api

在操做系統中,程序之間的通訊是經過進行來進行的,而不是程序。一個進程能夠被認爲是一個端系統中的一個程序,當進程運行在同一個端系統上時,它們使用進程間通訊機制進行通訊。進程間的通訊規則有端系統山的操做系統決定。瀏覽器

咱們如今知道了多數應用程序是經過通訊進程對組成,每對中的兩個進行 互相發動報文。從一個進程向另外一個進行發送報文必須經過下層的計算機網絡。這裏進程是經過一個被稱之爲套接字的軟件接口向網絡發送報文和從網絡接收報文的。緩存

進程尋址安全

爲了向特定的目的地的主機上的進程發送分組,接收進程須要一個地址,而爲了標識接收進程是須要經過:服務器

  1. 主機的地址;
  2. 定義在目標主機的進程的端口號;

咱們在開發應用層程序時,是不須要考慮具體是怎樣將發送的數據分組發送到目的主機的,對於應用層程序來講,只須要將數據分組推送進套接字。而在套接字的另外一側, 運輸層協議負責使該數據分組進入接收進程的套接字。網絡

因特網提供的運輸層的協議不止一種,咱們最多見的當屬 TCP、UDP 了,具體使用須要從如下幾個方面進行衡量:分佈式

  1. 可靠數據傳輸;
  2. 吞吐量;
  3. 定時
  4. 安全性;

總結來講,TCP 提供了可靠地數據傳輸,由於其創建在三次握手的基礎上,可以保證數據到達目的進程。UDP 是一種輕量級運輸協議,沒有擁塞控制,提供一種不可靠數據傳輸服務,也就是說,UDP客戶端能夠用任何它選定的速率向其下層注入數據,通常網絡電話能夠容忍範圍內的數據丟失,更願意應用運行在UDP上。ide

應用層協議

說到Web其應用層協議就是HTTP。
HTTP 請求報文:

GET /api/monitoring/converged-status HTTP/1.1\r\n
Host: 192.168.8.1\r\n
Connection: keep-alive\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\r\n
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8\r\n

第一行爲請求航,其後的都叫作首部行。

請求行的三個字段表明的是 方法字段、URL字段、HTTP版本字段
當請求爲POST方式時,在首部行下方還有一個實體體,用來存放表單提交的數據。

HTTP響應報文:

HTTP/1.1 200 OK\r\n
Cache-Control: no-cache, no-store, max-age=0, must-revalidate\r\n
Content-Type: text/html\r\n
Connection: Keep-Alive\r\n
Content-Length: 1073\r\n

File Data: 1073 bytes

響應報文,也有三個部分,狀態行、首部行、而後是實體體。實體體是報文的主要部分,即它包含了所請求對象的自己。

FTP文件傳輸協議

應用層協議FTP,做爲一個文件傳輸協議,其和HTTP有類似的地方,底層都採用TCP傳輸協議,然而這兩個應用也有也有一些重要的區別,其中最顯著的就是 FTP 使用了兩個並行的 TCP 鏈接來傳輸文件,一個是控制鏈接,一個是數據鏈接。 控制連接 用來在兩主機之間傳入控制信息,如用戶表示、口令、改變遠程目錄的命令以及存放和獲取文件的命令。數據鏈接用來實際發送一個文件。

SMTP

SMTP 是因特網電子郵件應用的核心,這個協議是用來從發送方的郵件服務器發送報文到接收方的郵件服務器的。

 

如上圖所示,SMTP 的做用就是將郵件報文從發送郵件服務器送到接收郵件服務器。 下面大概解釋下具體流程。
首先,客戶SMTP(運行在發送郵件服務器上)在25 端口創建一個到服務器SMTP(運行在接收郵件服務器上)的TCP鏈接。 若是服務器沒有開機,客戶會在稍後進行重試,一旦鏈接創建,服務器和客戶執行某些應用層的握手後,就向人們在互相交流前先進行自我介紹同樣。在SMTP握手階段,SMTP 客戶指示發送方郵件地址(產生報文的那我的)和接收方郵件地址,一旦該SMTP客戶和服務器彼此介紹以後 ,客戶發送該報文。

這裏在記錄一個比較明顯的問題,那就是在Bob的郵件服務器接收到郵件後,他的本地PC上的代理是如何得到位於他的某ISP 郵件服務器上的郵件呢? 這裏不能再使用SMTP了,由於這裏須要的是一個拉協議, 而SMTP 是一個推協議,目前流行的一些郵件訪問協議能夠解決這個問題,包括第三版的郵局協議(POP3) 、因特網郵件訪問協議(Internet Access Protocol,IMAP) 以及HTTP。

總結: SMTP 用來將郵件從發送方的郵件服務器傳輸到接收方的郵件服務器;SMTP 也用來將郵件從發送方的用戶代理傳送到發送方的郵件服務器。如POP3這樣的郵件訪問協議能夠用來將郵件從接收方的郵件服務器傳送到接收方的用戶代理。

DNS (Domain Name System)

DNS 是: 1. 一個由分層的 DNS服務器(DNS server) 實現的分佈式數據庫;2. 一個使得主機可以查詢分佈式數據庫的應用層協議。 DNS服務器一般是運行BIND (Berkeley Internet Name Domain) 軟件的UNIX機器。 DNS 協議運行在 UDP之上,使用53號端口。與 HTTP、FTP 和 SMTP 協議同樣,DNS 協議是應用層協議。

DNS服務器不多是單一部署的,它是一個巨大的具備表明性的分佈式數據庫;

 

DNS 是由不少DNS服務器組成,映射關係分佈在全世界範圍內的全部DNS服務器上。

DNS服務器分爲三種: 根DNS服務器、頂級域(TOP-Level Domain,TLD) DNS服務器和 權威DNS服務器。

接下來記錄一下,這三種DNS服務器之間的交互方式, 假設我如今要訪問 www.baidu.com , 首先我本機的DNS客戶端與根服務器之一聯繫,它將返回頂級域名 com 的TLD服務器 IP地址。而後 我在與這些TLD服務器之一聯繫,它將返回 baidu.com 的權威服務器的 IP地址。最後我將與 baidu.com 權威服務器之一聯繫,它將爲 www.baidu.com 返回其 IP 地址。

上面說的三類DNS服務器都是處在 DNS服務器的層次結構中, 在這裏咱們學習到還有一類很是重要的DNS服務器,稱爲 本地DNS服務器。 一個 本地DNS服務器,嚴格來講不屬於DNS服務器的層次結構,但它是很是重要的。 每一個 ISP(Internet Service Provider) 都有一臺本地DNS 服務器。 經過訪問Windows 或者UNIX 的網絡狀態窗口,可以很容易的肯定你本地DNS服務器的IP地址。 通常 本地DNS服務器「臨近」 本主機。 基本上 ISP 的本地DNS服務器與主機相隔不超過幾個路由器。

下面這幅圖用來理解本地DNS服務器在交互中起的做用:

 

 

接下來,要說一個DNS系統中很是重要的一個特點,DNS 是有緩存的。爲了減小時延而且有效減小因特網上處處傳輸的DNS報文數量, DNS 會將每個DNS 回答緩存在本地存儲中。 例如本地DNS服務器在接收到一個回答時,它可以將回答中的任何信息都緩存起來,在下一個相同主機名查詢時能夠直接返回。因爲主機和主機名以及IP地址之間的映射不是永久的,所以會有一個過時時間,通常緩存2天。

本地 DNS服務器 也能緩存 TLD服務器的IP 地址,於是容許本地DNS繞過查詢鏈路中的根DNS服務器。