最近一直在看一些網(wǎng)絡(luò)基礎(chǔ)相關(guān)的知識(shí),以便解決在工作中遇到的關(guān)于網(wǎng)絡(luò)傳輸方面的問(wèn)題。因此覺(jué)得有必要對(duì)最近學(xué)習(xí)的網(wǎng)絡(luò)協(xié)議做一個(gè)簡(jiǎn)單的總結(jié)。
網(wǎng)絡(luò)通信原理
- 互聯(lián)網(wǎng)的本質(zhì)就是一系列的網(wǎng)絡(luò)協(xié)議
- 一臺(tái)計(jì)算機(jī)有了操作系統(tǒng),然后裝上軟件你就可以正常使用了,但是這種情況下你只能夠自己使用,是沒(méi)有交朋友的能力的,因?yàn)槟愀鷦e的計(jì)算機(jī)之間無(wú)法溝通。
image
- 為了提供計(jì)算機(jī)溝通的能力,有了internet
image
- internet實(shí)際上就是一系列統(tǒng)一的標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)稱之為互聯(lián)網(wǎng)協(xié)議,其功能就是定義計(jì)算機(jī)如何接入internet,以及接入internet的計(jì)算機(jī)通信的標(biāo)準(zhǔn)。
- osi七層協(xié)議
互聯(lián)網(wǎng)協(xié)議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層,值得說(shuō)明的是這些層是邏輯上認(rèn)定的層次,并不是實(shí)際存在的。
image
- 上圖中從左到右依次為tcp/ip四層,tcp/ip五層,osi七層的劃分。
- 數(shù)據(jù)從應(yīng)用層發(fā)下來(lái),會(huì)在每一層都會(huì)加上頭部信息,進(jìn)行封裝,然后再發(fā)送到數(shù)據(jù)接收端,就是每個(gè)數(shù)據(jù)都會(huì)經(jīng)過(guò)數(shù)據(jù)的封裝和解封裝的過(guò)程。
- 物理層:主要是基于電器特性發(fā)送高低電壓(電信號(hào)),高電壓對(duì)應(yīng)數(shù)字1,低電壓對(duì)應(yīng)數(shù)字0,
- 數(shù)據(jù)鏈路層:?jiǎn)渭兊碾娦盘?hào)0和1沒(méi)有任何意義,必須規(guī)定電信號(hào)多少位一組,每組什么意思,因此數(shù)據(jù)鏈路層定義了電信號(hào)的分組方式。以太網(wǎng)協(xié)議位于該層,在每一幀的head中包含有mac地址,有了mac地址就可以通過(guò)廣播的方式進(jìn)行通信。
- 網(wǎng)絡(luò)層: 廣播的方式只能在同一個(gè)局域網(wǎng)內(nèi)進(jìn)行通信,如果不是同一網(wǎng)絡(luò)內(nèi),就采用路由的方式(向不同廣播域/子網(wǎng)分發(fā)數(shù)據(jù)包),mac地址是無(wú)法區(qū)分的,它只跟廠商有關(guān),因此在網(wǎng)絡(luò)層有了網(wǎng)絡(luò)地址的產(chǎn)生。規(guī)定網(wǎng)絡(luò)地址的協(xié)議叫ip協(xié)議,它定義的地址稱之為ip地址,廣泛采用的v4版本即ipv4,它規(guī)定網(wǎng)絡(luò)地址由32位2進(jìn)制表示,范圍0.0.0.0-255.255.255.255,一個(gè)ip地址通常寫(xiě)成四段十進(jìn)制數(shù),例:172.19.89.9。
- 傳輸層: 著重介紹TCP協(xié)議。
- tcp報(bào)文
image
- 源端口和目標(biāo)端口:分別占用16位,用于區(qū)別主機(jī)中的不同進(jìn)程,而IP地址是用來(lái)區(qū)分不同的主機(jī)的,源端口號(hào)和目的端口號(hào)配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個(gè)TCP連接;
- 序號(hào):用來(lái)標(biāo)識(shí)從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個(gè)報(bào)文段中的的第一個(gè)數(shù)據(jù)字節(jié)在數(shù)據(jù)流中的序號(hào);主要用來(lái)解決網(wǎng)絡(luò)報(bào)亂序的問(wèn)題;
- 確認(rèn)號(hào):32位確認(rèn)序列號(hào)包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào),因此,確認(rèn)序號(hào)應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)字節(jié)序號(hào)加1。不過(guò),只有當(dāng)標(biāo)志位中的ACK標(biāo)志(下面介紹)為1時(shí)該確認(rèn)序列號(hào)的字段才有效。主要用來(lái)解決不丟包的問(wèn)題;
- 數(shù)據(jù)偏移:給出首部中32 bit字的數(shù)目,需要這個(gè)值是因?yàn)槿芜x字段的長(zhǎng)度是可變的。這個(gè)字段占4bit(最多能表示15個(gè)32bit的的字,即4*15=60個(gè)字節(jié)的首部長(zhǎng)度),因此TCP最多有60字節(jié)的首部。然而,沒(méi)有任選字段,正常的長(zhǎng)度是20字節(jié);
- ACK:此標(biāo)志表示應(yīng)答域有效,就是說(shuō)前面所說(shuō)的TCP應(yīng)答號(hào)將會(huì)包含在TCP數(shù)據(jù)包中;有兩個(gè)取值:0和1,為1的時(shí)候表示應(yīng)答域有效,反之為0;
- SYN:表示同步序號(hào),用來(lái)建立連接。SYN標(biāo)志位和ACK標(biāo)志位搭配使用,當(dāng)連接請(qǐng)求的時(shí)候,SYN=1,ACK=0;連接被響應(yīng)的時(shí)候,SYN=1,ACK=1;這個(gè)標(biāo)志的數(shù)據(jù)包經(jīng)常被用來(lái)進(jìn)行端口掃描。掃描者發(fā)送一個(gè)只有SYN的數(shù)據(jù)包,如果對(duì)方主機(jī)響應(yīng)了一個(gè)數(shù)據(jù)包回來(lái) ,就表明這臺(tái)主機(jī)存在這個(gè)端口;但是由于這種掃描方式只是進(jìn)行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機(jī)器不很安全,一臺(tái)安全的主機(jī)將會(huì)強(qiáng)制要求一個(gè)連接嚴(yán)格的進(jìn)行TCP的三次握手;
- FIN: 表示發(fā)送端已經(jīng)達(dá)到數(shù)據(jù)末尾,也就是說(shuō)雙方的數(shù)據(jù)傳送完成,沒(méi)有數(shù)據(jù)可以傳送了,發(fā)送FIN標(biāo)志位的TCP數(shù)據(jù)包后,連接將被斷開(kāi)。這個(gè)標(biāo)志的數(shù)據(jù)包也經(jīng)常被用于進(jìn)行端口掃描。
- 三次握手與四次揮手圖解
image
- 三次握手
- 第一次 建立連接。客戶端發(fā)送連接請(qǐng)求報(bào)文段,將SYN位置為1,Sequence Number為x;然后,客戶端進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器的確認(rèn);
- 第二次:服務(wù)器收到SYN報(bào)文段。服務(wù)器收到客戶端的SYN報(bào)文段,需要對(duì)這個(gè)SYN報(bào)文段進(jìn)行確認(rèn),設(shè)置Acknowledgment Number為x+1(Sequence Number+1);同時(shí),自己自己還要發(fā)送SYN請(qǐng)求信息,將SYN位置為1,Sequence Number為y;服務(wù)器端將上述所有信息放到一個(gè)報(bào)文段(即SYN+ACK報(bào)文段)中,一并發(fā)送給客戶端,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
- 第三次:客戶端收到服務(wù)器的SYN+ACK報(bào)文段。然后將Acknowledgment Number設(shè)置為y+1,向服務(wù)器發(fā)送ACK報(bào)文段,這個(gè)報(bào)文段發(fā)送完畢以后,客戶端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài),完成TCP三次握手。
- 原因: 第一次客戶端發(fā)送消息到服務(wù)端,服務(wù)端接收到回復(fù)消息給客戶端,也就是當(dāng)?shù)诙挝帐挚蛻舳私邮盏较⒁院螅_保了客戶端可以正常發(fā)送以及接收消息,第三次握手客戶端發(fā)確認(rèn)消息給服務(wù)端,確保了服務(wù)端可以正常首發(fā)消息。彼此都可以收發(fā)消息就可以確保通信了。
- 四次揮手
- 第一次:主機(jī)1(可以使客戶端,也可以是服務(wù)器端),設(shè)置Sequence Number和Acknowledgment Number,向主機(jī)2發(fā)送一個(gè)FIN報(bào)文段;此時(shí),主機(jī)1進(jìn)入FIN_WAIT_1狀態(tài);這表示主機(jī)1沒(méi)有數(shù)據(jù)要發(fā)送給主機(jī)2了;
- 第二次:主機(jī)2收到了主機(jī)1發(fā)送的FIN報(bào)文段,向主機(jī)1回一個(gè)ACK報(bào)文段,Acknowledgment Number為Sequence Number加1;主機(jī)1進(jìn)入FIN_WAIT_2狀態(tài);主機(jī)2告訴主機(jī)1,我“同意”你的關(guān)閉請(qǐng)求;
- 第三次:主機(jī)2向主機(jī)1發(fā)送FIN報(bào)文段,請(qǐng)求關(guān)閉連接,同時(shí)主機(jī)2進(jìn)入LAST_ACK狀態(tài);
- 第四次:主機(jī)1收到主機(jī)2發(fā)送的FIN報(bào)文段,向主機(jī)2發(fā)送ACK報(bào)文段,然后主機(jī)1進(jìn)入TIME_WAIT狀態(tài);主機(jī)2收到主機(jī)1的ACK報(bào)文段以后,就關(guān)閉連接;此時(shí),主機(jī)1等待2MSL后依然沒(méi)有收到回復(fù),則證明Server端已正常關(guān)閉,那好,主機(jī)1也可以關(guān)閉連接了。
- 總結(jié):之所有會(huì)有四次,是因?yàn)閭鬏斶^(guò)程中可能接收到關(guān)閉信號(hào)后還有數(shù)據(jù)未發(fā)送完,所以會(huì)接著發(fā)送,當(dāng)發(fā)送完畢以后會(huì)再次揮手。如果沒(méi)有數(shù)據(jù)發(fā)送了,會(huì)有可能變成三次的即第三次的FIN跟第二次的ack合并。
總結(jié)
暫時(shí)就總結(jié)到這里,以后還會(huì)陸續(xù)更新。。。。