⑴ 互聯網的工作原理是什麼
計算機網路是由許多計算機組成的,要實現網路的計算機之間傳輸數據,必須要作兩件事,數據傳輸目的地址和保證數據迅速可靠傳輸的措施,這是因為數據在傳輸過程中很容易丟失或傳錯,Internet使用一種專門的計算機語言,以保證數據安全、可靠地到達指定的目的地,這種語言包括TCP傳輸控制協議和IP網間協議。
TCP/IP協議的數據傳輸過程:TCP/IP協議採用的通信方式是分組交換方式。所謂分組交換,簡單說就是數據在傳輸時分成若干段,每個數據段稱為一個數據包,TCP/IP協議的基本傳輸單位是數據包,TCP/IP協議主要包括兩個主要的協議,即TCP協議和IP協議,這兩個協議可以聯合使用,也可以與其他協議聯合使用,它們在數據傳輸過程中主要完成以下功能:
1)首先由TCP協議把數據分成若干數據包,給每個數據包寫上序號,以便接收端把數據還原成原來的格式。
2)IP協議給每個數據包寫上發送主機和接收主機的地址,一旦寫上的源地址和目的地址,數據包就可以在物理網上傳送數據了。IP協議還具有利用路由演算法進行路由選擇的功能。
3)這些數據包可以通過不同的傳輸途徑(路由)進行傳輸,由於路徑不同,加上其它的原因,可能出現順序顛倒、數據丟失、數據失真甚至重復的現象。這些問題都由TCP協議來處理,它具有檢查和處理錯誤的功能,必要時還可以請求發送端重發。簡言之,IP協議負責數據的傳輸,而TCP協議負責數據的可靠傳輸。
互聯網又稱網際網路,或網際網路、英特網,是網路與網路之間所串連成的龐大網路,這些網路以一組通用的協議相連,形成邏輯上的單一巨大國際網路。
這種將計算機網路互相聯接在一起的方法可稱作「網路互聯」,在這基礎上發展出覆蓋全世界的全球性互聯網路稱互聯網,即是互相連接一起的網路結構。互聯網並不等同萬維網,萬維網只是一建基於超文本相互鏈接而成的全球性系統,且是互聯網所能提供的服務其中之一。
⑵ 28 張圖詳解網路基礎知識:OSI、TCP/IP 參考模型(含動態圖)
目錄
1、網路協議
其實協議在我們生活中也能找到相應的影子。
舉個例子,有 2 個男生准備追求同一個妹子,妹子來自河南,講河南話,還會點普通話;一個男生來自胡建,講閩南語,也會點普通話;另一個男生來自廣東,只講粵語;
協議一致,溝通自如
語言不通,無法溝通
你們猜猜?最後誰牽手成功了?答案肯定是來自胡建的那位,雙方可以通過 普通話 進行溝通,表達內容都能理解。而來自廣東的帥哥只會講粵語,不會普通話,妹子表示聽不懂,就無法進行溝通下了。
每個人的成長環境不同,所講的語言、認知、理解能力也就不同。為了使來自五湖四海的朋友能溝通自如,就需要大家協商,認識某一個語言或規則,彼此能互相理解,這個語言就是普通話。
通過這個例子,大家可以這樣理解:
把普通話比作「協議」、把聊天比作「通信」,把說話的內容比作「數據」。
相信這樣類比,大家就知道,協議是什麼了?
簡單地說,就是程序員指定一些標准,使不同的通信設備能彼此正確理解、正確解析通信的內容。我們都知道計算機世界裡是二進制,要麼 1,要麼 0,那為啥可以表達豐富多彩的內容呢?
也是因為協議,不同欄位,不同組合,可以解析不同意思,這就依然協議,讓協議來正確處理。
例如,我們使用手機連 WiFi 來刷抖音,使用的是 802.11(WLAN)協議,通過這個協議接入網路。如果你所連的 WIFI 是不需要手動設置 IP 地址,是通過自動獲取的,就使用到了 DHCP 協議,這樣你的手機算上接入了 區域網, 如果你區域網內有台 NAS 伺服器,存放了某些不可描述的視頻資源,你就可以訪問觀看了,但這時你可能無法訪問互聯網資源,例如,你還想刷會抖音,看看妹子扭一扭,結果出現如下畫面:
出現這種畫面,說明無法使用 互聯網, 可能是無線路由器沒有設置好相關協議,比如: NAT、PPPoE 協議(上網賬號或密碼設置錯誤了),只有設置正確了,就可以通過運營商(ISP)提供的線路把區域網接入到互聯網中,實現手機可以訪問互聯網上的資源(伺服器)。玩微信撩妹子、刷抖音看妹子。
網路協議示意圖
延伸閱讀
1、區域網:最顯著的特點就是范圍有限,行政可控的區域可以是一所高校、一個餐廳、一個園區、一棟辦公樓或一個家庭的私有網路。
2、城域網:原本是介意區域網和廣域網之間,實際工作中很少再刻意去區分城域網和廣域網了,所以這邊不再介紹。
3、廣域網:簡單說就是負責把多個區域網連接起來,它的傳輸距離長距離傳輸,廣域網的搭建一般是由運營商來。
4、互聯網:把全世界上提供資源共享的 IT 設備所在網路連接起來,接入了互聯網就可以隨時隨地訪問這些資源了。
5、物聯網:把所有具有聯網功能的物體都接入互聯網就形成了物聯網。如空調聯網,就可以遠程式控制制空調; 汽車 聯網,就可以遠程獲取行程數據。
總結一下吧!我們可以把電腦、手機等 IT 設備比喻做來自五湖四海的人們,大家都通過多種語言(網路協議)實現溝通(通信)。所有人要一起交流,就用普通話,大家都能理解。所有胡建人在一起,就用閩南語進行溝通,彼此也能理解。這么的方言,就好比計算機網路世界裡也有這么多協議,只是不同協議用在不同地方。
好奇的同學,可能就會問,那網路協議是由誰來規定呢?這就需要提到一個組織,ISO。這個組織制定了一個國際標准 ,叫做 OSI 參考模型,如下,很多廠商都會參考這個制定網路協議。
OSI 參考模型圖
2、OSI 參考模型
既然是模型,就好比模範一樣,大家都要向它學習,以它為原型,展開學習研究。前面我們也提到了一些協議,這么多協議如果不進行歸納,分層,大家學習起來是不是感覺很凌亂?
所以 OSI 參考模型就是將這樣復雜的協議整理並進行分層,分為易於理解的 7 層,並定義每一層的 服務 內容,協議的具體內容是 規則 。上下層之間通過 介面 進行交互,同一層之間通過 協議 進行交互。相信很多網路工程師在今後工作中遇到問題,討論協議問題還會用到這個模型展開討論。所以說,對於計算機網路初學者來說,學習了解 OSI 參考模型就是通往成功的第一步。
OSI 參考模型分層功能
7.應用層
為應用程序提供服務並規定應用程序中通信相關的細節,OSI 的最高層。包括文件傳輸、Email、遠程登錄等協議。程序員接觸這一層比較多。
應用層示例圖
6.表示層
主要負責數據格式的轉換,為上下層能夠處理的格式。如編碼、加密、解密等。
表示層示例圖
5.會話層
即負責建立、管理和終止通信連接(數據流動的邏輯通路),數據分片、重組等傳輸的管理。
會話層示例圖
4.傳輸層
保證可靠傳輸,不需要再路由器上處理,只需再通信雙方節點上進行處理,如處理差錯控制和流量控制。
傳輸層示例圖
3.網路層
主要負責定址和路由選擇,將數據包傳輸到目的地。
網路層示例圖
2.數據鏈路層
負責物理層面上互連、節點之間的通信傳輸,將0 、 1 序列比特流劃分為具有意義的數據幀傳輸給對端。這一層有點類似網路層,網路層也是基於目的地址來傳輸,不同是:網路層是將數據包負責在整個網路轉發,而數據鏈路層僅是在網段內轉發,所以大家抓包會發現,源目 MAC 地址每經過一個二層網段,都會變化。
數據鏈路層示例圖
1.物理層
負責 0、1 比特流(0、1 序列)與電壓高低電平、光的閃滅之間的互相轉換,為數據鏈路層提供物理連接。
物理層示例圖
OSI 為啥最後沒有得到運用呢?其實最主要的原因,是 OSI 模型出現的比 tcp/ip 出現的時間晚,在 OSI 開始使用前,TCP/IP 已經被廣泛的應用了。如果要換成 OSI 模型也不太現實。其次是 OSI 是專家們討論,最後形成的,由於沒有實踐,導致該協議實現起來很復雜,很多廠商不願意用 OSI,與此相比,TCP/IP 協議比較簡單,實現起來也比較容易,它是從公司中產生的,更符合市場的要求。綜合各種因素,最終 OSI 沒有被廣泛的應用。
下面我們來看看 TCP/IP 與 OSI 分層之間的對應關系及相應的協議:
4.應用層
從上圖,可以知道 TCP/IP 四層模型,把應用層、表示層、會話層集成再一起了,該層的協議有:HTTP 、 POP3 、 TELNET 、 SSH 、 FTP 、 SNMP 等。
目前,大部分基於 TCP/IP 的應用都是 客戶端/服務端 架構。一般我們把提供資源服務的那一側叫服務端, 發起訪問服務資源的這一側叫客戶端。
應用層
3.傳輸層
主要職責就是負責兩端節點間的應用程序互相通信,每個節點上可能有很多應用程序,例如,登錄了微信,又打開了網頁,又打開迅雷看看,那數據到達後怎麼正確傳送到相應的應用程序呢?那就需要 埠號 來正確識別了。傳輸層中最為常見的兩個協議分別是傳輸控制協議 TCP (Transmission Control Protocol)和用戶數據報協議 UDP (User Datagram Protocol)
面向連接 顧名思義,就是建立連接,什麼時候建立連接呢?就是在通信之前需要先建立一條邏輯的通信鏈路。就跟我們平時打電話一樣,得先撥通,通了之後即鏈路建立好了,這條鏈路只有你和對方可以在這條鏈路傳播說話內容。掛電話後,這條鏈路也就斷開了。
面向無連接 無連接,即通信之前不需要建立連接,直接發送即可。跟我們以前寫信很像,不需要管對方在不在?直接寫信寄過去就可以了。
面向連接傳輸
面向無連 接傳輸
2.網路層
主要職責就是將數據包從源地址發送到目的地址。
在網路傳輸中,每個節點會根據數據的 IP 地址信息,來判斷該數據包應該由哪個介面(網卡)發送出去。各個地址會參考一個發出介面列表, MAC 定址中所參考的這張表叫做 MAC 地址轉發表 ,而 IP 定址中所參考的叫做 路由表 。MAC 地址轉發表根據自學自動生成。路由控製表則根據路由協議自動生成。MAC 地址轉發表中所記錄的是實際的 MAC 地址本身,而路由表中記錄的 IP 地址則是集中了之後的網路號(即網路號與子網掩碼)。
1.網路介面層
在 TCP/IP 把物理層和數據鏈路層集成為 網路介面層 。主要任務是將上層的數據封裝成幀發送到網路上,數據幀通過網路到達對端,對端收到後對數據幀解封,並檢查幀中包含的 MAC 地址。如果該地址就是本機的 MAC 地址或者是廣播地址,則上傳到網路層,否則丟棄該幀。
封裝與解封裝
所謂的封裝,其實就跟你寄快遞的時候,給物品加上紙盒包裝起來或者快件到站點,快遞員貼一層標簽的過程。在網路上,就是上層的數據往下送的時候,下層會添加頭部,不過,只有在二層,不僅會加上頭部,還會在上層數據尾部添加 FCS。
封裝
所謂解封裝,就如同你收到快件一樣,一層一層地拆外包裝,直到看到快件。網路也是,一層一層地拆掉頭部,往上層傳送,直到看到數據內容。
解封裝
我們把應用層的數據封裝傳輸層頭部後的報文,稱為 段 ;
把段封裝網路層頭部後的報文,稱為 包 ;
把包封裝乙太網頭部和幀尾,稱為 幀 。
⑶ 計算機網路——TCP/UDP協議
計算機網路七層模型中,傳輸層有兩個重要的協議:
(1)用戶數據報協議UDP (User Datagram Protocol)
(2)傳輸控制協議TCP (Transmission Control Protocol)
UDP 在傳送數據之前不需要先建立連接。遠地主機的運輸層在收到UDP 報文後,不需要給出任何確認。雖然UDP 不提供可靠交付,但在某些情況下UDP 卻是一種最有效的工作方式。
TCP 則提供面向連接的服務。在傳送數據之前必須先建立連接,數據傳送結束後要釋放連接。TCP 不提供廣播或多播服務。由於TCP 要提供可靠的、面向連接的運輸服務,因此不可避免地增加了許多的開銷,如確認、流量控制、計時器以及連接管理等。
UDP 的主要特點是:
首部手段很簡單,只有8 個位元組,由四個欄位組成,每個欄位的長度都是兩個位元組。
前面已經講過,每條TCP 連接有兩個端點,TCP 連接的端點叫做套接字(socket)或插口。套接字格式如下:
套接寧socket= (IP 地址:埠號』)
每一條TCP 連接唯一地被通信兩端的兩個端點(即兩個套接宇)所確定。即:
TCP 連接= {socket1, socket2} = {(IP1: port1), (IP2: port2)}
3次握手鏈接
4次握手釋放鏈接
斷開連接請求可以由客戶端發出,也可以由伺服器端發出,在這里我們稱A端向B端請求斷開連接。
各個狀態節點解釋如下:
下面為了討論問題的萬便,我們僅考慮A發送數據而B 接收數據並發送確認。因此A 叫做發送方,而B 叫做接收方。
「停止等待」就是每發送完一個分組就停止發送,等待對方的確認。在收到確認後再發送下一個分組。
使用上述的確認和重傳機制,我們就可以在不可靠的傳輸網路上實現可靠的通信。像上述的這種可靠傳輸協議常稱為自動重傳請求ARQ (Automatic Repeat reQuest)。意思是重傳的請求是自動進行的。接收方不需要請求發送方重傳某個出錯的分組。
滑動窗口協議比較復雜,是TCP 協議的精髓所在。這里先給出連續ARQ 協議最基本的概念,但不涉提到許多細節問題。詳細的滑動窗口協議將在後面討論。
下圖表示發送方維持的發送窗口,它的意義是:位於發送窗口內的5 個分組都可連續發送出去,而不需要等待對方的確認。這樣,信道利用率就提高了。
連續ARQ 協議規定,發送方每收到一個確認,就把發送窗口向前滑動一個分組的位置。
接收方一般都是採用 累積確認 的方式。這就是說,接收方不必對收到的分組逐個發送確認,而是可以在收到幾個分組後,對按序到達的最後一個分組發送確認,這樣就表示:到這個分組為止的所有分組都己正確收到了。
累積確認 的優點是容易實現,即使確認丟失也不必重傳。但缺點是不能向發送方反映出接收方己經正確收到的所有分組的信息。
例如,如果發送方發送了前5 個分組,而中間的第3 個分組丟失了。這時接收方只能對前兩個分組發出確認。發送方無法知道後面三個分組的下落,而只好把後面的三個分組都再重傳一次。這就叫做Go-back-N (回退N ),表示需要再退回來重傳己發送過的N 個分組。可見當通信線路質量不好時,連續ARQ 協議會帶來負面的影響。
TCP 的滑動窗口是以位元組為單位的。現假定A 收到了B 發來的確認報文段,其中窗口是20 (位元組),而確認號是31 (這表明B 期望收到的下一個序號是31 ,而序號30 為止的數據己經收到了)。根據這兩個數據, A 就構造出自己的發送窗口,其位置如圖所示。
發送窗口表示:在沒有收到B 的確認的情況下, A可以連續把窗口內的數據都發送出去。凡是己經發送過的數據,在未收到確認之前都必須暫時保留,以便在超時重傳時使用。
發送窗口後沿的後面部分表示己發送且己收到了確認。這些數據顯然不需要再保留了。而發送窗口前沿的前面部分表示不允許發送的,因為接收方都沒有為這部分數據保留臨時存放的緩存空間。
現在假定A 發送了序號為31 ~ 41 的數據。這時發送窗口位置並未改變,但發送窗口內靠後面有11個位元組(灰色小方框表示)表示己發送但未收到確認。而發送窗口內靠前面的9 個位元組( 42 ~ 50 )是允許發送但尚未發送的。】
再看一下B 的接收窗口。B 的接收窗口大小是20,在接收窗口外面,到30 號為止的數據是已經發送過確認,並且己經交付給主機了。因此在B 可以不再保留這些數據。接收窗口內的序號(31~50)足允許接收的。B 收到了序號為32 和33 的數據,這些數據沒有按序到達,因為序號為31 的數據沒有收到(也許丟失了,也許滯留在網路中的某處)。 請注意, B 只能對按序收到的數據中的最高序號給出確認,因此B 發送的確認報文段中的確認號仍然是31 (即期望收到的序號)。
現在假定B 收到了序號為31 的數據,並把序號為31~33的數據交付給主機,然後B刪除這些數據。接著把接收窗口向前移動3個序號,同時給A 發送確認,其中窗口值仍為20,但確認號是34,這表明B 已經收到了到序號33 為止的數據。我們注意到,B還收到了序號為37, 38 和40 的數據,但這些都沒有按序到達,只能先存在接收窗口。A收到B的確認後,就可以把發送窗口向前滑動3個序號,指針P2 不動。可以看出,現在A 的可用窗口增大了,可發送的序號范圍是42~53。整個過程如下圖:
A 在繼續發送完序號42-53的數據後,指針P2向前移動和P3重合。發送窗口內的序號都已用完,但還沒有再收到確認。由於A 的發送窗口己滿,可用窗口己減小到0,因此必須停止發送。
上面已經講到, TCP 的發送方在規定的時間內沒有收到確認就要重傳已發送的報文段。這種重傳的概念是很簡單的,但重傳時間的選擇卻是TCP 最復雜的問題之一。
TCP採用了一種自適應演算法 ,它記錄一個報文段發出的時間,以及收到相應的確認的時間。這兩個時間之差就是報文段的往返時間RTT,TCP 保留了RTT的一個加權平均往返時間RTTs (這又稱為平滑的往返時間, S 表示Smoothed 。因為進行的是加權平均,因此得出的結果更加平滑)。每當第一次測量到RTT樣本時, RTTs值就取為所測量到的RTT樣本值。但以後每測量到一個新的RTT樣本,就按下式重新計算一次RTTs:
新的RTTs = (1 - α)×(舊的RTTs) + α ×(新的RTT樣本)
α 越大表示新的RTTs受新的RTT樣本的影響越大。推薦的α 值為0.125,用這種方法得出的加權平均往返時間RTTs 就比測量出的RTT值更加平滑。
顯然,超時計時器設置的超時重傳時間RTO (RetransmissionTime-Out)應略大於上面得出的加權平均往返時間RTTs。RFC 2988 建議使用下式計算RTO:
RTO = RTTs + 4 × RTTd
RTTd是RTT 的偏差的加權平均值,它與RTTs和新的RTT樣本之差有關。計算公式如下:
新的RTTd= (1- β)×(舊的RTTd) + β × |RTTs-新的RTT樣本|
發現問題: 如圖所示,發送出一個報文段。設定的重傳時間到了,還沒有收到確認。於是重
傳報文段。經過了一段時間後,收到了確認報文段。現在的問題是:如何判定此確認報文段是對先發送的報文段的確認,還是對後來重傳的報文段的確認?
若收到的確認是對重傳報文段的確認,但卻被源主機當成是對原來的報文段的確認,則這樣計算出的RTTs 和超時重傳時間RTO 就會偏大。若後面再發送的報文段又是經過重傳後才收到確認報文段,則按此方法得出的超時重傳時間RTO 就越來越長。
若收到的確認是對原來的報文段的確認,但被當成是對重傳報文段的確認,則由此計算出的RTTs 和RTO 都會偏小。這就必然導致報文段過多地重傳。這樣就有可能使RTO 越來越短。
Kam 提出了一個演算法:在計算加權平均RTTs 時,只要報文段重傳了就不採用其往返時間樣本。這樣得出的加權平均RTTs 和RTO 就較准確。
新問題: 設想出現這樣的情況:報文段的時延突然增大了很多。因此在原來得出的重傳時間內,不會收到確認報文段。於是就重傳報文段。但根據Kam 演算法,不考慮重傳的報文段的往返時間樣本。這樣,超時重傳時間就無法更新。
解決方案: 對Kam 演算法進行修正,方法是z報文段每重傳一次,就把超時重傳時間RTO 增大一些。典型的做法是取新的重傳時間為2 倍的舊的重傳時間。當不再發生報文段的重傳時,才根據上面給出的公式計算超時重傳時間。
流量控制(flow control)就是讓發送方的發送速率不要太快,要讓接收方來得及接收。
利用滑動窗口機制可以很方便地在TCP 連接上實現對發送方的流量控制。
接收方的主機B 進行了三次流量控制。第一次把窗口減小到rwnd =300,第二次又減到rwnd = 100 ,最後減到rwnd = 0 ,即不允許發送方再發送數據了。這種使發送方暫停發送的狀態將持續到主機B 重新發出一個新的窗口值為止。我們還應注意到,B 向A 發送的三個報文段都設置了ACK=1,只有在ACK=1 時確認號欄位才有意義。
發生死鎖: 現在我們考慮一種情況。上圖中, B 向A 發送了零窗口的報文段後不久, B 的接收緩存又有了一些存儲空間。於是B 向A 發送了rwnd = 400 的報文段。然而這個報文段在傳送過程中丟失了。A 一直等待收到B 發送的非零窗口的通知,而B 也一直等待A 發送的數據。如果沒有其他措施,這種互相等待的死鎖局面將一直延續下去。
解決方案: TCP 為每一個連接設有一個 持續計時器(persistence timer) 。只要TCP 連接的一方收到對方的零窗口通知,就啟動持續計時器。若持續計時器設置的時間到期,就發送一個 零窗口探測報文段 (僅攜帶1 宇節的數據),而對方就在確認這個探測報文段時給出了現在的窗口值。
1 TCP連接時是三次握手,那麼兩次握手可行嗎?
在《計算機網路》中是這樣解釋的:已失效的連接請求報文段」的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連接釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段後,就誤認為是client再次發出的一個新的連接請求。於是就向client發出確認報文段,同意建立連接。假設不採用「三次握手」,那麼只要server發出確認,新的連接就建立了。由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送ACK包。這樣就會白白浪費資源。而經過三次握手,客戶端和伺服器都有應有答,這樣可以確保TCP正確連接。
2 為什麼TCP連接是三次,揮手確是四次?
在TCP連接中,伺服器端的SYN和ACK向客戶端發送是一次性發送的,而在斷開連接的過程中,B端向A端發送的ACK和FIN是是分兩次發送的。因為在B端接收到A端的FIN後,B端可能還有數據要傳輸,所以先發送ACK,等B端處理完自己的事情後就可以發送FIN斷開連接了。
3 為什麼在第四次揮手後會有2個MSL的延時?
MSL是Maximum Segment Lifetime,最大報文段生存時間,2個MSL是報文段發送和接收的最長時間。假定網路不可靠,那麼第四次發送的ACK可能丟失,即B端無法收到這個ACK,如果B端收不到這個確認ACK,B端會定時向A端重復發送FIN,直到B端收到A的確認ACK。所以這個2MSL就是用來處理這個可能丟失的ACK的。
1 文件傳送協議
文件傳送協議FTP (File Transfer Protocol) [RFC 959]是網際網路上使用得最廣泛的文件傳送協議,底層採用TCP協議。
盯P 使用客戶伺服器方式。一個FTP 伺服器進程可同時為多個客戶進程提供服務。FTP的伺服器進程由兩大部分組成:一個主進程,負責接受新的請求:另外有若干個從屬進程,負責處理單個請求。
在進行文件傳輸時,客戶和伺服器之間要建立兩個並行的TCP 連接:「控制連接」(21埠)和「數據連接」(22埠)。控制連接在整個會話期間一直保持打開, FTP 客戶所發出的傳送請求,通過控制連接發送給伺服器端的控制進程,但控制連接並不用來傳送文件。實際用於傳輸文件的是「數據連接」。伺服器端的控制進程在接收到FTP 客戶發送來的文件傳輸請求後就創建「數據傳送進程」和「數據連接」,用來連接客戶端和伺服器端的數據傳送進程。
2 簡單文件傳送協議TFTP
TCP/IP 協議族中還有一個簡單文件傳送協議TFfP (Trivial File Transfer Protocol),它是一個很小且易於實現的文件傳送協議,埠號69。
TFfP 也使用客戶伺服器方式,但它使用UDP 數據報,因此TFfP 需要有自己的差錯改正措施。TFfP 只支持文件傳輸而不支持交耳。
3 TELNET
TELNET 是一個簡單的遠程終端協議,底層採用TCP協議。TELNET 也使用客戶伺服器方式。在本地系統運行TELNET 客戶進程,而在遠地主機則運行TELNET 伺服器進程,佔用埠23。
4 郵件傳輸協議
一個電子郵件系統應具如圖所示的三個主要組成構件,這就是用戶代理、郵件伺服器,以及郵件發送協議(如SMTP )和郵件讀取協議(如POP3), POP3 是郵局協議(Post Office Protocol)的版本3 。
SMTP 和POP3 (或IMAP )都是在TCP 連接的上面傳送郵件,使用TCP 的目的是為了使郵件的傳送成為可靠的。
⑷ 圖解TCP/IP
計算機使用模式的演變:
20世紀50年代 批處理時代
20世紀60年代 分時系統時代
20世紀70年代 計算機間通信時代
20世紀80年代 計算機網路時代
20世紀90年代 互聯網普及時代
2000年 以互聯網為中心的時代
2010年 無論何時何地地一切皆TCP/IP的網路時代
在計算機網路與信息通信領域,人們經常提及 「協議」 。簡單來說。 協議 就是計算機與計算機之間通過網路實現通信時事先達成的一種「約定」。這種「約定」使那些由不同廠商的設備、不同的CPU以及不同的操作系統組成的計算機之間,只要遵循相同的協議就能實現通信。換句話說, 協議 就是計算機之間的通信語言,只有支持相同的協議,計算機之間才能相互通信。
計算機通信也會在每一個分組中附加上源主機地址和目標主機地址送給通信線路。這些發送端地址、接收端地址以及分組序號寫入的部分稱為 「報文首部」 。
TCP/IP協議並非ISO(國際標准化組織)所制定的某種國際標准,而是由IETF(Internet Engineering Task Force國際互聯網工程任務組)所建議的、致力於推進器標准化作業的一種協議。
OSI參考模型
應用層 :針對特定應用的協議。以電子郵件為例,用戶A在主機A上新建一封電子郵件,指定收件人為B,並輸入郵件內容為「早上好」。應用層協議會在所要傳遞數據的前端附加一個首部(標簽)信息,該首部標明了郵件內容為「早上好」和收件人為B。
表示層 :設備固有數據格式和網路標准數據格式的轉換。用戶A和用戶B使用的郵件客戶端一致,便能夠順利收取和閱讀郵件,不一致時表示層就發揮作用了:將數據從「某個計算機特定的數據格式」轉換為「網路通用的標准數據格式」後再發送出去,接收端也進行相應處理。表示層與表示層之間為了識別編碼格式也會附加首部信息,從而將實際傳輸的數據轉交給下一層處理。
會話層 :通信管理。負責建立和斷開通信連接(數據流動的邏輯通路)。管理傳輸層以下的分層。假定用戶A新建了5封電子郵件准備發送給用戶B,是建立一次連接一起發送,還是分別建立5次連接各自發送,都是會話層決定的,會話層和表示層一樣,也會在數據前段附加首部或標簽信息再轉發給下一層。而這些首部或標簽中記錄著數據傳送順序的信息。
傳輸層 :管理兩個節點之間的數據傳輸。負責可靠傳輸(確保數據被可靠傳送到目標地址)。用主機A將「早上好」這一數據發送給主機B,期間可能因為某些原因導致數據損壞,主機B只收到「早上」,此時也會將這一事實告訴主機A,主機A得知情況會將後面的「好」重發給主機B。保證數據傳輸的可靠性是傳輸層的一個重要作用。為了確保可靠性,這一層所要傳輸的數據附加首部以識別這一分層的數據。然而,實際上將數據傳輸給對端的處理是由網路層來完成的。
網路層 :地址管理與路由選擇。兩端主機之間雖然有眾多數據鏈路,但能夠將數據從主機A送到主機B也都是網路層的功勞。相當於TCP/IP協議中的IP協議,網路層不能保證數據的可達性,所以需要傳輸層TCP協議確保可達性,所以TCP/IP協議實現了可靠傳輸。
數據鏈路層 :互連設備之間傳送和識別數據幀。網路層負責將整個數據發送給最終目標地址,而數據鏈路層則只負責發送一個分段內的數據。
物理層 :以「0」、「1」代表電壓的高低、燈光的閃滅。界定連接器和網線的規格。將數據的0、1轉換為電壓和脈沖光傳輸給物理的傳輸介質。
計算機之間的網路連接通過 電纜 相互連接。任何一台計算機連接網路時,必須要使用 網卡 (網路適配器、NIC、LAN卡), 中繼器 的作用是將電纜傳過來的信號調整和放大再傳給另一個電纜,可以完成不同媒介之間的連接工作。 網橋 是數據鏈路層面上連接兩個網路的設備,提供的是傳遞數據幀的作用,並且還具備自學機制。 路由器 是在網路層面上(OSI七層模型網路層)連接兩個網路、並對分組報文進行轉發的設備。 網橋 是根據物理地址(MAC地址)進行處理,而路由器/3層交換機則是根據IP地址進行處理的。由此,TCP/IP中網路層的地址就成為了IP地址。對於並發訪問量非常大的一個企業級Web站點,使用一台伺服器不足以滿足前端的訪問需求,這時通常會架設多台伺服器來分擔。這些伺服器的訪問的入口地址通常只有一個,為了能通過同一個URL將前端訪問分發到後台多個伺服器上,可以將這些伺服器的前端加一個負載均衡器。這種負載均衡器就是4-7層交換機的一種。 網關 是OSI參考模型中負責將從傳輸層到應用層的數據進行轉換和轉發的設備。在兩個不能進行直接通信的協議之間進行翻譯,最終實現兩者的通信。非常典型的例子就是互聯網郵件和手機郵件之間的轉換服務。防火牆也是一款通過網關通信,針對不用應用提高安全性的產品。
美國軍方利用分組交換技術組件的ARPANET網路是互聯網的鼻祖。而BSD UNIX操作系統實現了TCP/IP協議,隨著UNIX系統的普及,TCP/IP協議開始盛行。TCP/IP可以單純的指這兩種協議,然而在很多情況下,它指的是包含HTTP、SMTP、FTP、TCP、UDP、IP、ARP等很多協議的 網際協議族 。
發送數據包的過程,和上節OSI參考模型中介紹的差不多。數據鏈路層是由網路介面(乙太網驅動)來處理的,它會改數據附加上 乙太網首部 , 乙太網首部 中包含接收端的MAC地址、發送端MAC地址以及標志乙太網類型的乙太網數據的協議。
在乙太網普及之初,一般多台終端使用同一根同軸電纜的 共享介質型 連接方式,訪問控制一般以半雙工通信為前提採用CSMA/CD方式。隨著ATM交換技術的進步和CAT5 UTP電纜的普及很快發生了變化,逐漸採用像 非共享介質網路 那樣直接與交換機連接的方式。
網路層與數據鏈路層的關系
某人要去一個很遠的地方旅行,並計劃先後乘坐飛機、火車、公交車到達目的地。旅行社不僅幫他預訂好了飛機票和火車票,甚至還為他指定了一個詳細的行程表,詳細到幾點幾分需要乘坐飛機或火車都一目瞭然。機票和火車票只能夠在某一限定區間內移動,此處的「區間內」就如同通信網路上的數據鏈路。這個區間內的出發地點和目的地點就如同某一個數據鏈路的源地址和目標地址等首部信息。整個行程表的作用就相當於網路層。
DNS :將域名和IP地址相匹配。
ARP :以目標IP地址為線索,用來定位下一個應該接受數據分包的網路設備對應的MAC地址。ARP只適用於IPv4,IPv6可以用ICMPv6替代ARP發送鄰居探索消息。
ICMP :在IP通信中如果某個IP包因為某種原因未能送達目標地址,那麼這個具體的原因將由ICMP負責通知。
DHCP :使用移動設備時,每移動到一個新地方,都要重新設置IP地址,為了實現自動設置IP地址、統一管理IP地址分配,就產生了DHCP協議。
NAT :是用於在本地網路中使用私有地址,在連接互聯網時轉而使用全局IP地址的技術。
IP隧道 :IPv4和IPv6之間進行通信的技術就是IP隧道。
TCP用於低速可靠傳輸
UDP用於高速不可靠傳輸
埠號就是用來識別同一台計算機中進行通信的不同應用程序,也被稱為程序地址。
TCP傳輸利用 窗口控制 提高速度,無需等到每次應答來進行下一次發送,而是有個窗口進行緩沖,來提高吞吐量。
TCP擁塞控制,利用擁塞窗口來調節發送的數據量,擁塞時減小窗口,流暢是增大窗口來控制吞吐量。
我們日常網路訪問的 http 用的是 tcp ,那還是看一下這個過程吧
tcp 可以提供全雙工的數據流傳輸服務,全雙工說白了,就是同一時間 A 可以發信息給 B , B 也可以發消息給 A ,倆人同時都可以給對方發消息;半雙工就是某個時間段 A 可以發給 B ,但 B 不能給 A ,換個時間段,就反過來了。
這個過程理解起來,就像兩人在喊話:
A:喂,有人嗎,我想建立連接
B:有哇,你建立吧,等你吆
A:好噠,我來啦
然後倆人就建立連接了...
一定要三次握手么,兩次行不行?
這么一個場景:
A->B: 洞幺洞幺,我是洞拐,收到請回復。
B->A: 洞拐洞拐,洞幺收到。
請問根據以上對話判斷:
1、B是否能收到A的信息? (答案是肯定的)
2、A是否能收到B的信息? (你猜?)
tcp的核心思想是保證數據可靠傳輸,如果 2 次,顯然不行,但 3 次就一定行么?未必,可能第三次的時候網路中斷了,然後 A 就認為 B 收到了,然後一通發消息,其實 B 沒收到,但這是無法完全保證的。無論握手多少次都不能滿足傳輸的絕對可靠,為了效率跟相對可靠而看, 3 次剛剛好,所以就 3 次了(正好 AB 相互確認了一次)。
舉個栗子:把客戶端比作男孩,伺服器比作女孩。通過他們的分手來說明「四次揮手」過程:
"第一次揮手" :日久見人心,男孩發現女孩變成了自己討厭的樣子,忍無可忍,於是決定分手,隨即寫了一封信告訴女孩。
「第二次揮手」 :女孩收到信之後,知道了男孩要和自己分手,怒火中燒,心中暗罵:你算什麼東西,當初你可不是這個樣子的!於是立馬給男孩寫了一封回信:分手就分手,給我點時間,我要把你的東西整理好,全部還給你!男孩收到女孩的第一封信之後,明白了女孩知道自己要和她分手。隨後等待女孩把自己的東西收拾好。
「第三次揮手」 :過了幾天,女孩把男孩送的東西都整理好了,於是再次寫信給男孩:你的東西我整理好了,快把它們拿走,從此你我恩斷義絕!
「第四次揮手」 :男孩收到女孩第二封信之後,知道了女孩收拾好東西了,可以正式分手了,於是再次寫信告訴女孩:我知道了,這就去拿回來!
為什麼連接的時候是三次握手,關閉的時候卻是四次握手?
答:因為當 Server端 收到 Client端 的 SYN 連接請求報文後,可以直接發送 SYN+ACK報文 。其中 ACK報文 是用來應答的, SYN報文 是用來同步的。但是關閉連接時,當 Server端 收到 FIN報文 時,很可能並不會立即 關閉SOCKET ,所以只能先回復一個 ACK報文 ,告訴 Client端 ,"你發的 FIN報文 我收到了"。只有等到我 Server端 所有的報文都發送完了,我才能發送 FIN報文 ,因此不能一起發送。故需要四步握手。
靜態路由 是指事先設置好路由器和主機中並將路由信息固定的一種方法。缺點是某個路由器發生故障,基本上無法自動繞過發生故障的節點,只有在管理員手工設置以後才能恢復正常。
動態路由 是管理員先設置好路由協議,其設定過程的復雜程度與具體要設置路由協議的類型有直接關系。在路由器個數較多的網路,採用動態路由顯然能夠減輕管理員負擔。網路發生故障,只要有一個可繞的其他路徑,數據包會自動選擇這個路徑,但路由器需要定期相互交換必要的路由控制信息,會增加一定程度的負荷。
根據路由控制范圍分為 IGP (內部網關協議)和 EGP (外部網關協議)
路由演算法分為 距離向量演算法 和 鏈路狀態演算法
距離向量演算法 :通過距離與方向確定通往目標網路的路徑
鏈路狀態演算法 :鏈路狀態中路由器知道網路的連接狀態,並根據鏈路信息確定通往目標網路的路徑。
IGP包含RIP、RIP2、OSPF
EGP包含EGP、BGP
RIP是距離向量型的一種路由協議,廣泛應用於LAN
RIP2是RIP的第二版。新增以下特點:使用多播、支持子網掩碼、路由選擇域、外部路由標志、身份驗證密鑰
OSPF是一種鏈路狀態型路由協議。
在RIP和OSPF中利用IP的網路地址部分進行著路由控制,然而BGP則需要放眼整個互聯網進行路由控制。BGP的最終路由控製表有網路地址和下一站的路由器組來表示,不過它會根據所要經過的AS個數進行路由控制。有了AS編號的域,就相當於有了自己一個獨立的「國家」。AS的代表可以決定AS內部的網路運營和相關政策。與其他AS相連的時候,可以像一位「外交官」一樣簽署合約再進行連接。正是有了這些不同地區的AS通過簽約的相互連接,才有了今天全球范圍內的互聯網。
轉發IP數據包的過程中除了使用路由技術外,還在使用標記交換技術。最有代表性的就是多協議標記交換技術(MPLS)。
MPLS的標記不像MAC地址直接對應到硬體設備。因此,MPLS不需要具備以外網或ATM等數據鏈路層協議的作用,而只需要關注它與下面一層IP層之間的功能和協議即可。
MPLS優點:
1.轉發速度快
2.利用標記生成虛擬路徑,並在它的上面實現IP等數據包的通信。
⑸ TCP數據包是什麼
概念性的東西就是以下內容:簡單的來說,就是一種傳輸協議發出的一段數據源傳輸控制協議(Transmission Control Protocol, TCP)
TCP協議主為了在主機間實現高可靠性的包交換傳輸協議。本文將描述協議標准和實現的一些方法。因為計算機網路在現代社會中已經是不可缺少的了,TCP協議主要在網路不可靠的時候完成通信,對軍方可能特別有用,但是對於政府和商用部門也適用。TCP是面向連接的端到端的可靠協議。它支持多種網路應用程序。TCP對下層服務沒有多少要求,它假定下層只能提供不可靠的數據報服務,它可以在多種硬體構成的網路上運行。下面的圖是TCP在層次式結構中的位置,它的下層是IP協議,TCP可以根據IP協議提供的服務傳送大小不定的數據,IP協議負責對數據進行分段,重組,在多種網路中傳送。
TCP的上面就是應用程序,下面是IP協議,上層介麵包括一系列類似於操作系統中斷的調用。對於上層應用程序來說,TCP應該能夠非同步傳送數據。下層介面我們假定為IP協議介面。為了在並不可靠的網路上實現面向連接的可靠的傳送數據,TCP必須解決可靠性,流量控制的問題,必須能夠為上層應用程序提供多個介面,同時為多個應用程序提供數據,同時TCP必須解決連接問題,這樣TCP才能稱得上是面向連接的,最後,TCP也必須能夠解決通信安全性的問題。
網路環境包括由網關(或其它設備)連接的網路,網路可以是區域網也可以是一些城域網或廣域網,但無論它們是什麼,它們必須是基於包交換的。主機上不同的協議有不同的埠號,一對進程通過這個埠號進行通信。這個通信不包括計算機內的I/O操作,只包括在網路上進行的操作。網路上的計算機被看作包傳送的源和目的結點。特別應該注意的是:計算機中的不同進程可能同時進行通信,這時它們會用埠號進行區別,不會把發向A進程的數據由B進程接收的。
進程為了傳送數據會調用TCP,將數據和相應的參數傳送給TCP,於是TCP會將數據傳送到目的TCP那裡,當然這是通過將TCP包打包在IP包內在網路上傳送達到的。接收方TCP在接收到數據後會通信上層應用程序,TCP會保證接收數據順序的正確性。雖然下層協議可能不會保證順序是正確的。這里需要說明的是網關在接收到這個包後,會將包解開,看看是不是已經到目的地了,如果沒有到,應該走什麼路由達到目的地,在決定後,網關會根據下一個網路內的協議情況再次將TCP包打包傳送,如果需要,還要把這個包再次分成幾段再傳送。這個落地檢查的過程是一個耗時的過程。從上面,我們可以看出TCP傳送的基本過程,當然具體過程可能要復雜得多。
在實現TCP的主機上,TCP可以被看成是一個模塊,和文件系統區別不大,TCP也可以調用一些操作系統的功能,TCP不直接和網路打交道,控制網路的任務由專門的設備驅動模塊完成。TCP只是調用IP介面,IP向TCP提供所有TCP需要的服務。通過下圖我們可以更清楚地看到TCP協議的結構。
上面已經說過了,TCP連接是可靠的,而且保證了傳送數據包的順序,保證順序是用一個序號來保證的。響應包內也包括一個序列號,表示接收方准備好這個序號的包。在TCP傳送一個數據包時,它同時把這個數據包放入重發隊列中,同時啟動記數器,如果收到了關於這個包的確認信息,將此包從隊列中刪除,如果計時超時則需要重新發送此包。請注意,從TCP返回的確認信息並不保證最終接收者接收到數據,這個責任由接收方負責。
每個用於傳送TCP的通道都有一個埠標記,因為這個標記是由每個TCP終端確定的,因此TCP可能不唯一,為了保證這個數值的唯一,要使用網路地址和埠號的組合達到唯一標識的目的,我們稱這個為了套接字(Socket),一個連接由連接兩端的套接字標識,本地的套接字可能和不同的外部套接字通信,這種通信是全雙工的。
通過向本地埠發送OPEN命令及外部套接字參數建立連接,TCP返回一個標記這個連接的名稱,以後如果用戶需要使用這個名稱標記這個連接。為了保存這個連接的信息,我們假設有一個稱為傳輸控制塊(Transmission Control Block,TCB)的東西來保存。OPEN命令還指定這個連接的建立是主動請求還是被動等待請求。下面我們要涉及具體的功能了,TCP段以internet數據報的形式傳送。IP包頭傳送不同的信息域,包括源地址和目的地址。TCP頭跟在internet包頭後面,提供了一些專用於TCP協議的信息。下圖是TCP包頭格式圖:
源埠:16位;
目的埠:16位
序列碼:32位,當SYN出現,序列碼實際上是初始序列碼(ISN),而第一個數據位元組是ISN+1;
確認碼:32位,如果設置了ACK控制位,這個值表示一個准備接收的包的序列碼;
數據偏移量:4位,指示何處數據開始;
保留:6位,這些位必須是0;
控制位:6位;
窗口:16位;
校驗位:16位;
優先指針:16位,指向後面是優先數據的位元組;
選項:長度不定;但長度必須以位元組記;選項的具體內容我們結合具體命令來看;
填充:不定長,填充的內容必須為0,它是為了保證包頭的結合和數據的開始處偏移量能夠被32整除;
我們前面已經說過有一個TCB的東西了,TCB里有存儲了包括發送方,接收方的套接字,用戶的發送和接收的緩沖區指針等變數。除了這些還有一些變數和發送接收序列號有關:
發送序列變數
SND.UNA - 發送未確認
SND.NXT - 發送下一個
SND.WND - 發送窗口
SND.UP - 發送優先指針
SND.WL1 - 用於最後窗口更新的段序列號
SND.WL2 - 用於最後窗口更新的段確認號
ISS - 初始發送序列號
接收序列號
RCV.NXT - 接收下一個
RCV.WND - 接收下一個
RCV.UP - 接收優先指針
IRS - 初始接收序列號
下圖會幫助您了解發送序列變數間的關系:
當前段變數
SEG.SEQ - 段序列號
SEG.ACK - 段確認標記
SEG.LEN - 段長
SEG.WND - 段窗口
SEG.UP - 段緊急指針
SEG.PRC - 段優先順序
連接進程是通過一系列狀態表示的,這些狀態有:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT和 CLOSED。CLOSED表示沒有連接,各個狀態的意義如下:
LISTEN - 偵聽來自遠方TCP埠的連接請求;
SYN-SENT - 在發送連接請求後等待匹配的連接請求;
SYN-RECEIVED - 在收到和發送一個連接請求後等待對連接請求的確認;
ESTABLISHED - 代表一個打開的連接,數據可以傳送給用戶;
FIN-WAIT-1 - 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認;
FIN-WAIT-2 - 從遠程TCP等待連接中斷請求;
CLOSE-WAIT - 等待從本地用戶發來的連接中斷請求;
CLOSING - 等待遠程TCP對連接中斷的確認;
LAST-ACK - 等待原來發向遠程TCP的連接中斷請求的確認;
TIME-WAIT - 等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認;
CLOSED - 沒有任何連接狀態;
TCP連接過程是狀態的轉換,促使發生狀態轉換的是用戶調用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS;傳送過來的數據段,特別那些包括以下標記的數據段SYN,ACK,RST和FIN;還有超時,上面所說的都會時TCP狀態發生變化。
下面的圖表示了TCP狀態的轉換,但這圖中沒有包括錯誤的情況和錯誤處理,不要把這幅圖看成是總說明了。
3.3. 序列號
請注意,我們在TCP連接中發送的位元組都有一個序列號。因為編了號,所以可以確認它們的收到。對序列號的確認是累積性的,也就是說,如果用戶收到對X的確認信息,這表示在X以前的數據(不包括X)都收到了。在每個段中位元組是這樣安排的:第一個位元組在包頭後面,按這個順序排列。我們需要認記實際的序列空間是有限的,雖然很大,但是還是有限的,它的范圍是0到2的32次方減1。我想熟悉編程的一定知道為什麼要在計算兩個段是不是相繼的時候要使用2的32次方為模了。TCP必須進行的序列號比較操作種類包括以下幾種:
(a) 決定一些發送了的但未確認的序列號;
(b) 決定所有的序列號都已經收到了;
(c) 決定下一個段中應該包括的序列號。
對於發送的數據TCP要接收確認,處理確認時必須進行下面的比較操作:
SND.UNA = 最老的確認了的序列號;
SND.NXT = 下一個要發送的序列號;
SEG.ACK = 接收TCP的確認,接收TCP期待的下一個序列號;
SEG.SEQ = 一個數據段的第一個序列號;
SEG.LEN = 數據段中包括的位元組數;
SEG.SEQ+SEG.LEN-1 = 數據段的最後一個序列號。
請注意下面的關系:
SND.UNA < SEG.ACK =< SND.NXT
如果一個數據段的序列號小於等於確認號的值,那麼整個數據段就被確認了。而在接收數據時下面的比較操作是必須的:
RCV.NXT = 期待的序列號和接收窗口的最低沿;
RCV.NXT+RCV.WND-1 = 最後一個序列號和接收窗口的最高沿;
SEG.SEQ = 接收到的第一個序列號;
SEG.SEQ+SEG.LEN-1 = 接收到的最後一個序列號;
上面幾個量有如下關系:
RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND 或 RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
測試的第一部分是檢查數據段的開始部分是否在接收窗口中,第二部分是檢查數據段的結束部分是否也在接收窗口內;上面兩個檢查通過任何一個就說明它包括窗口要求的數據。實際中的情況會更復雜一些,因為有零窗口和零數據段長,因此我們有下面四種情況:
段長度
接收窗口
測試
0
0
SEG.SEQ = RCV.NXT
0
>0
RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
>0
0
不可接受
>0
>0
RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND或RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
請注意接收窗口的大小可以為零,在窗口為零時它只用來接收ACK信息,因此對於一個TCP來說,它可以使用零大小窗口在發送數據的同時接收數據。即使接收窗口的大小為零,TCP必須處理所有接收到信息的RST和URG域。
我們也應用計數的方式保護了一些特定的控制信息,這是通過隱式地使用一些控制標記使數據段能夠可靠地重新發送(或確認)為達到的。控制信息並不在段數據空間中傳送,因此,我們必須採用隱式指定序列號進行控制。SYN和FIN是需要保護的控制量,這兩個控制量也只在連接打開和關閉時使用。SYN被認為是在第一個實際數據之間的數據,而FIN是最後一個實際數據之後的數據。段長度(SEG.LEN)包括數據和序列號空間,如果出現了SYN,那麼SEG.SEQ是SYN的序列號。
初始序列號選擇
協議對於特定連接被重復使用沒有什麼限制。連接是由一對套接字定義的。新的連接實例被定義為連接的另一次恢復,這就帶來了問題:TCP如果確定多個數據段是從以前連接的另一次恢復中取得的呢?這個問題在連接迅速打開和關閉,或因為內存原因被關閉然後又迅速建立後顯示特別突出。
為了避免混亂,用戶必須避免因此恢復使用某一連接,而使序列號發生混亂。我們必須保證序列號的正確性,即使TCP失敗,根本不知道以前的序列號是什麼的情況下也要保證序列號的正確性。當新的連接被創建時,產生一個新的初始序列號(ISN)產生子,它用來選擇一個新的32位ISN。產生子和32位時鍾的低度位位元組相關,低位位元組的刷新頻率大概是4微秒,因此ISN的循環時間大概是4.55小時。因此我們把網路包的最長生存時間(MSL)小於4.55小時,因此我們可以認為ISN是唯一的。對於每個連接都有發送序列號和接收序列號,初始發送序列號(ISS)由發送TCP選擇,而初始接收序列號是在連接建立過程中產生的。
對於將要連接或初始化的連接,兩個TCP必須和對方的初始序列號同步。這通過交換一個控制位SYN和初始序列號完成。我們把帶有SYN的數據段稱為"SYNs"。同步的獲得過程這里就不重復了,每方必須發送自己的序列號並返回對對方序列號的確認。
1) A --> B SYN 本方序列號是X
2) A <-- B ACK 本方序列號被確認
3) A <-- B SYN 對方序列號是Y
4) A --> B ACK 確認對方序列號
上面的第2步和第3步可以合並,這時可以成為3階段,所以我們可以稱它為三消息握手。這個過程是必須的,因為序列號不和全局時鍾關聯,TCP也可以有不同的機制選擇ISN。接收到第一個SYN的接收方不可能知道這個數據段是不是被延時,除非它記住了在連接上使用的最近的序列號(這通常是不可能的),因此它必須要求發送者確認。
為了保證TCP獲得的確認是剛才發送的段產生的,而不是仍然在網路中的老數據段產生的,因此TCP必須在MSL時間之內保持沉默。在本文中,我們假設MSL=2小時,這是出於工程的需要,如果用戶覺得可以,他可以改變MSL。請注意如果TCP重新初始化,而內存中的序列號正在使用,不需要等待,但必須確認使用的序列號比當前使用的要大。
如果一台主機在未保留任何序列號的情況下失敗,那麼它應該在MSL時間之內不發出任何數據段。下面將會這一情況進行說明。TCP的實現可以不遵守這個規定,但是這會造成老數據被當成新數據接收,而新數據被當成老數據拒絕的情況。
每當數據段形成並進入輸出隊列,TCP會為它指定序列空間中的一個值。TCP中多復本檢測和序列演算法都依賴於這個地址空間,在對方發送或接收之前不會超過2的32次方個包存在於輸出隊列中。所有多餘的數據段都會被刪除。如果沒有這個規定,會出現多個數據段被指定同一個序列號的情況,會造成混亂。數據段中序列號的多少和數據段中的位元組數一樣多。
在通常情況下,TCP保留下一個要發送的序列號和還未確認的最老的序列號,不要在沒有確認的時候就再次使用,這樣會有些風險,也正是因為這樣的目的,所以序列空間很大。對於2M的網路,要4.5小時來耗盡序列空間,因為一個數據段可能的最大生存時間也不過十幾分之一秒,這就留下了足夠的空間;而在100M的網路上需要5.4分鍾,雖然少了點,但也可以了。
如果在實現TCP時沒有為保存序列號留下空間,那清除多餘的包可能就不能實現了,因此推薦這種類型的TCP實現最好在失敗後等待MSL時間,這樣保證多餘的包被刪除。這種情況有時候也可能會出現在保留序列號的TCP實現中。如果TCP在選擇一個另一個TCP連接正在使用的序列號時,這台主機突然失敗了,這就產生了問題。這個問題的實質在於主機不知道它失敗了多久,也不知道多餘的復本是不是還在網路中。
處理這種問題的方法是等待MSL時間,如果不這樣就要冒著對方錯誤接收數據的危險,要等待的時間也就稱為「沉默時間」。實現者可以讓用戶選擇是不是等待,但是無論用戶如何也不見得非要等待MSL時間。
3.4. 建立一個連接
建立連接應用的是三消息握手。如果雙方同時都發送SYN也沒有關系,雙方會發現這個SYN中沒有確認,於是就知道了這種情況,通常來說,應該發送一個"reset"段來解決這種情況。三消息握手減少了連接失敗的可能性。下面就是一個例子,在尖括弧是的就是數據段中的內容和標記。其它的就不多說了。
在第2行,TCP A發送SYN初始化序列號,表示它要使用序列號100;第3行中,TCP B給出確認,並且期待著A的帶有序列號101的數據段;第4行,TCP A給出確認,而在第5行,它也給出確認,並發送了一些數據,注意第4行的序列號與第5號的一樣,因為ACK信息不佔用序列號空間內的序列號。同時產生請求的情況如下圖所示,只復雜一點。
使用三消息握手的主要原因是為了防止使用過期的數據段。為了這個目的,必須引入新的控制消息,RESET。如果接收TCP處理非同步狀態,在接收到RESET後返回到LISTEN狀態。如果TCP處理下面幾種狀態ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT時,放棄連接並通過用戶。我們下面就詳細說明後一種情況。
通過上面的例子,我們可以看出TCP連接是如何從過期數據段的干擾下恢復的。請注意第4行和第5行中的RST(RESET信號)。
半開連接和其它非正常狀態
如果一方在未通過另一方的情況下關閉連接,或雙方雖然失敗而不同步的情況我們稱為半開連接狀態。在一方試圖發送數據時連接會自動RESET。然而這種情況畢竟屬於不正常情況。應該做出相應的處理。如果A處的連接已經關閉,B處並不知道。當B希望發送數據到A時,就會收到RESET信號,表示這個TCP連接有誤,要中止當前連接。
假設A和B兩個進程相互通信的時候A的TCP發生了失敗,A依靠操作系統支持TCP的存在,通常這種情況下會有恢復機制起作用,當TCP重新恢復的時候,A可能希望從恢復點開始工作。這樣A可能會試圖OPEN連接,然後在這個它認為還是打開的連接上傳送數據,這時A會從本地(也就是A的)TCP上獲得錯誤消息「未打開連接」。A的TCP將發送包括SYN的數據段。下面的例子將顯示這一過程:
上面這個例子中,A方收到的信息並沒有確認任何東西,這時候A發現出了問題,於是發送了RST控制信息。另一種情況是發生在A失敗,而B方仍然試圖發送數據時,下面的例子可以表示這種情況,請注意第2行中A對B發送來的信息不知所雲。
在下面的例子中,A方和B方進行的被動連接,它們都在等待SYN信息。過期的包傳送到B方使B回應了,而收到回應的A卻發現不對頭,傳送RST控制信息,B方返回被動LISTEN狀態。
現實中的情況太多了,我們列舉一些產生RST控制信息的規則如下:通常情況下,RST在收到的信息不是期待的信息時產生。如果在不能確定時不要輕易發送RST控制信息。下面有三類情況:
如果連接已經不存在,而發送來的消息又不是RST,那麼要返回RST。如果想拒絕對不存在的連接進行SYN,可以使用這種辦法。如果到達的信息有一個ACK域,返回的RST信息可以從ACK域中取得序列號,如果沒有這個域,就把RST的序列號設置為0,ACK域被設備為序列號和到達段長度之和。連接仍然處於CLOSE狀態。
如果連接處於非同步狀態(LISTEN,SYN-SENT,SYN-RECEIVED),而且收到的確認是對未發出包的確認或是接收到數據段的安全級別與不能連接要求的相一一致時,就發送RST。如果SYN未被確認時,而且收到的數據段的優先順序比要求的優先順序要高,那麼要麼提高本地優先順序(得事先徵得用戶和系統的許可)要麼發送RST;如果接收數據段的優先順序比要求的優先順序低,就算是匹配了,當然如果對方發現優先順序不對提高了優先順序,在下一個包中提高了優先順序,這就不算是匹配了。如果連接已經進入SYN,那麼接收到數據段的優先順序必須和本地優先順序一樣,否則發送RST。如果到達的信息有一個ACK域,返回的RST信息可以從ACK域中取得序列號,如果沒有這個域,就把RST的序列號設置為0,ACK域被設備為序列號和到達段長度之和。連接仍然處於與原來相同的狀態。
如果連接處於同步狀態(ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT),任何超出接收窗口的序列號的數據段都產生如下結果:發出一個空確認數據段,此段中包括當前發送序列號,另外還包括一個確認指出希望接收的下一個數據段的序列號,連接仍然保存在原來的狀態。如果因為安全級,優先順序之類的問題,那就發送RST信號然後進入CLOSED狀態。