任何系統之間,如果需要通信,都需要一套自己的協(xié)議系統。這個(gè)協(xié)議系統一般要定義互相通信的語(yǔ)言,以及硬件。
OSI是被提取抽象出來(lái)的系統間通信模型,中文意思是“開(kāi)放式系統互聯(lián)”,是描述多個(gè)系統之間交流的通用模型。
OSI初步
在講OSI之間,我們首先看一個(gè)例子,PC a向PC b發(fā)送數據包的過(guò)程如下:
可以發(fā)現里面最重要的就是三個(gè)元素
OSI的七個(gè)層次
OSI模型將系統通信劃分為了7個(gè)層次,最上面的三個(gè)層次可以歸屬到應用層。這個(gè)層不需要關(guān)心如何將數據傳送到對方,只關(guān)心如何組織和表達數據。
應用層是OSI的最上層,表示一個(gè)系統對另一個(gè)系統要傳達的最終消息。
只關(guān)注數據, 不關(guān)注指令如何發(fā)送
表示層就是對應用層數據的一種表示。
發(fā)送方必須用雙方規定好的格式來(lái)表示信息:可以嵌入在實(shí)體數據中。
會(huì )話(huà)層:建立會(huì )話(huà)交互機制。實(shí)際是雙方的應用程序之間的交互。
應用層、表示層、會(huì )話(huà)層的數據內容都被封裝起來(lái),交給押運員傳輸層。
TCP/IP只有4層:應用層、傳輸層、網(wǎng)絡(luò )層、物理鏈路層,它將OSI的應用層、表示層、會(huì )話(huà)層合并為一層,即應用訪(fǎng)問(wèn)層。意思是這個(gè)層全部與應用程序相關(guān)的邏輯,與網(wǎng)絡(luò )通信無(wú)關(guān)。應用程序只需要調用下層的接口就可以完成通信。
下四層的作用是把上三層的數據成功送到目的地。
典型的傳輸層程序如下:
TCP主要處理?yè)砣土髁靠刂啤?/span>路由器是調度中心,它可以決定走哪條路。TCP不能調度,它只是在發(fā)生了擁擠就只能通知后續的貨物慢點(diǎn)發(fā)。如果道路暢通,則通知后面的貨物加速發(fā)送。
那么TCP是怎么知道鏈路是否擁塞呢?它可以通過(guò)接收方返回的ACK應答來(lái)判斷鏈路擁擠的。如果半天都沒(méi)收到對方的簽字,說(shuō)明擁塞,有丟失
** 傳輸層的程序一定運行在通信雙方的終端設備上。**而不是在中間的互聯(lián)設備上。
因為傳輸層是一種端到端的保障機制,必須保證成功收到了并成功處理數據,才算發(fā)送成功了。如果只到了對方的網(wǎng)卡,但是斷電了,也不叫端到端保障。
具體的可以再看從輸入網(wǎng)址到瀏覽器返回內容(二),TCP/IP篇
上面說(shuō)到了傳輸層其實(shí)只是一個(gè)押運員,它并不能進(jìn)行調度,那么如何選路就交給了網(wǎng)絡(luò )層。
同樣以客戶(hù)寄貨物為例,當客戶(hù)把貨物交給貨運公司的時(shí)候,會(huì )填寫(xiě)目的地址,至于應該走哪條路,統統不管,全部交給網(wǎng)絡(luò )層處理。
總結一下就是,客戶(hù)寄送貨物的時(shí)候需要給出最終的目的地址,不管這個(gè)貨物途徑哪個(gè)中轉站,所有的中轉站都會(huì )知道最終的目的地址。
比如,要從新疆將貨物寄到青島,但是新疆到青島沒(méi)有直到的火車(chē),所以只能去北京轉出。
那么新疆的調度會(huì )去查找路由表,發(fā)現必須先到北京。注意此時(shí)在貨物上貼上的還是青島的標簽,而不是北京的標簽,但是會(huì )將貨物發(fā)到去北京的火車(chē)上。
貨物到北京,查看最終的目的地,會(huì )查找北京調度中心的路由表,此路由表與新疆的表不同。于是將貨物送到去青島的火車(chē)。
可以看出** 路由器就是調度的角色**
比如從青島訪(fǎng)問(wèn)北京的服務(wù)器,具體步驟如下:
在中轉的過(guò)程中,目的IP并不會(huì )改變,改變的只是MAC地址,也就是說(shuō)會(huì )將MAC地址改為下一站的地址。
數據鏈路層:連通兩個(gè)設備之間的鏈路,將上層的數據包再次打包成對應鏈路特定的格式。按照對應鏈路的規則在鏈路上傳輸給對方。
數據鏈路就好比交通規則:上路之前還需要看公路的質(zhì)量怎么樣,和對方商量傳輸的事宜。
鏈路層的作用:
兩臺PC之間的通信和兩個(gè)路由器之間通信是有區別的。
路由間的通信:
簡(jiǎn)單的路由設備工作在OSI的第三層,即網(wǎng)絡(luò )層,沒(méi)有上4層的處理邏輯。
所以收到包之后,只檢查包中的IP地址,不改變IP頭之上的其他內容。
如果有NAT功能的路由器,會(huì )對IP包的源或者目的IP地址做修改。
未收到確認的包會(huì )放到緩沖區中,不會(huì )刪除,直到收到對方的確認。
所以即使中途的設備把包丟棄了,運行在兩端的TCP/IP協(xié)議依然會(huì )重傳,這就是端到端的保障,因為設備中途網(wǎng)絡(luò )設備不會(huì )緩存發(fā)送的數據,更不會(huì )自動(dòng)重傳。
現在我們來(lái)對比一下IP頭和TCP頭的區別:
物理層:在一種介質(zhì)上將數據編碼發(fā)送給對方。
注意鏈路層是控制物理層的。
我們可以把物理層看做傳送帶,不會(huì )進(jìn)行貨物分批,所以需要鏈路層給每批貨物加標志性的頭,接收方看到標志了以后就知道新一批貨物來(lái)了。
經(jīng)過(guò)物理層編碼后,最終變成了一串bit流。通過(guò)電路振蕩傳輸給對方,收到bit流之后,提交給鏈路層程序,剝去鏈路層同步頭、幀頭幀尾、控制字符。
MTU ,最大傳輸單元:每種鏈路都有自己最合適的分批大小
如果一次傳輸傳送大于這個(gè)大小的貨物,超過(guò)了鏈路接收放的處理吞吐量,會(huì )造成緩沖區溢出。
不過(guò)TCP和IP協(xié)議都會(huì )給貨物分批。TCP會(huì )首先給貨物分批,到了IP層,會(huì )按照鏈路層的分批大小來(lái)進(jìn)行分批,如果TCP的分批大小已經(jīng)小于鏈路層的分批,不會(huì )再分。
被IP層分批的貨物,最終會(huì )由接受方的IP層再組裝,但是由TCP分批的貨物,接收方的TCP層不會(huì )合并。對貨物的處理分析全部交由上層的應用程序來(lái)處理