了解背景
協(xié)議的產(chǎn)生,是為了世界各地的計(jì)算機(jī)用相同的方式有效的去進(jìn)行溝通。好比不同國(guó)家的人使用英語(yǔ)交流。
模型分層
- TCP/IP協(xié)議的四層劃分
- TCP/IP協(xié)議的五層劃分
- OSI七層劃分

物理層:確保原始數(shù)據(jù)可在物理媒介上傳輸。
數(shù)據(jù)鏈路層:將網(wǎng)絡(luò)層接收到的數(shù)據(jù)可靠的傳輸?shù)较噜徆?jié)點(diǎn)的目標(biāo)機(jī)網(wǎng)絡(luò)層。
網(wǎng)絡(luò)層:實(shí)現(xiàn)不同計(jì)算機(jī)之間數(shù)據(jù)透明傳送;路徑選擇、路由和邏輯尋址。IP協(xié)議非常簡(jiǎn)單,僅僅提供不可靠無(wú)連接的傳輸。協(xié)議:IP協(xié)議。設(shè)備:路由器。協(xié)議:以太網(wǎng)協(xié)議。設(shè)備:網(wǎng)橋、交換機(jī)。
傳輸層:負(fù)責(zé)將上層(應(yīng)用層)數(shù)據(jù)分段并提供端到端、可靠或不可靠的傳輸。以及端到端差錯(cuò)控制和流量控制。協(xié)議:TCP、TUP。設(shè)備:網(wǎng)關(guān)。
會(huì)話層:負(fù)責(zé)進(jìn)程的建立、管理、粽子進(jìn)程之間的會(huì)話。
表示層:對(duì)上層信息進(jìn)行數(shù)據(jù)轉(zhuǎn)化保證一個(gè)計(jì)算主機(jī)能被另外一個(gè)計(jì)算主機(jī)接受和理解。轉(zhuǎn)化方式:加密、解壓、格式轉(zhuǎn)化。
應(yīng)用層:最靠近用戶的OSI層。為用戶的應(yīng)用程序提供協(xié)議,將用戶的操作轉(zhuǎn)化為服務(wù)發(fā),并匹配一個(gè)相應(yīng)的服務(wù)協(xié)議送給傳輸層。
IP
用于計(jì)算機(jī)之間通信;無(wú)連接的通信協(xié)議;通過(guò)IP,將數(shù)據(jù)割分成不同的包在因特網(wǎng)上傳送。IP負(fù)責(zé)將沒(méi)有包路由到它的目的地。
IP地址
沒(méi)個(gè)計(jì)算機(jī)必須有IP地址才能連接因特網(wǎng),每一個(gè)IP包必須有一個(gè)地址才能傳送到另外一個(gè)計(jì)算機(jī)。IP地址(網(wǎng)絡(luò)號(hào)+主機(jī)號(hào))。TCP/IP使用32比特進(jìn)行編碼。計(jì)算機(jī)一個(gè)字節(jié)是8比特,所以TCP/IP使用4個(gè)字節(jié)做地址,一個(gè)字節(jié)(00000000)可以有256種形式。所以我們的IP地址為0-255。255.255.255.255樣式。
TCP/IP
TCP/IP:TCP和IP共同工作。
HTTP(貨物)
TCP(貨車):負(fù)責(zé)應(yīng)用軟件之間網(wǎng)絡(luò)軟件之間的通信。
IP(高速公路):負(fù)責(zé)計(jì)算機(jī)之間的通信。
過(guò)程:TCP把數(shù)據(jù)分割成并裝入IP包,然后在他們到達(dá)的時(shí)候重新組合它。IP負(fù)責(zé)把這個(gè)包發(fā)送到目標(biāo)計(jì)算機(jī)。
TCP報(bào)文形式

TCP三次握手和四次揮手

TCP三次握手
TCP三次握手是指發(fā)送三次包才能完成連接,同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換TCP窗口大小的信息。
第一次握手:客戶端發(fā)送SIN(隨機(jī)數(shù)seq=J)給到服務(wù)器??蛻舳诉M(jìn)入SYN_SENT
第二次握手:服務(wù)器接收SIN=J。發(fā)送一個(gè)確定收到ACK=J+1和自己的SIN(隨機(jī)數(shù)seq=K)給到客戶端。服務(wù)器進(jìn)入SYN_RCVD;
第三次握手:檢查ACK是否正確,如果正確發(fā)送一個(gè)ACK=K+1給到服務(wù)器。服務(wù)器確認(rèn)后。兩者都進(jìn)入ESTABLISHED
TCP四次揮手
第一次揮手:客戶端發(fā)送FIN(隨機(jī)seq=M)給到服務(wù)器,客戶端進(jìn)入FIN_WAIT。
第二次揮手:服務(wù)器接受FIN=M,發(fā)送一個(gè)ACK=M+1給到客戶端,服務(wù)器進(jìn)入LOSE_WAIT。
第三次揮手:服務(wù)器發(fā)送一個(gè)自己的FIN(隨機(jī)seq=N)給到客戶端,服務(wù)器進(jìn)入LASR_ACK。
第四次揮手:客戶端接收到ACK并確定正確,當(dāng)自己不需要再接受信息時(shí)自己發(fā)送一個(gè)ACK=N+1給到服務(wù)器,進(jìn)入TIME_WAIT。服務(wù)器接收確認(rèn),變成CLOSE狀態(tài)。
為什么建立連接是三次握手,而關(guān)閉連接卻是四次揮手呢?
這是因?yàn)榉?wù)端在LISTEN狀態(tài)下,收到建立連接請(qǐng)求的SYN報(bào)文后,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶端。而關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文時(shí),僅僅表示對(duì)方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對(duì)方了,所以己方可以立即close,也可以發(fā)送一些數(shù)據(jù)給對(duì)方后,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示同意現(xiàn)在關(guān)閉連接,因此,己方ACK和FIN一般都會(huì)分開(kāi)發(fā)送
為什么TIME_WAIT狀態(tài)需要經(jīng)過(guò)2MSL(最大報(bào)文段生存時(shí)間)才能返回到CLOSE狀態(tài)?
一、保證TCP協(xié)議的全雙工連接能夠可靠關(guān)閉
二、保證這次連接的重復(fù)數(shù)據(jù)段從網(wǎng)絡(luò)中消失
先說(shuō)第一點(diǎn),如果Client直接CLOSED了,那么由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡(luò)原因,導(dǎo)致Server沒(méi)有收到Client最后回復(fù)的ACK。那么Server就會(huì)在超時(shí)之后繼續(xù)發(fā)送FIN,此時(shí)由于Client已經(jīng)CLOSED了,就找不到與重發(fā)的FIN對(duì)應(yīng)的連接,最后Server就會(huì)收到RST而不是ACK,Server就會(huì)以為是連接錯(cuò)誤把問(wèn)題報(bào)告給高層。這樣的情況雖然不會(huì)造成數(shù)據(jù)丟失,但是卻導(dǎo)致TCP協(xié)議不符合可靠連接的要求。所以,Client不是直接進(jìn)入CLOSED,而是要保持TIME_WAIT,當(dāng)再次收到FIN的時(shí)候,能夠保證對(duì)方收到ACK,最后正確的關(guān)閉連接。
再說(shuō)第二點(diǎn),如果Client直接CLOSED,然后又再向Server發(fā)起一個(gè)新連接,我們不能保證這個(gè)新連接與剛關(guān)閉的連接的端口號(hào)是不同的。也就是說(shuō)有可能新連接和老連接的端口號(hào)是相同的。一般來(lái)說(shuō)不會(huì)發(fā)生什么問(wèn)題,但是還是有特殊情況出現(xiàn):假設(shè)新連接和已經(jīng)關(guān)閉的老連接端口號(hào)是一樣的,如果前一次連接的某些數(shù)據(jù)仍然滯留在網(wǎng)絡(luò)中,這些延遲數(shù)據(jù)在建立新連接之后才到達(dá)Server,由于新連接和老連接的端口號(hào)是一樣的,又因?yàn)門(mén)CP協(xié)議判斷不同連接的依據(jù)是socket pair,于是,TCP協(xié)議就認(rèn)為那個(gè)延遲的數(shù)據(jù)是屬于新連接的,這樣就和真正的新連接的數(shù)據(jù)包發(fā)生混淆了。所以TCP連接還要在TIME_WAIT狀態(tài)等待2倍MSL,這樣可以保證本次連接的所有數(shù)據(jù)都從網(wǎng)絡(luò)中消失。
SYN攻擊
在三次握手過(guò)程中,Server發(fā)送SYN-ACK之后,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時(shí)Server處于SYN_RCVD狀態(tài),當(dāng)收到ACK后,Server轉(zhuǎn)入ESTABLISHED狀態(tài)。SYN攻擊就是Client在短時(shí)間內(nèi)偽造大量不存在的IP地址,并向Server不斷地發(fā)送SYN包,Server回復(fù)確認(rèn)包,并等待Client的確認(rèn),由于源地址是不存在的,因此,Server需要不斷重發(fā)直至超時(shí),這些偽造的SYN包將產(chǎn)時(shí)間占用未連接隊(duì)列,導(dǎo)致正常的SYN請(qǐng)求因?yàn)殛?duì)列滿而被丟棄,從而引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。SYN攻擊時(shí)一種典型的DDOS攻擊,檢測(cè)SYN攻擊的方式非常簡(jiǎn)單,即當(dāng)Server上有大量半連接狀態(tài)且源IP地址是隨機(jī)的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現(xiàn)行:
TCP和DUP的區(qū)別
- TCP面向連接(如打電話需要先鏈接了才能通話);UDP不需要連接就可以發(fā)送信息,發(fā)數(shù)據(jù)前不需要建立連接。
- TCP提供可靠服務(wù),信息無(wú)差錯(cuò)、不丟失、無(wú)重復(fù)、且按序到達(dá);UDP是不可靠傳輸,不確定信息是否送到。
- TCP面象字節(jié)流,把數(shù)據(jù)看成無(wú)結(jié)構(gòu)的字節(jié)流;DUP面象報(bào)文,沒(méi)有做阻塞控制,不會(huì)影響源主機(jī)的發(fā)送頻率(在一些應(yīng)用上顯得很重要,如IP電話、實(shí)時(shí)會(huì)議等)
- TCP首部開(kāi)銷20字節(jié);UDP首部開(kāi)銷8字節(jié),相對(duì)來(lái)說(shuō)開(kāi)銷小。
- TCP是一對(duì)一點(diǎn)對(duì)點(diǎn);UDP可以一對(duì)多、多對(duì)一、一對(duì)一。
- TCP是全雙工可靠通道;UDP是不可靠通道。
TCP可靠性
- 校驗(yàn)和
- 確認(rèn)應(yīng)答與序列號(hào)
- 超時(shí)重傳
- 連接管理
- 流量控制
- 擁塞控制(慢啟動(dòng),擁塞避免,快重傳,快恢復(fù))
參考文章
如何針對(duì)App弱網(wǎng)情況優(yōu)化
HTTPS和HTTP有什么區(qū)別,HTTPS加密過(guò)程是什么樣的,對(duì)稱加密和非對(duì)稱解密各有什么優(yōu)缺點(diǎn)?
HTTPS是擁有SSL/TLS加密的HTTP網(wǎng)絡(luò)協(xié)議。加密傳輸、身份認(rèn)證,是比HTTP安全的網(wǎng)絡(luò)協(xié)議。
作用 提供安全的傳輸通道;確認(rèn)網(wǎng)站的真實(shí)性。
參考文章
Socket和Http通信原理
Socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過(guò)Socket,我們才能使用TCP/IP協(xié)議,主要利用三元組【ip地址,協(xié)議,端口】。
HTTP協(xié)議即超文本傳輸協(xié)議,是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一,http協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。
Socket和HTTP區(qū)別
socket連接:socket連接即是所謂的長(zhǎng)連接,理論上客戶端和服務(wù)端一旦建立連接,則不會(huì)主動(dòng)斷掉;
Http連接:http連接就是所謂的短連接,及客戶端向服務(wù)器發(fā)送一次請(qǐng)求,服務(wù)器端相應(yīng)后連接即會(huì)斷掉。