1:物理層:其實(shí)就是轉(zhuǎn)換一些電子信號(hào)為0和1組成的比特流的形式鸠匀;沒(méi)有物理層比特流就無(wú)法在物理介質(zhì)中傳輸疙筹;
2:數(shù)據(jù)鏈路層:它定義了通過(guò)通信介質(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)是唯一的,它用來(lá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地址來(lái)決定給哪個(gè)端口發(fā)數(shù)據(jù),要參照轉(zhuǎn)發(fā)表褐耳。
強(qiáng)調(diào)的是:數(shù)據(jù)鏈路層的定義:它是定義了同一種通信介質(zhì)兩端的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)傳輸?shù)囊?guī)范诈闺;它存在的意義就是如果沒(méi)有數(shù)據(jù)鏈路層,那數(shù)據(jù)只能以數(shù)據(jù)流的形式存在于通信介質(zhì)中铃芦,而不知道該往哪發(fā)送雅镊,過(guò)長(zhǎng)的數(shù)據(jù)流可能無(wú)法發(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霍弹,那傳輸過(guò)程中每一個(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 地址,雖然可以跳過(guò) ARP硅蹦,直接在數(shù)據(jù)鏈路上發(fā)一個(gè)廣播荣德,但是這僅適用于通信雙方處于同一個(gè)數(shù)據(jù)鏈路下的情況。如果雙方處于不同的數(shù)據(jù)鏈路童芹,數(shù)據(jù)報(bào)無(wú)法穿透中間的路由器涮瞻。(借鑒別人的話)
NAT NAPT一種將局域網(wǎng)的私有地址轉(zhuǎn)換成全局的IP地址的技術(shù)
它為了解決不同網(wǎng)段內(nèi)同一個(gè)IP地址時(shí)怎么通信的問(wèn)題。
4:傳輸層:TCP UDP協(xié)議
TCP:它是面向有連接的協(xié)議假褪,也就是說(shuō)使用TCP協(xié)議是發(fā)送方和接收方必須建立連接署咽,一般情況下三次建立連接,四次斷開(kāi)連接生音;
建立連接后由于TCP有數(shù)據(jù)重傳和流量控制等功能宁否,TCP能夠正確的處理丟包的問(wèn)題保證接收方能收到數(shù)據(jù),但是他的規(guī)范比較多缀遍,效率不及UDP慕匠,所以實(shí)時(shí)的視頻音頻傳輸不太適合;
UDP:面向無(wú)連接的協(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:三次的握手立帖;為什么三次呢眼溶??晓勇?堂飞?
資料說(shuō)要時(shí)刻記住網(wǎng)絡(luò)是不穩(wěn)定的,數(shù)據(jù)包是可能丟失的绑咱,假設(shè)沒(méi)有第三次確認(rèn)绰筛,客戶端向服務(wù)端發(fā)送了 SYN,請(qǐng)求建立連接描融。由于延遲铝噩,服務(wù)端沒(méi)有及時(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è)新的連接,然而客戶端覺(jué)得自己并沒(méi)有請(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ù)包丟失的問(wèn)題噪叙,如果第三步的確認(rèn)包丟失了怎么辦呢矮锈?
TCP處理丟包的一般辦法是服務(wù)端會(huì)重傳數(shù)據(jù)包給客戶端,直到收到ACK為止睁蕾,這種做法會(huì)導(dǎo)致SYN的泛紅攻擊苞笨,比如多個(gè)偽造的IP地址在服務(wù)端返回ACK確認(rèn)后故意不發(fā)ACK過(guò)去,從而使得服務(wù)器不斷的重發(fā)ACK子眶,導(dǎo)致服務(wù)器處于半連接的狀態(tài)瀑凝,最后消耗過(guò)多的CPU和內(nèi)存資源導(dǎo)致死機(jī);
正確的處理做法其實(shí)是服務(wù)端發(fā)送RST報(bào)文臭杰,進(jìn)入close的狀態(tài)粤咪,這表示連接的信息被初始化,原有的TCP的通道不能繼續(xù)的進(jìn)行渴杆,如果客戶端想重新建立連接必須從第一步開(kāi)始寥枝;
四次揮手的最后一步確認(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包都沒(méi)有到達(dá)客戶端敢辩,那客戶端就進(jìn)入了close的狀態(tài)蔽莱,那從而導(dǎo)致服務(wù)端永遠(yuǎn)也無(wú)法收到ACK確認(rèn)也就無(wú)法關(guān)閉了弟疆。
其實(shí)TCP區(qū)別于UDP最大的就是前者有數(shù)據(jù)丟包重發(fā)和流量控制戚长;
TCP窗口的概念:
按照之前的理論,在數(shù)據(jù)包發(fā)出后怠苔,直至 ACK 確認(rèn)返回以前同廉,發(fā)送端都無(wú)法發(fā)送數(shù)據(jù),而且包的往返時(shí)間越長(zhǎng)柑司,網(wǎng)絡(luò)利用效率和通信性能就越低迫肖。前兩張圖片形象的解釋了這一點(diǎn)。
為了解決這個(gè)問(wèn)題攒驰,TCP 使用了“窗口”這個(gè)概念蟆湖。窗口具有大小,它表示無(wú)需等待確認(rèn)應(yīng)答就可以繼續(xù)發(fā)送數(shù)據(jù)包的最大數(shù)量玻粪。引入窗口概念后隅津,數(shù)據(jù)要緩存一下不能立即的丟棄以備重發(fā)诬垂;
如果出現(xiàn)丟包那就是TCP最擅長(zhǎng)處理的問(wèn)題了,比如窗口為4 ACK 收到1001 4001那我們完全的可以相信中間的兩個(gè)也成功的接收了伦仍,不然ACK不會(huì)相加结窘,如果沒(méi)有窗口那就需要重傳中間的兩個(gè)包了,也就是那空間換時(shí)間充蓝。
流量控制:也就是設(shè)置窗口中的大小隧枫,如果窗口過(guò)大那會(huì)導(dǎo)致癱瘓,那程序會(huì)在啟動(dòng)的時(shí)候通過(guò)慢啟動(dòng)的算法算出窗口大小谓苟,對(duì)發(fā)送數(shù)據(jù)進(jìn)行流量的控制官脓。
HTTP:最頂層的應(yīng)用層協(xié)議,瀏覽器訪問(wèn)網(wǎng)頁(yè)就是直接使用了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é)議加載出來(lái)的網(wǎng)頁(yè)派草,通常是有html的語(yǔ)言來(lái)描述的搀缠,它是一段純文本,它算是表現(xiàn)層了近迁;
Get Post請(qǐng)求:
GET 請(qǐng)求通常用于查詢艺普、獲取數(shù)據(jù),而 POST 請(qǐng)求則用于發(fā)送數(shù)據(jù)鉴竭,除了用途上的區(qū)別歧譬,它們還有以下這些不同:
GET 請(qǐng)求可以被緩存,可以被收藏為書(shū)簽搏存,但 POST 不行瑰步。
GET 請(qǐng)求會(huì)保留在瀏覽器的歷史記錄中,POST 不會(huì)璧眠。
GET 請(qǐng)求的長(zhǎng)度有限制(不同的瀏覽器不一樣缩焦,大約在幾 Kb 左右),URL 的數(shù)據(jù)類型只能是 ASCII 字符责静,POST 請(qǐng)求沒(méi)有限制袁滥。
GET 請(qǐng)求的參數(shù)在 URL 中,因此絕不能用 GET 請(qǐng)求傳輸敏感數(shù)據(jù)灾螃。POST 請(qǐng)求數(shù)據(jù)則寫在 HTTP 的請(qǐng)求頭中题翻,安全性略高于 GET 請(qǐng)求。
HTTP是一種無(wú)狀態(tài)的連接腰鬼∏对客戶端每次讀取web的信息都會(huì)被認(rèn)為是一個(gè)新的會(huì)話靴拱;但是有時(shí)我們需要長(zhǎng)久的保存一些信息,這些就有cookie session來(lái)做了猾普;
cookie保存在客戶端袜炕,session呢保存在服務(wù)端
HTTPS則相對(duì)HTTP是安全的,它充分利用了對(duì)稱和非對(duì)稱的加密初家。
socket:它不是協(xié)議偎窘,它是TCP/IP協(xié)議中的應(yīng)用層和傳輸層之間的抽象,是它們的一個(gè)封裝溜在,是一個(gè)調(diào)用的API陌知,通過(guò)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ò)通信過(guò)程中端點(diǎn)的抽象表示紊浩,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議窖铡,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口坊谁,遠(yuǎn)地主機(jī)的IP地址费彼,遠(yuǎn)地進(jìn)程的協(xié)議端口。
應(yīng)用層通過(guò)傳輸層進(jìn)行數(shù)據(jù)通信時(shí)口芍,TCP會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問(wèn)題箍铲。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過(guò)同一個(gè) TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接阶界,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口虹钮。應(yīng)用層可以和傳輸層通過(guò)Socket接口,區(qū)分來(lái)自不同應(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岛都。
套接字之間的連接過(guò)程分為三個(gè)步驟:
服務(wù)器監(jiān)聽(tīng):服務(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)聽(tīng)到或者說(shuō)接收到客戶端套接字的連接請(qǐng)求時(shí)鸽斟,就響應(yīng)客戶端套接字的請(qǐng)求拔创,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端富蓄,一旦客戶端確認(rèn)了此描述剩燥,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài)立倍,繼續(xù)接收其他客戶端套接字的連接請(qǐng)求
參考文章:
原文鏈接:http://www.reibang.com/p/06f8b9111a56
原文鏈接:http://www.reibang.com/p/dc456cf57e06