TCP頭部報文
- source port/destination port
源/目標(biāo)端口號 - sequence number
字節(jié)流中每個字節(jié)的編號,用于TCP通信過程中確定數(shù)據(jù)通信的有序性 - acknowledgement number
確認序列號,N表示之前N-1為止的所有數(shù)據(jù)都已經(jīng)確認收到 - ISN(Initial Sequence Number)
- TCP FLAG
- ACK
ACK=0表示接收端未應(yīng)答颅夺,ACK=1表示接收端已經(jīng)接收到數(shù)據(jù) - SYN
同步序列號凡蚜,常用于確認端口存在爽醋,TCP握手發(fā)送的第一個數(shù)據(jù)包涝滴,SYN=1表示接收端已經(jīng)準(zhǔn)備好了 - FIN
數(shù)據(jù)末尾涮瞻,常用于端口掃描鲤拿,通知接收端已經(jīng)到數(shù)據(jù)末尾,可以關(guān)閉連接了
- ACK
三次握手過程
三次握手過程其實是指建立一個TCP連接時饲宛,需要客戶端和服務(wù)器總共發(fā)送3個包
三次握手主要就是為了確認雙方的接收能力和發(fā)送能力是否正常皆愉,指定自己的初始化序列號為后面的可靠性傳輸做準(zhǔn)備。
實質(zhì)上就是連接服務(wù)器指定端口艇抠,建立TCP連接幕庐,同步雙方序列號和確認號,交換TCP窗口大小信息
初始狀態(tài)
客戶端處于closed狀態(tài)家淤,服務(wù)器端處于listen狀態(tài)第一次握手
客戶端 發(fā)送 SYN=1(客戶端SYN) sequence num=x(客戶端ISN)
狀態(tài) SYN_Send第二次握手
服務(wù)端 發(fā)送 SYN=1(服務(wù)端SYN) sequence num=y(服務(wù)端ISN) ACK=1 acknowledgement number=x+1
狀態(tài) SYN_RCVD第三次握手
客戶端 發(fā)送 ACK=1 sequence num=x+1 acknowledgement number=y+1
狀態(tài) ESTABLISHED
相關(guān)問題
為什么是三次握手异剥?
只有三次握手才能確認雙方的發(fā)送和接收能力兩次握手行不行?
不行絮重,比如客戶端發(fā)送連接請求冤寿,但是由于網(wǎng)絡(luò)原因過了一會兒這個請求才到達服務(wù)端,但是客戶端又發(fā)送了一次連接請求青伤,并且連接成功督怜,傳輸完數(shù)據(jù)后關(guān)閉了連接,但是這時之前的第一次請求到達了服務(wù)端狠角,如果是兩次握手号杠,那么服務(wù)端會認為此時建立了連接,客戶端會一直忽略服務(wù)端發(fā)送的確認信息丰歌,造成服務(wù)端一直在等待客戶端發(fā)送數(shù)據(jù)姨蟋,浪費資源什么是半連接隊列?
服務(wù)端第一次接收到客戶端的SYN之后立帖,會處于SYN_RCVD狀態(tài)眼溶,此時連接并沒有建立,服務(wù)端會把處于這種狀態(tài)下的請求連接放在一個隊列中,我把這種隊列稱為半連接隊列晓勇,服務(wù)端同時還維護一個全連接隊列堂飞。服務(wù)端發(fā)送完SYN-ACK包后灌旧,如果收不到客戶端的確認消息,會每隔一段時間發(fā)送一次SYN-ACK包酝静,當(dāng)發(fā)送次數(shù)超過規(guī)定次數(shù)后节榜,會將該客戶端踢出半連接隊列羡玛。ISN
三次握手的其中一個重要功能是客戶端和服務(wù)端交換 ISN(Initial Sequence Number)别智,以便讓對方知道接下來接收數(shù)據(jù)的時候如何按序列號組裝數(shù)據(jù)。如果 ISN 是固定的稼稿,攻擊者很容易猜出后續(xù)的確認號薄榛,因此 ISN 是動態(tài)生成的。三次握手時可以攜帶數(shù)據(jù)么让歼?
第一次第二次不可以攜帶數(shù)據(jù)敞恋,防止被惡意攻擊,每次都在第一次握手放入大量數(shù)據(jù)谋右,服務(wù)端會浪費很多資源和時間來接收這些無用的報文硬猫。SYN攻擊是什么?
服務(wù)端的資源分配是第二次握手時分配的改执,客戶端的資源分配是第三次握手時分配的啸蜜。客戶端短時間內(nèi)通過不同的偽造IP辈挂,不斷向服務(wù)端發(fā)送SYN包衬横,服務(wù)端會和一堆不存在的IP進行第二次握手確認,同時會將這些偽造的客戶端加入半連接隊列终蒂,導(dǎo)致正常的客戶端請求被擠出隊列
防御方法:縮短超時時間蜂林、增加半連接隊列長度、過濾網(wǎng)關(guān)防護拇泣、SYN cookies技術(shù)
四次揮手過程
TCP的半關(guān)閉狀態(tài)噪叙,指的是TCP提供了連接的一端在結(jié)束發(fā)送后還能接收來自對方數(shù)據(jù)的能力。
- 初識狀態(tài)
雙方都處于ESTABLISHED狀態(tài) - 第一次揮手
客戶端 發(fā)送 FIN=1 sequence num=u(客戶端seq)
狀態(tài) FIN_WAIT1 - 第二次揮手
服務(wù)端 發(fā)送 ACK=1 sequence num=v(服務(wù)端seq) acknowledgement number=u+1
狀態(tài) CLOSE_WAIT - 第三次揮手
服務(wù)端 發(fā)送 FIN=1 ACK=1 sequence num=w(服務(wù)端seq) acknowledgement number=u+1
狀態(tài) LAST_ACK - 第四次揮手
客戶端 發(fā)送 ACK=1 sequence num=u+1(客戶端seq) acknowledgement number=w+1
狀態(tài) CLOSED
相關(guān)問題
- 為什么是四次揮手霉翔?
一方發(fā)送FIN=1睁蕾,那么另外一方需要先ACK=1確認收到最后一條消息,然后再另外發(fā)送一條FIN=1表示這是自己的最后一條信息早龟。 - 2MSL等待時間
MSL(Maximum Segment Lifetime)惫霸,報文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長時間,在揮手過程中最后一次發(fā)送ACK=1包后等待2MSL的時間內(nèi)不能關(guān)閉葱弟,同時該連接在這2MSL時間內(nèi)不能再次使用壹店。 - 等待2MSL的意義
- 保證客戶端發(fā)送的最后一個ACK=1包能夠到達服務(wù)端
- 防止已經(jīng)失效的連接的請求包出現(xiàn)在別的連接中