Computer Neworking: A Top-Down Approach
[TOC]
這本書是計算機網絡最好的入門書籍,與傳統的計算機網絡書籍不同,它采用了自頂而下的方式去講解。感謝兩位十分出色的作者: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.
簡而言之,設備互聯。
諸如筆記本,智能手機,遊戲控制臺,攝像頭,環境傳感器等,這些非傳統的設備就像被計算機網絡鉤住(hooked up)了一樣。在因特網的術語(jargon)中,這些設備被稱為 hosts(主機) 或 end systems(終端)。終端訪問因特網通過Internet Service Providers(ISPs), 還有本地的ISPs,例如中國電信。
packets = header bytes + data bytes
所以為什麽網路字節序是大端序? 因為要先傳輸字節頭。
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 端到端的延遲
dend-end = N(dproc + dtrans + dprop)
其中dtrans = 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 網絡層
Computer Neworking: A Top-Down Approach