## TCP
**TCP**(Transmission Control Protocol 傳輸控制協議)**是一種 面向連接的、可靠的、基于字節流的傳輸層通信協議**,由 IETF 的 RFC 793 定義。在簡化的計算機網絡 OSI 模型中,它完成第四層傳輸層所指定的功能,用戶數據報協議(UDP)是同一層內 另一個重要的傳輸協議。
在因特網協議族(Internet protocol suite)中,TCP層是位于 IP 層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連接,但是 IP 層不提供這樣的流機制,而是提供不可靠的包交換。
應用層向 TCP 層發送用于網間傳輸的、用 8 位字節表示的數據流,然后 TCP 把數據流分區成適當長度的報文段(通常受該計算機連接的網絡的數據鏈路層的最大傳輸單元( MTU)的限制)。之后 TCP 把結果包傳給 IP 層,由它來通過網絡將包傳送給接收端實體的 TCP 層。TCP 為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據包就被假設為已丟失將會被進行重傳。TCP 用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。
## 三次握手
TCP是因特網中的傳輸層協議,使用三次握手協議建立連接。當主動方發出 SYN 連接請求后,等待對方回答 SYN+ACK ,并最終對對方的 SYN 執行 ACK 確認。這種建立連接的方法可以防止產生錯誤的連接,TCP使用的流量控制協議是可變大小的滑動窗口協議
:-: 
1. 客戶端發送 **SYN(SEQ=x)**報文給服務器端,進入**SYN_SEND** 狀態。
2. 服務器端收到 **SYN** 報文,回應一個 **SYN (SEQ=y)ACK(ACK=x+1)**報文,進入 **SYN_RECV** 狀態。
3. 客戶端收到服務器端的 **SYN** 報文,回應一個 **ACK(ACK=y+1)**報文,進入 **Established** 狀態。
## 連接成功
連接成功之后雙方即可互相傳輸字節流,并隨時可關閉連接,傳輸的數據有以下特性:
* 傳輸的數據被 TCP 分割成了最適合發送的數據塊傳遞給 IP 協議,這個發送數據稱為 **報文段** 或 **段**
* TCP 作為可靠性連接,每次發送數據段,會啟動一個定時器,每次接收數據段,會發送一次確認,如果定時器沒有及時收到確認,則會重發數據
* TCP 將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP 將丟棄這個報文段和不確認收到此報文段(希望發端超時并重發)。
* 兩個應用程序通過 TCP 連接交換 8bit 字節構成的字節流。TCP 不在字節流中插入記錄標識符。我們將這稱為字節流服務(bytestreamservice)。如果一方的應用程序先傳 10 字節,又傳 20 字節,再傳 50 字節,連接的另一方將無法了解發方每次發送了多少字節。只要自己的接收緩存沒有塞滿,TCP 接收方將有多少就收多少。一端將字節流放到 TCP 連接上,同樣的字節流將出現在 TCP 連接的另一端。
## 四次揮手
終止一個連接要經過四次揮手,這是由 TCP 的**半關閉(half-close)**造成的。具體過程如下所示。
:-: 
1. 某個應用進程首先調用 close,稱該端執行“主動關閉”(active close)。該端的TCP 于是發送一個 **FIN** 分節,表示數據發送完畢。
2. 接收到這個 **FIN** 的對端執行 “被動關閉”(passive close),這個 **FIN** 由TCP 確認。
* 注意:**FIN** 的接收也作為一個文件結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其他數據之后,因為,FIN 的接收意味著接收端應用進程在相應連接上再無額外數據可接收。
3. 一段時間后,接收到這個文件結束符的應用進程將調用 close 關閉它的套接字。這導致它的 TCP 也發送一個 **FIN**。
4. 接收這個最終 **FIN** 的原發送端 TCP(即執行主動關閉的那一端)確認這個**FIN**。 既然每個方向都需要一個 **FIN** 和一個**ACK**,因此通常需要4個分節。
>“通常”是指,某些情況下,步驟1的FIN隨數據一起發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合并成一個分節。 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動數據是可能的,這稱為“半關閉”(half-close)。 當一個Unix進程無論自愿地(調用exit或從main函數返回)還是非自愿地(收到一個終止本進程的信號)終止時,所有打開的描述符都被關閉,這也導致仍然打開的任何TCP連接上也發出一個FIN。 無論是客戶還是服務器,任何一端都可以執行主動關閉。通常情況是,客戶執行主動關閉,但是某些協議,例如,HTTP/1.0卻由服務器執行主動關閉。
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS