天天看點

Linux網絡程式設計TCP三向交握與四次揮手

TCP三向交握與四次揮手

導緻TCP需要四次揮手的原因是半關閉
半關閉  關的是用戶端的  寫緩沖區,還沒有與服務端斷開連接配接      

分析圖:

三次握手:

Linux網絡程式設計TCP三向交握與四次揮手

文字描述:

三次握手:

Linux網絡程式設計TCP三向交握與四次揮手

注意:

  • 采用三次握手而不采用二次握手是為了防止已失效的連接配接請求封包段突然又傳送到了TCP伺服器,因而導緻錯誤
  • 序号不攜帶資料,是以不消耗序号

四次揮手:

Linux網絡程式設計TCP三向交握與四次揮手

主動關閉連接配接請求端,發送FIN标志位。

被動關閉連接配接請求端,應答ACK标志位。 ——半關閉完成

被動關閉連接配接請求端,發送FIN标志位。

主動關閉連接配接請求端,應答ACK标志位。 ——連接配接全部關閉

注意:

  • 序号不攜帶資料,是以不消耗序号

TCP封包段的首部格式:

Linux網絡程式設計TCP三向交握與四次揮手
  • FIN—終止标志位:用來釋放TCP連接配接
  • SYN—在TCP連接配接建立時用來同步序号
  • RST—用來複位TCP連接配接
  • 當RST=1時,表明TCP連接配接出現了異常,必須釋放連接配接,然後在重建立立連接配接。
  • RST置為1還用來拒絕一個非法的封包段或拒絕打開一個TCP連接配接。
  • 接收方的TCP收到該标志位為1的封包段會盡快上交應用程序,而不必等到接收緩存都填滿後再上傳遞。
  • URG—緊急标志位URG
  • 取值為1時緊急指針字段有效;取值為0時緊急指針字段無效。
  • 緊急指針占16比特,以位元組為機關,用來指明緊急資料的長度。

滑動視窗與TCP資料包格式

* 是一種流量控制技術
* 發送給連接配接對端
* 滑動視窗的實質是本端緩沖區大小(實時)。
* 滑動視窗的作用是防止資料丢失      

mms:Maximum Segment Size(一條資料的最大的資料量)

win:滑動視窗

Linux網絡程式設計TCP三向交握與四次揮手

TCP狀态時序圖:

文字描述:

* 1.主動發起連接配接請求端:CLOSE---發送SYN--SEND_SYN--接收ACK、SYN--發送ACK--ESTABLISHED(資料通信态)
    * 
2.主動關閉連接配接請求端:ESTABLISHED(資料通信态)--發送FIN--FIN_WAIT_1--接收ACK--FIN_WAIT_2(半關閉)

        * 
--接收對端發送FIN--FIN_WAIT_2(半關閉)--回發ACK--TIME_WAIT(隻有主動關閉連接配接方,會經曆該狀态)
        * 
 --等 2MSL時長--CLOSE
    * 
3.被動接收連接配接請求端:CLOSE--LISTEN--接收 SYN --LISTEN -- 發送ACK、SYN -- SYN_RCVD--接收ACK -- ESTABLISHED(資料通信态)
    * 
被動關閉連接配接請求端:ESTABLISHED(資料通信态)-- 接收FIN -- ESTABLISHED(資料通信态) -- 發送ACK

        * 
CLOSE_WAIT (說明對端【主動關閉連接配接端】處于半關閉狀态) -- 發送 FIN-- LAST_ACK -- 接收ACK -- CLOSE



    重點記憶:ESTABLISHED、FIN_WAIT_2<-->CLOSE_WAIT TIME_WAIT(2MSL)

2MSL時長:
    * 
一定出現在【主動關閉連接配接請求端】。---對應TIME——WATI狀态。
    * 
保證,最後一個ACK能成功被對端接收。(等待期間,對端沒收到我發的ACK,對端會再次發送FIN請求。)



端口複用:
    * 
int opt=1;        //設定端口複用。
    * 
setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,(void*)&opt,sizeof(opt));



半關閉:
    * 
通信雙方中,隻有一端關閉。    -----FIN_WAIT_2


close(cfd);
shutdown(int fd,int how);
how:      

繼續閱讀