1:物理層:其實(shí)就是轉(zhuǎn)換一些電子信號(hào)為0和1組成的比特流的形式;沒有物理層比特流就無法在物理介質(zhì)中傳輸;
2:數(shù)據(jù)鏈路層:它定義了通過通信介質(zhì)鏈接的設(shè)備之間進(jìn)行數(shù)據(jù)傳輸?shù)囊?guī)范;數(shù)據(jù)鏈路層數(shù)據(jù)不在以0和1的形式存在了,而是被分割成幀的概念;
它有兩個(gè)重要的概念:
a:MAC地址:它是被燒錄到網(wǎng)卡中的48比特的一串?dāng)?shù)字,在世界范圍內(nèi)是唯一的,它用來區(qū)分節(jié)點(diǎn),一旦指定了Mac地址就不會(huì)不知道往哪個(gè)設(shè)備傳輸?shù)那闆r。
b:分組交換:就是將數(shù)據(jù)較大的分成若干小的的數(shù)據(jù),然后依次發(fā)送。這樣做的原因是不同的數(shù)據(jù)鏈數(shù)層有不同的MTU最大的傳輸單元。
拓展:交換機(jī)這一設(shè)備就是出現(xiàn)在數(shù)據(jù)鏈路層,它有不同的端口,可以連接不同的設(shè)備;它根據(jù)每個(gè)針中的Mac地址來決定給哪個(gè)端口發(fā)數(shù)據(jù),要參照轉(zhuǎn)發(fā)表。
強(qiáng)調(diào)的是:數(shù)據(jù)鏈路層的定義:它是定義了同一種通信介質(zhì)兩端的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)傳輸?shù)囊?guī)范;它存在的意義就是如果沒有數(shù)據(jù)鏈路層,那數(shù)據(jù)只能以數(shù)據(jù)流的形式存在于通信介質(zhì)中,而不知道該往哪發(fā)送,過長(zhǎng)的數(shù)據(jù)流可能無法發(fā)送。
3:網(wǎng)絡(luò)層 :它對(duì)應(yīng)的是IP協(xié)議,它主要的作用是實(shí)現(xiàn)終端節(jié)點(diǎn)的通信;當(dāng)然網(wǎng)絡(luò)層中還有ARP(獲取MAC地址)和ICMP協(xié)議(數(shù)據(jù)發(fā)送異常通知)等等
數(shù)據(jù)鏈路層是實(shí)現(xiàn)在同一種數(shù)據(jù)鏈路下的包傳遞,而網(wǎng)絡(luò)層則是實(shí)現(xiàn)不同的數(shù)據(jù)鏈路層的包傳遞:wifi 以太網(wǎng)就是不同的數(shù)據(jù)鏈路;
它有三大的模塊:1:IP尋址,2:路由 3:IP分包
IP尋址:一種適用于網(wǎng)絡(luò)層的通訊對(duì)端信息的地址;舉例:下班回家,公司和家就是兩個(gè)對(duì)端,我需要轉(zhuǎn)3,8號(hào)地鐵它們就是數(shù)據(jù)鏈路層,地鐵轉(zhuǎn)線的節(jié)點(diǎn)就是MAC地址;
IP地址有32位正整數(shù)構(gòu)成,外在形式分為四個(gè)部分;功能上分為兩大部分:網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí);
路由:將分組的數(shù)據(jù)發(fā)送到目標(biāo)地址的功能,路由控制器中保存著一張表,可以在表中查找下一個(gè)路由器的地址;
分包重組:數(shù)據(jù)鏈數(shù)層有最大的MTU,那IP協(xié)議也有分片和重組,分片有發(fā)送端主機(jī)和路由器負(fù)責(zé),重組則有接收端負(fù)責(zé),由于分片會(huì)加重路由器的負(fù)擔(dān),所以主機(jī)就獲取整個(gè)路徑中的所有的數(shù)據(jù)鏈路的最小MTU,那傳輸過程中每一個(gè)路由器都不會(huì)再分片操作了;
IP的拓展:
DNS解析:由于通信雙方的IP地址是一串的數(shù)字,不方便記憶,所以就誕生了域名幫助我們記憶。域名是一種為了識(shí)別主機(jī)名稱和機(jī)構(gòu)名的具有分層的名稱,比如在域名 neu.edu.cn中,neu是主機(jī)名,edu 和 cn 是不同層次下的機(jī)構(gòu)名。域名和IP地址都可以唯一對(duì)應(yīng)一臺(tái)主機(jī),DNS協(xié)議就是轉(zhuǎn)換IP地址為容易識(shí)別記憶的域名。
ARP協(xié)議:獲取Mac地址的協(xié)議:MAC 和 IP 地址雖然看上去功能類似(都是用于唯一區(qū)分主機(jī)),但是兩者缺一不可。如果只有 IP 地址,雖然可以跳過 ARP,直接在數(shù)據(jù)鏈路上發(fā)一個(gè)廣播,但是這僅適用于通信雙方處于同一個(gè)數(shù)據(jù)鏈路下的情況。如果雙方處于不同的數(shù)據(jù)鏈路,數(shù)據(jù)報(bào)無法穿透中間的路由器。(借鑒別人的話)
NAT NAPT一種將局域網(wǎng)的私有地址轉(zhuǎn)換成全局的IP地址的技術(shù)
它為了解決不同網(wǎng)段內(nèi)同一個(gè)IP地址時(shí)怎么通信的問題。
4:傳輸層:TCP UDP協(xié)議
TCP:它是面向有連接的協(xié)議,也就是說使用TCP協(xié)議是發(fā)送方和接收方必須建立連接,一般情況下三次建立連接,四次斷開連接;
建立連接后由于TCP有數(shù)據(jù)重傳和流量控制等功能,TCP能夠正確的處理丟包的問題保證接收方能收到數(shù)據(jù),但是他的規(guī)范比較多,效率不及UDP,所以實(shí)時(shí)的視頻音頻傳輸不太適合;
UDP:面向無連接的協(xié)議,它只管發(fā)送數(shù)據(jù)而不管對(duì)方接受與否,這種特性反而適合多播,視頻播放,及時(shí)個(gè)別的丟包也不會(huì)影響整體的效果;
傳輸層主要是實(shí)現(xiàn)應(yīng)用程序之間的通信,所以傳輸層新增了三個(gè)要素:目標(biāo)端口,源端口,協(xié)議號(hào),加上IP協(xié)議兩大關(guān)鍵的要素:源IP地址,目標(biāo)IP地址,這五個(gè)要素能識(shí)別一個(gè)通信;
協(xié)議號(hào)則是區(qū)分 TCP UDP的;
TCP:三次的握手;為什么三次呢????
資料說要時(shí)刻記住網(wǎng)絡(luò)是不穩(wěn)定的,數(shù)據(jù)包是可能丟失的,假設(shè)沒有第三次確認(rèn),客戶端向服務(wù)端發(fā)送了 SYN,請(qǐng)求建立連接。由于延遲,服務(wù)端沒有及時(shí)收到這個(gè)包。于是客戶端重新發(fā)送一個(gè) SYN 包。回憶一下介紹 TCP 首部時(shí)提到的序列號(hào),這兩個(gè)包的序列號(hào)顯然是相同的。
假設(shè)服務(wù)端接收到了第二個(gè) SYN 包,建立了通信,一段時(shí)間后通信結(jié)束,連接被關(guān)閉。這時(shí)候最初被發(fā)送的 SYN 包剛剛抵達(dá)服務(wù)端,服務(wù)端又會(huì)發(fā)送一次 ACK 確認(rèn)。由于兩次握手就建立了連接,此時(shí)的服務(wù)端就會(huì)建立一個(gè)新的連接,然而客戶端覺得自己并沒有請(qǐng)求建立連接,所以就不會(huì)向服務(wù)端發(fā)送數(shù)據(jù)。從而導(dǎo)致服務(wù)端建立了一個(gè)空的連接,白白浪費(fèi)資源。三次握手情況下客戶端會(huì)收到一個(gè)重復(fù)的ack,它會(huì)拋棄它不會(huì)建立連接。不進(jìn)行第三次的握手。
三次握手其實(shí)解決的是第二次握手?jǐn)?shù)據(jù)包丟失的問題,如果第三步的確認(rèn)包丟失了怎么辦呢?
TCP處理丟包的一般辦法是服務(wù)端會(huì)重傳數(shù)據(jù)包給客戶端,直到收到ACK為止,這種做法會(huì)導(dǎo)致SYN的泛紅攻擊,比如多個(gè)偽造的IP地址在服務(wù)端返回ACK確認(rèn)后故意不發(fā)ACK過去,從而使得服務(wù)器不斷的重發(fā)ACK,導(dǎo)致服務(wù)器處于半連接的狀態(tài),最后消耗過多的CPU和內(nèi)存資源導(dǎo)致死機(jī);
正確的處理做法其實(shí)是服務(wù)端發(fā)送RST報(bào)文,進(jìn)入close的狀態(tài),這表示連接的信息被初始化,原有的TCP的通道不能繼續(xù)的進(jìn)行,如果客戶端想重新建立連接必須從第一步開始;
四次揮手的最后一步確認(rèn)關(guān)閉丟失怎辦呢???
實(shí)際上呢客戶端在第三步收到FIN包呢會(huì)設(shè)置一個(gè)計(jì)時(shí)器,等待一段相當(dāng)長(zhǎng)的時(shí)間,如果客戶端的ACK包丟失,服務(wù)端會(huì)重發(fā)FIN并重設(shè)計(jì)時(shí)器,假設(shè)在計(jì)時(shí)器失效前FIN包都沒有到達(dá)客戶端,那客戶端就進(jìn)入了close的狀態(tài),那從而導(dǎo)致服務(wù)端永遠(yuǎn)也無法收到ACK確認(rèn)也就無法關(guān)閉了。
其實(shí)TCP區(qū)別于UDP最大的就是前者有數(shù)據(jù)丟包重發(fā)和流量控制;
TCP窗口的概念:
按照之前的理論,在數(shù)據(jù)包發(fā)出后,直至 ACK 確認(rèn)返回以前,發(fā)送端都無法發(fā)送數(shù)據(jù),而且包的往返時(shí)間越長(zhǎng),網(wǎng)絡(luò)利用效率和通信性能就越低。前兩張圖片形象的解釋了這一點(diǎn)。
為了解決這個(gè)問題,TCP 使用了“窗口”這個(gè)概念。窗口具有大小,它表示無需等待確認(rèn)應(yīng)答就可以繼續(xù)發(fā)送數(shù)據(jù)包的最大數(shù)量。引入窗口概念后,數(shù)據(jù)要緩存一下不能立即的丟棄以備重發(fā);
如果出現(xiàn)丟包那就是TCP最擅長(zhǎng)處理的問題了,比如窗口為4 ACK 收到1001 4001那我們完全的可以相信中間的兩個(gè)也成功的接收了,不然ACK不會(huì)相加,如果沒有窗口那就需要重傳中間的兩個(gè)包了,也就是那空間換時(shí)間。
流量控制:也就是設(shè)置窗口中的大小,如果窗口過大那會(huì)導(dǎo)致癱瘓,那程序會(huì)在啟動(dòng)的時(shí)候通過慢啟動(dòng)的算法算出窗口大小,對(duì)發(fā)送數(shù)據(jù)進(jìn)行流量的控制。
HTTP:最頂層的應(yīng)用層協(xié)議,瀏覽器訪問網(wǎng)頁就是直接使用了HTTP,使用HTTP協(xié)議時(shí)客戶端需要先跟服務(wù)端的80端口建立tcp連接,然后在這個(gè)連接的基礎(chǔ)上進(jìn)行請(qǐng)求和應(yīng)答以及數(shù)據(jù)的交換。
http分1.0 1.1的版本,前者呢需要每次請(qǐng)求和應(yīng)答都要建立TCP的連接,后者不需要;
由html協(xié)議加載出來的網(wǎng)頁,通常是有html的語言來描述的,它是一段純文本,它算是表現(xiàn)層了;
Get Post請(qǐng)求:
GET 請(qǐng)求通常用于查詢、獲取數(shù)據(jù),而 POST 請(qǐng)求則用于發(fā)送數(shù)據(jù),除了用途上的區(qū)別,它們還有以下這些不同:
GET 請(qǐng)求可以被緩存,可以被收藏為書簽,但 POST 不行。
GET 請(qǐng)求會(huì)保留在瀏覽器的歷史記錄中,POST 不會(huì)。
GET 請(qǐng)求的長(zhǎng)度有限制(不同的瀏覽器不一樣,大約在幾 Kb 左右),URL 的數(shù)據(jù)類型只能是 ASCII 字符,POST 請(qǐng)求沒有限制。
GET 請(qǐng)求的參數(shù)在 URL 中,因此絕不能用 GET 請(qǐng)求傳輸敏感數(shù)據(jù)。POST 請(qǐng)求數(shù)據(jù)則寫在 HTTP 的請(qǐng)求頭中,安全性略高于 GET 請(qǐng)求。
HTTP是一種無狀態(tài)的連接??蛻舳嗣看巫x取web的信息都會(huì)被認(rèn)為是一個(gè)新的會(huì)話;但是有時(shí)我們需要長(zhǎng)久的保存一些信息,這些就有cookie session來做了;
cookie保存在客戶端,session呢保存在服務(wù)端
HTTPS則相對(duì)HTTP是安全的,它充分利用了對(duì)稱和非對(duì)稱的加密。
socket:它不是協(xié)議,它是TCP/IP協(xié)議中的應(yīng)用層和傳輸層之間的抽象,是它們的一個(gè)封裝,是一個(gè)調(diào)用的API,通過socket我們可以使用TCP .IP。系統(tǒng)提供的一種網(wǎng)絡(luò)通信的辦法;
socket描述了一個(gè)端口port對(duì),一個(gè)IP對(duì),它簡(jiǎn)化了程序員的操作指導(dǎo)對(duì)方的IP,端口,就可以給對(duì)方發(fā)消息,所以socket一定是包含了雙方 客戶端和服務(wù)端。
Socket原理
套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。
應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí),TCP會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過同一個(gè) TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應(yīng)用層可以和傳輸層通過Socket接口,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。
Socket連接
建立Socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket。
套接字之間的連接過程分為三個(gè)步驟:
服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請(qǐng)求
客戶端請(qǐng)求:指客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求
連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請(qǐng)求時(shí),就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求
參考文章:
原文鏈接:http://www.itdecent.cn/p/06f8b9111a56
原文鏈接:http://www.itdecent.cn/p/dc456cf57e06