《計算機網絡——自頂向下方法》讀書筆記,第二章、應用層

《計算機網絡——自頂向下方法》讀書筆記,第二章、應用層

一、應用層協議概述

這一章主要是講的應用層的相關內容(這不是廢話麼,題目都寫着了),作爲網絡結構的最頂層,它上面主要定義的就是程序和傳輸層之間的內容。也就是它描述了在一臺計算機上,一個軟件如何把信息傳入互聯網,又如何從互聯網上獲取其他主機傳輸的信息。

另外對於互聯網應用程序來說,主要兩種體系結構。

  • 第一種是客戶——服務器體系結構,這種結構我們普通的都作爲客戶,而我們電腦上的應用程序上網都是相當於向服務器發送指令,獲取相關的反饋。比如:瀏覽網頁就是相當於從服務器獲取網頁文件,然後使用我們本地的瀏覽器軟件對網頁文件進行解釋說明,然後呈現在我們的面前;再比如發送郵件,就是我們本地的程序向某一個服務器發送我們的郵件,然後服務器存儲或者根據郵件地址發送到其他的服務器上面,另一個人接收郵件的過程則是,從對應的服務器下載之前存儲的郵件的過程。
  • 第二種是:P2P體系結構,這種結構簡單來說就是讓每個人都儘量的對等,共同來分擔信息傳輸的壓力,而且有很強的自擴展性,但是對於安全性也有很大的挑戰。共享是它的核心。

二、 套接字

程序員寫的應用程序如何和互聯網上的其他應用程序交互呢,這裏首先應用程序生成一個進程,這個進程就是將需要傳輸的信息通過一個叫做套接字的接口傳輸到運輸層,進而進一步傳輸到其它層。因此套接字也稱作“應用程序和網絡之間的應用程序編程接口API”,作爲應用程序的開發者,對於運輸層,我們只能選擇使用哪一個運輸層協議,另外傳遞幾個限制參數。

這裏用發郵件爲例,爲了表示接收進程,需要定義兩個信息:1.主機的地址(ip);2.在目的主機中指定接收進程的標識符(端口號)。

三、運輸協議 TCP & UDP

因特網爲運輸層提供兩個協議,就是UDPTCP,注意這裏的兩個協議是運輸層協議。這一部分簡單的描述一下,後面在運輸層會具體講。

1.TCP

TCP連接提供兩個服務:面向連接服務可靠數據傳輸服務

  • 面向連接服務:在應用層數據報文流動之前,TCP首先讓客戶和服務器進行握手並建立TCP連接。包括交換運輸層的控制信息。注意:TCP連接可以看成是兩個進程的套接字之間的連接。
  • 可靠數據傳輸服務:它保證了發送進程流進套接字裏面的信息,可以完全的沒有遺漏的傳輸到接收進程的套接字裏面。

2.UDP

UDP是一種不提供不必要服務的輕量級運輸協議,它不建立連接。UDP協議傳輸的信息不保證每一個報文一定按照發送順序到達接收端,也不保證每一個報文都能到達接收端。

四、5種重要的應用以及應用層協議

關於應用層協議定義了什麼:

  • 交換的報文類型,例如請求報文和響應報文。
  • 各種報文類型的語法,如報文的各個字段及這些字段是如何描述的。
  • 字段的語義,即這些字段中的信息的含義。
  • 確定一個進程何時以及如何發送報文,對報文進行響應的規則。

注:在我理解的,協議即爲標準,也就是用何種方式來把一段01序列和我要表達的信息進行相互轉換,還有用什麼順序發送和回覆信息。

1.Web

  • 什麼是Web?

Web頁面就是我們平時訪問的各種網頁。我們看到的網頁是由很多個文件(包括比如:HTML文件,JPEG圖形等)組合到一起,然後由Web客戶端(網頁瀏覽器)進行合併和解釋,再呈現給我們,就是我們看到的樣子了。這裏插一句關於URL,URL定義每個對象(文件)在哪,它由兩個部分組成:存放對象的主機名 + 對象的路徑名。

  • 什麼是HTTP協議?

HTTP叫做超文本傳輸協議,我們訪問網頁的過程,也就是向服務器的Web服務端程序發送請求讓它把網頁文件發過來我們再用瀏覽器來查看的過程。HTTP協議也就定義了:Web客戶端和Web服務器交互的方法。

  • HTTP的連接

HTTP使用TCP連接,並且默認選擇持續連接,但是客戶端和服務器也可以手動配置成使用非持續連接。下面分別說明兩個連接的步驟。
(1)非持續連接
第一步:客戶發起TCP連接。
第二步:客戶發送HTTP請求報文,請求文件。
第三步:服務器將文件封裝,發送對應的響應報文。
第四步:服務器確認客戶完整收到文件後,通知進程斷開TCP連接。
第五步:客戶收到響應報文,TCP連接關閉。
第六步:客戶對於收到的文件中包含的每個URL地址重新進行前4個步驟。
(2)持續連接
顯然就是建立完成TCP連接之後不斷開,持續的進行文件的傳輸,直到客戶接收完整個頁面或者一段時間內TCP沒有被使用,則斷開TCP連接。缺點是可能會對服務器造成較大的負擔,因爲TCP連接可能會過多。

  • HTTP報文格式

(1)請求報文
它一共由三個部分組成,第一行叫請求行,有三個字段:方法字段、URL字段、HTTP版本字段。後面若干行是首部行,這裏有很多可選的選項,每一個選項的格式都是,首部字段名:sp 值 cr lf,他們可以描述請求的各種規則,比如是否採用持續連接,瀏覽器的類型等等。後面是一個空行,最後是實體體,這個是POST方法提交表單時使用的,使用GET方法時實體體爲空。
(2)響應報文
它也有三個部分:狀態行,首部行,實體體。首先狀態行有三個字段:協議版本字段、狀態碼、相應狀態信息。首部行也是若干行返回各類信息。最後的實體體就是完整的被請求的數據了。關於狀態碼:200 OK即爲請求成功,404 Not Found表示被請求的文檔不在服務器上等等(所以404刷新也沒用啦)。

  • cookie

以前我們清理瀏覽器垃圾的時候,有時候有一個選項就是cookie,那麼這個cookie是什麼呢?舉個例子,我們在沒有登錄淘寶賬號的時候,也可以在網頁上面看到喜歡的商品,也可以放到購物車裏。但是按照我們之前的理論,我們放到購物車裏的信息怎麼能被保存呢,即使是緩存到了遠端的服務器中,那服務器又怎麼能知道我是我呢?換一句話說,我第二次向服務器提交請求報文的時候,服務器怎麼確定我是之前那個把商品加入了購物車的客戶呢。這裏就有一個巧妙地辦法了,就是服務器在返回響應報文的時候,順便加入一個標識碼,我在第二次訪問的時候,在請求報文中加入這個標識碼,這樣服務器再次收到的時候,就知道我是我了。這樣服務器也就可以跟蹤用戶了。

  • Web緩存

Web緩存器也叫代理服務器,代理服務器可以存儲最近被訪問過的網頁,這樣每次HTTP請求先到代理服務器上,如果代理服務器有所請求的頁面則直接返回響應報文,否則,去初始服務器請求該頁面,並備份,再返回響應報文。另外爲了保證緩存的頁面是最新的,可以使用條件GET方法

2.文件傳輸

3.電子郵件

電子郵件我們應該都使用過,電子郵件系統由三個主要的部分組成:用戶代理郵件服務器簡單郵件傳輸協議(SMTP)
這三者之間的關係是這樣的:用戶代理將客戶的郵件發送給自己的郵件服務器A,郵件服務器根據郵件的收件地址,不斷的將郵件向郵件服務器B發送,直到發送成功。而這個傳輸的格式,也就是簡單郵件傳輸協議來規定的。

  • SMTP(郵件傳輸協議)

    SMTP是因特網電子郵件的核心。SMTP用於從發送方的郵件服務器發送報文到接收方的郵件服務器。下面簡單描述一下一個場景(Alice發送給Bob一個)簡單的ASCII報文。來說明SMTP的基本操作。

    1. Alice調用他的郵件代理程序,提供Bob的郵件代理,指示用戶代理髮送報文。
    2. Alice的用戶代理吧報文發送給Alice的郵件服務器,郵件服務器把報文放進隊列。
    3. Alice的郵件服務器上面運行的SMTP客戶端發現了報文隊列中的報文,客戶端創建一個進程對Bob郵件服務器上的SMTP服務器的TCP連接。
    4. SMTP兩端確認身份,然後通過TCP發送信息。
    5. Bob郵件服務器上的SMTP把收到的報文放在Bob的郵箱中(也是在Bob的郵件服務器中)。
    6. Bob調用用戶代理閱讀報文

    我們可以注意到,這個過程中不通過中間郵件服務器發送郵件,所以就不會有郵件存留在其他的服務器中,保證了信息的安全性。另外SMTP使用的是持續連接,如果郵件服務器有多個報文發往另一個郵件服務器,則他們可以通過同一個TCP連接來完成。

    對比HTTP和SMTP:都是發送信息的協議,一個是用Web服務器,一個是郵件服務器;一個是去申請信息,一個是把信息扔過去;一個是任意二進制數據,一個必須是7比特ASCII碼。

    另外還有一些比較繁瑣的郵件報文格式描述,這裏就不仔細說了,大概是分成了首部等等的各種部分。

  • 郵件訪問協議

    這一部分,本來在書中是一小部分,但是第一次讀的時候,就是因爲這一段被弄得思路很亂,爲什麼上面說了協議下面還有這麼多協議?所以這裏單獨拿出來和SMTP並列來說。先來解答他們之間的關係,SMTP是郵件傳輸協議,也就是規定了郵件怎麼從一個服務器發送到另一個服務器。下面這一欄中說的協議叫做郵件訪問協議,他們規定的是,已經發送到Bob郵箱中的報文,Bob如何在自己的設備上訪問這個報文。

    1. POP3(Post Office Protocol - Version 3)

      超級簡單的一個協議,功能有限,有三個階段:階段一(特許):用戶代理用明文發送用戶名和口令,認證身份;階段二(事務處理):這一階段用戶代理取回報文,同時還能標記刪除;階段三(更新):在客戶發送了quit命令後,結束會話,郵件服務器刪除被標記刪除的內容。

      注:POP3並不在會話中攜帶狀態信息。

    2. IMAP(Internet Mail Access Protocol)

      一種更復雜的訪問協議,可以有更高的自由度,比如獲取一部分某個文件,可以遠程訪問,避免佔用很大的本地空間。不仔細講了,用到再看就可以。

    3. HTTP

      簡單來說就是用現有的HTTP協議,直接把郵件拉過來,然後隨便怎麼瀏覽。

4.目錄服務(DNS)

因爲最近想自己搭建一個網站,所以對於這方面多進行了一些瞭解。

我們在瀏覽器中輸入網址實際上是輸入的我們要訪問的服務器主機的名字(主機名),但是因爲計算機更希望處理定長的數據,所以我們希望有一種方式可以把主機名和一串數字一一對應,這也就是我們常說的IP地址

5.流式視頻和P2P

五、編程實踐(UDP & TCP)

UDP套接字

客戶端代碼:

# 導入套接字的包
import socket

HOST = '127.0.0.1'
PORT = 9999

# 客戶端使用UDP時,首先仍然創建基於UDP的Socket,然後,直接通過sendto()給服務器發數據
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
    print('Please input your data:')
    InputData = input('> ')

    # 發送數據
    s.sendto(InputData.encode('gb2312'), (HOST, PORT))
    # 接收數據
    ReceiveData = s.recv(1024)
    print(ReceiveData.decode('gb2312'))

服務器端代碼:

# 導入套接字的包
import socket

# 創建UDP的套接字
# 在本程序中的參數選擇如下:
# socket(IPv4網絡通信, 數據報套接字, UDP傳輸協議)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 客戶端IP和端口號
HOST = '127.0.0.1'
PORT = 9999
s.bind((HOST, PORT))

# 循環接收Client數據
while True:
    # 利用recvfrom()方法獲取數據和客戶端的信息
    data, addr = s.recvfrom(1024)
    print("Received from %s: %s" % (addr, data.decode('gb2312')))
    s.sendto('I got it!'.encode('gb2312'), addr)

TCP套接字

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