網絡的五層划分是什么?
- 應用層,常見協議:HTTP、FTP
- 傳輸層,常見協議:TCP.UDP
- 網絡層,常見協議:IP
- 鏈路層
- 物理層
TCP 和 UDP 的區別是什么
- TCP/UDP 都屬於傳輸層的協議
- TCP 是面向
連接
的傳輸層協議,能夠准確可靠
的把數據傳遞給對方,當數據有丟包情況會重發,但是需要在建立和斷開連接需要至少7次的發包和收包,會浪費網絡流量
,主要用在對可靠性要求較高的地方。 - UDP 是面向
無連接
的傳輸層協議,意思是只負責傳輸數據,不能確保
對方是否收到數據和數據的正確順序,數據的正確性由應用層來校驗。主要用於高速傳輸和實時性要求較高的場合如音視頻會議,廣播。
TCP 三次握手和四次揮手
- 先來張時序圖
- 來張自己使用
wireShark
抓取的tcp
數據包和wireShark
生成的流量圖- 數據包(三次握手是完整的,四次揮手不完整,丟了一個包)
- 流量圖(三次握手是完整的,四次揮手不完整,丟了一個包)
- 數據包(三次握手是完整的,四次揮手不完整,丟了一個包)
序號,確認號
- 序列號 Sequeuece number(Seq): 數據包本身的序列號,初始序列號是隨機的。
- 確認號 Acknowledgment number(Ack): 在接收端,用來通知發送端數據成功接收
- 標志位,標志位只有為
1
的時候才有效- SYN: 創建一個連接
- ACK: 確認接收到的數據
- FIN: 終結一個連接
TCP 三次握手
- TCP 三次握手圖
- 第一次握手:客戶端向服務器端發送報文,報文中設置標志位
SYN=1
,生成隨機序列號Seq = x
,這時客戶端進入SYN_SENT
狀態。
- 第二次握手: 服務器端收到客戶端的報文,由
SYN=1
可以知道客戶端請求建立連接。服務器端給客戶端發送報文,設置標志位SYN=1,ACK=1
, 生成隨機序列號Seq=y
,設置確認號Ack = x+1
,這是服務器端進入SYN_RCVD
狀態
- 第三次握手: 客戶端接收到服務器的報文,檢查
ACK
是否為1
,Ack
是否為x+1
, 如果正確則將標志位ACK
置為1
,Ack
置為y+1
,並將該數據包發送給服務器端,服務器端檢查ACK
是否為1
,Ack
是否為y+1
,如果正確則連接建立成功,服務器端和客戶端進入ESTABLISHED
狀態,完成三次握手。
- 為什么需要三次握手,兩次確認?
- 為什么客戶端還要發送一次確認呢,主要是為了防止已失效的連接請求報文突然又傳送到了服務器端,造成錯誤。比如:客戶端發送連接請求,因為網絡或者一些其他因素造成沒有在一定時間到達服務器端,所以客戶端沒有收到確認。於是客戶端會重發一次連接請求,通過三次握手與服務器建立連接,但是這時上次的請求到達服務器端了,服務器會誤以為客戶端又發來了一次新的連接請求,會向客戶端發送報文同意建立連接,但是客戶端已經建立了,就會放棄掉該報文,服務器端沒有收到響應,也就不會建立連接了。
TCP 四次揮手
-
四次揮手數據包
-
四次揮手流量圖
-
由於 TCP 連接是全雙工的,因此每個方向都必須單獨進行關閉。這一原則是當一方數據發送完成,發送一個標志位為 FIN 的報文來終止這一方向的連接,收到標志位為 FIN 的報文意味着這一方向上不會再收到數據了。但是在 TCP 連接上仍然能夠發送數據,直到這一方向也發送了 FIN 。發送 FIN 的一方執行主動關閉,另一方則執行被動關閉。
-
第一次揮手:客戶端發送報文,標志位
FIN =1
,Seq = n
,此時客戶端進入到FIN_WAIT_1
狀態,表示客戶端沒有數據要發送給服務器
-
第二次揮手:服務端收到客戶端發送的
FIN
報文,然后向客戶端發送一個報文,設置標志位為ACK =1
,確認序列號為Ack = n+1
,這是服務端進入CLOSE_WAIT
狀態.表示客戶端到服務端的發送連接已經斷開。
-
第三次揮手:服務器發送報文到客戶端,報文標志位
FIN =1
序列號為Seq = m
,用來關閉服務器到客戶端的數據傳輸,服務端進行LAST_ACK
狀態
-
第四次揮手:客戶端收到服務器發送的標志位為 FIN 的報文,客戶端進入到 CLIENT_WAIT 狀態,等待
2MSL
時間。然后發送一個標志位為 ACK = 1 的報文,確認序列號為Ack = m+1
。完成四次揮手。
-
為什么要等待
2MSL
- 客戶端發送的第4次握手報文,服務器沒有收到。這時候服務器端會再次發送一個 FIN =1 的報文,而這個時候客戶端還處於 CLIENT_WAIT 狀態,所以可以再次發送確認消息。
-
TCP 發送失敗重發情況
-
抓包環境
- whireShark: 2.6.1
- Android device: HTC D820U
- Android Version: 6.0
- Android IP : 192.168.123.103
- Destination IP : 183.192.196.182
https://blog.csdn.net/sssnmnmjmf/article/details/68486261
https://blog.csdn.net/oney139/article/details/8103223
https://www.jianshu.com/p/9f3e879a4c9c?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation