1. 程式人生 > >網路中TCP/IP模型

網路中TCP/IP模型

昨天學習了網路中的OSI模型,但OSI模型並沒有被廣泛應用,反而TCP/IP模型獲得了較大的成功,那今天就來學習下TCP/IP模型。

開始瘋狂的十萬個為什麼

什麼是TCP/IP模型?

TCP/IP參考模型是美國國防部高階研究計劃局計算機網(Advanced Research Projects Agency Network,ARPANET)和其後繼因特網使用的參考模型。ARPANET是由美國國防部(U.S.Department of Defense,DoD)贊助的研究網路。
最初,它只連線了美國境內的四所大學。隨後的幾年中,它通過租用的電話線連線了數百所大學和政府部門。最終ARPANET發展成為全球規模最大的互連網路-因特網。

我是這麼記得:美國國防部搞得網路模型—發展壯大----最後發展成了因特網

既然叫TCP/IP模型,什麼是TCP和IP?

TCP和IP分別是兩個協議

TCP:傳輸控制協議
IP:網際網路協議地址(Internet Protocol Address),縮寫就是IP地址

細節我們等等再說。

######現在我大概知道TCP/IP是怎麼來的了。來看看它的結構模型。
#####TCP/IP模型的體系結構
TCP/IP的參考模型將協議分成四個層次。對比OSI模型如圖:
圖片.png
可以看到TCP/IP模型把OSI模型濃縮了一些,沒有OSI模型那麼詳細。

應用層
表示層 ----- 應用層
會話層

這三層合併為應用層:為使用者提供各種服務。例如:HTTP,HTTPS,TFP,Telnet

TCP/IP中的傳輸層 ----- OSI中的傳輸層

提供了端對端的通訊連線方式,可靠的連線方式:TCP,不可靠的連線方式:UDP

TCP/IP中的網路層 ----- OSI中的網路層

提供主機與主機間的通訊,並找到一條好的路徑

網路介面層 ----- OSI中的鏈路層,物理層

負責監視主機在和網路之間的交換

######現在來比較下他們的相同點和不同點
相同點:
1.都採用了層級化結構
2.都提供了無連線和麵向連線兩種通訊服務機制
不同點:
1.TCP/IP模型是四層結構,ISO是七層結構
2.TCP是根據協議才制定的模型,而ISO模型是協議開發前就設定的,具有通用性。

接下來學習下TCP的連線和斷開

#####TCP連線的建立(三次握手)
首先要認識幾個標誌位和序號:

SYN:表示建立連線
ACK:表示確認序號有效
FIN:表示關閉連線
RST:表示連線重置
PSH:表示有 DATA資料傳輸

傳送報文時,帶上相應的標誌位,就代表相應的意思

1.seq序號,佔32位,發起方傳送資料時進行標記。
2.ack序號,確認序號,佔32位。

例如:

  • SYN=1,代表建立連線
  • SYN=1,和ACK=1,就代表建立連線和確認序號有效。
  • ACK=1,代表確認序號有效

三次握手

第一次握手:客戶端A向伺服器B傳送請求報文

######請求報文是這樣的
1.標誌符:SYN=1,代表建立連線
2.隨機初始化的一個序號:比如seq=x.
客戶端A進入(SYN-SEND)同步已傳送狀態。

第二次握手:伺服器B收到後,如果同意連線,那麼伺服器B就會向客戶端A傳送一個確認報文。

######確認報文是這樣的
1.標誌符:ACK=1,表示對剛剛的SYN包的確認,SYN=1,表示B與A建立連線。
2.隨機初始化一個序號:比如seq=y.
3.確認序號ack:ack是剛剛客戶端A傳送過來的序號+1,也就是x+1。
伺服器B進入SYN-RCVD(同步收到)狀態

第三次握手:客戶端A收到伺服器B的確認報文後,再向伺服器B傳送一個確認報文。

######這個確認報文是這樣的:
1.標誌符:ACK=1,表示對剛剛的SYN包的確認。
2.seq是上個請求的序號+1,也就是x+1
3.確認序號ack:ack是剛剛客戶端B傳送過來的序號+1,也就是y+1.
客戶端和伺服器進入ESTABLISHED(TCP連線成功)狀態。
#####單純看標誌符就是這樣一個過程:

  1. (A) –> [SYN] –> (B)
  2. (B) -> [SYN/ACK] -> (A)
  3. (A) –> [ACK] –> (B)
    #####看序號的話就是這樣的
    方向 seq ack
    A->B 2000 0
    B->A 3000 2001
    A->B 2001 3001
    A隨機初始化了一個序號seq=2000
    B隨機初始化了一個序號seq=3000
    A在接著上一個請求繼續下去,seq=20001。
    ######伺服器B收到後確認seq值和ACK,說明連線建立成功。

#####TCP連線的斷開(四次揮手)
四次揮手
假設客戶端A想要斷開連線

第一次揮手:

客戶端傳送一個 FIN 標誌位為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。

傳送完畢後,客戶端進入 FIN_WAIT_1 狀態。
第二次揮手:

伺服器B確認客戶端A傳送的 FIN 包,傳送一個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線

傳送完畢後,伺服器端進入 CLOSE_WAIT 狀態.
客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態,等待伺服器端關閉連線。

第三次揮手:

伺服器端準備好關閉連線時,向客戶端傳送FIN 為1的結束連線請求。

傳送完畢後,伺服器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。
第四次揮手:

  • 客戶端:接收到來自伺服器端的關閉請求,傳送一個確認包,並進入 TIME_WAIT狀態。等待可能出現的要求重傳的 ACK 包。
  • 伺服器端接收到這個確認包之後,關閉連線,進入 CLOSED 狀態。
  • 客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime)之後,沒有收到伺服器端的 ACK ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入 CLOSED 狀態。

#####形象點說就像這樣
A說:“我說完了。” A進去FIN-WAIT-1狀態。
B說:“我知道你說完了,但我還沒說完啊,我還沒準備好,讓我等會。”
於是呢A進入了FIN-WAIT-2狀態,B進去了CLOSE-WAIT狀態
B說:"我講完了,我也不說了"於是B進去了LAST-ACK狀態。
A說:"好了,我知道你不說了"於是A進去了TIME-WAIT狀態。B進去了CLOSED狀態
最後A在等了一會,發現B沒有理他,於是認為B不說話了,自己也不說了。A進去了CLOSED狀態。
#####為什麼連線的時候是三次握手,關閉的時候卻是四次揮手?
不同地方就在於:。
關閉連線時,是分別傳送ACK包和FIN包的。
建立連線時,SYN包和ACK包可以一起傳送。
這樣的原因是因為:關閉連線時,可能客戶端A還在傳送報文,只能告訴客戶端,我已經收到了。直到客戶端A傳送完報文時,伺服器B才可以傳送FIN報文。

參考文章:
https://blog.csdn.net/ygm_linux/article/details/79546034
https://blog.csdn.net/diligentkong/article/details/73351278
http://www.imooc.com/article/19345