tcp協(xié)議中syn?
TCP的三次握手是怎么進(jìn)行的了:發(fā)送端發(fā)送一個(gè)SYN=1,ACK=0標(biāo)志的數(shù)據(jù)包給接收端,請(qǐng)求進(jìn)行連接,這是第一次握手;接收端收到請(qǐng)求并且允許連接的話,就會(huì)發(fā)送一個(gè)SYN=1,ACK=1標(biāo)志的數(shù)據(jù)包給發(fā)送端,告訴它,可以通訊了,并且讓發(fā)送端發(fā)送一個(gè)確認(rèn)數(shù)據(jù)包,這是第二次握手;最后,發(fā)送端發(fā)送一個(gè)SYN=0,ACK=1的數(shù)據(jù)包給接收端,告訴它連接已被確認(rèn),這就是第三次握手。之后,一個(gè)TCP連接建立,開(kāi)始通訊。
*SYN:同步標(biāo)志
同步序列編號(hào)(Synchronize Sequence Numbers)欄有效。該標(biāo)志僅在三次握手建立TCP連接時(shí)有效。它提示TCP連接的服務(wù)端檢查序列編號(hào),該序列編號(hào)為T(mén)CP連接初始端(一般是客戶端)的初始序列編號(hào)。在這里,可以把TCP序列編號(hào)看作是一個(gè)范圍從0到4,294,967,295的32位計(jì)數(shù)器。通過(guò)TCP連接交換的數(shù)據(jù)中每一個(gè)字節(jié)都經(jīng)過(guò)序列編號(hào)。在TCP報(bào)頭中的序列編號(hào)欄包括了TCP分段中第一個(gè)字節(jié)的序列編號(hào)。
*ACK:確認(rèn)標(biāo)志
確認(rèn)編號(hào)(Acknowledgement Number)欄有效。大多數(shù)情況下該標(biāo)志位是置位的。TCP報(bào)頭內(nèi)的確認(rèn)編號(hào)欄內(nèi)包含的確認(rèn)編號(hào)(w+1,F(xiàn)igure-1)為下一個(gè)預(yù)期的序列編號(hào),同時(shí)提示遠(yuǎn)端系統(tǒng)已經(jīng)成功接收所有數(shù)據(jù)。
*RST:復(fù)位標(biāo)志
復(fù)位標(biāo)志有效。用于復(fù)位相應(yīng)的TCP連接。
*URG:緊急標(biāo)志
緊急(The urgent pointer) 標(biāo)志有效。緊急標(biāo)志置位,
*PSH:推標(biāo)志
該標(biāo)志置位時(shí),接收端不將該數(shù)據(jù)進(jìn)行隊(duì)列處理,而是盡可能快將數(shù)據(jù)轉(zhuǎn)由應(yīng)用處理。在處理 telnet 或 rlogin 等交互模式的連接時(shí),該標(biāo)志總是置位的。
*FIN:結(jié)束標(biāo)志
帶有該標(biāo)志置位的數(shù)據(jù)包用來(lái)結(jié)束一個(gè)TCP回話,但對(duì)應(yīng)端口仍處于開(kāi)放狀態(tài),準(zhǔn)備接收后續(xù)數(shù)據(jù)
三次握手Three-way Handshake
一個(gè)虛擬連接的建立是通過(guò)三次握手來(lái)實(shí)現(xiàn)的
1. (B) --> [SYN] --> (A)
假如服務(wù)器A和客戶機(jī)B通訊. 當(dāng)A要和B通信時(shí),B首先向A發(fā)一個(gè)SYN (Synchronize) 標(biāo)記的包,告訴A請(qǐng)求建立連接.
注意: 一個(gè) SYN包就是僅SYN標(biāo)記設(shè)為1的TCP包(參見(jiàn)TCP包頭Resources). 認(rèn)識(shí)到這點(diǎn)很重要,只有當(dāng)A受到B發(fā)來(lái)的SYN包,才可建立連接,除此之外別無(wú)他法。因此,如果你的防火墻丟棄所有的發(fā)往外網(wǎng)接口的SYN包,那么你將不能讓外部任何主機(jī)主動(dòng)建立連接。
2. (B)
接著,A收到后會(huì)發(fā)一個(gè)對(duì)SYN包的確認(rèn)包(SYN/ACK)回去,表示對(duì)第一個(gè)SYN包的確認(rèn),并繼續(xù)握手操作.
注意: SYN/ACK包是僅SYN 和 ACK 標(biāo)記為1的包.
3. (B) --> [ACK] --> (A)
B收到SYN/ACK 包,B發(fā)一個(gè)確認(rèn)包(ACK),通知A連接已建立。至此,三次握手完成,一個(gè)TCP連接完成
Note: ACK包就是僅ACK 標(biāo)記設(shè)為1的TCP包. 需要注意的是當(dāng)三此握手完成、連接建立以后,TCP連接的每個(gè)包都會(huì)設(shè)置ACK位
這就是為何連接跟蹤很重要的原因了. 沒(méi)有連接跟蹤,防火墻將無(wú)法判斷收到的ACK包是否屬于一個(gè)已經(jīng)建立的連接.一般的包過(guò)濾(Ipchains)收到ACK包時(shí),會(huì)讓它通過(guò)(這絕對(duì)不是個(gè)好主意). 而當(dāng)狀態(tài)型防火墻收到此種包時(shí),它會(huì)先在連接表中查找是否屬于哪個(gè)已建連接,否則丟棄該包
四次握手Four-way Handshake
四次握手用來(lái)關(guān)閉已建立的TCP連接
1. (B) --> ACK/FIN --> (A)
2. (B)
3. (B)
4. (B) --> ACK --> (A)
注意: 由于TCP連接是雙向連接, 因此關(guān)閉連接需要在兩個(gè)方向上做。ACK/FIN 包(ACK 和FIN 標(biāo)記設(shè)為1)通常被認(rèn)為是FIN(終結(jié))包.然而, 由于連接還沒(méi)有關(guān)閉, FIN包總是打上ACK標(biāo)記. 沒(méi)有ACK標(biāo)記而僅有FIN標(biāo)記的包不是合法的包,并且通常被認(rèn)為是惡意的