TCP/IP模型

歷史

研發初期

1983年1月1日,在網際網路的前身(ARPA網)中,TCP/IP取代舊的網路控制協議(NCP,Network Control Protocol),從而成為今天的互聯網的基石。最早的TCP/IP由文頓·瑟夫和羅伯特·卡恩兩位開發,慢慢地通過競爭戰勝其他一些網路協議的方案,比如國際標準化組織ISO的OSI模型。TCP/IP的蓬勃發展發生在1990年代中期。當時一些重要而可靠的工具的出世,例如頁面描述語言HTML和瀏覽器Mosaic,促成了互聯網應用的飛速發展。 隨著互聯網的發展,目前流行的IPv4協議(網際協議版本四)已經接近它的功能上限。IPv4最致命的兩個缺陷在於:

- 地址只有32位,IP地址空間有限;

- 不支持服務質量(Quality of Service,QoS)的想法,無法管理帶寬和優先順序,故而不能很好的支持現今越來越多實時的語音和視頻應用。因此IPv6(網際協議版本六)浮出水面,用以取代IPv4。

TCP/IP成功的另一個因素在於對為數眾多的低層協議的支持。這些低層協議對應OSI模型中的第一層(物理層)和第二層(數據鏈路層)。每層的所有協議幾乎都有一半數量支持TCP/IP,例如:乙太網(Ethernet)、令牌環(Token Ring)、光纖數據分布介面(FDDI)、點對點協議(PPP)、X.25、幀中繼(Frame Relay)、ATM、Sonet、SDH等。

#### 研發背景

最初想到讓不同電腦之間實現連接的,是美國加州大學洛杉磯分校網路工作小組的S.克羅克。1970年,克羅克及其小組著手制定最初的主機對主機通信協議,它被稱為網路控制協議(Network Control Protocol,縮寫NCP)。該協議被用於阿帕網,並在局部網路條件下運行穩定,但隨著阿帕網用戶的增多,NCP逐漸暴露出兩大缺陷:

- NCP只是一台主機對另一台主機的通訊協議,並未給網路中的每台電腦設置唯一的地址,結果就造成電腦在越來越龐大的網路中難以準確定位需要傳輸數據的對象。

- NCP缺乏糾錯功能,這樣一來,數據在傳輸過程中一旦出現錯誤,網路就可能停止運行。出錯電腦增多,使得網路運行效率大打折扣。

-

#### 開發過程

在構建阿帕網先驅之後,DARPA開始其他數據傳輸技術的研究。NCP誕生後兩年,1972年,羅伯特·卡恩(Robert E. Kahn)被DARPA的信息技術處理辦公室僱傭,在那裡他研究衛星數據包網路和地面無線數據包網路,並且意識到能夠在它們之間溝通的價值。在1973年春天,已有的ARPANET網路控制程序(NCP)協議的開發者文頓·瑟夫(Vinton Cerf)加入到卡恩為ARPANET設計下一代協議而開發開放互連模型的工作中。到了1973年夏天,卡恩和瑟夫很快開發出一個基本的改進形式,其中的網路協議之間的差異通過使用一個公用互聯網協議而隱藏起來,且可靠性由主機保證而不是ARPANET那樣由網路保證。瑟夫稱讚了Hubert Zimmerman和Louis Pouzin(CYCLADES網路的設計者)在這個設計上發揮重要影響。

由於網路的作用減少到最小的程度,更有可能將任何網路連接到一起,而不用管它們不同的特點,這樣能解決卡恩最初的問題。一個流行的說法提到瑟夫和卡恩工作的最終產品TCP/IP將在運行「兩個罐子和一根弦」上,實際上它已經用在信鴿上。一個稱為網關(後來改為路由器以免與網關混淆)的計算機為每個網路提供一個介面並且在它們之間來回傳輸數據包。這個設計思想更細的形式由瑟夫在斯坦福的網路研究組的1973年–1974年期間開發出來。處於同一時期誕生PARC通用包協議組的施樂PARC早期網路研究工作也有著重要的技術影響;人們在兩者之間搖擺不定。DARPA於是與BBN、斯坦福和倫敦大學簽署協議開發不同硬體平台上協議的運行版本。有四個版本被開發出來——TCP v1、TCP v2、在1978年春天分成TCP v3和IP v3的版本,後來就是穩定的TCP/IP v4——目前網際網路仍然使用的標準協議。

1975年,兩個網路之間的TCP/IP通信在斯坦福和倫敦大學(UCL)之間進行測試。1977年11月,三個網路之間的TCP/IP測試在美國、英國和挪威之間進行。在1978年到1983年間,其他一些TCP/IP原型在多個研究中心之間開發出來。ARPANET完全轉換到TCP/IP在1983年1月1日發生。1984年,美國國防部將TCP/IP作為所有計算機網路的標準。1985年,網際網路架構理事會舉行一個三天有250家廠商代表參加的關於計算產業使用TCP/IP的工作會議,幫助協議的推廣並且引領它日漸增長的商業應用。

## OSI七層網路模型

- 應用層(Application) :提供網路與用戶應用軟體之間的介面服務,例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP

- 表示層(Presentation) :提供格式化的表示和轉換數據服務,如XDR、ASN.1、SMB、AFP、NCP

- 會話層(Session) 提供包括訪問驗證和會話管理在內的建立和維護應用之間通信的機制,例如ASAP、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、IGMP、Winsock、BSD sockets

- 傳輸層(Transimission):提供建立、維護和取消傳輸連接功能,負責可靠地傳輸數據(PC),例如TCP、UDP、TLS、RTP、SCTP、SPX、ATP、IL

- 網路層(Network): 處理網路間路由,確保數據及時傳送(路由器),例如IP、ICMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25

- 數據鏈路層(DataLink): 負責無錯傳輸數據,確認幀、發錯重傳等(交換機),例如乙太網、令牌環、HDLC、幀中繼、ISDN、ATM、IEEE 802.11、FDDI、PPP

- 物理層(Physics) :提供機械、電氣、功能和過程特性例如線路、無線電、光纖

## TCP/IP協議

通常人們認為OSI模型的最上面三層(應用層,表示層和會話層)在TCP/IP組中是一個應用層。由於TCP/IP有一個相對較弱的會話層,由TCP和RTP下的打開和關閉連接組成,並且在TCP和UDP下的各種應用提供不同的埠號,這些功能能夠被單個的應用程序(或者那些應用程序所使用的庫)增加。與此相似的是,IP是按照講它下面的網路當做一個黑盒子的思想設計的,這樣在討論TCP/IP的時候就可以把它當做一個獨立的層。

### 1)應用層

該層包括所有和應用程序系統工作,利用基礎網路交換應用程序專用的數據的協議。應用層是大多數普通與網路相關的程序為了通過網路其他程序通信所使用的層。這個層的處理過程是應用特有的,數據從網路相關的程序以這種應用內部使用的格式進行傳送,然後被編碼成標準協議的格式。

### 2)傳輸層

傳輸層的協議,能夠解決諸如端到端可靠性和保證數據按照正確的順序到達這樣的問題。在TCP/IP協議族中,傳輸協議也包括所給數據應該送給哪個應用程序。

TCP(IP協議6)是一個`可靠的`,面向連結的傳輸機制,它提供一種**可靠的位元組流**保證數據完整、無損並且按順序到達。TCP 盡量連續不斷地測試網路的負載並且控制發送數據的速度以避免網路過載。

`1.TCP的功能`

TCP 主要是將數據進行分段打包傳輸,對每個數據包編號控制順序,運輸中丟失、重發和丟棄處理

`2.TCP頭的介紹`

- Source Port & Destination Port - 源埠號和目標埠號;計算機通過埠號識別訪問哪個服務,比如http服務或ftp服務;發送方埠號是進行隨機埠;目標埠號決定了接收方哪個程序來接收。

- Sequence number - 32位序列號,TCP用序列號對數據包進行標記,以便在到達目的地後重新重裝。在建立連接時通常由計算機生成一個隨機數作為序列號的初始值。

- Acknowledgment number - 32位確認號,確認應答號。發送端接收到這個確認應答後,可以認為這個位置以前所有的數據都已被正常接收。

- Header Length - 首部長度。單位是 4個位元組,如果沒有可選欄位,那麼這裡的值就是 5。表示 TCP 首部的長度為 20 位元組。

- checksum - 16位校驗和。用來做差錯控制,TCP校驗和的計算包括TCP首部、數據和其它填充位元組。

- flags - 控制位(UGA,ACK,PSH,PST,SYS,FIN)。TCP的連接、傳輸和斷開都受這六個控制位的指揮。

- URG (urgent緊急) — 緊急標誌位,表示的是此報文段中有緊急數據,將緊急數據排在普通數據的前面;當接受端收到此報文後後必須先處理緊急數據,而後再處理普通數據。 通常用來暫時中斷通信

- ACK (acknowledgement確認) — 置1時表示確認號合法,為0表示數據段不包含確認信息,確認號被忽略

- PSH (push推送) — 置1時請求的報文在接收方收到時,會儘快交付接收應用進程,而不在等到整個緩存區都填滿後再交付給應用進程

- RST (reset重置) — 置1時重新連接,表示出現錯誤,需要釋放連接,再重新建立連接

- SYN (synchronous同步) — 置1時連接請求或同意報文,當SYN=1而ACK=0時,表明這是一個連接請求報文段。對方若同意建立連接,則應在響應的報文段中使SYN=1和ACK=1

- FIN (FINis終止) — 釋放連接,提出斷開連接的一方將FIN置為1表示斷開連接

- window size - 本地可接收數據的數目,這個值的大小是可變的。當網路通暢時將這個窗口值變大加快傳輸速度,當網路不穩定時減少這個值可以保證網路數據的可靠傳輸。它是來在TCP傳輸中進行流量控制的

`3.不得不提的三次握手,四次揮手`

- TCP是面向連接的協議,它在源點和終點之間建立虛擬連接,而不是物理連接

- 在數據通信之前,發送端與接收端要先建立連接,等數據發送結束後,雙方再斷開連接

- TCP連接的每一方都是由一個IP地址和一個埠組成

- 三次握手

- 第一次握手,首先建立連接,客戶端連接伺服器端,發送32位序列號 seq= x,並且把 SYN 置1,

- 第二次握手,服務端監聽客戶端發送的序列號,接收成功後,向客戶端發送32位確認響應 swq=y 和ack= x+1,並將 SYN、ACK置1

- 第三次握手,客戶端接收以後,說明服務端接收成功,然後再返回 ack = y+1,表示客戶端已經接收成功可以開始連接

> 用大白話來講,就是客戶端向服務端發送數據(第一次握手);服務端收到後會告訴客戶端收到了消息(第二次握手),客戶端收到服務端的響應後,已經確定了自己向服務端的發送數據是正常的;但是此時服務端的還不知道自己的發送數據是否正常,需要客戶端給服務端回復(第三次握手),這就是為什麼需要三次握手的原因了。

- 四次揮手

- 第一次揮手:客戶端向伺服器發送一個FIN報文段,將設置seq為x+2和ack為y+1,;此時,客戶端進入 FIN_WAIT_1狀態,這表示客戶端沒有數據要發送伺服器了,請求關閉連接;

- 第二次揮手:伺服器收到了客戶端發送的FIN報文段,向客戶端回一個ACK報文段,ack設置為1,seq設置為x+3;伺服器進入了CLOSE_WAIT狀態,客戶端收到伺服器返回的ACK報文後,進入FIN_WAIT_2狀態;

- 第三次揮手:伺服器會觀察自己是否還有數據沒有發送給客戶端,如果有,先把數據發送給客戶端,再發送FIN報文;如果沒有,那麼伺服器直接發送FIN報文給客戶端。請求關閉連接,同時伺服器進入LAST_ACK狀態;

- 第四次揮手:客戶端收到伺服器發送的FIN報文段,向伺服器發送ACK報文段,將seq設置為y+1,將ack設置為y+2,然後客戶端進入TIME_WAIT狀態;伺服器收到客戶端的ACK報文段以後,就關閉連接;此時,客戶端等待2MS後依然沒有收到回復,則證明Server端已正常關閉,客戶端也可以關閉連接了。

> 繼續大白話講講四次揮手的梗,為什麼握手需要三次,斷開卻需要四次?客戶端向服務端發送斷開連接的消息(第一次揮手),服務端收到後向客戶端發送響應信息表示已經收到(第二次揮手),`注意:此時服務端不會立刻關閉`,此時的服務端可能還有一些數據沒發送完,需要把這些未發送完的數據發送完畢,數據發送完畢同時會向客服端發請求關閉的消息(第三次揮手),客戶端收到伺服器的消息後,會返回給客戶端確認關閉的消息(第四次揮手),伺服器收到消息後會確定關閉服務。

### 3)網路互連層

TCP/IP協議族中的網路互連層(internet layer)在OSI模型中叫做網路層(network layer)。

正如最初所定義的,網路層解決在一個單一網路上傳輸數據包的問題。隨著網際網路思想的出現,在這個層上添加附加的功能,也就是將數據從源網路傳輸到目的網路。這就牽涉到在網路組成的網上選擇路徑將數據包傳輸,也就是網際網路。 在網際網路協議組中,IP完成數據從源發送到目的的基本任務。IP能夠承載多種不同的高層協議的數據;這些協議使用一個唯一的IP協議號進行標識。ICMP和IGMP分別是1和2。 一些IP承載的協議,如ICMP(用來發送關於IP發送的診斷信息)和IGMP(用來管理多播數據),它們位於IP層之上但是完成網路層的功能,這表明網際網路和OSI模型之間的不兼容性。所有的路由協議,如BGP、OSPF、和RIP實際上也是網路層的一部分,儘管它們似乎應該屬於更高的協議棧。

4)網路介面層

網路介面層實際上並不是網際網路協議組成的一部分,但是它是數據包從一個設備的網路層傳輸到另外一個設備的網路層的方法。這個過程能夠在網卡的軟體驅動程序中控制,也可以在專用晶元中控制。這將完成如添加報頭準備發送,通過實體媒介發送數據的功能。另一端,鏈路層將完成數據幀接收、去除報頭並且將接收到的包傳到網路層。然而,鏈路層並不經常這樣簡單。它也可能是一個虛擬專有網路(VPN)或者隧道,在這裡從網路層來的包使用隧道協議和其他(或者同樣的)協議組發送而不是發送到實體的介面上。VPN和隧道通常預先建好,並且它們有一些直接發送到實體介面所沒有的特殊特點(例如,它可以加密經過它的數據)。由於現在鏈路「層」是一個完整的網路,這種協議組的遞歸使用可能引起混淆。但是它是一個實現常見複雜功能的一個優秀方法。(儘管需要注意預防一個已經封裝並且經隧道發送下去的數據包進行再次地封裝和發送)。

## http報文通過tcp發送的舉例

參考文獻

- TCP/IP協議族

- 深入理解TCP/IP模型 - 掘金

- TCP/IP分層模型 - Ervins Blog - CSDN博客

推薦閱讀:

React填坑記(三):國際化方案
把網頁導出為圖片的兩種方案以及其適用場景
我理解的同步載入與非同步載入
實現符合 Promise/A+ 規範的Promise
zzz 周刊 - 1039 期 - 公孫離幻舞玲

TAG:前端工程師 | 前端開發 |