昨天學(xué)習(xí)了網(wǎng)絡(luò)中的OSI模型,但OSI模型并沒有被廣泛應(yīng)用稀颁,反而TCP/IP模型獲得了較大的成功慕蔚,那今天就來(lái)學(xué)習(xí)下TCP/IP模型。
開始瘋狂的十萬(wàn)個(gè)為什么
什么是TCP/IP模型?
TCP/IP參考模型是美國(guó)國(guó)防部高級(jí)研究計(jì)劃局計(jì)算機(jī)網(wǎng)(Advanced Research Projects Agency Network,ARPANET)和其后繼因特網(wǎng)使用的參考模型奠蹬。ARPANET是由美國(guó)國(guó)防部(U.S.Department of Defense,DoD)贊助的研究網(wǎng)絡(luò)绳矩。
最初罩润,它只連接了美國(guó)境內(nèi)的四所大學(xué)。隨后的幾年中翼馆,它通過(guò)租用的電話線連接了數(shù)百所大學(xué)和政府部門。最終ARPANET發(fā)展成為全球規(guī)模最大的互連網(wǎng)絡(luò)-因特網(wǎng)金度。
我是這么記得:美國(guó)國(guó)防部搞得網(wǎng)絡(luò)模型---發(fā)展壯大----最后發(fā)展成了因特網(wǎng)
既然叫TCP/IP模型应媚,什么是TCP和IP?
TCP和IP分別是兩個(gè)協(xié)議
TCP:傳輸控制協(xié)議
IP:互聯(lián)網(wǎng)協(xié)議地址(Internet Protocol Address),縮寫就是IP地址
細(xì)節(jié)我們等等再說(shuō)。
現(xiàn)在我大概知道TCP/IP是怎么來(lái)的了猜极。來(lái)看看它的結(jié)構(gòu)模型中姜。
TCP/IP模型的體系結(jié)構(gòu)
TCP/IP的參考模型將協(xié)議分成四個(gè)層次。對(duì)比OSI模型如圖:
可以看到TCP/IP模型把OSI模型濃縮了一些跟伏,沒有OSI模型那么詳細(xì)丢胚。
應(yīng)用層
表示層 ----- 應(yīng)用層
會(huì)話層
這三層合并為應(yīng)用層:為用戶提供各種服務(wù)。例如:HTTP,HTTPS,TFP,Telnet
TCP/IP中的傳輸層 ----- OSI中的傳輸層
提供了端對(duì)端的通信連接方式受扳,可靠的連接方式:TCP携龟,不可靠的連接方式:UDP
TCP/IP中的網(wǎng)絡(luò)層 ----- OSI中的網(wǎng)絡(luò)層
提供主機(jī)與主機(jī)間的通信,并找到一條好的路徑
網(wǎng)絡(luò)接口層 ----- OSI中的鏈路層,物理層
負(fù)責(zé)監(jiān)視主機(jī)在和網(wǎng)絡(luò)之間的交換
現(xiàn)在來(lái)比較下他們的相同點(diǎn)和不同點(diǎn)
相同點(diǎn):
1.都采用了層級(jí)化結(jié)構(gòu)
2.都提供了無(wú)連接和面向連接兩種通信服務(wù)機(jī)制
不同點(diǎn):
1.TCP/IP模型是四層結(jié)構(gòu)勘高,ISO是七層結(jié)構(gòu)
2.TCP是根據(jù)協(xié)議才制定的模型峡蟋,而ISO模型是協(xié)議開發(fā)前就設(shè)定的坟桅,具有通用性。
接下來(lái)學(xué)習(xí)下TCP的連接和斷開
TCP連接的建立(三次握手)
首先要認(rèn)識(shí)幾個(gè)標(biāo)志位和序號(hào):
SYN:表示建立連接
ACK:表示確認(rèn)序號(hào)有效
FIN:表示關(guān)閉連接
RST:表示連接重置
PSH:表示有 DATA數(shù)據(jù)傳輸
發(fā)送報(bào)文時(shí)蕊蝗,帶上相應(yīng)的標(biāo)志位仅乓,就代表相應(yīng)的意思
1.seq序號(hào),占32位蓬戚,發(fā)起方發(fā)送數(shù)據(jù)時(shí)進(jìn)行標(biāo)記夸楣。
2.ack序號(hào),確認(rèn)序號(hào)子漩,占32位豫喧。
例如:
- SYN=1,代表建立連接
- SYN=1,和ACK=1,就代表建立連接和確認(rèn)序號(hào)有效痛单。
- ACK=1嘿棘,代表確認(rèn)序號(hào)有效
第一次握手:客戶端A向服務(wù)器B發(fā)送請(qǐng)求報(bào)文
請(qǐng)求報(bào)文是這樣的
1.標(biāo)志符:SYN=1,代表建立連接
2.隨機(jī)初始化的一個(gè)序號(hào):比如seq=x.
客戶端A進(jìn)入(SYN-SEND)同步已發(fā)送狀態(tài)旭绒。
第二次握手:服務(wù)器B收到后鸟妙,如果同意連接,那么服務(wù)器B就會(huì)向客戶端A發(fā)送一個(gè)確認(rèn)報(bào)文挥吵。
確認(rèn)報(bào)文是這樣的
1.標(biāo)志符:ACK=1重父,表示對(duì)剛剛的SYN包的確認(rèn),SYN=1忽匈,表示B與A建立連接房午。
2.隨機(jī)初始化一個(gè)序號(hào):比如seq=y.
3.確認(rèn)序號(hào)ack:ack是剛剛客戶端A發(fā)送過(guò)來(lái)的序號(hào)+1,也就是x+1。
服務(wù)器B進(jìn)入SYN-RCVD(同步收到)狀態(tài)
第三次握手:客戶端A收到服務(wù)器B的確認(rèn)報(bào)文后丹允,再向服務(wù)器B發(fā)送一個(gè)確認(rèn)報(bào)文郭厌。
這個(gè)確認(rèn)報(bào)文是這樣的:
1.標(biāo)志符:ACK=1,表示對(duì)剛剛的SYN包的確認(rèn)雕蔽。
2.seq是上個(gè)請(qǐng)求的序號(hào)+1,也就是x+1
3.確認(rèn)序號(hào)ack:ack是剛剛客戶端B發(fā)送過(guò)來(lái)的序號(hào)+1折柠,也就是y+1.
客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài)。
單純看標(biāo)志符就是這樣一個(gè)過(guò)程:
- (A) –> [SYN] –> (B)
- (B) -> [SYN/ACK] -> (A)
- (A) –> [ACK] –> (B)
看序號(hào)的話就是這樣的
方向 seq ack
A->B 2000 0
B->A 3000 2001
A->B 2001 3001
A隨機(jī)初始化了一個(gè)序號(hào)seq=2000
B隨機(jī)初始化了一個(gè)序號(hào)seq=3000
A在接著上一個(gè)請(qǐng)求繼續(xù)下去批狐,seq=20001扇售。
服務(wù)器B收到后確認(rèn)seq值和ACK,說(shuō)明連接建立成功嚣艇。
TCP連接的斷開(四次揮手)
假設(shè)客戶端A想要斷開連接
第一次揮手:
客戶端發(fā)送一個(gè) FIN 標(biāo)志位為1的包承冰,表示自己已經(jīng)沒有數(shù)據(jù)可以發(fā)送了,但是仍然可以接受數(shù)據(jù)食零。
發(fā)送完畢后困乒,客戶端進(jìn)入 FIN_WAIT_1 狀態(tài)。
第二次揮手:
服務(wù)器B確認(rèn)客戶端A發(fā)送的 FIN 包慌洪,發(fā)送一個(gè)確認(rèn)包顶燕,表明自己接受到了客戶端關(guān)閉連接的請(qǐng)求凑保,但還沒有準(zhǔn)備好關(guān)閉連接。
發(fā)送完畢后涌攻,服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài).
客戶端接收到這個(gè)確認(rèn)包之后欧引,進(jìn)入 FIN_WAIT_2 狀態(tài),等待服務(wù)器端關(guān)閉連接恳谎。
第三次揮手:
服務(wù)器端準(zhǔn)備好關(guān)閉連接時(shí)芝此,向客戶端發(fā)送FIN 為1的結(jié)束連接請(qǐng)求。
發(fā)送完畢后因痛,服務(wù)器端進(jìn)入 LAST_ACK 狀態(tài)婚苹,等待來(lái)自客戶端的最后一個(gè)ACK。
第四次揮手:
- 客戶端:接收到來(lái)自服務(wù)器端的關(guān)閉請(qǐng)求鸵膏,發(fā)送一個(gè)確認(rèn)包膊升,并進(jìn)入 TIME_WAIT狀態(tài)。等待可能出現(xiàn)的要求重傳的 ACK 包谭企。
- 服務(wù)器端接收到這個(gè)確認(rèn)包之后廓译,關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)债查。
- 客戶端等待了某個(gè)固定時(shí)間(兩個(gè)最大段生命周期非区,2MSL,2 Maximum Segment Lifetime)之后盹廷,沒有收到服務(wù)器端的 ACK 征绸,認(rèn)為服務(wù)器端已經(jīng)正常關(guān)閉連接,于是自己也關(guān)閉連接俄占,進(jìn)入 CLOSED 狀態(tài)管怠。
形象點(diǎn)說(shuō)就像這樣
A說(shuō):"我說(shuō)完了。" A進(jìn)去FIN-WAIT-1狀態(tài)缸榄。
B說(shuō):"我知道你說(shuō)完了排惨,但我還沒說(shuō)完啊,我還沒準(zhǔn)備好,讓我等會(huì)碰凶。"
于是呢A進(jìn)入了FIN-WAIT-2狀態(tài),B進(jìn)去了CLOSE-WAIT狀態(tài)
B說(shuō):"我講完了鹿驼,我也不說(shuō)了"于是B進(jìn)去了LAST-ACK狀態(tài)欲低。
A說(shuō):"好了,我知道你不說(shuō)了"于是A進(jìn)去了TIME-WAIT狀態(tài)畜晰。B進(jìn)去了CLOSED狀態(tài)
最后A在等了一會(huì)砾莱,發(fā)現(xiàn)B沒有理他,于是認(rèn)為B不說(shuō)話了凄鼻,自己也不說(shuō)了腊瑟。A進(jìn)去了CLOSED狀態(tài)聚假。
為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次揮手闰非?
不同地方就在于:膘格。
關(guān)閉連接時(shí),是分別發(fā)送ACK包和FIN包的财松。
建立連接時(shí)瘪贱,SYN包和ACK包可以一起發(fā)送。
這樣的原因是因?yàn)椋宏P(guān)閉連接時(shí)辆毡,可能客戶端A還在發(fā)送報(bào)文菜秦,只能告訴客戶端,我已經(jīng)收到了舶掖。直到客戶端A發(fā)送完報(bào)文時(shí)球昨,服務(wù)器B才可以發(fā)送FIN報(bào)文。
參考文章:
https://blog.csdn.net/ygm_linux/article/details/79546034
https://blog.csdn.net/diligentkong/article/details/73351278
http://www.imooc.com/article/19345