# TCP/IP 協議
## 傳輸層
鏈路層,網絡層,傳輸層,應用層。
- 應用層:常用的Http 通過Http協議設置相關數據,比如請求行,請求頭,請求方法,請求體,請求參數等等(Https:Http+SSL,是在應用層和傳輸層之間對請求數據進行加密處理,和Http相比安全有證書的驗證)
- 傳輸層:傳輸層是面向通信的最高層,也是用戶功能的最底層。復用和分發,在發送端多個進程可復用一個傳輸層,在接收端為不同主機的不同進程進行分發數據。其中使用TCP協議、UDP協議等。
- 網絡層:使用IP協議,這里面的IP協議不是指IP地址,IP協議包含IP地址和計算機的MAC地址,IP協議能夠通過IP地址和MAC地址準確的找到你需求請求的服務器
- 物理層:就是我們平時接觸的網卡和網卡的驅動程序等。
## 二、三次握手
> [參考鏈接](https://www.cnblogs.com/laowz/p/6947539.html)
### 兩個序號和三個標志位:
(1)序號:seq序號,占32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
(2)確認序號:ack序號,占32位,只有ACK標志位為1時,確認序號字段才有效,ack=seq+1。
(3)標志位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
(A)URG:緊急指針(urgent pointer)有效。
(B)ACK:確認序號有效。
(C)PSH:接收方應該盡快將這個報文交給應用層。
(D)RST:重置連接。
(E)SYN:發起一個新連接。
(F)FIN:釋放一個連接。
### 建立新連接過程
客戶端 -> SYN=1,seq=x -> 服務端
客戶端 <- SYN=1,ACK=1,seq=y,ack=x+1 <- 服務端
客戶端 -> ACK=1,seq=x+1,ack=y+1 -> 服務端
> seq 為單方面消息序列號,ack為單方面待收消息序列號。
## 三、四次揮手
### 斷開連接過程
client -> FIN=m -> server
client <- ack=m+1 <- server
client <- FIN=n <- server
client -> ACK=1,ack n+1 -> server
### 為什么建立連接是三次握手,而關閉連接卻是四次揮手呢?
這是因為服務端在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端。
而關閉連接時,收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,
己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些數據給對方后,
再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送。
- 1. HTML
- 1.1 HTML 標簽
- 1.2 HTML 屬性
- 1.3 HTML5
- 2. CSS/CSS3
- 2.1 CSS3
- 2.2 Less
- 2.3 Sass
- 3. JavaScript
- 3.1 JQuery
- 3.2 javascript code
- 3.3 es6
- 4. 前端框架
- 4.1 Angular4+
- 4.2 React
- 4.3 Vue
- 5. 綜合知識
- 5.1 HTTP
- 5.2 websocket
- 5.3 綜合問題集合
- 5.4 前端優化
- 6. 附加知識
- 6.1 TCP/IP
- 6.2 數據結構
- 6.3 前端開發
- 7. 相關工具
- 7.1 Git
- 7.2 調試
- 7.3 Linux
- 8. 其他需要了解的內容
- 8.1 Python3
- 8.2 Java
- 8.3 數據庫