OSI七層和TCP五層協議,為什么勝出的是TCP/IP協議
一、OSI參考模型
1. OSI的來源
首先 osi 七層模型是什么?
OSI 是英文 Open System Interconnection 的簡寫,翻譯成中文叫做 (開放系統互連參考模型),他是一個國際標準化組織制定的一個用于計算機或通信系統間互聯的標準體系
怎么理解呢?你可以這么想,在之前很早的時候,世界上有各種生產計算機硬件和網絡設備的廠家,大家你做你的我做我的,弄的很亂而且還都互不兼容,這時候國際上有一個很牛很牛的公認的組織,為了統一互聯網,讓他不那么復雜,更加容易管理而制定了一個規則,而這個規則大家必須都要遵守,這個就是 OSI 七層模型。
2、那七層是什么意思?
首先,這個七層模型呢他是一個虛擬的,就是理論上的規則,并不是一個什么摸得到的物理形狀的類似于汽車模型的那種模型,那它具體是什么樣的呢?你看下圖

【純個人手打,替老師傳道,不求多大成就但愿 能幫到大家,在閑暇的時間里為大家共享一些工作經驗和各種技術資源文章,希望幫助大家共同進步 也希望我的發布對你有所幫助,我的發布里有更多類似的文章可以查閱,喜歡的請點關注,謝謝。你們的關注是我不停發布的最大動力】
3、那這兩個七層模型到底是怎么回事呢?
首先,你要把這兩邊的七層模型看成是兩個人在寫信,你給人家寫信人家是不是得給你回信?這個就是兩個模型中間的箭頭。意思是有來有回。而你們兩個人的來回信件呢都得經過這七個步驟,然后才能到達各自的手中。這就是為什么兩邊都畫了七層模型
4、OSI七層模型基本功能是什么?
OSI模型通過七個層次化結構的模型,使不同的系統不同的網絡之間實現可靠的通訊,因此,其最主要的功能就是幫助不同類型主機之間實現數據傳輸
5、那這七個層到底都對應了哪些東西呢?
(1)物理層:它對應了,網卡、網線、光纖,等
(2)數據鏈路層:它對應了,網橋、交換機、等
(3)網絡層:路由器、三層交換機
(4)傳輸層、會話層、表示層、應用層、這些個在軟件層面上和虛擬層面上的,所以他不 對應相關的物理設備,這四個層面呢,它對應的是相關的協議了。
比如說:傳輸層有:TCP UDP 協議 ;應用層有 http ftp 協議等,就是這個意思
但實際網管需要日常維護的只有:物理層、數據鏈路層、網絡層、應用層 這五層
6、 各層功能定義
這里我們只對OSI各層進行功能上的大概闡述,不詳細深究,因為每一層實際都是一個復雜的層。
這里我們就大概了解一下。
我們從最頂層——應用層 開始介紹。
整個過程以公司A和公司B的一次商業報價單發送為例子進行講解。
(1) 應用層
OSI參考模型中最靠近用戶的一層,是為計算機用戶提供應用接口,也為用戶直接提供各種網絡服務。
我們常見應用層的網絡服務協議有:HTTP,HTTPS,FTP,POP3、SMTP等。
實際公司A的老板就是我們所述的用戶,而他要發送的商業報價單,就是應用層提供的一種網絡服務,當然,老板也可以選擇其他服務,比如說,發一份商業合同,發一份詢價單,等等。
(2) 表示層
表示層提供各種用于應用層數據的編碼和轉換功能,確保一個系統的應用層發送的數據能被另一個系統的應用層識別。
如果必要,該層可提供一種標準表示形式,用于將計算機內部的多種數據格式轉換成通信中采用的標準表示形式。
數據壓縮和加密也是表示層可提供的轉換功能之一。
由于公司A和公司B是不同國家的公司,他們之間的商定統一用英語作為交流的語言,所以此時表示層(公司的文秘),就是將應用層的傳遞信息轉翻譯成英語。
同時為了防止別的公司看到,公司A的人也會對這份報價單做一些加密的處理。
這就是表示的作用,將應用層的數據轉換翻譯等。
(3) 會話層
會話層就是負責建立、管理和終止表示層實體之間的通信會話。
該層的通信由不同設備中的應用程序之間的服務請求和響應組成。
會話層的同事拿到表示層的同事轉換后資料,(會話層的同事類似公司的外聯部),會話層的同事那里可能會掌握本公司與其他好多公司的聯系方式,這里公司就是實際傳遞過程中的實體。他們要管理本公司與外界好多公司的聯系會話。
當接收到表示層的數據后,會話層將會建立并記錄本次會話,他首先要找到公司B的地址信息,然后將整份資料放進信封,并寫上地址和聯系方式。準備將資料寄出。
等到確定公司B接收到此份報價單后,此次會話就算結束了,外聯部的同事就會終止此次會話。
(4) 傳輸層
傳輸層建立了主機端到端的鏈接,傳輸層的作用是為上層協議提供端到端的可靠和透明的數據傳輸服務,包括處理差錯控制和流量控制等問題。
該層向高層屏蔽了下層數據通信的細節,使高層用戶看到的只是在兩個傳輸實體間的一條主機到主機的、可由用戶控制和設定的、可靠的數據通路。
我們通常說的,TCP UDP就是在這一層。端口號既是這里的"端"。
傳輸層就相當于公司中的負責快遞郵件收發的人,公司自己的投遞員,他們負責將上一層的要寄出的資料投遞到快遞公司或郵局。
(5) 網絡層
本層通過IP尋址來建立兩個節點之間的連接,為源端的運輸層送來的分組,選擇合適的路由和交換節點,正確無誤地按照地址傳送給目的端的運輸層。
就是通常說的IP層。
這一層就是我們經常說的IP協議層。
IP協議是Internet的基礎。
網絡層就相當于快遞公司龐大的快遞網絡,全國不同的集散中心,比如說,從深圳發往北京的順豐快遞(陸運為例啊,空運好像直接就飛到北京了),首先要到順豐的深圳集散中心,從深圳集散中心再送到武漢集散中心,從武漢集散中心再寄到北京順義集散中心。這個每個集散中心,就相當于網絡中的一個IP節點。
(6) 數據鏈路層
將比特組合成字節,再將字節組合成幀,使用鏈路層地址 (以太網使用MAC地址)來訪問介質,并進行差錯檢測。
數據鏈路層又分為2個子層:邏輯鏈路控制子層(LLC)和媒體訪問控制子層(MAC)。
MAC子層處理CSMA/CD算法、數據出錯校驗、成幀等;LLC子層定義了一些字段使上次協議能共享數據鏈路層。
在實際使用中,LLC子層并非必需的。
(7) 物理層
實際最終信號的傳輸是通過物理層實現的。
通過物理介質傳輸比特流。規定了電平、速度和電纜針腳。
常用設備有(各種物理設備)集線器、中繼器、調制解調器、網線、雙絞線、同軸電纜。
這些都是物理層的傳輸介質。
快遞寄送過程中的交通工具,就相當于我們的物理層,例如汽車,火車,飛機,船。
7. 通信特點:對等通信
對等通信,為了使數據分組從源傳送到目的地,源端OSI模型的每一層都必須與目的端的對等層進行通信,這種通信方式稱為對等層通信。
在每一層通信過程中,使用本層自己協議進行通信。

二、TCP/IP五層模型
TCP/IP五層協議和OSI的七層協議對應關系如下:

在每一層都工作著不同的設備,比如我們常用的交換機就工作在數據鏈路層的,一般的路由器是工作在網絡層的。
在每一層實現的協議也各不同,即每一層的服務也不同,下圖列出了每層主要的協議。

1. 應用層
應用層向應用程序提供服務,這些服務按其向應用程序提供的特性分成組,并稱為服務元素。
有些可為多種應用程序共同使用,有些則為較少的一類應用程序使用。
應用層為最高層,是直接為應用進程提供服務的。
其作用是在實現多個系統應用進程相互通信的同時,完成一系列業務處理所需的服務。
其服務元素分為兩類:公共應用服務元素CASE和特定應用服務元素SASE。
CASE提供最基本的服務,它成為應用層中任何用戶和任何服務元素的用戶,主要為應用進程通信,分布系統實現提供基本的控制機制。
特定服務SASE則要滿足一些特定服務,如文卷傳送,訪問管理,作業傳送,銀行事務,訂單輸入等。
這些將涉及到虛擬終端,作業傳送與操作,文卷傳送及訪問管理,遠程數據庫訪問,圖形核心系統,開放系統互連管理等等。
應用層的標準有DP8649"公共應用服務元素",DP8650"公共應用服務元素用協議",文件傳送,訪問和管理服務及協議。
2. 傳輸層
傳輸層是兩臺計算機經過網絡進行數據通信時,第一個端到端的層次,具有緩沖作用。
當網絡層服務質量不能滿足要求時,它將服務加以提高,以滿足高層的要求;當網絡層服務質量較好時,它只用很少的工作。
傳輸層還可進行復用,即在一個網絡連接上創建多個邏輯連接。
傳輸層也稱為運輸層,是很重要的一層。
因為它是源端到目的端對數據傳送進行控制從低到高的最后一層。
有一個既存事實,即世界上各種通信子網在性能上存在著很大差異。
例如電話交換網,分組交換網,公用數據交換網,局域網等通信子網都可互連,但它們提供的吞吐量,傳輸速率,數據延遲通信費用各不相同。
對于會話層來說,卻要求有一性能恒定的界面。
傳輸層就承擔了這一功能。
它采用分流/合流,復用/解復用技術來調節上述通信子網的差異,使會話層感受不到。
此外傳輸層還要具備差錯恢復,流量控制等功能,以此對會話層屏蔽通信子網在這些方面的細節與差異。
傳輸層面對的數據對象已不是網絡地址和主機地址,而是和會話層的界面端口。
上述功能的最終目的是為會話提供可靠的,無誤的數據傳輸。
傳輸層的服務一般要經歷傳輸連接建立階段,數據傳送階段,傳輸連接釋放階段3個階段才算完成一個完整的服務過程。
而在數據傳送階段又分為一般數據傳送和加速數據傳送兩種。
3. 網絡層
網絡層的產生也是網絡發展的結果。
在聯機系統和線路交換的環境中,網絡層的功能沒有太大意義。
當數據終端增多時,它們之間有中繼設備相連。
此時會出現一臺終端要求不只是與唯一的一臺而是能和多臺終端通信的情況,這就是產生了把任意兩臺數據終端設備的數據鏈接起來的問題,也就是路由或者叫尋徑。
另外,當一條物理信道建立之后,被一對用戶使用,往往有許多空閑時間被浪費掉。
人們自然會希望讓多對用戶共用一條鏈路,為解決這一問題就出現了邏輯信道技術和虛擬電路技術。
網絡層為建立網絡連接和為上層提供服務,應具備以下主要功能:
· 路由選擇和中繼。
· 激活,終止網絡連接。
· 在一條數據鏈路上復用多條網絡連接,多采取分時復用技術 。
· 差錯檢測與恢復。
· 排序,流量控制。
· 服務選擇。
· 網絡管理。
4. 數據鏈路層
數據鏈路可以粗略地理解為數據通道。
物理層要為終端設備間的數據通信提供傳輸媒體及其連接。
媒體是長期的,連接是有生存期的。
在連接生存期內,收發兩端可以進行不等的一次或多次數據通信。
每次通信都要經過建立通信聯絡和拆除通信聯絡兩過程。
這種建立起來的數據收發關系就叫作數據鏈路。
而在物理媒體上傳輸的數據難免受到各種不可靠因素的影響而產生差錯,為了彌補物理層上的不足,為上層提供無差錯的數據傳輸,就要能對數據進行檢錯和糾錯。
數據鏈路的建立,拆除,對數據的檢錯,糾錯是數據鏈路層的基本任務。
鏈路層的主要功能:鏈路層是為網絡層提供數據傳送服務的,這種服務要依靠本層具備的功能來實現。
· 鏈路連接的建立,拆除,分離。
· 幀定界和幀同步。鏈路層的數據傳輸單元是幀,協議不同,幀的長短和界面也有差別,但無論如何必須對幀進行定界。
· 順序控制,指對幀的收發順序的控制。
· 差錯檢測和恢復。
還有鏈路標識,流量控制等等。
差錯檢測多用方陣碼校驗和循環碼校驗來檢測信道上數據的誤碼,而幀丟失等用序號檢測。
各種錯誤的恢復則常靠反饋重發技術來完成。
5. 物理層
物理層雖然處于最底層,卻是整個計算機網絡的基礎。
物理層為設備之間的數據通信提供傳輸媒體及互連設備,為數據傳輸提供可靠的環境。
物理層的媒體包括架空明線、平衡電纜、光纖、無線信道等。通信用的互連設備指DTE和DCE間的互連設備。
DTE即數據終端設備,又稱物理設備,如計算機、終端等都包括在內。
而DCE則是數據通信設備或電路連接設備,如調制解調器等。
數據傳輸通常是經過DTE——DCE,再經過DCE——DTE的路徑。
互連設備指將DTE、DCE連接起來的裝置,如各種插頭、插座。
LAN中的各種粗、細同軸電纜、T型接、插頭,接收器,發送器,中繼器等都屬物理層的媒體和連接器。
物理層的主要功能:
(1) 為數據端設備提供傳送數據的通路,數據通路可以是一個物理媒體,也可以是多個物理媒體連接而成。
一次完整的數據傳輸,包括激活物理連接,傳送數據,終止物理連接。
所謂激活,就是不管有多少物理媒體參與,都要在通信的兩個數據終端設備間連接起來,形成一條通路。
(2) 傳輸數據,物理層要形成適合數據傳輸需要的實體,為數據傳送服務。
一是要保證數據能在其上正確通過,二是要提供足夠的帶寬(帶寬是指每秒鐘內能通過的比特(BIT)數),以減少信道上的擁塞。
傳輸數據的方式能滿足點到點,一點到多點,串行或并行,半雙工或全雙工,同步或異步傳輸的需要。
三、 TCP/IP 基礎
1. TCP/IP 的具體含義
從字面意義上講,有人可能會認為 TCP/IP 是指 TCP 和 IP 兩種協議。實際生活當中有時也確實就是指這兩種協議。然而在很多情況下,它只是利用 IP 進行通信時所必須用到的協議群的統稱。具體來說,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都屬于 TCP/IP 協議。他們與 TCP 或 IP 的關系緊密,是互聯網必不可少的組成部分。TCP/IP 一詞泛指這些協議,因此,有時也稱 TCP/IP 為網際協議群。
互聯網進行通信時,需要相應的網絡協議,TCP/IP 原本就是為使用互聯網而開發制定的協議族。因此,互聯網的協議就是 TCP/IP,TCP/IP 就是互聯網的協議。

網際協議群
2. 數據包
包、幀、數據包、段、消息
以上五個術語都用來表述數據的單位,大致區分如下:
- 包可以說是全能性術語;
- 幀用于表示數據鏈路層中包的單位;
- 數據包是 IP 和 UDP 等網絡層以上的分層中包的單位;
- 段則表示 TCP 數據流中的信息;
- 消息是指應用協議中數據的單位。
每個分層中,都會對所發送的數據附加一個首部,在這個首部中包含了該層必要的信息,如發送的目標地址以及協議相關信息。通常,為協議提供的信息為包首部,所要發送的內容為數據。在下一層的角度看,從上一層收到的包全部都被認為是本層的數據。

數據包首部
網絡中傳輸的數據包由兩部分組成:一部分是協議所要用到的首部,另一部分是上一層傳過來的數據。首部的結構由協議的具體規范詳細定義。在數據包的首部,明確標明了協議應該如何讀取數據。反過來說,看到首部,也就能夠了解該協議必要的信息以及所要處理的數據。包首部就像協議的臉。
3. 數據處理流程
下圖以用戶 a 向用戶 b 發送郵件為例子:

數據處理流程
① 應用程序處理
- 首先應用程序會進行編碼處理,這些編碼相當于 OSI 的表示層功能;
- 編碼轉化后,郵件不一定馬上被發送出去,這種何時建立通信連接何時發送數據的管理功能,相當于 OSI 的會話層功能。
② TCP 模塊的處理
- TCP 根據應用的指示,負責建立連接、發送數據以及斷開連接。TCP 提供將應用層發來的數據順利發送至對端的可靠傳輸。為了實現這一功能,需要在應用層數據的前端附加一個 TCP 首部。
③ IP 模塊的處理
- IP 將 TCP 傳過來的 TCP 首部和 TCP 數據合起來當做自己的數據,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,參考路由控制表決定接受此 IP 包的路由或主機。
④ 網絡接口(以太網驅動)的處理
- 從 IP 傳過來的 IP 包對于以太網來說就是數據。給這些數據附加上以太網首部并進行發送處理,生成的以太網數據包將通過物理層傳輸給接收端。
⑤ 網絡接口(以太網驅動)的處理
- 主機收到以太網包后,首先從以太網包首部找到 MAC 地址判斷是否為發送給自己的包,若不是則丟棄數據。
- 如果是發送給自己的包,則從以太網包首部中的類型確定數據類型,再傳給相應的模塊,如 IP、ARP 等。這里的例子則是 IP 。
⑥ IP 模塊的處理
- IP 模塊接收到 數據后也做類似的處理。從包首部中判斷此 IP 地址是否與自己的 IP 地址匹配,如果匹配則根據首部的協議類型將數據發送給對應的模塊,如 TCP、UDP。這里的例子則是 TCP。
- 另外嗎,對于有路由器的情況,接收端地址往往不是自己的地址,此時,需要借助路由控制表,在調查應該送往的主機或路由器之后再進行轉發數據。
⑦ TCP 模塊的處理
- ·在 TCP 模塊中,首先會計算一下校驗和,判斷數據是否被破壞。然后檢查是否在按照序號接收數據。最后檢查端口號,確定具體的應用程序。數據被完整地接收以后,會傳給由端口號識別的應用程序。
⑧ 應用程序的處理
· 接收端應用程序會直接接收發送端發送的數據。通過解析數據,展示相應的內容。
四、傳輸層中的 TCP 和 UDP
TCP/IP 中有兩個具有代表性的傳輸層協議,分別是 TCP 和 UDP。
- TCP 是面向連接的、可靠的流協議。流就是指不間斷的數據結構,當應用程序采用 TCP 發送消息時,雖然可以保證發送的順序,但還是猶如沒有任何間隔的數據流發送給接收端。TCP 為提供可靠性傳輸,實行"順序控制"或"重發控制"機制。此外還具備"流控制(流量控制)"、"擁塞控制"、提高網絡利用率等眾多功能。
- UDP 是不具有可靠性的數據報協議。細微的處理它會交給上層的應用去完成。在 UDP 的情況下,雖然可以確保發送消息的大小,卻不能保證消息一定會到達。因此,應用有時會根據自己的需要進行重發處理。
- TCP 和 UDP 的優缺點無法簡單地、絕對地去做比較:TCP 用于在傳輸層有必要實現可靠傳輸的情況;而在一方面,UDP 主要用于那些對高速傳輸和實時性有較高要求的通信或廣播通信。TCP 和 UDP 應該根據應用的目的按需使用。
1. 端口號
數據鏈路和 IP 中的地址,分別指的是 MAC 地址和 IP 地址。前者用來識別同一鏈路中不同的計算機,后者用來識別 TCP/IP 網絡中互連的主機和路由器。在傳輸層也有這種類似于地址的概念,那就是端口號。端口號用來識別同一臺計算機中進行通信的不同應用程序。因此,它也被稱為程序地址。
1.1 根據端口號識別應用
一臺計算機上同時可以運行多個程序。傳輸層協議正是利用這些端口號識別本機中正在進行通信的應用程序,并準確地將數據傳輸。

通過端口號識別應用
1.2 通過 IP 地址、端口號、協議號進行通信識別
- 僅憑目標端口號識別某一個通信是遠遠不夠的。


通過端口號、IP地址、協議號進行通信識別
- ① 和② 的通信是在兩臺計算機上進行的。它們的目標端口號相同,都是80。這里可以根據源端口號加以區分。
- ③ 和 ① 的目標端口號和源端口號完全相同,但它們各自的源 IP 地址不同。
- 此外,當 IP 地址和端口號全都一樣時,我們還可以通過協議號來區分(TCP 和 UDP)。
1.3 端口號的確定
- 標準既定的端口號:這種方法也叫靜態方法。它是指每個應用程序都有其指定的端口號。但并不是說可以隨意使用任何一個端口號。例如 HTTP、FTP、TELNET 等廣為使用的應用協議中所使用的端口號就是固定的。這些端口號被稱為知名端口號,分布在 0~1023 之間;除知名端口號之外,還有一些端口號被正式注冊,它們分布在 1024~49151 之間,不過這些端口號可用于任何通信用途。
- 時序分配法:服務器有必要確定監聽端口號,但是接受服務的客戶端沒必要確定端口號。在這種方法下,客戶端應用程序完全可以不用自己設置端口號,而全權交給操作系統進行分配。動態分配的端口號范圍在 49152~65535 之間。
1.4 端口號與協議
· 端口號由其使用的傳輸層協議決定。因此,不同的傳輸層協議可以使用相同的端口號。
· 此外,那些知名端口號與傳輸層協議并無關系。只要端口一致都將分配同一種應用程序進行處理。
2. UDP
· UDP 不提供復雜的控制機制,利用 IP 提供面向無連接的通信服務。
- 并且它是將應用程序發來的數據在收到的那一刻,立即按照原樣發送到網絡上的一種機制。即使是出現網絡擁堵的情況,UDP 也無法進行流量控制等避免網絡擁塞行為。
- 此外,傳輸途中出現丟包,UDP 也不負責重發。
- 甚至當包的到達順序出現亂序時也沒有糾正的功能。
- 如果需要以上的細節控制,不得不交由采用 UDP 的應用程序去處理。
- UDP 常用于一下幾個方面:1.包總量較少的通信(DNS、SNMP等);2.視頻、音頻等多媒體通信(即時通信);3.限定于 LAN 等特定網絡中的應用通信;4.廣播通信(廣播、多播)。
3. TCP
- TCP 與 UDP 的區別相當大。它充分地實現了數據傳輸時各種控制功能,可以進行丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。而這些在 UDP 中都沒有。
- 此外,TCP 作為一種面向有連接的協議,只有在確認通信對端存在時才會發送數據,從而可以控制通信流量的浪費。
- 根據 TCP 的這些機制,在 IP 這種無連接的網絡上也能夠實現高可靠性的通信( 主要通過檢驗和、序列號、確認應答、重發控制、連接管理以及窗口控制等機制實現)。
3.1 三次握手(重點)
- TCP 提供面向有連接的通信傳輸。面向有連接是指在數據通信開始之前先做好兩端之間的準備工作。
- 所謂三次握手是指建立一個 TCP 連接時需要客戶端和服務器端總共發送三個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發。
下面來看看三次握手的流程圖:

三次握手
- 第一次握手:客戶端將標志位SYN置為1,隨機產生一個值seq=J,并將該數據包發送給服務器端,客戶端進入SYN_SENT狀態,等待服務器端確認。
- 第二次握手:服務器端收到數據包后由標志位SYN=1知道客戶端請求建立連接,服務器端將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,并將該數據包發送給客戶端以確認連接請求,服務器端進入SYN_RCVD狀態。
- 第三次握手:客戶端收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,并將該數據包發送給服務器端,服務器端檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端和服務器端進入ESTABLISHED狀態,完成三次握手,隨后客戶端與服務器端之間可以開始傳輸數據了。
3.2 四次揮手(重點)
- 四次揮手即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發。
- 由于TCP連接是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務后,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉。
下面來看看四次揮手的流程圖:

四次揮手
- 中斷連接端可以是客戶端,也可以是服務器端。
- 第一次揮手:客戶端發送一個FIN=M,用來關閉客戶端到服務器端的數據傳送,客戶端進入FIN_WAIT_1狀態。意思是說"我客戶端沒有數據要發給你了",但是如果你服務器端還有數據沒有發送完成,則不必急著關閉連接,可以繼續發送數據。
- 第二次揮手:服務器端收到FIN后,先發送ack=M+1,告訴客戶端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息。這個時候客戶端就進入FIN_WAIT_2 狀態,繼續等待服務器端的FIN報文。
- 第三次揮手:當服務器端確定數據已發送完成,則向客戶端發送FIN=N報文,告訴客戶端,好了,我這邊數據發完了,準備好關閉連接了。服務器端進入LAST_ACK狀態。
- 第四次揮手:客戶端收到FIN=N報文后,就知道可以關閉連接了,但是他還是不相信網絡,怕服務器端不知道要關閉,所以發送ack=N+1后進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。服務器端收到ACK后,就知道可以斷開連接了。客戶端等待了2MSL后依然沒有收到回復,則證明服務器端已正常關閉,那好,我客戶端也可以關閉連接了。最終完成了四次握手。
上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,
具體流程如下圖:

同時揮手
3.3 通過序列號與確認應答提高可靠性
- 在 TCP 中,當發送端的數據到達接收主機時,接收端主機會返回一個已收到消息的通知。這個消息叫做確認應答(ACK)。當發送端將數據發出之后會等待對端的確認應答。如果有確認應答,說明數據已經成功到達對端。反之,則數據丟失的可能性很大。
- 在一定時間內沒有等待到確認應答,發送端就可以認為數據已經丟失,并進行重發。由此,即使產生了丟包,仍然能夠保證數據能夠到達對端,實現可靠傳輸。
- 未收到確認應答并不意味著數據一定丟失。也有可能是數據對方已經收到,只是返回的確認應答在途中丟失。這種情況也會導致發送端誤以為數據沒有到達目的地而重發數據。
- 此外,也有可能因為一些其他原因導致確認應答延遲到達,在源主機重發數據以后才到達的情況也屢見不鮮。此時,源主機只要按照機制重發數據即可。
- 對于目標主機來說,反復收到相同的數據是不可取的。為了對上層應用提供可靠的傳輸,目標主機必須放棄重復的數據包。為此我們引入了序列號。
序列號是按照順序給發送數據的每一個字節(8位字節)都標上號碼的編號。接收端查詢接收數據 TCP 首部中的序列號和數據的長度,將自己下一步應該接收的序列號作為確認應答返送回去。通過序列號和確認應答號,TCP 能夠識別是否已經接收數據,又能夠判斷是否需要接收,從而實現可靠傳輸。

序列號和確認應答
3.4 重發超時的確定
- 重發超時是指在重發數據之前,等待確認應答到來的那個特定時間間隔。如果超過這個時間仍未收到確認應答,發送端將進行數據重發。最理想的是,找到一個最小時間,它能保證"確認應答一定能在這個時間內返回"。
- TCP 要求不論處在何種網絡環境下都要提供高性能通信,并且無論網絡擁堵情況發生何種變化,都必須保持這一特性。為此,它在每次發包時都會計算往返時間及其偏差。將這個往返時間和偏差時間相加,重發超時的時間就是比這個總和要稍大一點的值。
- 在 BSD 的 Unix 以及 Windows 系統中,超時都以0.5秒為單位進行控制,因此重發超時都是0.5秒的整數倍。不過,最初其重發超時的默認值一般設置為6秒左右。
- 數據被重發之后若還是收不到確認應答,則進行再次發送。此時,等待確認應答的時間將會以2倍、4倍的指數函數延長。
- 此外,數據也不會被無限、反復地重發。達到一定重發次數之后,如果仍沒有任何確認應答返回,就會判斷為網絡或對端主機發生了異常,強制關閉連接。并且通知應用通信異常強行終止。
3.5 以段為單位發送數據
- 在建立 TCP 連接的同時,也可以確定發送數據包的單位,我們也可以稱其為"最大消息長度"(MSS)。最理想的情況是,最大消息長度正好是 IP 中不會被分片處理的最大數據長度。
- TCP 在傳送大量數據時,是以 MSS 的大小將數據進行分割發送。進行重發時也是以 MSS 為單位。
- MSS 在三次握手的時候,在兩端主機之間被計算得出。兩端的主機在發出建立連接的請求時,會在 TCP 首部中寫入 MSS 選項,告訴對方自己的接口能夠適應的 MSS 的大小。然后會在兩者之間選擇一個較小的值投入使用。
3.6 利用窗口控制提高速度
- TCP 以1個段為單位,每發送一個段進行一次確認應答的處理。這樣的傳輸方式有一個缺點,就是包的往返時間越長通信性能就越低。
- 為解決這個問題,TCP 引入了窗口這個概念。確認應答不再是以每個分段,而是以更大的單位進行確認,轉發時間將會被大幅地縮短。也就是說,發送端主機,在發送了一個段以后不必要一直等待確認應答,而是繼續發送。如下圖所示:

·
- 窗口控制
- 窗口大小就是指無需等待確認應答而可以繼續發送數據的最大值。上圖中窗口大小為4個段。這個機制實現了使用大量的緩沖區,通過對多個段同時進行確認應答的功能。
3.7 滑動窗口控制

滑動窗口
- 上圖中的窗口內的數據即便沒有收到確認應答也可以被發送出去。不過,在整個窗口的確認應答沒有到達之前,如果其中部分數據出現丟包,那么發送端仍然要負責重傳。為此,發送端主機需要設置緩存保留這些待被重傳的數據,直到收到他們的確認應答。
- 在滑動窗口以外的部分包括未發送的數據以及已經確認對端已收到的數據。當數據發出后若如期收到確認應答就可以不用再進行重發,此時數據就可以從緩存區清除。
- 收到確認應答的情況下,將窗口滑動到確認應答中的序列號的位置。這樣可以順序地將多個段同時發送提高通信性能。這種機制也別稱為滑動窗口控制。
3.8 窗口控制中的重發控制
在使用窗口控制中, 出現丟包一般分為兩種情況:
- ① 確認應答未能返回的情況。在這種情況下,數據已經到達對端,是不需要再進行重發的,如下圖:

部分確認應答丟失
- ② 某個報文段丟失的情況。接收主機如果收到一個自己應該接收的序列號以外的數據時,會針對當前為止收到數據返回確認應答。如下圖所示,當某一報文段丟失后,發送端會一直收到序號為1001的確認應答,因此,在窗口比較大,又出現報文段丟失的情況下,同一個序列號的確認應答將會被重復不斷地返回。而發送端主機如果連續3次收到同一個確認應答,就會將其對應的數據進行重發。這種機制比之前提到的超時管理更加高效,因此也被稱為高速重發控制。
