真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)
一、TCP報文格式
下面是TCP報文格式圖:
(1) 序號, Seq(Sequence number),占32位,用來標(biāo)識從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時對此進(jìn)行標(biāo)記。
(2) 確認(rèn)號, Ack(Acknowledge number), 占32位,只有ACK標(biāo)志位為1時,確認(rèn)序號字段才有效,Ack=Seq+1。
(3) 標(biāo)志位 有6種標(biāo)示(SYN、ACK、PSH、RST、URG、FIN):
①SYN(synchronous建立聯(lián)機(jī))
②ACK(acknowledgement 確認(rèn))
③PSH(push傳送)
④RST(reset重置)
⑤URG(urgent緊急)
⑥FIN(finish結(jié)束)
注:
① 不要將確認(rèn)號Ack(Acknowledge number) 和 標(biāo)志位中的 ACK(acknowledgement)混淆
二、三次握手
(1) 第一次握手: Client將標(biāo)志位SYN置為1, 隨機(jī)產(chǎn)生一個seq=J,并將該數(shù)據(jù)包發(fā)送給Server, Client進(jìn)入SYN_SENT狀態(tài), 等待
Server確認(rèn).
(2) 第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請求建立連接, Server將標(biāo)志位SYN和ACK都置為1,ack=J+1,
隨機(jī)產(chǎn)生一個值seq=K,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求,Server進(jìn)入SYN_RECV狀態(tài).
(3) 第三次握手:Client收到確認(rèn)后, 檢查ack是否為J+1, ACK是否為1, 如果正確則將標(biāo)志位ACK置為1,ack=K+1, 并將該數(shù)據(jù)
包發(fā)送給Server,Server檢查ack是否為K+1, ACK是否為1, 如果正確則連接建立成功, Client和Server進(jìn)入
ESTABLISHED狀態(tài),完成三次握手, 隨后Client與Server之間可以開始傳輸數(shù)據(jù)了.
SYN攻擊:
在三次握手過程中, Server發(fā)送SYN_ACK之后, 收到Client的ACK之前的TCP連接稱為 半連接(half-open connect), 此時
Server處于SYN_RECV狀態(tài),Server轉(zhuǎn)入ESTABLISHED狀態(tài). SYN攻擊就是Client在短時間內(nèi)偽造不存在的IP地址, 并向Server
不斷的發(fā)送SYN包, Server回復(fù)確認(rèn)包, 并等待Client確認(rèn), 由于源地址不存在的, 因此Server需要不斷重發(fā)直至超時, 這些偽造的
SYN包將產(chǎn)時間占用未連接隊列, 導(dǎo)致正常的SYN請求因為隊列滿而被丟棄, 從而引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓. SYN攻擊時一種典
型的DDOS攻擊, 檢測SYN攻擊的方式非常簡單, 即當(dāng)Server上有大量半連接狀態(tài)切源IP地址是隨機(jī)的, 則可以斷定遭到SYN攻擊
了,使用如下命令可以讓之現(xiàn)行:
#netstat -nap | grep SYN_RECV
四、四次揮手
所謂四次揮手就是終止TCP連接, 就是要斷開一個TCP連接時, 需要客戶端和服務(wù)器總共進(jìn)行四次交互。在socket編程中, 這個
執(zhí)行過程由客戶端或者服務(wù)器任意一方執(zhí)行close來觸發(fā), 下面是斷開流程圖:
由于TCP連接時全雙工的, 因此, 每個方向都必須要單獨(dú)進(jìn)行關(guān)閉, 這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后, 發(fā)送一個FIN來終止
這一方向的連接,收到一個FIN只是意味著這一方向上沒有數(shù)據(jù)流動了, 即不會再收到數(shù)據(jù)了, 但是在這個TCP連接上仍然能夠發(fā)送數(shù)
據(jù),直到這一方向也發(fā)送了FIN. 首先進(jìn)行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方則執(zhí)行被動關(guān)閉,上圖描述的即是如此。
(1) 第一次揮手: Client發(fā)送一個FIN, 用來關(guān)閉Client 到 Server的數(shù)據(jù)傳輸, Client進(jìn)入FIN_WAIT_1狀態(tài)
(2) 第二次揮手: Server收到FIN后, 發(fā)送一個ACK給Client, 確認(rèn)序號為收到的序號+1(與SYN相同, 一個FIN占用一個序號),
Server進(jìn)入CLOSE_WAIT狀態(tài)
(3) 第三次揮手: Server發(fā)送一個FIN后, 用來關(guān)閉Server到Client的數(shù)據(jù)傳輸, Server進(jìn)入LAST_ACK狀態(tài)
(4) 第四次揮手: Client收到FIN后, Client進(jìn)入TIME_WAIT狀態(tài), 接著發(fā)送一個ACK給Server, 確認(rèn)序號為收到序號+1, Server
進(jìn)入CLOSED狀態(tài), 完成四次揮手
四、狀態(tài)
SYN_SENT狀態(tài):
當(dāng)客戶端SOCKET執(zhí)行CONNECT連接時,它首先發(fā)送SYN報文,因此也隨即它會進(jìn)入到了SYN_SENT狀態(tài),并等待服務(wù)
端的發(fā)送三次握手中的第2個報文。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN報文. (發(fā)送端)
SYN_RCVD狀態(tài): 這個狀態(tài)與SYN_SENT相呼應(yīng)這個狀態(tài)表示接受到了SYN報文.
ESTABLISHED: 表示連接已經(jīng)建立了.
CLOSE_WAIT狀態(tài):
發(fā)起TCP連接關(guān)閉的一方稱為client,被動關(guān)閉的一方稱為server. 被動關(guān)閉的server收到FIN后, 但未發(fā)出ACK的TCP狀態(tài)
是CLOSE_WAIT.出現(xiàn)這種狀況一般都是由于server端代碼的問題, 如果你的服務(wù)器上出現(xiàn)大量CLOSE_WAIT, 應(yīng)該要考慮檢查代碼.
TIME_WAIT狀態(tài):
表示收到了對方的FIN報文, 并發(fā)送出ACK報文, 就等2MSL后即可回到CLOSED可用狀態(tài).
LAST_ACK:
表示被關(guān)閉的一方在發(fā)送FIN報文后, 最后等待對方的ACK報文. 當(dāng)收到ACK報文后, 也即可以進(jìn)入到CLOSED狀態(tài)了.
CLOSED: 表示連接中斷.
五、總結(jié)
關(guān)于三次握手與四次揮手通常都會有典型的面試題:
(1) 三次握手是什么或者流程? 四次握手呢? 答案前面分析就是.
(2) 為什么連接時是三次握手, 而關(guān)閉連接卻是四次揮手?
這是因為服務(wù)端在LISTEN狀態(tài)下, 收到建立連接請求的SYN報文后, 把ACK和SYN放在一個報文里發(fā)送給客戶端. 而關(guān)閉連接時,
當(dāng)收到對方的FIN報文時, 僅僅表示對方不在發(fā)送數(shù)據(jù)了, 但是還能接收數(shù)據(jù), 己方也未必全部數(shù)據(jù)都發(fā)送對方了, 所以己方可以立即
close, 也可以發(fā)送一些數(shù)據(jù)給對方后, 再發(fā)送FIN報文給對方來表示同意現(xiàn)在關(guān)閉連接, 因此, 己方ACK和FIN一般都會分開發(fā)送。
參考文章:
http://blog.csdn.net/xifeijian/article/details/12777187
http://www.cnblogs.com/Jessy/p/3535612.html
http://blog.csdn.net/renzhenhuai/article/details/12105457
http://www.cnblogs.com/jiangson/p/5980681.html
總結(jié)
以上是生活随笔為你收集整理的真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对电脑屏幕进行监控和远程控制有什么方法对
- 下一篇: 小红书全面发力双十一,推百亿流量扶持、亿