1.傳輸全雙工通信,即 一個(gè)鏈接 雙向通信 互不影響
2.在TCP層,有個(gè)FLAGS字段,這個(gè)字段有以下幾個(gè)標(biāo)識(shí):SYN, FIN, ACK, PSH, RST, URG.
含義是:
SYN表示建立連接,
FIN表示關(guān)閉連接,
ACK表示響應(yīng),
PSH表示有 DATA數(shù)據(jù)傳輸,
RST表示連接重置。
3.TCP建立鏈接需要三次握手:

1).C -> S 標(biāo)志位:SYN = 1 , ACK = 0 ,隨機(jī)序列號(hào):seq:10000
(如何理解:客戶端C 自己隨機(jī)一個(gè)序列號(hào)seq發(fā)送給服務(wù)端 ;發(fā)送標(biāo)識(shí) SYN = 1 & ACK = 0 表示要求建立鏈接)
發(fā)送報(bào)文:SYN=1,ACK=0,SEQ=10000

2). S -> C 標(biāo)志位:SYN = 1 , ACK = 1 ,隨機(jī)序列號(hào):seq:20000,ack:10000 +1
(如何理解:服務(wù)端S 接到 SYN = 1 & ACK = 0 標(biāo)識(shí)的報(bào)文后, 自己隨機(jī)一個(gè)序列號(hào)seq,并將客戶端的seq+1 作為ack發(fā)送給客戶端 ;發(fā)送 標(biāo)識(shí) SYN = 1 & ACK = 1 表示已收到新鏈接請(qǐng)求,請(qǐng)繼續(xù)握手)
發(fā)送報(bào)文:SYN=1,ACK=1,SEQ=20000,ack=10001

3). C -> S 標(biāo)志位:SYN = 0 , ACK = 1 ,序列號(hào):seq:10001,ack:2000+1
(如何理解:客戶端C 接到 SYN = 1 & ACK = 1 標(biāo)識(shí)的報(bào)文后, 檢查收到ack是不是等于自己第一發(fā)送的seq +1,如果正確則將服務(wù)端的seq+1 作為ack發(fā)送給客戶端 ;發(fā)送 標(biāo)識(shí) SYN = 0 & ACK = 1 表示客戶端已與服務(wù)端確認(rèn)鏈接,此時(shí)鏈接成功,可以傳輸數(shù)據(jù)。)

內(nèi)容參考引用:
http://blog.csdn.net/onlyou930/article/details/7386484
http://m.survivalescaperooms.com/azraelly/archive/2012/12/25/2832393.html
PS1:
在TCP/ip協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。 第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn); 第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù) 器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)
PS2:
三次握手Three-way Handshake一個(gè)虛擬連接的建立是通過三次握手來實(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包(參見TCP包頭Resources). 認(rèn)識(shí)到這點(diǎn)很重要,只有當(dāng)A受到B發(fā)來的SYN包,才可建立連接,除此之外別無他法。因此,如果你的防火墻丟棄所有的發(fā)往外網(wǎng)接口的SYN包,那么你將不能讓外部任何主機(jī)主動(dòng)建立連接。2. (B) <-- [SYN/ACK] <--(A)接著,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位這就是為何連接跟蹤很重要的原因了. 沒有連接跟蹤,防火墻將無法判斷收到的ACK包是否屬于一個(gè)已經(jīng)建立的連接.一般的包過濾(Ipchains)收到ACK包時(shí),會(huì)讓它通過(這絕對(duì)不是個(gè)好主意). 而當(dāng)狀態(tài)型防火墻收到此種包時(shí),它會(huì)先在連接表中查找是否屬于哪個(gè)已建連接,否則丟棄該包四次握手Four-way Handshake四次握手用來關(guān)閉已建立的TCP連接1. (B) --> ACK/FIN --> (A)2. (B) <-- ACK <-- (A)3. (B) <-- ACK/FIN <-- (A)4. (B) --> ACK --> (A)注意: 由于TCP連接是雙向連接, 因此關(guān)閉連接需要在兩個(gè)方向上做。ACK/FIN 包(ACK 和FIN 標(biāo)記設(shè)為1)通常被認(rèn)為是FIN(終結(jié))包.然而, 由于連接還沒有關(guān)閉, FIN包總是打上ACK標(biāo)記. 沒有ACK標(biāo)記而僅有FIN標(biāo)記的包不是合法的包,并且通常被認(rèn)為是惡意的連接復(fù)位Resetting a connection四次握手不是關(guān)閉TCP連接的唯一方法. 有時(shí),如果主機(jī)需要盡快關(guān)閉連接(或連接超時(shí),端口或主機(jī)不可達(dá)),RST (Reset)包將被發(fā)送. 注意在,由于RST包不是TCP連接中的必須部分, 可以只發(fā)送RST包(即不帶ACK標(biāo)記). 但在正常的TCP連接中RST包可以帶ACK確認(rèn)標(biāo)記請(qǐng)注意RST包是可以不要收到方確認(rèn)的?無效的TCP標(biāo)記Invalid TCP Flags到目前為止,你已經(jīng)看到了 SYN, ACK, FIN, 和RST 標(biāo)記. 另外,還有PSH (Push) 和URG (Urgent)標(biāo)記.最常見的非法組合是SYN/FIN 包. 注意:由于 SYN包是用來初始化連接的, 它不可能和 FIN和RST標(biāo)記一起出現(xiàn). 這也是一個(gè)惡意攻擊.由于現(xiàn)在大多數(shù)防火墻已知 SYN/FIN 包, 別的一些組合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明顯,當(dāng)網(wǎng)絡(luò)中出現(xiàn)這種包時(shí),很你的網(wǎng)絡(luò)肯定受到攻擊了。別的已知的非法包有FIN (無ACK標(biāo)記)和"NULL"包。如同早先討論的,由于ACK/FIN包的出現(xiàn)是為了關(guān)閉一個(gè)TCP連接,那么正常的FIN包總是帶有 ACK 標(biāo)記。"NULL"包就是沒有任何TCP標(biāo)記的包(URG,ACK,PSH,RST,SYN,FIN都為0)。到目前為止,正常的網(wǎng)絡(luò)活動(dòng)下,TCP協(xié)議棧不可能產(chǎn)生帶有上面提到的任何一種標(biāo)記組合的TCP包。當(dāng)你發(fā)現(xiàn)這些不正常的包時(shí),肯定有人對(duì)你的網(wǎng)絡(luò)不懷好意。
PS3: 數(shù)據(jù)傳輸階段:
序號(hào) 方向 seq ack size23 A->B 40000 70000 151424 B->A 70000 40000+1514-54=41460 5425 A->B 41460 70000+54-54=70000 151426 B->A 70000 41460+1514-54=42920 54解釋:23:B接收到A發(fā)來的seq=40000,ack=70000,size=1514的數(shù)據(jù)包24:于是B向A也發(fā)一個(gè)數(shù)據(jù)包,告訴B,你的上個(gè)包我收到了。B的seq就以它收到的數(shù)據(jù)包的ACK填充,ACK是它收到的數(shù)據(jù)包的SEQ加上數(shù)據(jù)包的大小(不包括以太網(wǎng)協(xié)議頭,IP頭,TCP頭),以證實(shí)B發(fā)過來的數(shù)據(jù)全收到了。25:A在收到B發(fā)過來的ack為41460的數(shù)據(jù)包時(shí),一看到41460,正好是它的上個(gè)數(shù)據(jù)包的seq加上包的大小,就明白,上次發(fā)送的數(shù)據(jù)包已安全到達(dá)。于是它再發(fā)一個(gè)數(shù)據(jù)包給B。這個(gè)正在發(fā)送的數(shù)據(jù)包的seq也以它收到的數(shù)據(jù)包的ACK填充,ACK就以它收到的數(shù)據(jù)包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長,沒數(shù)據(jù)項(xiàng))。其實(shí)在握手和結(jié)束時(shí)確認(rèn)號(hào)應(yīng)該是對(duì)方序列號(hào)加1,傳輸數(shù)據(jù)時(shí)則是對(duì)方序列號(hào)加上對(duì)方攜帶應(yīng)用層數(shù)據(jù)的長度.如果從以太網(wǎng)包返回來計(jì)算所加的長度,就嫌走彎路了.另外,如果對(duì)方?jīng)]有數(shù)據(jù)過來,則自己的確認(rèn)號(hào)不變,序列號(hào)為上次的序列號(hào)加上本次應(yīng)用層數(shù)據(jù)發(fā)送長度.
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注