OSI七層與TCP/IP四層(小結(jié))
OSI 七層模型
我們一般使用的網(wǎng)絡(luò)數(shù)據(jù)傳輸由下而上共有七層,分別為物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層,也被依次稱為 OSI 第一層、第二層、??、 第七層。

各層功能簡介
1.物理層(Physical Layer)
物理層位于 OSI 參考模型的最低層,它直接面向原始比特流的傳輸。為了實現(xiàn)原始比特流的物理傳輸,物理層必須解決好包括傳輸介質(zhì)、信道類型、數(shù)據(jù)與信號之間的轉(zhuǎn)換、信號傳輸中的衰減和噪聲等在內(nèi)的一系列問題。另外,物理層標(biāo)準要給出關(guān)于物理接口的機械、 電氣、功能和規(guī)程特性,以便于不同的制造廠家既能夠根據(jù)公認的標(biāo)準各自獨立地制造設(shè)備,又能使各個廠家的產(chǎn)品能夠相互兼容。實質(zhì)上就是提供連接網(wǎng)絡(luò)的硬件設(shè)備,將電腦連接起來的物理手段. 如光纜/電纜/無線電波。
2.數(shù)據(jù)鏈路層(Data Link Layer)
在物理層發(fā)送和接收數(shù)據(jù)的過程中,會出現(xiàn)一些物理層自己不能解決的問題。例如, 當(dāng)兩個節(jié)點同時試圖在一條線路上發(fā)送數(shù)據(jù)時該如何處理?節(jié)點如何知道它所接收的數(shù)據(jù) 是否正確?如果噪聲改變了一個分組的目標(biāo)地址,節(jié)點如何察覺它丟失了本應(yīng)收到的分組呢?這些都是數(shù)據(jù)鏈路層所必須負責(zé)的工作。數(shù)據(jù)鏈路層涉及相鄰節(jié)點之間的可靠數(shù)據(jù)傳輸,數(shù)據(jù)鏈路層通過加強物理層傳輸原始比特的功能,使之對網(wǎng)絡(luò)層表現(xiàn)為一條無錯線路。為了能夠?qū)崿F(xiàn)相鄰節(jié)點之間無差錯的數(shù)據(jù)傳送,數(shù)據(jù)鏈路層在數(shù)據(jù)傳輸過程中提供了確認、差錯控制和流量控制等機制。
3.網(wǎng)絡(luò)層(Network Layer)
網(wǎng)絡(luò)中的兩臺計算機進行通信時,中間可能要經(jīng)過許多中間結(jié)點甚至不同的通信子網(wǎng)。網(wǎng)絡(luò)層的任務(wù)是:進行邏輯地址尋址,實現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇。網(wǎng)絡(luò)層建立了主機之間的通信,它在網(wǎng)絡(luò)層引入了一套地址機制:網(wǎng)絡(luò)地址.簡稱網(wǎng)址(Ip地址),我們可以通過Ip地址,可以找到唯一的一臺計算機,通過主機MAC地址來接收和發(fā)送信息。
4.傳輸層(Transport Layer)
傳輸層是 OSI 七層模型中唯一負責(zé)端到端節(jié)點間數(shù)據(jù)傳輸和控制功能的層。傳輸層是 OSI 七層模型中承上啟下的層,它下面的三層主要面向網(wǎng)絡(luò)通信,以確保信息被準確有效地傳輸;它上面的三層則面向用戶主機,為用戶提供各種服務(wù)。傳輸層通過:定義傳輸數(shù)據(jù)的協(xié)議端口號,以及流控和差錯效驗,定義了端口和端口之間的通信,幫助我們使不同的應(yīng)用程序能夠接收到自己所需要的的數(shù)據(jù)。
5.會話層(Session Layer)
會話層的功能是:包括建立、管理、終止會話,用來建立和管理應(yīng)用程序之間的通信,實現(xiàn)自動尋址,自動收發(fā)數(shù)據(jù)。
6.表示層(Presentation Layer)
表示層以下的各層只關(guān)心可靠的數(shù)據(jù)傳輸,而表示層關(guān)心的是所傳輸數(shù)據(jù)的語法和語義。它主要涉及處理在兩個通信系統(tǒng)之間所交換信息的表示方式,包括數(shù)據(jù)格式變換、數(shù)據(jù)加密與解密、數(shù)據(jù)壓縮與恢復(fù)等功能。比如我們要用基于Unix系統(tǒng)的mac電腦給pc機發(fā)送數(shù)據(jù),表示層為我們解決了通信間語法的問題。
7.應(yīng)用層(Application Layer)
應(yīng)用層是 OSI 參考模型的最高層,負責(zé)為用戶的應(yīng)用程序提供網(wǎng)絡(luò)服務(wù)。與 OSI 其他層不同的是,它不為任何其他OSI層提供服務(wù),而只是為OSI模型以外的應(yīng)用程序提供服務(wù)。比如不同的文件類型要用不同的應(yīng)用程序打開,應(yīng)用層中就規(guī)定了不同應(yīng)用程序的數(shù)據(jù)格式。
(其中,物理層、數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層通常被稱作媒體層,是網(wǎng)絡(luò)工程師所研究的對象;
傳輸層、會話層、表示層和應(yīng)用層則被稱作主機層,是用戶所面向和關(guān)心的內(nèi)容。)
OSI七層結(jié)構(gòu)與TCP/IP四層結(jié)構(gòu)對應(yīng)關(guān)系:

OSI七層模型對應(yīng)的協(xié)議:
7、應(yīng)用層application——FTP、HTTP、DNS、SMTP、TELNET協(xié)議
6、表示層presentation——信息的語法定義以及它們的關(guān)聯(lián),如加密、解密、轉(zhuǎn)換翻譯、壓縮解壓縮
5、會話層session——不同機器上的用戶之間建立及管理會話
4、傳輸層transport——TCP、UDP協(xié)議
3、網(wǎng)絡(luò)層Internet——IP、ICMP協(xié)議
2、數(shù)據(jù)鏈路層link——ARP協(xié)議、RARP協(xié)議
1、物理層physical——機械、電子、定時接口通信道上的原始比特流傳輸
TCP/IP四層模型模型對應(yīng)的協(xié)議:
4、應(yīng)用層——FTP、HTTP、DNS、SMTP、TELNET協(xié)議
3、傳輸層——TCP、UDP協(xié)議
2、網(wǎng)絡(luò)層——IP、ICMP、ARP協(xié)議、RARP協(xié)議
1、網(wǎng)絡(luò)接口層——Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等
1)應(yīng)用層通過傳輸層進行數(shù)據(jù)通信時,TCP和UDP會遇到同時為多個應(yīng)用程序進程提供并發(fā)服務(wù)的問題。多個TCP連接或多個應(yīng)用程序進程可能需要通過同一個TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)分不同的應(yīng)用程序進程間的網(wǎng)絡(luò)通信和連接,許多計算機操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了稱為套接字 (Socket)的接口(socket是操作系統(tǒng)提供出來的接口),區(qū)分不同應(yīng)用程序進程間的網(wǎng)絡(luò)通信和連接。
生成Socket,主要有3個參數(shù):通信的目的IP地址、使用的傳輸層協(xié)議(TCP或UDP)和使用的端口號。Socket原意是“插座”。通過將這3個參數(shù)結(jié)合起來,與一個“插座”Socket綁定,應(yīng)用層就可以和傳輸層通過socket接口,區(qū)分來自不同應(yīng)用程序進程間的網(wǎng)絡(luò)通信和連接,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。
Socket可以看成在兩個程序進行通訊連接中的一個端點,一個程序?qū)⒁欢涡畔懭隨ocket中,該Socket將這段信息發(fā)送給另外一個Socket中,使這段信息能傳送到其他程序中。
2)Host A上的程序A將一段信息寫入Socket中,Socket的內(nèi)容被Host A的網(wǎng)絡(luò)管理軟件訪問,并將這段信息通過Host A的網(wǎng)絡(luò)接口卡發(fā)送到Host B,Host B的網(wǎng)絡(luò)接口卡接收到這段信息后,傳送給Host B的網(wǎng)絡(luò)管理軟件,網(wǎng)絡(luò)管理軟件將這段信息保存在Host B的Socket中,然后程序B才能在Socket中閱讀這段信息。
要通過互聯(lián)網(wǎng)進行通信,至少需要一對Socket,一個運行于客戶機端,稱之為ClientSocket,另一個運行于服務(wù)器端,稱之為serverSocket。
根據(jù)連接啟動的方式以及本地套接字要連接的目標(biāo),Socket之間的連接過程可以分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認。
服務(wù)器監(jiān)聽:是指serverSocket并不定位具體的ClientSocket,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。
客戶端請求:是指由ClientSocket提出連接請求,要連接的目標(biāo)是serverSocket。為此,ClientSocket必須首先描述它要連接的serverSocket,指出serverSocket的地址和端口號,然后就向serverSocket提出連接請求。
連接確認:是指當(dāng)serverSocket監(jiān)聽到或者說接收到ClientSocket的連接請求,它就響應(yīng)ClientSocket的請求,建立一個新的線程,把serverSocket的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而serverSocket繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他ClientSocket的連接請求。
3)而我們平時說的最多的socket是什么呢,實際上socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API)。通過Socket,我們才能更好地使用TCP/IP協(xié)議。實際上,Socket跟TCP/IP協(xié)議沒有必然的聯(lián)系。Socket編程接口在設(shè)計的時候,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議。所以說,Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口,比如create、listen、connect、accept、send、read和write等等。網(wǎng)絡(luò)有一段關(guān)于socket和TCP/IP協(xié)議關(guān)系的說法比較容易理解:“TCP/IP只是一個協(xié)議棧,就像操作系統(tǒng)的運行機制一樣,必須要具體實現(xiàn),同時還要提供對外的操作接口。這個就像操作系統(tǒng)會提供標(biāo)準的編程接口,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口。”
IP TCP UDP HTTP
IP、TCP UDP、Http、Socket的區(qū)別?
IP協(xié)議對應(yīng)于網(wǎng)絡(luò)層,TCP、UDP協(xié)議對應(yīng)于傳輸層,而HTTP協(xié)議對應(yīng)于應(yīng)用層。
IP協(xié)議是網(wǎng)絡(luò)層協(xié)議,是一種不可靠的、無連接的傳送機制稱為Internet協(xié)議,解決的是主機之間如何通信的問題
TCP、UDP是傳輸層協(xié)議,解決的是數(shù)據(jù)如何傳輸的問題
HTTP是應(yīng)用層協(xié)議,解決的是數(shù)據(jù)如何包裝的問題
Socket本身并不是協(xié)議,而是一個針對TCP或者IP的調(diào)用接口(API),解決的是區(qū)分不同的應(yīng)用程序進程間的網(wǎng)絡(luò)通信和連接,從而實現(xiàn)數(shù)據(jù)傳輸并發(fā)服務(wù)的問題
傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的。而Socket本身不算是協(xié)議,就像上面所說,它只是提供了一個針對TCP協(xié)議或者IP協(xié)議的編程接口。
socket連接、TCP連接、UDP連接、HTTP連接?
創(chuàng)建Socket連接時,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當(dāng)使用TCP/UDP協(xié)議進行連接時,該Socket連接就是一個TCP連接/UDP連接。
通常情況下 Socket 連接就是TCP連接,因此 Socket 連接一旦建立,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開。但在實際網(wǎng)絡(luò)應(yīng)用中,客戶端到服務(wù)器之間的通信往往需要穿越多個中間節(jié)點,例如路由器、網(wǎng)關(guān)、防火墻等,大部分防火墻默認會關(guān)閉長時間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連,因此需要通過輪流詢問告訴網(wǎng)絡(luò),該連接處于活躍狀態(tài)。
而HTTP連接使用的是“請求—響應(yīng)”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務(wù)器發(fā)出請求后,服務(wù)器端才能回復(fù)數(shù)據(jù)。
很多情況下,需要服務(wù)器端主動向客戶端推送數(shù)據(jù),保持客戶端與服務(wù)器數(shù)據(jù)的實時與同步,此時若雙方建立的是Socket連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶端;若雙方建立的是HTTP連接,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端,因此,客戶端定時向服務(wù)器端發(fā)送連接請求,不僅可以保持在線,同時也是在“詢問”服務(wù)器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端。
TCP和UDP的區(qū)別?
1、TCP是面向連接,可靠、穩(wěn)定的,缺點:慢,效率低,占用系統(tǒng)資源高,容易被攻擊。雖然說網(wǎng)絡(luò)的不安全不穩(wěn)定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上)保證了連接的可靠性;
而UDP非面向連接,快,比TCP稍安全,缺點:不可靠、不穩(wěn)定。UDP傳送數(shù)據(jù)前并不與對方建立連接,對接收到的數(shù)據(jù)也不發(fā)送確認信號,發(fā)送端不知道數(shù)據(jù)是否會正確接收,當(dāng)然也不用重發(fā),所以說UDP是無連接的、不可靠的一種數(shù)據(jù)傳輸協(xié)議。
2、也正由于1所說的特點,使得UDP的開銷更小,數(shù)據(jù)傳輸速率更高,因為不必進行收發(fā)數(shù)據(jù)的確認,所以UDP的實時性更好。
知道了TCP和UDP的區(qū)別,就不難理解為何采用TCP傳輸協(xié)議的MSN比采用UDP的QQ傳輸文件慢了,但并不能說QQ的通信是不安全的,
因為程序員可以手動對UDP的數(shù)據(jù)收發(fā)進行驗證,比如發(fā)送方對每個數(shù)據(jù)包進行編號然后由接收方進行驗證啊什么的,
即使是這樣,UDP因為在底層協(xié)議的封裝上沒有采用類似TCP的“三次握手”,而實現(xiàn)了TCP無法達到的傳輸效率。
3、TCP應(yīng)用場景 如:瀏覽器使用HTTP,QQ文件傳輸?shù)?/p>
4、UDP應(yīng)用場景 如:QQ語音、QQ視頻等
5、轉(zhuǎn)發(fā)

TCP三次握手和四次揮手?
tcp三次握手
所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務(wù)器總共發(fā)送3個包。
三次握手的目的是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號和確認號并交換 TCP 窗口大小信息.在 Socket 編程中,客戶端執(zhí)行connect()時,將觸發(fā)三次握手。

首先了解一下幾個標(biāo)志,SYN(synchronous),同步標(biāo)志,ACK (Acknowledgement),即確認標(biāo)志,seq應(yīng)該是Sequence Number,序列號的意思,另外還有四次握手的fin,應(yīng)該是final,表示結(jié)束標(biāo)志。
第一次握手:客戶端發(fā)送一個TCP的SYN標(biāo)志位置1的包指明客戶打算連接的服務(wù)器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里。
第二次握手:服務(wù)器發(fā)回確認包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時,將確認序號(Acknowledgement Number)設(shè)置為客戶的序列號加1以,即X+1。
第三次握手:客戶端再次發(fā)送確認包(ACK) SYN標(biāo)志位為0,ACK標(biāo)志位為1。并且把服務(wù)器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫序列號的+1。
tcp四次揮手
TCP連接的拆除需要發(fā)送四個包,因此稱為四次揮手(four-way handshake)。客戶端或服務(wù)器均可主動發(fā)起揮手動作,在socket編程中,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作。

其實有個問題,為什么連接的時候是三次握手,關(guān)閉的時候卻是四次揮手?
因為當(dāng)Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的,SYN報文是用來同步的。但是關(guān)閉連接時,當(dāng)Server端收到FIN報文時,很可能并不會立即關(guān)閉SOCKET,所以只能先回復(fù)一個ACK報文,告訴Client端,” 你發(fā)的FIN報文我收到了”。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文,因此不能一起發(fā)送。故需要四步握手。
tcp socket和udp socket的具體實現(xiàn)


常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的 Socket,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報式 Socket 是一種非面向連接的 Socket ,對應(yīng)于非面向連接的UDP服務(wù)應(yīng)用。

浙公網(wǎng)安備 33010602011771號