[TOC]html
這本書是計算機網絡最好的入門書籍,與傳統的計算機網絡書籍不一樣,它採用了自頂而下的方式去講解。感謝兩位十分出色的做者:Jim Kurose和Keith Ross, 他們生動的敘述方式使我以爲計算機網絡如此有趣。單單引用文獻就有33頁,我十分佩服這麼嚴謹又有耐心的人。編程
Keep those cards and letters coming! --諺語設計模式
Chapter 1: Computer Networks and the Internet
計算機網絡的概覽,描繪了這本書藍圖。borad picture,to see the forest through the trees. 這是一個引入性章節,覆蓋了大量的基礎知識和計算機網絡的不少方便,可是也沒有失去重點。introductory chapter,without losing sight of the big picture.瀏覽器
1. What is the Internet?
1.1 A Nuts-and-Bolts Description 基本特徵描述
定義:安全
The Internet is a computer network that interconnects hundreds of millions of computing devices throughout the world. 簡而言之,設備互聯。bash
諸如筆記本,智能手機,遊戲控制檯,攝像頭,環境傳感器等,這些非傳統的設備就像被計算機網絡鉤住(hooked up)了同樣。在因特網的術語(jargon)中,這些設備被稱爲 hosts(主機) 或 end systems(終端)。終端訪問因特網經過Internet Service Providers(ISPs), 還有本地的ISPs,例如中國電信。服務器
packets = header bytes + data bytes 因此爲何網路字節序是大端序? 由於要先傳輸字節頭。cookie
1.2 A Service Description
the Internet as an infrastructure that provides service to applications.網絡
協議的定義:多線程
A protocol defines the format and the order of messages exchanged between two or more communicating entities,as well as the actions taken on the transmision and/or receipt of a message or other event.
精通計算機網絡的本質:
Mastering the field of computer networking is equirvalent to understading what, why, and how of networking protocols.
2. The Network Edge
end systems -- at edge of the Internet 爲何end systems 也被稱爲 hosts?
Because they host(that is, run) application programs such as a Web browser program, and e-mail client program, or an e-mail server program. 這本書中,host = end system. Hosts are somnetimes further divided into the two categories: clients and servers.
注意,不要覺得服務器就不是終端或者主機了,雖然它們提供了服務(搜索引擎,郵箱等),可是對因特網而言,它們和別的終端沒有區別,都是運行了應用而已。servers 服務器端常有很大的數據中心(data centers),谷歌有30-50個數據中心,提供了成百上千的服務。
家庭網絡接入:
DSL方式 爲何一般上行速率和下行速率一般不一樣?
Because the downstream and upstrean transmission rates are diffent,the access is said to be asymmetric. DSL有DSL modern,外面和電話掛在同一個分離器上。
Cable Internet access 方式 Cable電纜經常使用於電視公司搭建的因特網訪問方式。最多見的是同軸電纜(coaxial caBLE)+ 光纖混用方式,一個同軸電纜下掛多個用戶,同軸電纜線接在光纖節點上,此外都是光纖傳輸。 它一樣須要特殊一個的modems,稱爲cable modems。它一個重要而典型的特徵就是它是共享的廣播媒介。發送或者接受的包會被上傳或者下載到同一channel的每一個用戶上。
FTTH (fiber to the home)光纖到戶 每一個用戶都有一個ONT(optical network terminator 光網絡終端),多個用戶(一般不到100個)都經過光纖鏈接到同一個上分光器(Optical splitter),光分器經過光纖鏈接到OLT(光線路終端機),光線路終端機再鏈接到電信公司的CO(central office)
企業網絡接入:
LAN = local area network, 一個基礎路由器+ 以太網交換機,全部設備都直連到以太網交換機上。
物理介質
具體的每種介質不須要深究,要始終記住:每種介質限定了它自身的網絡傳輸承載能力,傳輸速度和傳輸距離。
3. The Network Core
有兩種基本的方式經過網絡鏈路和交換機去移動數據:包轉發和電路交換。
3.1 Packet Switching
- Store-and-Forward Transmission 存儲轉發傳輸
- Queuing Delays and Packet Loss
- Forwatding Tables and Routing Protocols
3.2 Circuit Switching
採用面向鏈接的方式,在雙方通訊以前,須要爲通訊雙方分配一條具備固定帶寬的通訊電路,在通訊雙發在通訊的過程當中一直佔用所分配的資源,直到通訊結束。 電路交換的網絡中,資源須要一個佔用一個路徑,包括路徑上的buffer,link 傳輸比率,在兩個終端之間須要保留會話的持續時間。傳統的電話網絡就是基於電路交換的網絡。不要想固然的覺得網絡就只是英特網,電話網絡也是一種網絡。
優勢:能夠爲用戶保證會話的穩定性,實時性強,時延小,交換設備成本低。 缺點:帶寬利用率低,一旦電路鏈接創建,無論通訊與否都將佔用通訊。
一個鏈路中電路交換的實現有兩種方式: FDM 頻分複用和 TDM 時分複用
4.Delay,Loss,and Throughput in Packet-Switched Networks
- nodal processing delay 節點的處理時延 $$<10^-6$$
- queuing delay delay 排隊時延 $$10^-6 - 10^-3$$
- transmission delay 發送時延 $$10^-6 - 10^-3$$
- propagation delay 傳播時延 $$d/s$$ s = speed,小於光速,約爲光速的2/3
發送時延是從節點到傳輸介質的延遲,發送時延=數據/帶寬。和設備的船宿速度有關。
傳輸時延和包的大小不要緊,取決於距離和傳輸速率。傳播時延=發送距離/傳播速率 由於在某種介質中傳輸的速率固定的。
End-to-End Delay 端到端的延遲
d<sub>end-end</sub> = N(d<sub>proc</sub> + d<sub>trans</sub> + d<sub>prop</sub>) 其中d<sub>trans</sub> = L/R = packet size/Rates
Chapter 2 : Application Layer 應用層
本章主要是講應用層協議,懶得寫了,費事,妨礙看書的速度。挑本身認爲重要的寫寫。
1.進程間交流(p88)
操做系統中,應用程序的本質是進程,不一樣的進程以前免不了要進行交流。本質上,英特網客戶端和服務器的交流經過進程實現。這裏我門只關注網絡上運行在不一樣的兩個主機之間的進程交流。
一個類比: 有個房子,房子有個門。咱們訪問這個房子,老是經過門去訪問。
Process
就像是房子,Socket
就像是門。
Socket
描述了應用層和傳輸層之間的接口,它是由網絡應用建立的。當來自傳輸層的數據報交付給上層的應用層時,它總想交給特定的應用,所以就有了Socket
。應用層開發這隻關心應用層這邊的Socket
,而不關心傳輸層那邊的。最多隻是選擇傳輸層的協議,或者設置一些傳輸層參數,好比最大的Buffer和報文段的大小。
更精妙的比喻:
- 想着這裏有個大水壩,一邊是傳輸層,一邊是應用層。水壩上有不少孔洞,用於放水。每一個應用會獨佔一個孔洞,用於發送和等待接受水,而另外一邊是傳輸層。
- 又像是古代的皇帝在翻牌子。
如何識別收發的進程:
- 主機的地址 --> IP地址
- 收發進程的識別符號 --> 端口號
2.安全的傳輸層協議(p94)
傳輸層最出名的兩個協議就是TCP和UDP,可是它們兩都是不加密的。若是應用程序發送了一個明文密碼,而這個包被別人捕獲到了,那麼就可能就存在安全問題了。
因此就想辦法增強一下TCP協議,就有了Secure Sockerts Layrer(SSL), SSL不是第三個傳輸層協議,處於TCP和UDP的同層次,而是TCO和UDP協議的增強,負責加密,數據整合,端點認證。
這種增強由應用層實現,特別的,若是一個應用程序想要使用SSL服務,那麼它須要包含SSL的代碼(高度優化的類和庫)。SSL有本身的socket API
,假設應用層使用了明文密碼,那麼SSL會對它進行加密,接受房的SSL對它進行解密。
使用WireShark 研究HTTP協議
3.Web Caching(p110)
Web Caching = Proxy server
- can substantially reduce the response time
- reduce Web traffic in the Internet as a whole
4.Distributed Hash Tables(DHTs)
simple databash in a P2P network,key -- value.
- key: content names(e.g. names of movies, albums, and software)
- value: IP address
5.Socket Programming: Creating Network Applications
寫了一個UDP的簡單C/S應用,放在了博客園。 http://www.cnblogs.com/crb912/p/9060670.html
++書中一個很重要的地方(p163),就是UDP和TCP的套接字編程時,有所不一樣++:
就是UDP是無鏈接的,每次讀寫socket時,都須要加入主機的地址,接受數據也獲得是兩個參數(data, addr)。而TCP的socket則不須要這麼作,由於它是面向鏈接的,在讀寫基於這個鏈接的socket時,只須要直接的讀寫數據。而不須要關注去加入和接受這個目標主機地址。由於TCP的協議已經幫你創建好專用的鏈接了。
6.Sockt Programming Assignment
Assignment 1: Web Server
- 接受的客戶端的鏈接
- 接受此次鏈接的
HTTP request
- 解析這個請求的文件
- 從服務器的文件系統中獲取這個文件
- 建立一個
HTTP response
消息,包含這個請求的文件 - 發送這個響應文件,若是服務器的文件系統中不存這個文件,則返回
404 Not Found
這個做業我沒有本身動手,https://blog.csdn.net/hmunan/article/details/73826062 這篇文章很好的幫助了我。感受若是我本身去寫,我可能寫不出來,由於我沒理解HTTP應答,甚至沒想到把html
文件寫入這個TCP鏈接中。
Assignment 2: UDP Pinger
實驗內容:基於UDP實驗一個Ping工具.
題目的連接:https://wenku.baidu.com/view/ed19e6cce2bd960591c677d2.html
我寫的答案放在博客園上: https://www.cnblogs.com/crb912/p/9082379.html
Assignment 3: Mail Client
這個實驗沒什麼興趣,就跳過吧
Assignment 4: Multi-Threaded Web Proxy
這個實驗要求實現一個Web Proxy
(網頁代理),一個瀏覽器
向代理請求網頁, 而後Web Proxy
向origin server
請求網頁,請求的結果返回給Web Proxy
,最終返回給瀏覽器。 難點在於:數據的流動和多線程 https://www.cs.rochester.edu/~kshen/csc257-fall2009/assignments/assignment1.html
Chapter 3: Transport Layer
Multiplexing and Demultiplexing
定義:
Each trasport-layer segment has a set of fields in the segment for this purpose. At eceiving end, the transport layer examines these indentify the receiving socket and then directs the segment to that socket. This job of delivering the data in a tranport-layer segment to the corrent socket is called dumultiplexing.分用 The job of gathering data chunks at the source host from different sockets, encapsulating each data chunk with header information (that will later be used in demultiplexing.) to create segments, and passing the segmengts to the network layer is called multiplexing. 複用
總結一下: 在接收端,傳輸層把接受到的segment,傳輸給相應的socket,這個稱爲分用。 在發送端,來自上層的不一樣socket,須要被封裝成segment,而後把Segment傳遞給下面的網絡層,這個過程稱爲複用。
關於實現: 傳輸層要想實現分用,就必須有兩個條件成立:
- the sockets must have unique identifiers. 標識符惟一
- 每一個segment必須有特殊的字段指示,用於告訴傳遞給哪一個socket.
bind()
方法能夠綁定套接字到特定的端口,這對服務器端頗有好處,但對客戶端意義不大。
UDP socket 被一個2元組標識: 目標IP,目標port TCP socket被一個4元組標識:源IP,源port,目標IP, 目標port。
socket是網絡上兩臺不一樣的計算機之間進程通訊的手段,對於同一臺主機,它能夠有大量的進程,每一個進程均可以有本身的端口,而且關聯惟一的一個端口。記住: Socket = 網絡進程通訊
若是兩個UDP segment 具備相同的目標IP和port,不一樣的源IP和port。而後這兩個segmet會進入同一個UPD socket進入同一個目標process.
安全
因爲端口暴露,容易收到攻擊。著名的SQL 2000 Slammer worm蠕蟲病毒就是如此。由於每一個socket都有本身的buffer,當被攻擊時,buffer overflow。
Building a Reliable Data Transefer Protocol
這個小節十分重要,講述瞭如何去創建一個可靠的數據傳輸協議。這是一個邏輯上的設計,做者嚴謹的考慮了三種狀況。
- 在可靠的Channel上的傳輸: rdt1.0
- 在存在Bit Errors的Channel上傳輸:rdt2.0
- 在存在bit Errors的Lossy Channel上傳輸: rdt3.0
在第三種方案中,已經考慮差錯校驗,Timer, Sequence number,ACK , 丟包重傳等。這個設計就是傳輸層協議的關鍵與核心。
Pipelined Reliable Data Transfer Protocols
rdt3.0是一個功能上正確的協議,可是沒人會爲它的性能感到高興,尤爲是在現在這樣的高速網絡。rdt3.0最大的問題就是:stop-and-wait,它是一箇中止-等待協議,這致使它的性能十分糟糕。
所以如何去實現一個流水線的可靠傳輸協議呢?這是本節的重要思想。所以設計出了:
- Go-Back-N(GBN)協議,它相對於stop-and-wait已經有很大的改善了,提升了信道的利用率,可是缺陷仍然存在:單個的包錯誤會致使大量包的重傳。
- Selective Repeat(SR)協議 它只會重傳丟失的包。
講述了這兩個設計模式以後,就引入了TCP鏈接,TCP是這個設計模式實現的典範。TCP鏈接不存在於一個TDM和FDM的電路交換網絡,也不在虛電路上,只運行在兩個end system之中。Cerf和Kahn出版了關於TCP/IP的論文,他們所以在2004被授予了ACM‘s Turing Award。TCP提供雙工的服務,full-duplex service。
應用層的SSH協議和Telnet協議,下一層使用的就是TCP,可是Telnet在傳輸層使用了明文密碼。
安全
因爲TCP鏈接須要'three-way-handshake',SYN是創建所須要的,所以有SYN flood attack
防範的辦法很是簡單:就是SYN cookies
。當傳輸層收到一個segment時,對它執行hash函數,獲得一個特徵值。接着下面的步驟進行,若是發現ACK無效,那麼這可能就是一個有害的包。後面的每一個包都會被執行Hash操做,比對。若是無效就被丟棄。
Principle of Congestion Control
擁塞控制的原則,廣義上,擁塞控制須要從兩處實現:
- End-to-end congestions control
- Network-assisted congestion control 而後在下一節引入的TCP的擁塞控制:加法增長,乘法減小
總結
咱們在這個章節開始處學習了傳輸層協議能夠提供給網絡應用的服務。從某個極端上講,傳輸層能夠很是簡單的提供給應用層一個無修飾(no-frill)的服務。UDP就是無修飾的服務的典型例子。從另外一個極端,傳出層也能夠給應用層提供一個帶有大量保證的服務,諸如可靠傳輸,延遲保證,帶寬保證,TCP就是這樣的例子。不然,傳輸層只能依賴下一層的網絡層爲它提供這些保證。而網絡層沒有作這些,所以這些被傳輸層實現了。
ACK應答的方式保證了數據的可靠傳輸,timer限制了在規定時間應答,重轉是保證的關鍵,seq方便了肯定重傳的segment。TCP遠遠比咱們想象中的要複雜,大量的TCP補丁,修正,各類版本的TCP實現。尤爲的TCP的擁塞控制已經演化了不少年,而且仍然在持續演化。傳輸層也出現了其餘的協議:
- DCCP 類UDP的,可是應用層能夠選擇是可靠的仍是半可靠的。
- SCTP 可靠的服務。容許應用層的'Streams'
- TFRC TCP-Friendly Rate Congtrol protocol
只有時間才能檢驗這些傳輸層協議是否會在將來普遍部署!儘管這些協議是TCP和UDP的增強版,可是從這些年的表現而言,TCP和UDP表現的已經足夠"good enough",人們是否會拋棄"better"而選擇「good better",這取決於複雜的:技術、社會和商業考慮的混合。
Chapter 4 Network Layer 網絡層 1.