(附)10、tcp建立連接為什么要三次握手?
tcp是一個(gè)面向連接的協(xié)議,在傳送數(shù)據(jù)以前,必須要首先建立一條連接。連接的建立需要經(jīng)過(guò)三次握手。為什么要經(jīng)過(guò)三次握手呢,每次握手雙方都做了些什么?
1)什么是tcp報(bào)文?
tcp報(bào)文就是通過(guò)tcp協(xié)議發(fā)送的數(shù)據(jù)包,由tcp頭和數(shù)據(jù)段組成。
tcp頭是固定的20個(gè)字節(jié),它的格式為:
2)第一次握手做什么?
請(qǐng)求端(客戶(hù)端)會(huì)向服務(wù)端(被請(qǐng)求端)發(fā)送一個(gè)tcp報(bào)文,申請(qǐng)打開(kāi)某一個(gè)端口。因?yàn)闆](méi)有數(shù)據(jù),所以這個(gè)報(bào)文僅包含一個(gè)tcp頭。其中:
SYN=1;當(dāng)建立一個(gè)新的連接時(shí), SYN標(biāo)志變1。
序號(hào);序號(hào)用來(lái)標(biāo)識(shí)從客戶(hù)端向服務(wù)端發(fā)送的數(shù)據(jù)字節(jié)流。
此時(shí)客戶(hù)端進(jìn)入SYN_SENT狀態(tài)。
3)第二次握手做什么?
服務(wù)端收到客戶(hù)端的SYN包,也會(huì)發(fā)一個(gè)只包含tcp頭的報(bào)文給客戶(hù)端。
ACK=1;服務(wù)端確認(rèn)收到信息
確認(rèn)序號(hào);客戶(hù)端序號(hào)+1,作為應(yīng)答
SYN=1;因?yàn)閠cp的連接是雙向的,服務(wù)端作為應(yīng)答的同時(shí)請(qǐng)求建立連接。
此時(shí)服務(wù)端進(jìn)入SYN_RECV狀態(tài)
4)第三次握手做什么?
ACK=1;客戶(hù)端確認(rèn)收到信息
確認(rèn)序號(hào);服務(wù)端序號(hào)+1,作為應(yīng)答
此時(shí)客戶(hù)端進(jìn)入ESTABLISHED狀態(tài),服務(wù)端收到ACK后也會(huì)進(jìn)入此狀態(tài)
可見(jiàn),客戶(hù)端和服務(wù)端都保留了對(duì)方的序號(hào),這三次握手缺少任何一步都無(wú)法實(shí)現(xiàn)這一目標(biāo)。在三次握手過(guò)程中,出現(xiàn)了一些中間狀態(tài)。
5)什么是半連接隊(duì)列?
第一次握手完成后,服務(wù)端發(fā)送ACK+SYN包到客戶(hù)端,在收到客戶(hù)端返回前的狀態(tài)為SYN_RECV,服務(wù)端為此狀態(tài)維護(hù)一個(gè)半連接隊(duì)列。當(dāng)服務(wù)端收到客戶(hù)的確認(rèn)包時(shí),刪除該條目,服務(wù)端進(jìn)入ESTABLISHED狀態(tài)。Listen中的backlog參數(shù)表示這兩個(gè)狀態(tài)合的最大值。若客戶(hù)端完成第一次握手后不再發(fā)送ACK包,導(dǎo)致服務(wù)端未完成隊(duì)列溢出,達(dá)到Dos攻擊的目的。
6)什么是SYN-ACK 重傳?
Dos攻擊可以達(dá)到目的的一個(gè)重要因素是服務(wù)端在發(fā)送完SYN+ACK包后會(huì)等待客戶(hù)端的確認(rèn)包,如果等待時(shí)間內(nèi)未收到,服務(wù)端會(huì)進(jìn)行首次重傳,等待一段時(shí)間仍未收到客戶(hù)確認(rèn)包,會(huì)進(jìn)行第二次重傳,直到重傳次數(shù)超過(guò)系統(tǒng)規(guī)定的最大值,系統(tǒng)將該連接信息從半連接隊(duì)列中刪除。如果系統(tǒng)刪除的頻率小于半連接狀態(tài)的增長(zhǎng)頻率,服務(wù)端就無(wú)法正常提供服務(wù)。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |