天天看點

【計算機網絡】應用層知識要點

這是一份比較私人的應用層個人體會,看官如果拿這個來當做學習資料可能會感到太散。

1、應用層協定

針對解決不同主機中的多個應用程序之間的通信和協同工作。總的來說,就是在兩個主機之間進行資訊互動。是以,所有的應用層協定都遵循一定的規則:1、傳輸的封包類型;2、封包中的各個字段的含義;3、字段對應資訊的含義;4、排程這些封包發送的規則。

2、 DNS

将主機的 ip位址轉換為友善記憶的主機名,但是,一個ip位址可以對應多個域名,而一個域名隻能對應一個ip位址。是以,這樣看起來,請求方必須指明要請求ip位址中的哪一個域名。

域名的命名規則:1、多級标号,每個不超過63字元;2、大小寫不分;3、域名總長度不超過 255。

每次通路一個域名,都需要通過DNS伺服器解析域名對應的 ip 位址,這樣,tcp/ip協定才開始工作。現在大多數的 網絡都是 專用網,是以的話,ip位址都固定在了路由器上,從路由器開始,接入網際網路。是以,我們的第一級 DNS 放在了路由器上。

遞歸查詢:若路由器根據自己的 DNS 伺服器無法解析域名,那麼這個 DNS 伺服器就向上一級 DNS 伺服器做請求。如果上級還沒有,就再向上級DNS請求,直到根域名伺服器。整個過程采用的 任播技術,直接尋找相鄰跳數最近的上級伺服器。

疊代查詢:根域名伺服器告訴本地 DNS,你下次查詢去哪裡查。

兩個查詢方式的差別就是,遞歸查詢是好人幫忙幫到底,親自上手;疊代查詢是指導一下方法,做不做全看你自己(本地DNS當然會去做)。這樣總結下來,其實工作就是本地的DNS在做,本地的主機享受了服務,得到一個 ip位址而已。

提高查詢效率的方法就是緩存,原因是伺服器方的 ip位址到 域名的映射,并不經常改變。

3、 FTP協定

FTP 的目的是克服計算機存儲資料格式不同,檔案目錄和命名規則不同,不同作業系統使用的指令不同,通路控制方法不同設計的檔案傳輸協定。ftp面向檔案傳輸,常用浏覽器支援 ftp協定。

FTP 的伺服器有兩類程序,一個排程程序,當收到 ftp請求的時候,就安排一個 工作程序去處理 ftp請求。也就是支援多程序。

而工作程序在處理一個客戶請求時,分别有一個控制程序和一個資料傳輸程序,各使用一個端口号。名為帶外傳輸。

TFTP協定相當于是沒有控制程序的ftp協定,直接将資料傳給要傳的主機。可用于 UDP環境,不需要傳輸太多控制資訊。

4、TELNET協定

遠端終端協定,計算機上附件裡貌似有這個東西,可以使用自己的顯示器,點選操作遠端連接配接的電腦,有像素限制。

QQ裡也有這種工具,更進階一些,解決了 VPN 中的本地ip位址的識别問題。但是由于現在的網速是比較感人的,尤其是跨多個路由器的話,那個使用效果的确是……

5、HTTP協定

1、www:網際網路簡稱,分布式超媒體系統。URL标記這個大系統中的資源位置,HTTP進行資源傳輸,HTML用以顯示頁面,搜尋引擎提供尋找資源的方法

2、url的文法:協定名://主機域名或ip位址:端口/資源的路徑?參數1=值1#參數2=值2

3、作為伺服器,要時刻監聽80端口,一旦有通路,就建立一條tcp連結,在此基礎上傳輸http協定的資料。解析協定資料,擷取通路的 html文檔。由于采用了 tcp請求,就有一個請求和确認,收到确認的過程。http協定中,同樣有一個請求連結時間,一個傳輸封包的時間。我們會設定一個逾時最大的值,超過即放棄請求。

流水線傳輸資料要比非流水線快的多,因為沒有阻塞,阻塞點在用戶端。在沒有收到确認的情況下就發到下一步了。

4、代理伺服器:即高速緩存,解決了路由器ip位址被自己的客戶機使用崩潰的問題。

5、HTTP請求封包中的請求方法:get,讀取資訊;POST,給伺服器添加資訊;option,請求一些選項的資訊;head,請求html頁面裡的 headers标簽;put,在指定的url下存一些文檔;DELETE:删除url對應的檔案;connect:用于代理伺服器;trace:環回測試的請求封包。廣大老百姓使用的最多的是 get 和post。其他的方法,我們沒有權限。

6、看來 Cookie是個伺服器跟蹤客戶的工具,阻止所有Cookie和DNT标簽的含義應該差不多吧。相關聯的。

7、動态文檔:靜态文檔就不說了,html即靜态,css是渲染。動态文檔是指在用戶端請求到伺服器時,伺服器首先安排一個應用程式處理用戶端的請求資料,并把處理後的資料封裝成http封包裡面,傳輸給用戶端。這樣,主要是有一些資料是實時可變的,不可能将資料放在靜态的html裡面,那樣講無法同步更新。但是這種動态指的是每次重新整理都擷取目前值,而不重新整理的話,資料不會自己變化呈現。

是以,在這裡有一個 cgi的概念,所有設計的應用程式都必須滿足 cgi 标準,這樣的應用程式都是 cgi 程式。之是以叫網關,是因為這個程式很可能要調用資料庫之類的資源。一般cgi腳本都放在/cgi-bin檔案夾下。

8、活動web文檔:

伺服器推送:在這種情況下,伺服器和用戶端之間建立http長連結,伺服器不斷地 把資料推送給用戶端。動畫呈現,時間更新等等。太占帶寬,連結不斷,占用伺服器資源,端口,帶寬,時間資源。

活動文檔:伺服器直接把一個活動的程式,腳本之類的傳回給用戶端,其實連結已經斷開了,但是程式運作呈現在頁面上,看起來是連續不斷的資料。視訊緩存就是這個道理吧。

9、搜尋技術:

全文搜尋引擎:爬蟲爬回資料,是以,百度搜尋出來的結果中的連結标題,其實就是爬取的網頁的title标簽中的文字。

分類搜尋:不用爬蟲爬,隻是傳回一些url。

垂直搜尋:特定領域搜尋。

元搜尋:對各個搜尋引擎的封裝,資訊的彙總,是以更牛逼一些。

需要了解一下 Google 和 百度的搜尋引擎算法,一是如何用爬蟲爬回資料,而是計算網頁重要性排名。真的是覺得數學是個好東西啊!回頭翻翻矩陣理論。

10、加密技術,https:http明文在網上傳播不安全,對于有安全需求的消息,伺服器和用戶端之間首先建立連接配接,之後,伺服器給用戶端提供一個加密算法,一把秘鑰,用戶端程式使用算法和秘鑰對資料加密,傳輸給伺服器,伺服器再用另一把不同的秘鑰将資料解密出來。感覺好爽,這是網絡安全中的密碼算法吧,接觸到數學感覺好開心,好有安全感。

6、SMTP協定

使用者代理:電子郵件的用戶端軟體,和http協定裡的使用者代理概念相近。

使用者代理将郵件發送給郵件伺服器,郵件伺服器發送給接收方的郵件伺服器,然後接收方的使用者代理,使用 POP3 協定讀取其中的資訊。使用的是 tcp 連結。且:郵件不會在中轉的某個郵件伺服器停留落地。

這個協定模型中,郵件伺服器的程式功能不能讓PC來做,因為,email的性質決定了,郵件的發送和接收一定是不同時的,而tcp連結則必須要求同時線上,這樣,就必須通過一個24小時線上的伺服器來處理這個業務。

但是允許一種情況,即從PC直接發送郵件到接收方的郵件伺服器,而這種情況下,往往帶有惡意,病毒。但也是foxmail實作特快專遞服務的一個措施。

POP3有局限性,而IMAP網際封包存取協定則強大靈活的多,現在很多的浏覽器郵箱采用的讀取協定很多都是HTTP。

有用戶端程式的郵箱應該都是IMAP協定。

MIME是在SMAP協定缺點基礎上的改進。

7、DHCP協定

計算機聯網前的網絡配置,自動添加ip位址,子網路遮罩,預設路由器ip,DNS的ip位址,不用人工手動添加。

DHCP對運作客戶軟體和伺服器軟體的主機都有不同的适用政策。

主機接入網際網路的一刻起,就向網絡中發送全1 的ip位址消息,由于自己沒有ip位址,是以,這個消息的源ip位址為全0,這一點和計算機ip位址的概念是一緻的,如果服務(比如docker之類的,虛拟機等等)沒有指定端口映射的ip位址,預設為主控端本身,即0.0.0.0。

一般來講,路由器上內建的協定是 DHCP的中繼代理,其再尋找 DHCP 伺服器 的時候采用UDP協定。但是,專用網的 ip位址是如何配置設定的呢?道理應該也是一樣的,DHCP伺服器記錄專用網中的ip位址配置設定。

如果 ip撞車的話,說明前一個IP位址的租用期到期了,DHCP伺服器中并沒有該ip位址的記錄,然而ip被實際固定占用了下來,造成了一定的問題。

8、SNMP協定

網管協定,似乎隻有在學校念書的時候才接觸過,網管中心會監督大家的上網有沒有搞些網絡破壞,監督帶寬有沒有被占用等等。聽說南開大學以前,有流量監督,每月流量不能超過4g,真的是……還是我母校好。

9、應用程序與OS的互動

這塊是網絡程式設計需要深刻了解的地方。java 和 python 裡的套接字。

應用程式——>系統調用的接口——>OS——>OS内部過程——>OS——>系統調用接口——>應用程序程式。

套接字是 傳輸層 tcp/ip協定和應用程序之間的接口。建立套接字意味着請求OS給其安排一定的記憶體,外存,CPU時間,帶寬等等。這些都有OS統一排程。OS安排好後,用套接字descriptor交給應用程序,程序就可以使用了。

程序在接收到套接字descriptor後,用bind來綁定到一個本地的ip位址和端口号。已經連上了 tcp/ip的一端。然後将套接字設定為被動收聽listen 模式。

伺服器使用 accept方式将用戶端的請求接收下來,這是并發多程序的。且主伺服器程序還要連結多個從屬伺服器的程序。,都要建立套接字,但是從屬的是不配置設定端口的吧。

在建立連結後,使用 send 和recv 系統調用接收資料。

傳輸完資料後,close 釋放套接字資源。

以上的 英文都是系統調用的方法,各種主流程式設計語言中都有封裝。

繼續閱讀