天天看點

TCP/IP 協定

TCP/IP 協定

鍊路層:對0、1進行分組、定義資料幀、确認主機的地理位置進行傳輸

網絡層:定義ip位址,确認主機所在的網絡位置,通過ip進行Mac尋址,對外網資料包進行路由轉發

傳輸層:定義端口,确認本機上應用程式的身份并将資料包又給對應的應用程式。

應用層:定義資料格式,并按照對應的的格式解讀資料

TCP/IP協定的傳輸打包圖解,反之則是解包

TCP/IP 協定

三次握手機制,是建立TCP連接配接,并同步連接配接雙方的序列号和确認号并交換TCP視窗大小資訊,在socket程式設計中,用戶端執行connect()時。将觸發三次握手。

TCP/IP 協定

這邊做一下解釋:

1、第一次握手時,用戶端發送一個TCP/IP的SYN标志位置1的包指明用戶端打算連接配接的伺服器的端口,以及初始化序号X,儲存在標頭的序列号Seq字段裡。

2、第二次握手:

伺服器發回确認包(ACK)應答。即SYN标志位和ACK标志位均為1同時,将确認序号ACK設定位客戶的ISN加1,即圖中的X+1。

3、第三次握手:

用戶端再次發送确認包(ACK) SYN标志位為0 ACK标志位為1,并且把伺服器發來的ACK的序号字段+1,放在确定字段中發送給對方,并且在資料段放寫INS的+1。

TCP四次揮手

TCP的連接配接的拆除需要發送四個包,是以稱為四次揮手。用戶端或伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()操作即可産生揮手操作。

圖解:

TCP/IP 協定

主動放發出信号即觸發了揮手機制。

解釋:

1)用戶端程序發出連接配接釋放封包,并且停止發送資料。釋放資料封包首部,FIN=1,其序列号為seq=u(等于前面已經傳送過來的資料的最後一個位元組的序号加1),此時,用戶端進入FIN-WAIT-1(終止等待1)狀态。 TCP規定,FIN封包段即使不攜帶資料,也要消耗一個序号。

2)伺服器收到連接配接釋放封包,發出确認封包,ACK=1,ack=u+1,并且帶上自己的序列号seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀态。TCP伺服器通知高層的應用程序,用戶端向伺服器的方向就釋放了,這時候處于半關閉狀态,即用戶端已經沒有資料要發送了,但是伺服器若發送資料,用戶端依然要接受。這個狀态還要持續一段時間,也就是整個CLOSE-WAIT狀态持續的時間。

3)用戶端收到伺服器的确認請求後,此時,用戶端就進入FIN-WAIT-2(終止等待2)狀态,等待伺服器發送連接配接釋放封包(在這之前還需要接受伺服器發送的最後的資料)。

4)伺服器将最後的資料發送完畢後,就向用戶端發送連接配接釋放封包,FIN=1,ack=u+1,由于在半關閉狀态,伺服器很可能又發送了一些資料,假定此時的序列号為seq=w,此時,伺服器就進入了LAST-ACK(最後确認)狀态,等待用戶端的确認。

5)用戶端收到伺服器的連接配接釋放封包後,必須發出确認,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此時,用戶端就進入了TIME-WAIT(時間等待)狀态。注意此時TCP連接配接還沒有釋放,必須經過2∗∗MSL(最長封包段壽命)的時間後,當用戶端撤銷相應的TCB後,才進入CLOSED狀态。

6)伺服器隻要收到了用戶端發出的确認,立即進入CLOSED狀态。同樣,撤銷TCB後,就結束了這次的TCP連接配接。可以看到,伺服器結束TCP連接配接的時間要比用戶端早一些。

這邊常出現的面試題:

一、為什麼連接配接的時候時三次握手,關閉的時候卻是四次揮手?

解答:因為Server端受到的Client端的SYN連接配接請求封包後,可以直接發送SYN+ACK封包。其中ACK封包使用來應答的,SYN封包是用來同步的。但是關閉連接配接時,當Server端受到FIN封包時,很可能并不會立即關閉SOCKET,是以隻能先回複一個ACK封包,通知Client端FIN封包Server端已經接收到了。但是Server端也并不能立即關閉連接配接,需要等待Server端的所有封包都發送完成後,Server才能發送FIN封包,是以SYN與ACK在Server端不能一并發送,是以需要四次揮手。