TCP頭部報(bào)文
- source port/destination port
源/目標(biāo)端口號(hào) - sequence number
字節(jié)流中每個(gè)字節(jié)的編號(hào),用于TCP通信過(guò)程中確定數(shù)據(jù)通信的有序性 - acknowledgement number
確認(rèn)序列號(hào),N表示之前N-1為止的所有數(shù)據(jù)都已經(jīng)確認(rèn)收到 - ISN(Initial Sequence Number)
- TCP FLAG
- ACK
ACK=0表示接收端未應(yīng)答,ACK=1表示接收端已經(jīng)接收到數(shù)據(jù) - SYN
同步序列號(hào),常用于確認(rèn)端口存在,TCP握手發(fā)送的第一個(gè)數(shù)據(jù)包,SYN=1表示接收端已經(jīng)準(zhǔn)備好了 - FIN
數(shù)據(jù)末尾,常用于端口掃描,通知接收端已經(jīng)到數(shù)據(jù)末尾,可以關(guān)閉連接了
- ACK
三次握手過(guò)程
三次握手過(guò)程其實(shí)是指建立一個(gè)TCP連接時(shí),需要客戶(hù)端和服務(wù)器總共發(fā)送3個(gè)包
三次握手主要就是為了確認(rèn)雙方的接收能力和發(fā)送能力是否正常,指定自己的初始化序列號(hào)為后面的可靠性傳輸做準(zhǔn)備。
實(shí)質(zhì)上就是連接服務(wù)器指定端口,建立TCP連接,同步雙方序列號(hào)和確認(rèn)號(hào),交換TCP窗口大小信息
初始狀態(tài)
客戶(hù)端處于closed狀態(tài),服務(wù)器端處于listen狀態(tài)第一次握手
客戶(hù)端 發(fā)送 SYN=1(客戶(hù)端SYN) sequence num=x(客戶(hù)端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第三次握手
客戶(hù)端 發(fā)送 ACK=1 sequence num=x+1 acknowledgement number=y+1
狀態(tài) ESTABLISHED
相關(guān)問(wèn)題
為什么是三次握手?
只有三次握手才能確認(rèn)雙方的發(fā)送和接收能力兩次握手行不行?
不行,比如客戶(hù)端發(fā)送連接請(qǐng)求,但是由于網(wǎng)絡(luò)原因過(guò)了一會(huì)兒這個(gè)請(qǐng)求才到達(dá)服務(wù)端,但是客戶(hù)端又發(fā)送了一次連接請(qǐng)求,并且連接成功,傳輸完數(shù)據(jù)后關(guān)閉了連接,但是這時(shí)之前的第一次請(qǐng)求到達(dá)了服務(wù)端,如果是兩次握手,那么服務(wù)端會(huì)認(rèn)為此時(shí)建立了連接,客戶(hù)端會(huì)一直忽略服務(wù)端發(fā)送的確認(rèn)信息,造成服務(wù)端一直在等待客戶(hù)端發(fā)送數(shù)據(jù),浪費(fèi)資源什么是半連接隊(duì)列?
服務(wù)端第一次接收到客戶(hù)端的SYN之后,會(huì)處于SYN_RCVD狀態(tài),此時(shí)連接并沒(méi)有建立,服務(wù)端會(huì)把處于這種狀態(tài)下的請(qǐng)求連接放在一個(gè)隊(duì)列中,我把這種隊(duì)列稱(chēng)為半連接隊(duì)列,服務(wù)端同時(shí)還維護(hù)一個(gè)全連接隊(duì)列。服務(wù)端發(fā)送完SYN-ACK包后,如果收不到客戶(hù)端的確認(rèn)消息,會(huì)每隔一段時(shí)間發(fā)送一次SYN-ACK包,當(dāng)發(fā)送次數(shù)超過(guò)規(guī)定次數(shù)后,會(huì)將該客戶(hù)端踢出半連接隊(duì)列。ISN
三次握手的其中一個(gè)重要功能是客戶(hù)端和服務(wù)端交換 ISN(Initial Sequence Number),以便讓對(duì)方知道接下來(lái)接收數(shù)據(jù)的時(shí)候如何按序列號(hào)組裝數(shù)據(jù)。如果 ISN 是固定的,攻擊者很容易猜出后續(xù)的確認(rèn)號(hào),因此 ISN 是動(dòng)態(tài)生成的。三次握手時(shí)可以攜帶數(shù)據(jù)么?
第一次第二次不可以攜帶數(shù)據(jù),防止被惡意攻擊,每次都在第一次握手放入大量數(shù)據(jù),服務(wù)端會(huì)浪費(fèi)很多資源和時(shí)間來(lái)接收這些無(wú)用的報(bào)文。SYN攻擊是什么?
服務(wù)端的資源分配是第二次握手時(shí)分配的,客戶(hù)端的資源分配是第三次握手時(shí)分配的??蛻?hù)端短時(shí)間內(nèi)通過(guò)不同的偽造IP,不斷向服務(wù)端發(fā)送SYN包,服務(wù)端會(huì)和一堆不存在的IP進(jìn)行第二次握手確認(rèn),同時(shí)會(huì)將這些偽造的客戶(hù)端加入半連接隊(duì)列,導(dǎo)致正常的客戶(hù)端請(qǐng)求被擠出隊(duì)列
防御方法:縮短超時(shí)時(shí)間、增加半連接隊(duì)列長(zhǎng)度、過(guò)濾網(wǎng)關(guān)防護(hù)、SYN cookies技術(shù)
四次揮手過(guò)程
TCP的半關(guān)閉狀態(tài),指的是TCP提供了連接的一端在結(jié)束發(fā)送后還能接收來(lái)自對(duì)方數(shù)據(jù)的能力。
- 初識(shí)狀態(tài)
雙方都處于ESTABLISHED狀態(tài) - 第一次揮手
客戶(hù)端 發(fā)送 FIN=1 sequence num=u(客戶(hù)端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 - 第四次揮手
客戶(hù)端 發(fā)送 ACK=1 sequence num=u+1(客戶(hù)端seq) acknowledgement number=w+1
狀態(tài) CLOSED
相關(guān)問(wèn)題
- 為什么是四次揮手?
一方發(fā)送FIN=1,那么另外一方需要先ACK=1確認(rèn)收到最后一條消息,然后再另外發(fā)送一條FIN=1表示這是自己的最后一條信息。 - 2MSL等待時(shí)間
MSL(Maximum Segment Lifetime),報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長(zhǎng)時(shí)間,在揮手過(guò)程中最后一次發(fā)送ACK=1包后等待2MSL的時(shí)間內(nèi)不能關(guān)閉,同時(shí)該連接在這2MSL時(shí)間內(nèi)不能再次使用。 - 等待2MSL的意義
- 保證客戶(hù)端發(fā)送的最后一個(gè)ACK=1包能夠到達(dá)服務(wù)端
- 防止已經(jīng)失效的連接的請(qǐng)求包出現(xiàn)在別的連接中