1.2 TCP/IP是什么
IP世界的根本大法,是TCP/IP協議族。
IP世界是由通信實體構成的,而通信實體,是要分層的。
就如一個公司混亂的管理要進行改革一樣。我們首先思考一下一個企業最可能出現的管理混亂有哪些表現。
員工“越界”:員工不經過部門經理直接向公司總經理匯報工作;秘書經常到總經理處指責其對公司的未來規劃缺乏經驗。
部門經理做“二傳手”:提交給總經理的匯報,是員工匯報的簡單疊加;總經理給部門經理分配的工作,部門經理不做思索地推給某個員工。
兩個部門之間職責不清:市場部經理經常指責客服部員工A,因為A沒有按照市場部經理的要求向某個客戶提供服務,而是把有限的時間給了另外一個客戶,而這個工作是由客服部經理指派的;采購部經理要求市場部員工B在某個項目中必須向客戶提供聯想品牌筆記本電腦,而實際情況是,客戶要求必須使用SONY筆記本電腦但采購部經理并不知情。
總經理一抓到底:布置任務跳過部門經理直接與員工溝通,而部門經理也經常布置任務給員工,部門經理無從了解員工的工作量,總經理也無法把控任務的進度。
公司與客戶接口混亂:任何人都可以向客戶隨意承諾,而承諾出來的東西又無法兌現。
不管你做多少培訓、增加多少職業經理人,最終改變這種狀況的,無非是以下幾個舉措。
分層:要把總經理——部門經理——員工的三層結構搞清晰,每層的職責范圍明確定義。公司總經理負責公司戰略和重大事務的處理;公司部門經理負責管理部門,向公司總經理匯報工作;公司員工負責具體事物處理,向部門經理匯報工作。
明確層之間的關系:需要明確任何一個層面的人員,其與上下層的關系;總經理將公司戰略和要求部署給每個部門經理,每個部門經理細化后部署給每個員工。
對等層之間的關系:需要明確任何一個層面的人員,與對等部門或對等公司的關系(對等公司如客戶和原材料供應方)。
這樣,公司都形成了三個層次的機構,每個層次都與上下層次的權責清晰明了,對外業務接口統一,溝通渠道通暢,業務流程規范。
通信實體也必須分出層次,以保證各種網絡技術能和諧地共存和良好地配合,并不斷激勵技術創新。通信網的分層,與公司的組織結構極其相似。加入通信網中的各個實體就好比一個個公司,比如路由器是一個通信實體,某個通信軟件(如瀏覽器或者QQ)是一個通信實體,網絡游戲的服務器軟件和用戶端軟件都是通信實體。這些實體必須滿足以下要求。
要分出若干層次,管理上類似的功能要放在同一層,在實現技術經常變化的地方增加層次,每個層次有自己的職責。
要明確每個層次與上下層的關系,層次之間的邊界要合理,使層次間的信息流量盡量最小且容易規范。
兩個實體之間要明確每個層面之間的關系。
1.OSI RM(開放系統互連參考模型)
基于上述要求,國際標準化組織(ISO)于1984年建立了一套非常抽象的分層結構,這就是著名的ISO/OSI(國際標準化組織的開放網絡架構)。與其說這是一個通信標準,不如說這是一種管理哲學。任何事物之間的聯系都可以用OSI表示出來,雖然不是所有的事物都必須具備其所有的層面(通信網本身大部分實體也不具備其所有層面),但是這對我們分析事物是非常有幫助的。
兩個通信實體可以友好合作、充分信任,但是也可以不互相信,可以打架、罵人,但是它們必須能互相理解對方說的是什么。
就像兩國沖突,他們可以打若干年的仗,但是必須都具有能互相理解的語言展開外交辭令,可以和談、破裂,可以下戰書、聲明、抗議。如果沒有統一的能互相理解的語言,那叫雞同鴨講。
為了讓兩個通信實體保持最基本的溝通,在“層”的基礎上,專家們定義了“協議”、“標準”和“規范”。
我們把這7層OSI結構與實現生活中的“說話”聯系起來,有助于大家對OSI的理解,如表1.1所示。
表1.1 OSI參考模型
物理層就像人與人溝通中的能夠互相聽懂的“發音”。物理層解決最基礎的傳送通道,涉及問題主要是建立、維護和釋放物理鏈路所需的機械的、電氣的/光學的、功能的和規程的特性,如光纜如何抗衰耗,無線設備如何提高發射功率,為什么雙絞線要有屏蔽層等。
(2)數據鏈路層
有了發音,才能有“字”或者“詞”,對于說錯的話,要盡快予以糾正;如果不能很好地糾正,就要重新把話再說一遍。
接下來,我們開始考慮在物理層提供的按“位”服務的基礎上,在相鄰的網絡節點之間提供簡單的、傳輸以幀為單位的數據,同時它還負責數據鏈路的流量控制、差錯控制。
首先,數據鏈路層為網絡層提供“簡單”的通信鏈路,通信實體所在的系統必須經過物理介質直接相連——當然,這物理介質可以是有線的銅纜或者光纜,也可以是無線的微波。
大家要理解,這條鏈路不具備任何路徑選擇和轉發功能,你可以把它僅僅理解為“一條封閉的路”,除了兩端,沒有額外出入口。
數據鏈路層將物理層提供的比特流組成“幀”,也就是說,把發送方發出來的若干“位”的數據組成一組,加上“開始”“結束”標志和與檢錯有關的代碼等,形成有固定格式的數據幀——這有點像把貨物放入標準集裝箱中,正因為集裝箱的體積、尺寸都是標準的,最后所有的集裝箱看起來非常整齊,搬運和船載過程也會變得有序和規范。
本層要提供一定的差錯檢驗和糾正機制。信號會因機械、電氣等原因,出現錯誤,如將“0”“1”顛倒,丟失一個“0”或“1”,或者因為外界干擾而多出一位數字。接收者根據檢錯代碼就可以判斷收到的數據幀是否有錯誤,并在可能的情況下糾正錯誤。不能糾正的錯誤可以選擇重傳。
這里面很有學問。發送的信息,接收方是不清楚的。但是如何讓接收方知道發送過來的信息有錯誤呢?對付這種問題,數據鏈路層有應對策略。
假如我們運送的不是數據信息而是貨物,運送工具不是幀而是車。這個問題怎么處理?
發貨方出貨前,將附帶一張“裝箱單”,單子上標明了這車貨物的相關參數,比如重量、體積、品質,接收方只需要稱重量、測體積以及檢驗品質,并和裝箱單上的數據做對比,即可判斷運送過程中是否出現錯誤或者失誤。
數據幀傳送也有類似裝箱單一樣的信息,存儲在“糾錯字節”中。當數據幀到達目的地,它會對自身進行計算,計算結果和糾錯字節中的內容進行對比。如果一致,進行下一步操作。如果不一致呢?這個類似“裝箱單”的糾錯字節就能夠很快將錯誤檢測出來并進行相應處理(比如進行重傳)。
以太網就屬于這一層。所以你會經常聽到“以太網幀”這一術語。
(3)網絡層
我們繼續分析日常說話的方式。說話應該有目標、內容和語速,向誰說,通過誰轉述,說什么,以多快的速度說。網絡層所干的工作,就是進行路由選擇、擁塞控制和網絡互聯。
網絡層對自己的上級——傳輸層,可以提供兩種服務,一種叫作“面向連接”的網絡服務,一種叫作“無連接”的網絡服務——這有點像有軌交通和無軌交通。
有軌交通的特點是,車輛沿著特定軌道行駛,自出發點到目的地,路線、速度基本確定。面向連接的服務也有類似特點。
無軌交通的特點是,車輛走一站看一站,線路、速度均不確定。無連接的服務與此驚人一致。
這兩者的區別,直接導致相關技術體制的巨大差異。面向連接的服務關注于如何建立鏈路,而無連接的服務則專注于在每一站建立一套詳盡的路由表。
傳統IP技術就是無連接服務,而改造為MPLS(多協議標簽交換)網絡后,就屬于面向連接的服務了。
網絡層擔負著的四大任務如下。
路由選擇。任何數據包都不可能在網絡上像無頭的蒼蠅亂跑亂撞,而網絡層的關鍵任務是發現路由、選擇路徑,有時,也負責地址轉換。它就像一個警察,在網絡節點這樣的“十字路口”管理來來往往的數據包,數據包的路徑選擇就是我們經常提到的“路由選擇”。各種路由協議、MPLS的流量工程都與路由選擇有關。
擁塞控制。后文會專門介紹擁塞發生的原理。網絡層可以采用擁塞控制機制,盡量避免擁塞的發生,如果真的發生擁塞,也要通過多種途徑緩解擁塞狀況(比如丟棄一些數據,或者進行緩存)。
局域網間互聯。數據包在局域網間穿梭,會面臨諸如包大小、網絡速度,甚至協議的差異,這些都是網絡層要解決的,就是通過一定的調整,讓兩個網絡之間的數據包成功的傳遞。
統計和控制。如統計哪些用戶需要的網絡流量比較多,訪問哪些站點比較頻繁,或者禁止或控制用戶訪問某些站點;記賬功能一般也在網絡層解決。
網絡層最知名的協議就是IP。
(4)傳輸層
要保證別人聽到你說的話,不能“想當然”。
傳輸層的任務是向用戶提供可靠的、透明的端到端的數據傳輸,以及差錯控制和流量控制機制。由于它的存在,網絡硬件技術的任何變化對高層都是不可見的,也就是說會話層、表示層、應用層的設計不必考慮低層細節,因此傳輸層起到“承上啟下”的作用。
所謂“端到端”是相對鏈接而言的。
各位讀者要記住一個概念,OSI參考模型的四層到七層屬于端到端的方式,而一到三層屬于鏈接的方式。在傳輸層,通信雙方的兩機器之間,有一對應用程序或進程直接對話,它們并不關心低層的實現細節。低層的鏈接方式就不一樣,它要負責處理通信鏈路中的任何相鄰機器之間的通信。假如兩臺計算機A和B要通信,那么A和B之間可以進行直接的傳輸層的通信,而在A和B之間如果有若干網絡節點,如路由器X、Y、Z,那么A與X、X與Y、Y與Z、Z與B之間都要進行低三層的通信。
傳輸層通過邏輯接口向高層提供服務。服務的類型是在連接建立時確定的,最重要的服務是端到端的、可靠的、面向連接的字節流服務——這里已經不是“位流”(也稱“比特流”)了。
一般情況下,傳輸層為每一條傳輸連接生成一條第三層的網絡鏈接,但也有例外:需要高吞吐率的傳輸連接可以同時占用多條網絡鏈接。
傳輸層有一項很有趣的工作——流量控制,通過技術手段,使字節流均勻、穩定。當然,這不是必需的。
大名鼎鼎的TCP和UDP就屬于傳輸層。
(5)會話層
說話要有開始、過程和終止。在不同的機器之間提供會話進程的通信,如建立、管理和拆除會話進程。你可能要考慮這個話是在大庭廣眾之下說還是專門對某個人說,或者是說一句等對方答復后再說下一句。
會話層還提供了許多增值服務,如交互式對話管理,允許一路交互、兩路交換和兩路同時會話;管理用戶登錄遠程分時系統;在兩機器之間傳輸文件,進行同步控制等。
(6)表示層
有些話要以悄悄話的形式,避免第三者聽到;有些話,要簡單明了,不要拖泥帶水。表示層就處理通信進程之間交換數據的表示方法,包括語法轉換、數據格式的轉換、加密與解密、壓縮與解壓縮等。
(7)應用層
有了上面所列的網絡層次,你已經把要說的話通過聲帶的震動,一字一句、清晰明了地地告訴了你的某個好朋友,并且保證他聽到了,沒有讓第三者聽到。你明確地讓對方知道,你的談話何時開始以及何時結束。
應用層就負責管理應用程序之間的通信。
應用層是OSI參考模型的最高層,低層所有協議的最終目的都是為應用層提供可靠的傳送手段,低層協議并沒有直接滿足用戶的任何實際需求。我們日常使用的收發電子郵件、傳送文件、瀏覽網頁、交互即時信息、播放網絡視頻等都屬于應用層的范疇,這是用戶體驗最直觀的服務。
OSI是哲學,而不僅僅是技術!
通信“層”的概念,讓各種協議、規范、標準變得有所不同——它們更靈活但可控,更開放但不混亂,更清晰但不拘束。上面的論述會讓一些讀者覺得乏味,但是如果你能夠緊密結合通信網絡的一些實際應用,并類比生活中的例子,你會發現其實枯燥中蘊含著無窮樂趣,你也會發現,其實分層是一種哲學而非技術。
2. TCP/IP(傳輸控制協議/網際協議)
在《倚天屠龍記》中,張無忌為什么做不成皇帝,而朱元璋卻可以?那是張無忌心太軟,他不愛江山愛美人的性格不適合當皇帝。“優勝劣汰,適者生存”是一條永恒不變的法則,OSI由于體系比較復雜,不太方便計算機軟件實現,逐漸退出人們關注的視野,TCP/IP得到了廣泛的應用。
TCP/IP是Internet的核心技術,是由IETF定義的。所有的系統、終端、線路、用戶、開發者,都必須遵守TCP/IP協議族所規定的法則,否則,將不被IP世界所接受。
對比ISO/OSI的七層結構,看完上面的圖,讀者會奇怪了:怎么沒有表示層和會話層呢?他們到哪里去了?
在TCP/IP分層結構中,的確沒有表示層和會話層,也就是說OSI規定的這兩層,在TCP/IP中并不是必需的。
還有一種五層的說法,將網絡接口層分為物理層和數據鏈路層兩層,這樣有利于數據通信的分析。TCP/IP體系結構中最核心的部分是上面的三層:應用層、傳輸層和互聯網層(也稱網絡層),互聯網層以下的層次沒有制定相關標準,蘿卜咸菜各有所愛,至于最下面的是一層還是兩層,這都不太重要。我們建議提到分層模型時按四層來分,在進行數據通信時按五層來分析。
說到《快樂大本營》,你會立刻想到何炅,謝娜,其實快樂大本營是一個節目組,不僅包括主持人,還有導演、攝像、錄音等其他工作人員。TCP/IP也是一個組,是一個協議組,不僅包括TCP、IP,還包括HTTP、TELNET、FTP、RIP、OSPF、BGP、UDP、ARP、pop3等,只不過TCP/IP這個名字來源于協議族中最主要的兩個協議——TCP(傳輸控制協議)和IP(網際協議)。各個層次分別對應著不同的協議,如圖1.7所示。
下面,分別介紹各層的主要功能。
(1)網絡接口層也稱為數據鏈路層,TCP/IP并沒有嚴格定義該層,它只是要求能夠提供給其上層——網絡層一個訪問接口,以便在其上傳遞IP分組。由于這一層次未被定義,所以其具體的實現方法將隨著網絡類型的不同而不同。以太網是IP通信中數據鏈路層最常見的形式,除此之外還有PPP、HDLC等。10Gbit/s以下的以太網一般應用于局域網,而PPP、HDLC則應用于廣域網范圍內居多。
(2)網絡層(Internet Layer)俗稱IP層,它處理機器之間的通信。IP是一個不可靠的、無連接協議,它接受來自傳輸層的請求,傳輸某個具有目的地址信息的分組。該層把分組封裝到IP數據報中,填入數據報的首部(也稱為報頭),使用路由算法來選擇是直接把數據報發送到目標機還是把數據報發送給路由器,然后把數據報交給下面的網絡接口層中的對應網絡接口模塊。IP負責給互聯網的每一臺計算機或者終端分配一個地址,并將信息以IP包的形式傳送到正確的目的地。這是TCP/IP的核心。IP協議族中最關鍵的是路由協議。除此之外還有ICMP,被用來傳送IP的控制信息。我們熟知的Ping和Traceroute命令就出自ICMP。
(3)傳輸層:傳輸控制協議(Transmission Control Protocol,TCP)和用戶數據報協議(User Datagram Protocol,UDP)是該層的重要協議。TCP是一個面向連接的、可靠的協議。它將一臺主機發出的字節流無差錯地發往互聯網上的其他主機。在發送端,它負責把上層傳送下來的字節流分成報文段并傳遞給下層。在接收端,它負責把收到的報文進行重組后遞交給上層。TCP還要處理端到端的流量控制。UDP是一個不可靠的、無連接協議,主要適用于不需要對報文進行排序和流量控制的場合。大家注意一下,在數通試題中,會經常涉及TCP、IP、UDP可靠不可靠,連接無連接的內容。
3.TCP報文格式
TCP報文包括首部(報頭)和數據部分,其中首部的具體字段如下。
(1)源端口和目的端口字段——各占16bit。端口是傳輸層與應用層的服務接口。
(2)序號字段——SEQ序號,占32bit。TCP連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號。
(3)確認序號:ACK序號,占32 bit,是期望收到對方的下一個報文段的數據的第一個字節的序號。只有ACK標志位為1時,確認序號字段才有效,ACK=SEQ+1。
(4)標志位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下。
緊急比特 URG——當 URG=1 時,表明緊急指針(urgent pointer)字段有效。它告訴系統此報文段中有緊急數據,應盡快傳送(相當于高優先級的數據)。
確認比特ACK——只有當ACK=1時確認號字段才有效。當 ACK=0時,確認號無效。
推送比特PSH(PuSH)——接收TCP收到推送比特置1的報文段,就盡快地交付給接收應用進程,而不再等到整個緩存都填滿了后再向上交付。
復位比特 RST(ReSeT)——當RST=1時,表明TCP連接中出現嚴重差錯(如由于主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接。
同步比特SYN——同步比特SYN置為1,就表示這是一個連接請求或連接接受報文。
終止比特 FIN(FINal)——用來釋放一個連接。當FIN=1時,表明此報文段的發送端的數據已發送完畢,并要求釋放運輸連接。
需要注意的是:不要將確認序號ACK與標志位中的ACK搞混了;確認方ACK=發起方SEQ+1,兩端配對。
(5)數據偏移——占4bit,它指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠。
(6)窗口字段——占16bit。窗口字段用來控制對方發送的數據量,單位為字節。TCP連接的一端根據設置的緩存空間大小確定自己的接收窗口大小,然后通知對方以確定對方的發送窗口的上限。
(7)檢驗和——占16bit。檢驗和字段檢驗的范圍包括首部和數據這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12字節的偽首部。
(8)緊急指針字段——占16bit。緊急指針指出在本報文段中的緊急數據的最后一個字節的序號。
(9)選項字段——長度可變。TCP只規定了一種選項,即最大報文段長度MSS(Maximum Segment Size)。MSS告訴對方TCP:“我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節。”
(10)保留字段——占6bit,保留為今后使用,但目前應置為0。
4.TCP的三次握手和四次揮手
TCP的連接和建立都是采用客戶服務器方式。主動發起連接建立的應用進程叫作客戶(Client)。被動等待連接建立的應用進程叫作服務器(Server)。
建立TCP需要三次握手才能建立,而斷開連接則需要四次揮手。整個過程如圖1.10所示。
(1)三次握手
在TCP/IP中,采用三次握手建立一個連接,連接過程就像打電話的過程,如圖1.11所示。
第一次握手:Client(主機A)向Server(主機B)發送一個連接請求,在這個包中,標志位SYN=1,發送序號SEQ=x,上圖中x=200,Client進入SYN_SEND狀態,等待Server確認。
第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,確認序號ACK=x+1=201,隨機產生一個發送序號SEQ=y,上圖中y=500,并將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
第三次握手:Client收到確認后,檢查確認序號ACK是否為x+1=201,標志位ACK是否為1,如果正確,則將標志位ACK置為1,確認序號ACK=y+1=501,并將該數據包發送給Server,Server檢查確認序號ACK是否為y+1=501,標志位ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態。
完成三次握手,客戶端與服務器開始傳送數據。
(2)四次揮手
四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開,如圖1.12所示。
第一次揮手:當客戶A要斷開TCP連接時,發送一個包,其中標志位fin=1,ACK=1,發送序號SEQ=x,確認序號ACK=y,上圖中x=200,y=500。Client進入FIN_WAIT_1狀態。
第二次揮手:客戶B知道A要斷開后,發送一個確認包,其中標志位ACK=1發送序號,SEQ=y確認序號ACK=x+1=201,Server進入CLOSE_WAIT狀態。
第三次揮手:客戶B也斷開TCP連接,此時發送一個包,其中,標志位fin=1,發送序號SEQ=y+1=501,Server進入LAST_ACK狀態。
第四次揮手:客戶A收到B的斷開請求后,Client進入TIME_WAIT狀態,接著發送一個確認包,標志位ACK=1,發送序號SEQ=x+1=201,確認序號ACK=y+2=502;Server進入CLOSED狀態。
由于TCP連接是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務后,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。
5.TCP/IP協議體系常見術語
(1)包
包(Packet)是網絡上傳輸的數據片段,也稱分組。包是一種統稱,在不同的協議不同的層次,包有不同的名字,如TCP/IP中,數據鏈路層的包叫幀(Frame),IP層的包稱為IP數據報,TCP層的包常稱為TCP報文等。大多數包都由包頭和信息組成:包頭常常包括諸如源和目的地址、包的長度和類型指示符等信息;信息部分可以是原始數據,也可以包含另一個包。
(2)封裝
不同設備的對等層之間依靠封裝和解封裝來實現相互間的通信。封裝就像洗完澡光著身子穿衣服,解封裝就像洗澡前脫衣服,脫了一層又一層直到脫光。
TCP/IP也是一種計算機數據打包和尋址的標準方法。在數據傳送中,可以形象地理解為有兩個信封,TCP和IP就像是信封,要傳遞的信息被劃分成若干段,每一段塞入一個TCP信封,并在該信封面上記錄有分段號的信息,再將TCP信封塞入IP大信封,發送上網。在接受端,一個TCP軟件包收集信封,抽出數據,按發送前的順序還原,并加以校驗,若發現差錯,TCP將會要求重發。因此,TCP/IP在互聯網中幾乎可以無差錯地傳送數據。
在通信過程中,TCP/IP每一層都讓數據得以通過網絡進行傳輸,這些層之間使用協議數據單元(Protocol Data Unit,PDU)彼此交換信息,確保網絡設備之間能夠通信。不同層的PDU中包含有不同的信息,因此PDU在不同層被賦予了不同的名稱。如圖1.13所示,傳輸層在上層數據中加入TCP報頭后得到的PDU被稱為數據段(Segment);數據段被傳遞給網絡層,網絡層添加IP報頭得到的PDU被稱為數據包(Packet);數據包被傳遞到數據鏈路層,封裝數據鏈路層報頭得到的PDU被稱為數據幀(Frame);最后,幀被轉換為比特,通過網絡介質傳輸。這種協議棧向下傳遞數據,并添加報頭和報尾的過程稱為封裝。數據被封裝并通過網絡傳輸后,接收設備將刪除添加的信息,并根據報頭中的信息決定如何將數據沿協議棧上傳給合適的應用程序,這個過程稱為解封裝。