《計算機網絡 --自頂向下方法》閱讀過程中的整理
一、 應用層
1. 套接字(Socket):進程與計算機網絡之間的接口
從一個進程向另一個進程發送的報文必須通過下層的網絡,進程通過一個稱爲套接字的軟件接口向網絡發送報文和從網絡接收報文。進程只負責把報文塞給套接字,且假設該套接字與目的套接字之間有運輸的基礎設施,該設施會將報文傳到目的進程的套接字中。
- 應用程序的要求:可靠數據傳輸、吞吐量、定時(時延)、安全性
- 安全套接字層(Secure Sockets Layer)是對TCP的加強,這種強化是在應用層上實現的。加密、數據完整性和端點鑑別。
2. HTTP協議
HTTP定義了Web客戶向Web服務器請求WEB頁面的方式,以及服務器向客戶傳送WEB頁面的方式。
1. 特點
- 基於TCP。建立TCP連接之後往套接字中塞HTTP報文即可。
- 無狀態協議。不保存關於客戶的任何信息。
2. 非持續連接和持續連接
- 每一個請求建立一個單獨的TCP連接 or 同一個主機只建立一個連接
- 非持續連接造成了會給服務器帶來很重的負擔
- 在持續連接情況下,服務器在發送響應後仍保持連接打開,再次接收到該客戶端請求後仍通過該連接發送響應。若在一段時間內某一連接一直未被使用,服務器就關閉該連接。
在三次握手的最後一次時,主機會將請求和確認消息一併發送
3. HTTP報文格式
- 請求報文
第一行叫做請求行,包括方法、url和Http版本
後繼的行叫做首部行,包括很多亂七八糟的,比如主機域名、上文提到的連接類型、用戶代理,即向服務器發送請求的瀏覽器類型、用戶想得到的文件內容、編碼方式、語言、和兩個不知道是什麼的屬性。
使用get方法時報文的實體體(entity body)是空的,使用post方法時會在首部後面跟一個實體,比如表單的輸入值。書中特別提到表單不一定通過post方法提交,也可通過get,把參數和值掛在url的後面。
- http響應報文
第一行狀態行:協議版本、狀態碼、短語
首部行:服務器名字、連接類型、內容類型、內容長度
3. cookie:用戶與服務器的交互
cookie可以幫助服務器識別用戶
在用戶首次訪問某服務器時,服務器給用戶生成一個cookie,並保存在數據庫中,同時將生成的cookie發給用戶,由瀏覽器記錄,下一次用戶再訪問該服務器時會在http報文頭部附上cookie
4. Web緩存
代理服務器,瀏覽器向代理服務器發送請求,代理服務器再向初始服務器發請求,若代理服務器確認緩存有最新的被請求文件則直接發給瀏覽器;若沒有,則由初始服務器發給代理服務器,代理服務器再發送響應給瀏覽器,同時在代理服務器上備份文件。它存在的意義是這樣做會快很多。
其他基於TCP的應用層協議
FTP(文件傳輸)
STMP(郵件)
5. DNS : 因特網的目錄服務(基於UDP)
DNS是
- 一個由DNS服務器實現的分佈式數據庫
- 一個使得主機能夠查詢分佈式數據庫的應用層協議
DNS通常被其他應用層協議所使用、將用戶提供的主機名解析爲IP地址
工作過程:
- 瀏覽器從URL中抽取出主機名,並將主機名傳給DNS應用的客戶端
- 客戶端向服務器發送一個包含主機名的請求
- 客戶端收到迴應報文,得到該主機名對應的IP地址
- 瀏覽器得到IP地址,建立TCP連接
獲得映射的過程
- 主機將包含域名的請求發送給本地DNS服務器
- 本地服務器將該報文轉發到根DNS服務器,得到負責管理該域名(比如 .edu)的TLD DNS服務器的列表
- 本地DNS服務器選擇其中之一發送查詢報文,得到權威DNS 服務器的IP
- 本地DNS服務器向權威服務器發送查詢、得到最終的IP
DNS服務器具有緩存機制
6. Socket 編程
若要使用TCP通信,服務端需要建立兩個Socket,一個用於握手,一個用於收發消息
二、 運輸層
爲進程之間提供邏輯通信,只工作於端系統,不關心報文在網絡中如何移動
運輸層分組叫報文段(segment),網絡層分組叫數據報
將主機間交付擴展到進程間交付被稱爲運輸層的多路複用與多路分解
1. 多路複用與多路分解
多路分解:將運輸層報文段中的數據交付到正確的套接字
多路複用:將套接字輸出的數據收集,爲其封裝上首部信息,生成報文段,傳遞到網絡層
通過給報文段加上源端口號和目的端口號達成,源端口號是爲了回消息
2. UDP協議
UDP只完成了複用/分解的功能(爲數據加上源端口,目的端口),以及少量的差錯檢測(校驗和字段,可以檢驗數據是否出錯,錯了可以丟棄,但不重發)。
UDP相對於TCP的優勢在於:數據傳遞延遲小、無需連接建立、無連接狀態、分組首部開銷小
總結起來就是數據傳輸時效性更強、消耗的資源少。
3. 可靠數據傳輸原理
- rdt2.0 自動重傳請求協議(ARQ),需要三個功能:
差錯檢測、接收方反饋(ACK)、重傳
- 滑動窗口協議(GBN協議)
在《自頂向下》中,對於此協議的說明與《計網期末複習》中所整理的內容有所不同。
對於發送方,需要維護這樣幾個值:已被確認的序號,下一個即將發送的序號,窗口長度。而對於接收方,需要維護的值只是下一個報文的序號,沒有緩存。
若接收方收到的報文不是它想要的,則把它扔了,發送ack=想要的序號
發送方的某個分組超時後,會重發這個分組及之後的所有能發的分組
接收方採取這樣的策略可以減少緩存資源的浪費;
- 選擇重傳
對於接收方:他會緩存失序但未被確認的報文,並且每收到一個報文(無論順序是否正確)都會返回ack=報文seq+長度;
對於發送方,他會一直髮窗口內可發的報文,收到ack後可以將窗口後移;某報文超時就將其重發;
窗口不能太大(分組總數的一半?),否則接收方有可能會分不清是一個新分組還是重傳(出現在下一輪開始,且該分組之前的分組丟失時)。
####4. TCP : 面向連接的傳輸
全雙工:AB間若有一條TCP連接,則數據可從A流向B,也可從B流向A
點對點
數據通過套接字後,TCP將這些數據引導到該連接的發送緩存中,發送緩存是在三次握手階段設置的緩存之一。接下來TCP會不時從緩存中取出一塊數據以報文段的形式發送數據。數據量受限於最大報文段長度(MMS),MMS又由最大鏈路層幀長度(最大傳輸單元MTU)決定。MMS=MTU - IP報頭部(20字節)- TCP頭部(20字節),典型值爲1460字節。
當TCP發送一個大文件時,會將該文件劃分成長度爲MSS的若干塊。
- TCP報文結構
序號和確認號:可靠傳輸/序號是當前分組的第一個字節的序號,確認號是希望接收到的下一個分組(第一個字節)的序號
接受窗口:流量控制,接收方願意接受的字節數
首部長度:由於選項字段的原因,TCP首部長度是可變的
選項字段:協商最大報文長度
ACK:字段有效
RST/SYN/FIN:連接的建立和拆除
PSH:接收方應立即將數據交到上層
URG:很緊急
- 對於序號(seq)和確認號(ack)的一些說明
在主機A - 主機B的通信過程中,假設是A to B的單方面數據傳輸
a. A給B發送若干個數據報,並在每個數據報頭部加上seq與字節數,同時啓動定時器;
b. B每收到一個數據報,返回ack=當前已收到連續序列的最大序號+1,一般情況下是seq+字節長度;同時向上層交付已收到的連續序列的未交付的報文。
c. A收到B的ack報之後知道該確認字節前的所有數據報都已被收到,關閉他們的定時器;
d. 若A的某個定時器超時,則重發該報;
e. 若B收到重複的序列則把該報丟掉,返回ack=當前已收到序列的最大序號+1;
綜上,對B來說,他每收到一個數據報,都會返回ack等於已收到的序列的最大序號+1(積累確認),且緩存。對A主要就是確認B已收到或超時重發。
TCP的可靠傳輸機制與回退N步策略的差別在於tcp將失序序列緩存
與重傳策略差別在於tcp有積累確認機制(每次返回確認正確的序列的最大序號+1)。
- 超時重發機制過期時間的設置 --擁塞控制的方法之一
每次超時後將過期時間加倍,當收到上次數據或ACK後重新根據RTT計算超時時間;
- 快速重傳(SR)
冗餘ACK的產生:接收方接收到的序列中間存在間隔,當發送方給接收方發送間隔之後的包時,接收方不斷返回ack=間隔前的最大序號。
當發送方接收到三個ack之後,就執行快速重傳:傳那個ack對應的序號的報文。
- TCP連接的建立與拆除
三次握手和四次揮手
- TCP擁塞控制
慢啓動(指數增長)、擁塞避免、快速恢復(線性增長)
- cwnd從1開始慢啓動
- 若達到閾值,快速恢復;
- 若期間發生超時,cwnd設爲1,重新慢啓動,閾值設爲cwnd/2;
- 若期間接收到三個ACK,cwnd減半,則執行快速重傳後進入快速恢復狀態;