一篇文章讀懂TCP ,UDP概念和TCP三次握手連接
OSI 計(jì)算機(jī)網(wǎng)絡(luò)7層模型
TCP/IP四層網(wǎng)絡(luò)模型
傳輸層提供應(yīng)用間的邏輯通信(端到端),網(wǎng)絡(luò)層提供的是主機(jī)到主機(jī)的通信,傳輸層提供的是可靠服務(wù)。
TCP 中常說(shuō)的握手指的是:連接的定義和連接的建立的過(guò)程。IP 協(xié)議是無(wú)連接的,但是 TCP 是有鏈接的。
端口:數(shù)據(jù)鏈路層依靠 mac 地址尋址,網(wǎng)絡(luò)接口層依靠 ip 地址尋址,傳輸層依靠端口號(hào)尋址,端口就是應(yīng)用層的各種協(xié)議進(jìn)程和傳輸實(shí)體之間進(jìn)行層間交換的地址。
端口號(hào):標(biāo)識(shí)不同進(jìn)程的號(hào)碼,16位,2的16次方個(gè),只在本地有意義。一共有三類,一是保留端口,比如 ftp 是21,20,dns 是53,http 是80端口,smtp 是25等。二是登記端口,三是客戶端端口號(hào),也叫臨時(shí)端口(前兩者叫服務(wù)端端口)
套接字:主機(jī) ip+端口號(hào)組成,只有通過(guò) ip 地址和端口號(hào),才唯一確定一個(gè)連接的端口。唯一的標(biāo)識(shí)了網(wǎng)絡(luò)里的某臺(tái)主機(jī)中的某個(gè)應(yīng)用進(jìn)程。
udp :
用戶數(shù)據(jù)報(bào)協(xié)議,實(shí)現(xiàn)的是無(wú)連接服務(wù),無(wú)確認(rèn),不可靠的交付,開(kāi)銷小,時(shí)延短,沒(méi)有擁塞控制,主要應(yīng)用于實(shí)時(shí)應(yīng)用,比如 ip 電話,qq,視頻會(huì)議等。udp 數(shù)據(jù)報(bào)僅僅是 ip 數(shù)據(jù)報(bào)的一部分。
tcp
也就是傳輸控制協(xié)議,實(shí)現(xiàn)的是面向連接的服務(wù),向上提供了一條全雙工的可靠的邏輯信道,可靠交付,開(kāi)銷大,注意,tcp 的連接通道是邏輯 上的,對(duì)路由器不可見(jiàn),類似虛電路。
tcp 連接的三段:
建立,傳送,釋放。連接的端點(diǎn)叫 socket(套接字),被唯一的通信兩端點(diǎn)確定,采用的是 cs 架構(gòu)(客戶服務(wù)器模型),tcp 傳輸連接的建立采用的是三次握手(可以防止報(bào)文段在傳輸過(guò)連接建立中出錯(cuò))。
tcp三次握手的最主要目的是保證連接是雙工的,可靠更多的是通過(guò)重傳機(jī)制來(lái)保證的。
***次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器 進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入 ESTABLISHED狀態(tài),完成三次握手。
通過(guò)這樣的三次握手,客戶端與服務(wù)端建立起可靠的雙工的連接,開(kāi)始傳送數(shù)據(jù)。
但是為什么一定要進(jìn)行三次握手來(lái)保證連接是雙工的呢,一次不行么?兩次不行么?我們舉一個(gè)現(xiàn)實(shí)生活中兩個(gè)人進(jìn)行語(yǔ)言溝通的例子來(lái)模擬三次握手。
***次握手:
在考試, a同學(xué) 和 b 同學(xué)是鐵哥們,此時(shí)a 想抄b 的卷子上***個(gè)大題的結(jié)果。
a 就向 b 說(shuō)悄悄話,小 b,我抄一下你的卷子的***個(gè)大題的答案,我算不出來(lái)了。此時(shí)結(jié)果有兩種:
1、假如小 b 專心答題,沒(méi)注意 a 的請(qǐng)求,那么,a 和 b 的溝通建立失敗,也就是說(shuō) b 同學(xué)接受不到 a 同學(xué)傳來(lái)的信息,溝通肯定是失敗了。
2、假如小 b 聽(tīng)到了 a 的悄悄話,好了,說(shuō)明***次對(duì)話(握手)成功了。說(shuō)明 a 同學(xué)對(duì) b 同學(xué)的請(qǐng)求,b 能接受到。
第二次握手:
小 b 聽(tīng)到了 a 的請(qǐng)求抄襲的信息,結(jié)果有兩種:
1、假如 b 同學(xué)因?yàn)榫o張,雖然聽(tīng)到了,但是聽(tīng)的內(nèi)容比較模糊,不知道a具體是想抄襲哪道題,于是就索性的隨便敷衍一句:我也不會(huì)。此時(shí)的a同學(xué)一聽(tīng)立刻生氣了,還能不能做朋友了?算我看錯(cuò)你了!好的吧,a 和 b 的溝通失敗。說(shuō)明b 同學(xué)無(wú)法做出正確應(yīng)答的情況下溝通失敗。
2、假如b 同學(xué)聽(tīng)到且聽(tīng)清了a 同學(xué)的抄襲請(qǐng)求,于是乎,b 同學(xué)會(huì)做出正確的應(yīng)答,并對(duì) a說(shuō)出了***個(gè)大題的結(jié)果,并且ab兄弟情深,b還怕a他抄不上。反問(wèn):a,你抄好了么?那么等價(jià)于第二次握手成功。通過(guò)前兩次對(duì)話(握手)證明了b同學(xué)能聽(tīng)到且聽(tīng)清a同學(xué)說(shuō)的話,并能對(duì) a同學(xué)的請(qǐng)求,去做出正確的應(yīng)答。接下來(lái)進(jìn)行第三次握手。
第三次握手:
a 得到了 b 同學(xué)的正確的反饋,此時(shí)有兩個(gè)結(jié)果:
1、假如a 同學(xué)很高興,馬上開(kāi)始抄吧!a 就忘乎所以了,抄的飛起,結(jié)果沒(méi)注意 b 同學(xué)的***那句話『你炒好了么?』,讓人家小b 同學(xué)等回復(fù)等了好幾分鐘。b很失落,心說(shuō):好啊你,你抄到了,就忘了我了,得,我再也不管你了,***ab還是溝通失敗。說(shuō)明a 同學(xué)無(wú)法對(duì) b 同學(xué)做出應(yīng)答的情況下,ab溝通失敗。
2、假如a 同學(xué)注意到了 b 的反饋和反問(wèn),于是 a 同學(xué)對(duì) b 同學(xué)說(shuō):我抄好了。那么 ab 的第三次握手成功,ab已經(jīng)建立起了愉快流暢的溝通渠道,接下來(lái)a 和 b 就可以繼續(xù)愉快的去傳遞答案了。
通過(guò)第二次和第三次的握手證明:
a 同學(xué)能夠聽(tīng)到聽(tīng)清 b 同學(xué)的話,并且a 同學(xué)對(duì)此,能做出正確的反饋??梢?jiàn),ab進(jìn)行有效的,愉快的溝通,那么這三次握手的過(guò)程是必須的。
同理對(duì)于TCP為什么需要進(jìn)行三次握手,可以一樣的理解:
實(shí)際上就是為了兩邊的請(qǐng)求都能被識(shí)別,所以邏輯上最少三次。為了保證服務(wù)端能收接受到客戶端的信息并能做出正確的應(yīng)答而進(jìn)行前兩次(***次和第二次)握手,為了保證客戶端能夠接收到服務(wù)端的信息并能做出正確的應(yīng)答而進(jìn)行后兩次(第二次和第三次)握手。