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