任何系統(tǒng)之間吱涉,如果需要通信刹泄,都需要一套自己的協(xié)議系統(tǒng)。這個協(xié)議系統(tǒng)一般要定義互相通信的語言怎爵,以及硬件特石。
OSI是被提取抽象出來的系統(tǒng)間通信模型,中文意思是“開放式系統(tǒng)互聯(lián)”鳖链,是描述多個系統(tǒng)之間交流的通用模型姆蘸。
OSI模型
OSI初步
在講OSI之間,我們首先看一個例子,PC a向PC b發(fā)送數(shù)據(jù)包的過程如下:
a在內存中通過定義的語言生成數(shù)據(jù)包
將數(shù)據(jù)包通過總線傳給TCP/IP協(xié)議處理單元乞旦,告訴對方的IP地址贼穆、UDP還是TCP、端口號
TCP/IP處理模塊收到包之后兰粉,封裝故痊,通過總線發(fā)送給以太網(wǎng)卡
以太網(wǎng)卡再進行編碼,變成高低電平震蕩發(fā)給交換機
交換機將數(shù)據(jù)包交換到b的接口
b輸送到以太網(wǎng)卡的解碼芯片玖姑,去掉以太網(wǎng)頭然后產生中斷愕秫,將數(shù)據(jù)包送到內存
TCP/IP處理模塊提取IP頭和TCP頭,以便區(qū)分應該輸送到哪個應用程序的緩沖區(qū)內存焰络。
送到b的應用程序緩沖區(qū)內存
可以發(fā)現(xiàn)里面最重要的就是三個元素
連:通信雙方需要連通起來戴甩。
找:指的是通信雙方必須能區(qū)分自己和對方。
發(fā):定義了如何將數(shù)據(jù)發(fā)到對方闪彼。
OSI的七個層次
OSI模型將系統(tǒng)通信劃分為了7個層次甜孤,最上面的三個層次可以歸屬到應用層。這個層不需要關心如何將數(shù)據(jù)傳送到對方畏腕,只關心如何組織和表達數(shù)據(jù)缴川。
應用層
應用層是OSI的最上層,表示一個系統(tǒng)對另一個系統(tǒng)要傳達的最終消息描馅。
只關注數(shù)據(jù)把夸, 不關注指令如何發(fā)送
表示層
表示層就是對應用層數(shù)據(jù)的一種表示。
發(fā)送方必須用雙方規(guī)定好的格式來表示信息:可以嵌入在實體數(shù)據(jù)中铭污。
會話層
會話層:建立會話交互機制恋日。實際是雙方的應用程序之間的交互。
應用層嘹狞、表示層岂膳、會話層的數(shù)據(jù)內容都被封裝起來,交給押運員傳輸層
磅网。
TCP/IP只有4層:應用層闷营、傳輸層、網(wǎng)絡層知市、物理鏈路層傻盟,它將OSI的應用層、表示層嫂丙、會話層合并為一層娘赴,即應用訪問層
。意思是這個層全部與應用程序相關的邏輯跟啤,與網(wǎng)絡通信無關诽表。應用程序只需要調用下層的接口就可以完成通信唉锌。
下四層的作用是把上三層的數(shù)據(jù)成功送到目的地。
傳輸層
典型的傳輸層程序如下:
TCP協(xié)議的作用是保證上層數(shù)據(jù)能傳輸?shù)侥康牡馗妥唷n愃曝涍\公司的押運員袄简,不管通過什么渠道(直達還是下一跳),不管物理鏈路的類型泛啸,只要送到即可绿语。
如果出現(xiàn)錯誤,需要重新發(fā)送候址。每件貨物到了目的地必須找收件人簽字(TCP的ACK應答包)或者一批貨物到了以后一次性簽收吕粹。(滑動窗口)
最后回公司登記
TCP主要處理擁塞和流量控制。路由器是調度中心岗仑,它可以決定走哪條路匹耕。TCP不能調度,它只是在發(fā)生了擁擠就只能通知后續(xù)的貨物慢點發(fā)荠雕。如果道路暢通稳其,則通知后面的貨物加速發(fā)送。
那么TCP是怎么知道鏈路是否擁塞呢炸卑?它可以通過接收方返回的ACK應答來判斷鏈路擁擠的既鞠。如果半天都沒收到對方的簽字,說明擁塞矾兜,有丟失
** 傳輸層的程序一定運行在通信雙方的終端設備上。**而不是在中間的互聯(lián)設備上患久。
因為傳輸層是一種端到端的保障機制椅寺,必須保證成功收到了并成功處理數(shù)據(jù),才算發(fā)送成功了蒋失。如果只到了對方的網(wǎng)卡返帕,但是斷電了,也不叫端到端保障篙挽。
具體的可以再看從輸入網(wǎng)址到瀏覽器返回內容(二)荆萤,TCP/IP篇
網(wǎng)絡層
上面說到了傳輸層其實只是一個押運員,它并不能進行調度铣卡,那么如何選路就交給了網(wǎng)絡層链韭。
同樣以客戶寄貨物為例,當客戶把貨物交給貨運公司的時候煮落,會填寫目的地址敞峭,至于應該走哪條路,統(tǒng)統(tǒng)不管蝉仇,全部交給網(wǎng)絡層處理旋讹。
貨運公司為每件貨物貼上IP頭地址標簽
貨運公司掌握了全球范圍的地址信息(路由表)
選擇了一條路就上路殖蚕。
貨物每中轉到一個地方就交給那個地方的調度,由調度來決定下一站到哪里沉迹。
舊調度不必告訴新調度最終的目的怎么走睦疫,因為所有調度都知道最終的目的。
總結一下就是鞭呕,客戶寄送貨物的時候需要給出最終的目的地址蛤育,不管這個貨物途徑哪個中轉站,所有的中轉站都會知道最終的目的地址琅拌。
比如缨伊,要從新疆將貨物寄到青島,但是新疆到青島沒有直到的火車进宝,所以只能去北京轉出刻坊。
那么新疆的調度會去查找路由表,發(fā)現(xiàn)必須先到北京党晋。注意此時在貨物上貼上的還是青島的標簽谭胚,而不是北京的標簽,但是會將貨物發(fā)到去北京的火車上未玻。
貨物到北京灾而,查看最終的目的地,會查找北京調度中心的路由表扳剿,此路由表與新疆的表不同旁趟。于是將貨物送到去青島的火車。
可以看出** 路由器就是調度的角色**
比如從青島訪問北京的服務器庇绽,具體步驟如下:
首先必須知道服務器的IP地址锡搜,用這個IP地址作為最終目的地址組裝成數(shù)據(jù)包,發(fā)送給青島的Internet提供商(下面叫運營商)的路由器
運營商的路由器解析目的IP地址瞧掺,發(fā)現(xiàn)應該從1號端口發(fā)送出耕餐,于是發(fā)到了河北的另一臺路由器。
河北路由器根據(jù)目的IP查找路由表辟狈,發(fā)現(xiàn)需要從8口出
多次中轉以后肠缔,發(fā)到了北京的路由器。
最終到了北京的服務器哼转,將這個包傳送到這臺服務器的網(wǎng)卡明未,并提交到TCP/IP協(xié)議處理的內存空間。
發(fā)現(xiàn)是一個TCP握手數(shù)據(jù)包壹蔓,所以返回一個確認包亚隅,三次握手完成后,就可以向服務器發(fā)送HTTP請求來獲取網(wǎng)頁資源庶溶。
在中轉的過程中煮纵,目的IP并不會改變懂鸵,改變的只是MAC地址,也就是說會將MAC地址改為下一站的地址行疏。
數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層:連通兩個設備之間的鏈路匆光,將上層的數(shù)據(jù)包再次打包成對應鏈路特定的格式。按照對應鏈路的規(guī)則在鏈路上傳輸給對方酿联。
數(shù)據(jù)鏈路就好比交通規(guī)則:上路之前還需要看公路的質量怎么樣终息,和對方商量傳輸?shù)氖乱恕?/p>
鏈路層的作用:
協(xié)商鏈路參數(shù):雙工、速率贞让、鏈路質量
打包成幀周崭,加上同步頭,一次傳輸一句或者一個字符一個字符(取決于上層的選擇)
鏈路層程序調用物理層提供的接口喳张,將幀交給物理層续镇。
提供一些保障機制,在每個幀之后加一個校驗字段销部。如果不符說明鏈路干擾摸航,直接丟棄,不過不會報告錯誤舅桩,因為上層對鏈路層的錯誤不關心酱虎。接收方的傳輸層會感知某個包沒有到達,重新傳送不完整的包擂涛。鏈路層只偵錯读串,不糾錯。
兩臺PC之間的通信和兩個路由器之間通信是有區(qū)別的撒妈。
路由間的通信:
簡單的路由設備工作在OSI的第三層恢暖,即網(wǎng)絡層,沒有上4層的處理邏輯踩身。
所以收到包之后胀茵,只檢查包中的IP地址社露,不改變IP頭之上的其他內容挟阻。
如果有NAT功能的路由器,會對IP包的源或者目的IP地址做修改峭弟。
下圖為通信路徑上各個設備所作用的層次示意圖:
PC A上的瀏覽器要訪問PC B上的Web服務附鸽,首先調用WinSock接口,訪問OS內核中的TCP/IP協(xié)議棧瞒瘸,將目的IP和目的端口以及數(shù)據(jù)(HTTP GET請求)告訴TCP/IP協(xié)議棧
協(xié)議棧發(fā)現(xiàn)與
PC B
不存在鏈接坷备,所以通過三次握手與B的協(xié)議棧建立連接。
(A的協(xié)議棧組裝第一次握手包情臭,發(fā)給OS的內核緩沖區(qū)省撑,調用網(wǎng)卡驅動從緩沖區(qū)將IP包編碼并傳遞出去赌蔑,因為握手包很小,所以只需要一個幀竟秫。)幀到達路由器A的緩沖區(qū)娃惯,產生中斷信號,去掉以太網(wǎng)頭肥败,發(fā)送到
路由器A
的內存趾浅,等待IP轉發(fā)邏輯塊處理(IP路由協(xié)議計算模塊),分析出IP包的頭部目的IP地址馒稍,查找路由表確定出去的端口號查找出后皿哨,從
網(wǎng)卡2
出發(fā)送到路由器B的網(wǎng)卡2
.通過同樣的過程,發(fā)送到PC B
的網(wǎng)卡緩沖區(qū)纽谒,網(wǎng)卡產生中斷证膨,通過總線傳送到TCP/IP的協(xié)議棧緩沖區(qū)內存。PC B
的協(xié)議棧分析出IP是自己的佛舱,端口號是80椎例,同時握手標識位是二進制1,就知道是從源設備向Web服務程序所監(jiān)聽的端口發(fā)起的握手連接请祖。所以回復IP包給PC A
订歪,PC A再回一個最終確認的包。握手成功肆捕,
PC A
的協(xié)議棧將緩沖區(qū)中有瀏覽器發(fā)送過來的HTTP GET請求數(shù)據(jù)組裝成TCP/IP數(shù)據(jù)包發(fā)送給PC B
刷晋。PC B獲得數(shù)據(jù)包之后,分析TCP 端口號慎陵,根據(jù)對應關系將數(shù)據(jù)放到監(jiān)聽這個端口的應用程序的緩沖區(qū)內存眼虱。應用程序收到GET請求后,觸發(fā)Web服務邏輯流程席纽,返回Web數(shù)據(jù)捏悬。同樣由B的協(xié)議棧發(fā)送給
PC機 A
。
未收到確認的包會放到緩沖區(qū)中润梯,不會刪除过牙,直到收到對方的確認。
所以即使中途的設備把包丟棄了纺铭,運行在兩端的TCP/IP協(xié)議依然會重傳寇钉,這就是端到端的保障,因為設備中途網(wǎng)絡設備不會緩存發(fā)送的數(shù)據(jù)舶赔,更不會自動重傳扫倡。
現(xiàn)在我們來對比一下IP頭和TCP頭的區(qū)別:
IP頭是個標簽,用來查看是誰發(fā)的貨物竟纳。
TCP頭是用來確認由哪個上層應用程序來處理收到的包撵溃。(用端口號來決定)
物理層
物理層
:在一種介質上將數(shù)據(jù)編碼發(fā)送給對方疚鲤。
注意鏈路層是控制物理層的。
我們可以把物理層看做傳送帶缘挑,不會進行貨物分批石咬,所以需要鏈路層給每批貨物加標志性的頭,接收方看到標志了以后就知道新一批貨物來了卖哎。
經(jīng)過物理層編碼后鬼悠,最終變成了一串bit流。通過電路振蕩傳輸給對方亏娜,收到bit流之后焕窝,提交給鏈路層程序,剝去鏈路層同步頭维贺、幀頭幀尾它掂、控制字符。
MTU ,最大傳輸單元:每種鏈路都有自己最合適的分批大小
如果一次傳輸傳送大于這個大小的貨物溯泣,超過了鏈路接收放的處理吞吐量虐秋,會造成緩沖區(qū)溢出。
不過TCP和IP協(xié)議都會給貨物分批垃沦。TCP會首先給貨物分批客给,到了IP層,會按照鏈路層的分批大小來進行分批肢簿,如果TCP的分批大小已經(jīng)小于鏈路層的分批靶剑,不會再分。
被IP層分批的貨物池充,最終會由接受方的IP層再組裝桩引,但是由TCP分批的貨物,接收方的TCP層不會合并收夸。對貨物的處理分析全部交由上層的應用程序來處理