我們現實網絡無處不在,我們被龐大的虛擬網絡包圍,但我們卻對它是怎樣把我們的信息傳遞并實現通信的,我們并沒有了解過,那么當我們在瀏覽器中出入一段地址,按下回車這背后都會發生什么? 比如說一般場景下,客戶機和服務器不在一個局域網,輸入的是一個域名而不是IP地址。那么當按下回車后,首先瀏覽器會通過DNS解析找到我們對應的IP地址,將http報文發送給目標IP地址對應的服務器,之后服務器做出響應,將請求的資源發送給瀏覽器。 TIP/IP在這當中扮演著重要的作用。
TCP/IP歷史
在計算機發展的早期階段,很多不同的廠商生產各種不同的計算型號,他們運行完全不同的操作系統,為了讓他們之間能夠相互通信,TCP/IP協議族誕生了。
那么為什么我們叫它協議族呢? 因為實際上TCP/IP是一組不同層次上的多個協議的組合。 那么協議組合是什么?——TCP/IP模型
TCP/IP模型
TCP/IP模型是一個四層結構,從上往下依次是應用層,運輸層(傳輸層),網絡層,網絡接口層(數據鏈路層)。 通過開頭我們輸入一個url的例子,自上而下進行介紹TIP/IP參考模型
應用層
為用戶提供各種服務,比如我們瀏覽網頁時用到的HTTP,收發郵件時用的SMTP,登錄遠程主機用的SSH或者FTP協議,DNS等協議。 假設我們對 www.xxx.com
發送請求
- 瀏覽器看到這個域名的時候,就好像去一家從沒去過的餐廳吃飯,只知道餐廳名字,卻不知道具體地址,域名就像是一個餐廳的名字,而IP地址相當于一個具體的地址。 瀏覽器必須知道要請求服務器的IP地址,發出的請求才有目的地。DNS可以將IP轉換成地址。
- http 會生成報文 ,這個請求里面包含了請求的方法,請求的路徑“/”,請求的主機名,客戶機的類型以及一些其他的信息。
傳輸層
傳輸層位于應用層下層,網絡借口層的上層,主要有TCP和UDP兩種協議。 UDP是用戶數據報協議,不關心是否收到,不需要建立連接就可以通信,傳輸效率高,比如說微信。 而TCP是一種可靠的面向連接的協議,就是在交互數據前先建立一個TCP連接,如同打電話,首先要撥號,然后等待對方響應后才能彼此交流 TCP提供全雙工服務,即數據可在同一時間雙向傳播 TCP將若干個字節構成一個分組,此分組稱為報文段(Segment)
TCP連接的建立過程如下圖所示。
- 三次握手
- 主機A通過一個標識為SYN標識位的數據段發送給主機B請求連接,告訴主機B“我想和你創建一條TCP連接”。
- 當主機B收到SYN請求后,如果其所請求的端口號正在等待連接,則會為這一條TCP連接分配資源,并主機A發送確認應答ACK和同步序列號SYNC標志位的數據段來響應主機。
- 主機A確認收到了主機B的數據段并可以開始傳輸實際數據。
- 四次揮手
- 主機A發送FIN控制位發出斷開連接的請求 。
- 主機B進行響應,確認收到斷開連接請求。
- 主機B發送FIN控制,隨后關閉了連接。
- 主機A收到之后,又向主機B回復一個ACK應答。過了一段計時等待,主機A也關閉了連接,釋放資源。這一段計時等待的時間是為了主機B重傳最后的ACK防止其丟失。
網絡層
在這一層中主要是 IP 協議處理數據傳輸。用于把數據從源主機經過若干個中間節點傳送到目標主機,并向傳輸層提供最基礎的數據傳輸服務。
在網絡中,每臺計算機都有一個唯一的地址,方便別人找到它,這個地址稱為IP地址。 IP協議處理過的數據擁有自己的名字:IP數據報,讓我們從下圖來了解一下IP數據報的格式:
- 版本
- 一個4位二進制數的標識,用來標識IP協議的版本,目前大部分的協議版本號為4,因此IP有時也稱為IPv4。
- 首部長部
- 優先級與服務類型
- 總長度
- 該字段用以指示整個IP數據包的長度,最長為65535字節,包括頭和數據 標識符
- 唯一標識主機發送的每一份數據報
- 標志
- 分為3個字段,依次為保留位、不分片位和更多片位,保留位:一般被置為0 不分片位:表示該數據報是否被分片,如果被置為1,則不能對數據報進行分片,如果要對其進行分片處理,就應將其置為0 更多片位:除了最后一個分片,其他每個組成數據報的片都要將該位置設置為1.
- 段偏移量
- 該分片相對于原始數據報開始處位置的偏移量
- TTL(Time to Live生存時間)
- 該字段用于表示IP數據包的生命周期,可以防止一個數據包在網絡中無限循環地發下去。TTL的意思是一個數據包在被丟棄之前在網絡中的最大周轉時間。該數據包經過的每一個路由器都會檢查該字段中的值,當TTL的值為0時此數據包會被丟棄。TTL對應于一個數據包通過路由器的數目,一個數據包每經過一個路由器,TTL將減去1。
- 協議號
- 用以指示IP數據包中封裝的是哪個協議
- 首部校驗和
- 檢驗和是16位的錯誤檢測字段。目的主機和網絡中的每個網關都要重新計算報頭的校驗和,一樣表示沒有改動過。
- 源IP地址
- 該字段用于表示數據包的源地址,指的是發送該數據包的設備的網絡地址
- 目標IP地址
- 該字段用于表示數據包的目標的地址,指的是接收節點的網絡地址
數據鏈路層
在這一層中,上層傳來的數據經過協議處理后的一份數據,我們稱之為一幀(Frame) 在鏈路層中的地址指的的是計算機中網卡的硬件地址,即mac地址。我們知道,每一個網卡在出廠時,其內部都存有一個全世界獨一無二的硬件標識,稱為mac地址,它是的長度為6個字節。在網絡中,兩個計算機之間的通信實際上就是計算機中的兩張網卡之間的通信。如果沒有mac地址,就無法得知通信的具體位置,因此獲取mac地址是計算機通信的基礎保障。
但是實際上,計算機程序在發送連接請求時,一般只知道目的主機的IP地址,那么mac地址是如何獲取的呢?這就要靠ARP協議來實現。
ARP協議(地址解析協議)可以看做是鏈路層的一個協議,它的作用是為IP地址與對應的mac地址之間提供動態的映射,這個過程是自動完成的,因此無需用戶或管理員關心。ARP協議將IP映射為mac地址的過程大致如下:
如果目的主機與源主機位于同一網段,那么ARP協議會向本網段發送一個廣播,網段中的所有主機都會受到一條消息,這條消息詢問哪臺主機的IP地址與目的主機地址相同。當目的主機接受到這條消息,就做出應答,將自己的mac地址發送過去。其他主機則將這條消息忽略。
如果目的主機與源主機位于不同網段,那么ARP協議會將消息發送給本地的路由,路由經過IP尋址找到目的主機所在網段的路由,再由目的路由將消息廣播出去,獲得目的主機響應后再返回給源主機。
一般來說, 每臺機器都維護的有一個ARP緩存表, 存儲了近期的IP地址和硬件地址的映射關系, 可以用 arp -a 命令來查看緩存表中內容。
總結
事實上當我們http訪問一個地址的時候,從應用層開始向下傳遞,沒經過一層,該層的協議會把上層傳遞的數據在這個基礎上加一個首部,該首部包含了該層協議管理的信息,比如說網絡層會打包IP信息,數據鏈路層打包mac地址。 通過這種層層打包的方式,最后由物理層傳遞出去,再有路由器,代理服務器等設備,交給目標計算機。 目標計算機得到傳遞過來的數據后,從物理層向上傳遞,每一層會將該層對應協議負責的首部摘除后再傳給上層。最后抵達應用層對應的某個應用程序。