## TCP首部
> 先來一張圖~ 1字節(byte) = 8bit~

* **TCP端口**
* TCP端口就是為TCP協議通信提供服務的端口。(80, 8080之類)
* **源端口**
* 包含發送數據報的程序所使用端口
* **目的端口**
* 接收數據報的程序所使用端口
* **序號**
* 序號用來標識從TCP發送端向TCP接收端發送的數據字節流,在一個 TCP 連接中傳輸的字節流中的每個字節都按照順序編號,**序號**是本報文段發送的數據組的第一個字節的序號。
> 第一個 TCP 報文段包含的是第一個 25kb 的數據,0 ~ 25599 字節, 該報文的序號的值就是:0
> 第二個 TCP 報文段包含的是第二個 25kb 的數據,25600 ~ 51199 字節,該報文的序號的值就是:25600
> ...
* **確認號**
* 指明下一個期待收到的字節序號,表明該序號之前的所有數據已經正確無誤的收到。確認號只有當ACK標志為1時才有效。
* **數據偏移/首部長度**
* 表示報文中除開有效數據段,報文首部的長度。所以數據偏移的最小值是20字節(固定首部)。
* **保留**
* 保留,一般置為0。
* **URG**
* 緊急指針標志,當URG值為1時,發送方應用程序告訴發送方的TCP有緊急數據需要處理,TCP就將緊急數據放到數據區的最前面。緊跟其后是普通數據。
* **ACK**
* 確認序號標志,當ACK=1時,確認號才有效。當ACK=0時,連接都還沒建立,不可能傳送有效數據。
* **PSH**
* push標志,為1表示是帶有push標志的數據,指示接收方在接收到該報文段以后,應盡快將這個報文段交給應用程序,而不是在緩沖區排隊。
* **RST**
* 重置連接標志,用來拒絕一個非法的報文段和拒絕打開一個連接,RST也可稱為重建位或者重置位。
* **SYN**
* 同步序號,用于建立連接過程,當SYN置為1時,表示連接請求或連接接受報文。
* **FIN**
* finish標志,用于釋放連接,為1時表示發送方的數據已發送完畢,請求釋放連接。
* **窗口**
* 滑動窗口大小,用來告知發送端接受端的緩存大小,以此控制發送端發送數據的速率,從而達到流量控制。
> 例如,發送了一個報文段,確認號1001(期望下一個收到的報文中,數據區第一個字節的序號是1001),窗口字段是1000。就是告訴對方:“從1001開始,我最多只能接受1000個字節的數據,你發送數據的時候考慮下這點。”
* **檢驗和**
* 發送端對TCP首部、數據進行CRC運算得出的結果。接收端收到數據后,對接收到的TCP報文段的首部、數據進行CRC運算,并跟TCP首部中的校驗和進行對比,確保數據在傳輸過程中沒有損壞。
* **緊急指針**
* 只有當?URG?標志置?1?時緊急指針才有效。表示緊急數據的長度,指出了緊急數據的末尾在報文段的位置。
* **選項**
* 最常見的可選字段是最長報文大小,又稱為MSS(Maximum Segment Size),每個連接方通常都在通信的第一個報文段(為建立連接而設置SYN標志為1的那個段)中指明這個選項,它表示本端所能接受的最大報文段的長度。
* **填充**
* 選項長度不一定是32位的整數倍,所以要加填充位,即在這個字段中加入額外的零,以保證TCP頭是32的整數倍。
* **數據部分**
* TCP?報文段中的數據部分是可選的。在一個連接建立和一個連接終止時,雙方交換的報文段僅有?TCP?首部。如果一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多情況中,也會發送不帶任何數據的報文段。
- 版本控制之Git簡介
- Git工作流程
- Git工作區、暫存區、版本庫
- Git 指令匯總
- Git 忽略文件規則 .gitignore
- pull request
- HTTP簡介
- HTTP - Keep-Alive
- HTTP緩存
- XMLHttpRequest
- Fetch
- 跨域
- HTTP 消息頭
- TCP/IP
- TCP首部
- IP首部
- IP 協議
- TCP/IP漫畫
- 前端開發規范
- 前端開發規范整理
- 前端未來規劃
- HTML思維導圖
- CSS思維導圖
- 布局
- position,float,display的關系和優先級
- line-height、height、font-size
- 移動端適配
- JS 對象
- JS 原型模式 - 創建對象
- JS 預編譯
- 探索JS引擎
- ES