日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)

發(fā)布時間:2024/8/24 综合教程 45 生活家

一、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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。