做網(wǎng)絡(luò) 批發(fā)的網(wǎng)站seo運(yùn)營(yíng)推廣
OSI七層模型
七層模型一般指開(kāi)放系統(tǒng)互連參考模型,開(kāi)放系統(tǒng)互連參考模型 (Open System Interconnect 簡(jiǎn)稱OSI),OSI參考模型是具有7個(gè)層次的框架,自底向上的7個(gè)層次分別是物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層。
背景:生活中每個(gè)地方都有自己的方言,而大家如果都將方言肯定就亂了,聽(tīng)不懂,為了讓大家都能夠暢通的交流通信,從而推出普通話標(biāo)準(zhǔn),大家都用普通話標(biāo)準(zhǔn),這樣就能暢通無(wú)阻的通信了。而網(wǎng)絡(luò)中的節(jié)點(diǎn)也是一樣,任何網(wǎng)絡(luò)中的節(jié)點(diǎn)只要都遵循這個(gè)模型,然后物理上連接起來(lái),它們之間都可以互相通信。
TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/網(wǎng)際協(xié)議)是指能夠在多個(gè)不同網(wǎng)絡(luò)間實(shí)現(xiàn)信息傳輸?shù)膮f(xié)議簇。TCP/IP協(xié)議不僅僅指的是TCP?和IP兩個(gè)協(xié)議,而是指一個(gè)由FTP、SMTP、TCP、UDP、IP等協(xié)議構(gòu)成的協(xié)議簇, 只是因?yàn)樵赥CP/IP協(xié)議中TCP協(xié)議和IP協(xié)議最具代表性,所以被稱為TCP/IP協(xié)議。?[1]
TCP/IP協(xié)議在一定程度上參考了OSI的體系結(jié)構(gòu)。OSI模型共有七層,從下到上分別是物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層。但是這顯然是有些復(fù)雜的,所以在TCP/IP協(xié)議中,它們被簡(jiǎn)化為了四個(gè)層次。只有四層體系結(jié)構(gòu)的TCP/IP協(xié)議,與有七層體系結(jié)構(gòu)的OSI相比要簡(jiǎn)單了不少,也正是這樣,TCP/IP協(xié)議在實(shí)際的應(yīng)用中效率更高,成本更低。
OSI是定義了一個(gè)理論的通信模型,而TCP/IP則是實(shí)現(xiàn)了這個(gè)理論,在這個(gè)基礎(chǔ)上進(jìn)行簡(jiǎn)化的一個(gè)通信協(xié)議。
OSI七層網(wǎng)絡(luò)模型 | TCP/IP四層網(wǎng)絡(luò)模型 | 對(duì)應(yīng)協(xié)議 | 對(duì)應(yīng)設(shè)備 |
應(yīng)用層 | 應(yīng)用層 | HTTP、FTP、SFTP、TELNET、SMTP、WebSocket | 計(jì)算機(jī) |
表示層 | |||
會(huì)話層 | |||
傳輸層 | 傳輸層 | TCP、UDP | 防火墻 |
網(wǎng)絡(luò)層 | 網(wǎng)絡(luò)層 | IP、ICMP、OSPF、EIGRP、IGMP | 路由器 |
數(shù)據(jù)鏈路層 | 網(wǎng)絡(luò)接口層 | SLIP、CSLIP、PPP、MTU | 交換機(jī) |
物理層 | ISO2110、IEEE802 | 集線器 |
應(yīng)用層
應(yīng)用層:應(yīng)用層是TCP/IP協(xié)議的第一層,是直接為應(yīng)用進(jìn)程提供服務(wù)的。
(1)對(duì)不同種類的應(yīng)用程序它們會(huì)根據(jù)自己的需要來(lái)使用應(yīng)用層的不同協(xié)議,郵件傳輸應(yīng)用使用了SMTP協(xié)議、萬(wàn)維網(wǎng)應(yīng)用使用了HTTP協(xié)議、遠(yuǎn)程登錄服務(wù)應(yīng)用使用了有TELNET協(xié)議。?[1]
(2)應(yīng)用層還能加密、解密、格式化數(shù)據(jù)。?[1]
(3)應(yīng)用層可以建立或解除與其他節(jié)點(diǎn)的聯(lián)系,這樣可以充分節(jié)省網(wǎng)絡(luò)資源。?[1]
HTTP
HTTP_百度百科 (baidu.com)
超文本傳輸協(xié)議(Hypertext Transfer Protocol,HTTP)是一個(gè)簡(jiǎn)單的請(qǐng)求-響應(yīng)協(xié)議,它通常運(yùn)行在TCP之上。它指定了客戶端可能發(fā)送給服務(wù)器什么樣的消息以及得到什么樣的響應(yīng)。請(qǐng)求和響應(yīng)消息的頭以ASCII形式給出;而消息內(nèi)容則具有一個(gè)類似MIME的格式。超文本傳輸協(xié)議是一種用于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用層協(xié)議,是萬(wàn)維網(wǎng)WWW(World Wide Web)的數(shù)據(jù)通信的基礎(chǔ)。
通信過(guò)程
詳情見(jiàn)TCP/IP通信過(guò)程。
報(bào)文格式
請(qǐng)求行 - 通用信息頭 - 請(qǐng)求頭 - 實(shí)體頭 - 報(bào)文主體
狀態(tài)行 - 通用信息頭 - 響應(yīng)頭 - 實(shí)體頭 - 報(bào)文主體
WebSocket
WebSocket_百度百科 (baidu.com)
是一個(gè)通信協(xié)議,WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。
WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
WebSocket 是獨(dú)立的、創(chuàng)建在 TCP 上的協(xié)議。
為了創(chuàng)建Websocket連接,需要通過(guò)瀏覽器發(fā)出請(qǐng)求,之后服務(wù)器進(jìn)行回應(yīng),這個(gè)過(guò)程通常稱為“握手”(handshaking)。Websocket 通過(guò)HTTP/1.1 協(xié)議的101狀態(tài)碼進(jìn)行握手。
只需要進(jìn)行一次握手連接,后續(xù)就可以通過(guò)這個(gè)連接一直通信。
與HTTP比較
WebSocket只需要進(jìn)行一次握手連接,然后就可以進(jìn)行通信。而HTTP一次握手只能通信一次,每次通信都需要進(jìn)行握手。
WebSocket只在握手的時(shí)候是使用http協(xié)議,在連接創(chuàng)建后,服務(wù)器和客戶端之間交換數(shù)據(jù)時(shí),用于協(xié)議控制的數(shù)據(jù)包頭部相對(duì)較小。而HTTP每次都要攜帶完整的頭部,開(kāi)銷比較大。
實(shí)時(shí)性更強(qiáng),由于服務(wù)端可以監(jiān)控變化數(shù)據(jù)主動(dòng)發(fā)送數(shù)據(jù)給客戶端。而HTTP一般只能采用客戶端輪詢的方式實(shí)現(xiàn),延遲更大。
更好的二進(jìn)制支持。Websocket定義了二進(jìn)制幀,相對(duì)HTTP,可以更輕松地處理二進(jìn)制內(nèi)容。
以下兩點(diǎn)暫時(shí)沒(méi)用到過(guò):
可以支持?jǐn)U展。Websocket定義了擴(kuò)展,用戶可以擴(kuò)展協(xié)議、實(shí)現(xiàn)部分自定義的子協(xié)議。如部分瀏覽器支持壓縮等。
更好的壓縮效果。相對(duì)于HTTP壓縮,Websocket在適當(dāng)?shù)臄U(kuò)展支持下,可以沿用之前內(nèi)容的上下文,在傳遞類似的數(shù)據(jù)時(shí),可以顯著地提高壓縮率。
傳輸層
傳輸層:作為TCP/IP協(xié)議的第二層,傳輸層在整個(gè)TCP/IP協(xié)議中起到了中流砥柱的作用。且在傳輸層中,TCP和UDP也同樣起到了中流砥柱的作用。
TCP
TCP(傳輸控制協(xié)議)_百度百科 (baidu.com)
https://www.cnblogs.com/jojop/p/14111160.html
傳輸控制協(xié)議(TCP,Transmission Control Protocol)是為了在不可靠的互聯(lián)網(wǎng)絡(luò)上提供可靠的端到端字節(jié)流而專門設(shè)計(jì)的一個(gè)傳輸協(xié)議。
TCP是一對(duì)一進(jìn)行通信,廣播和多播不適合用TCP
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層:網(wǎng)絡(luò)層在TCP/IP協(xié)議中的位于第三層。在TCP/IP協(xié)議中網(wǎng)絡(luò)層可以進(jìn)行網(wǎng)絡(luò)連接的建立和終止以及IP地址的尋找等功能。
網(wǎng)絡(luò)接口層
網(wǎng)絡(luò)接口層:在TCP/IP協(xié)議中,網(wǎng)絡(luò)接口層位于第四層。由于網(wǎng)絡(luò)接口層兼并了物理層和數(shù)據(jù)鏈路層所以,網(wǎng)絡(luò)接口層既是傳輸數(shù)據(jù)的物理媒介,也可以為網(wǎng)絡(luò)層提供一條準(zhǔn)確無(wú)誤的線路。
通信過(guò)程
TCP/IP協(xié)議工作原理和工作流程_tcp工作原理-CSDN博客
https://www.cnblogs.com/jojop/p/14111160.html
1、以web應(yīng)用為例,在發(fā)送數(shù)據(jù)通信之前先進(jìn)行三次握手:
①客戶端發(fā)送SYN包
- 應(yīng)用層:客戶端應(yīng)用程序(如瀏覽器)請(qǐng)求建立連接。
- 傳輸層:TCP 協(xié)議創(chuàng)建一個(gè) SYN 數(shù)據(jù)段。這個(gè)數(shù)據(jù)段的 SYN 標(biāo)志位被設(shè)置為 1,表示這是一個(gè)同步序列編號(hào)的請(qǐng)求,包含一個(gè)初始序列號(hào)(例如
seq = x
)。- 網(wǎng)絡(luò)層:IP 協(xié)議將 SYN 數(shù)據(jù)段封裝成 IP 數(shù)據(jù)包,并添加 IP 頭部信息(如源 IP 地址、目標(biāo) IP 地址)。
- 鏈路層:鏈路層將 IP 數(shù)據(jù)包封裝成數(shù)據(jù)幀,并添加鏈路層頭部信息(如源 MAC 地址、目標(biāo) MAC 地址)。
發(fā)送數(shù)據(jù):[鏈路層頭部][IP 頭部][TCP 頭部 (SYN, seq = x)]
②服務(wù)端響應(yīng)SYN-ACK包
- 鏈路層:服務(wù)器的網(wǎng)卡接收到數(shù)據(jù)幀,并將其傳遞到網(wǎng)絡(luò)層。
- 網(wǎng)絡(luò)層:IP 協(xié)議去除 IP 頭部,并將 IP 數(shù)據(jù)包傳遞到傳輸層。
- 傳輸層:TCP 協(xié)議識(shí)別 SYN 數(shù)據(jù)段,生成一個(gè) SYN-ACK 數(shù)據(jù)段。這個(gè)數(shù)據(jù)段的 SYN 和 ACK 標(biāo)志位被設(shè)置為 1,包含服務(wù)器的初始序列號(hào)(例如
seq = y
)和對(duì)客戶端序列號(hào)的確認(rèn)號(hào)(ack = x + 1
)。- 網(wǎng)絡(luò)層:IP 協(xié)議將 SYN-ACK 數(shù)據(jù)段封裝成 IP 數(shù)據(jù)包。
- 鏈路層:鏈路層將 IP 數(shù)據(jù)包封裝成數(shù)據(jù)幀。
發(fā)送數(shù)據(jù):[鏈路層頭部][IP 頭部][TCP 頭部 (SYN, ACK, seq = y, ack = x + 1)]
③客戶端發(fā)送ACK包
- 鏈路層:客戶端的網(wǎng)卡接收到數(shù)據(jù)幀,并將其傳遞到網(wǎng)絡(luò)層。
- 網(wǎng)絡(luò)層:IP 協(xié)議去除 IP 頭部,并將 IP 數(shù)據(jù)包傳遞到傳輸層。
- 傳輸層:TCP 協(xié)議識(shí)別 SYN-ACK 數(shù)據(jù)段,生成一個(gè) ACK 數(shù)據(jù)段。這個(gè)數(shù)據(jù)段的 ACK 標(biāo)志位被設(shè)置為 1,包含對(duì)服務(wù)器序列號(hào)的確認(rèn)號(hào)(
ack = y + 1
)。- 網(wǎng)絡(luò)層:IP 協(xié)議將 ACK 數(shù)據(jù)段封裝成 IP 數(shù)據(jù)包。
- 鏈路層:鏈路層將 IP 數(shù)據(jù)包封裝成數(shù)據(jù)幀。
發(fā)送數(shù)據(jù):[鏈路層頭部][IP 頭部][TCP 頭部 (ACK, seq = x + 1, ack = y + 1)]
2、通信
原數(shù)據(jù)從應(yīng)用層產(chǎn)生,然后往下經(jīng)過(guò)每一層會(huì)根據(jù)協(xié)議封裝數(shù)據(jù),到了接收方這邊從下往上經(jīng)過(guò)每一層會(huì)根據(jù)對(duì)應(yīng)的協(xié)議對(duì)數(shù)據(jù)進(jìn)行拆包然后往上傳遞直到應(yīng)用層收到原數(shù)據(jù)。
圖上每一層虛線就是在數(shù)據(jù)封包和解包經(jīng)過(guò)這一層都會(huì)遵守一樣的協(xié)議進(jìn)行數(shù)據(jù)的封包和解包,比如HTTP協(xié)議,但請(qǐng)求報(bào)文經(jīng)過(guò)層層解包到了接收方的的應(yīng)用層,會(huì)根據(jù)HTTP請(qǐng)求報(bào)文格式:請(qǐng)求行 - 通用信息頭 - 請(qǐng)求頭 - 實(shí)體頭 - 報(bào)文主體 將數(shù)據(jù)進(jìn)行提取,這就是HTTP協(xié)議的體現(xiàn),應(yīng)用層雙方都按這個(gè)報(bào)文格式進(jìn)行數(shù)據(jù)的封裝和解包。
這樣讓人感覺(jué)就好像每一層都在直接通信,但實(shí)際上每一層不會(huì)直接對(duì)接通信。
3、四次揮手?jǐn)嚅_(kāi)連接
缺陷
像OSl模型一樣,TCP/IP模型和協(xié)議也有自己的問(wèn)題。
(1)該模型沒(méi)有明顯地區(qū)分服務(wù)、接口和協(xié)議的概念。因此,對(duì)于使用新技術(shù)來(lái)設(shè)計(jì)新網(wǎng)絡(luò),TCP/IP模型不是一個(gè)太好的模板。?[5]
(2)TCP/IP模型完全不是通用的,并且不適合描述除TCP/IP模型之外的任何協(xié)議棧。?[5]
(3)鏈路層并不是通常意義上的一層。它是一個(gè)接口,處于網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層之間。接口和層間的區(qū)別是很重要的。?[5]
(4)TCP/IP模型不區(qū)分物理層和數(shù)據(jù)鏈路層。這兩層完全不同,物理層必須處理銅纜、光纖和無(wú)線通信的傳輸特征;而數(shù)據(jù)鏈路層的工作是確定幀的開(kāi)始和結(jié)束,并且按照所需的可靠程度把幀從一端發(fā)送到另一端。?[5]
Socket
????????所謂套接字(Socket),就是對(duì)網(wǎng)絡(luò)中不同主機(jī)上的應(yīng)用進(jìn)程之間進(jìn)行雙向通信的端點(diǎn)的抽象。一個(gè)套接字就是網(wǎng)絡(luò)上進(jìn)程通信的一端,提供了應(yīng)用層進(jìn)程利用網(wǎng)絡(luò)協(xié)議交換數(shù)據(jù)的機(jī)制。從所處的地位來(lái)講,套接字上聯(lián)應(yīng)用進(jìn)程,下聯(lián)網(wǎng)絡(luò)協(xié)議棧,是應(yīng)用程序通過(guò)網(wǎng)絡(luò)協(xié)議進(jìn)行通信的接口,是應(yīng)用程序與網(wǎng)絡(luò)協(xié)議棧進(jìn)行交互的接口?。
????????Socket(套接字)可以看成是兩個(gè)網(wǎng)絡(luò)應(yīng)用程序進(jìn)行通信時(shí),各自通信連接中的端點(diǎn),套接字主要有目標(biāo)IP、傳輸層使用的傳輸協(xié)議、傳輸層使用的端口號(hào)這3個(gè)重要參數(shù)。
主要類型
1.流套接字(SOCK_STREAM)
????????流套接字用于提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù)。該服務(wù)將保證數(shù)據(jù)能夠?qū)崿F(xiàn)無(wú)差錯(cuò)、無(wú)重復(fù)送,并按順序接收。流套接字之所以能夠?qū)崿F(xiàn)可靠的數(shù)據(jù)服務(wù),原因在于其使用了傳輸控制協(xié)議,即TCP(The?Transmission?Control Protocol)協(xié)議。
2.數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)
????????數(shù)據(jù)報(bào)套接字提供一種無(wú)連接、不可靠的服務(wù)。該服務(wù)并不能保證數(shù)據(jù)傳輸?shù)目煽啃?數(shù)據(jù)有可能在傳輸過(guò)程中丟失或出現(xiàn)數(shù)據(jù)重復(fù),且無(wú)法保證順序地接收到數(shù)據(jù)。數(shù)據(jù)報(bào)套接字使用UDP( User DatagramProtocol)協(xié)議進(jìn)行數(shù)據(jù)的傳輸。由于數(shù)據(jù)報(bào)套接字不能保證數(shù)據(jù)傳輸?shù)目煽啃?#xff0c;對(duì)于有可能出現(xiàn)的數(shù)據(jù)丟失情況,需要在程序中做相應(yīng)的處理。
3.原始套接字(SOCK_RAW)
????????原始套接字與標(biāo)準(zhǔn)套接字(標(biāo)準(zhǔn)套接字指的是前面介紹的流套接字和數(shù)據(jù)報(bào)套接字)的區(qū)別在于:原始套接字可以讀寫內(nèi)核沒(méi)有處理的IP數(shù)據(jù)包,而流套接字只能讀取TCP協(xié)議的數(shù)據(jù),數(shù)據(jù)報(bào)套接字只能讀取UDP協(xié)議的數(shù)據(jù)。因此,如果要訪問(wèn)其他協(xié)議發(fā)送的數(shù)據(jù)必須使用原始套接?[3]。原始套接字主要用于一些協(xié)議的開(kāi)發(fā),可以進(jìn)行比較底層的操作。
Java中:java.net.Socket類代表創(chuàng)建TCP連接;java.net.DatagramSocket類代表創(chuàng)建UDP連接
工作流程
要通過(guò)互聯(lián)網(wǎng)進(jìn)行通信,至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱之為 Client Socket,另一個(gè)運(yùn)行于服務(wù)器端,稱之為 Server Socket?。
1.服務(wù)器監(jiān)聽(tīng):所謂服務(wù)器監(jiān)聽(tīng),是指服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)?[3]。
2.客戶端請(qǐng)求:所謂客戶端請(qǐng)求,是指由客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端接字提出連接請(qǐng)求?[3]。
3.連接確認(rèn):所謂連接確認(rèn),是指當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶端套接字的連接請(qǐng)求,就會(huì)響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,并把服務(wù)器端套接字的描述發(fā)送給客戶端。一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),接收其他客戶端套接字的連接請(qǐng)求?[3]。
數(shù)據(jù)物理網(wǎng)絡(luò)傳輸
TCP/IP協(xié)議 (圖解+秒懂+史上最全) - 瘋狂創(chuàng)客圈 - 博客園 (cnblogs.com)