Abstract
本文主要關注了TCP連接中最關鍵的部分就是如何建立連接和關閉連接.
寫這個文章的目的主要還是總結備忘TCP相關的聯繫
TCP 三次握手
什麼是TCP三次握手?
TCP 三次握手主要用於建立TCP連接.其中涉及3個TCP包.
一個連接的建立過程:
- 客戶端發送SYNC包:
- 服務端回覆SYNC+ACK包:
- 客戶端回覆ACK包
Q&A
2次行不行?
不行. 因爲如果客戶端發送的SYNC由於網絡延遲發送了, 那麼客戶端重新發SYNC包, 然後服務器建立了連接. 前面SYNC的包又到了, 那麼會重複建立連接.
4次行不行?
可以. 但是效率不高.
如果TCP的握手是四次:
–1.client給server發送SYN同步報文;
–2.server收到SYN後,給client回覆ACK確認報文;
–3.server給client發送SYN同步報文;
–4.client給server發送ACK確認報文。
第2.3步之間,server和client沒有任何的數據交互,分開發送相當於多發了一次TCP報文段,SYN和ACK標識只是TCP報頭的一個標識位。很明顯,這兩步可以合併,從而提高連接的速度和效率。
什麼是backlog
在建立連接時, 客戶端發送SYNC,服務器收到SYNC後, 服務器端會將該請求放入SYNC隊列(服務器端半連接隊列), 然後服務器發送SYNC+ACK給客戶端, 客戶端收到SYNC+ACK後, 在客戶端連接標記爲Established, 然後客戶端發送ACK, 服務器檢查ACCEPT隊列, 如果ACCEPT隊列滿, 要麼丟棄要麼直接回復RST(參數tcp_abort_on_overflow). 如果ACCEPT隊列沒有滿, 則將該連接從SYNC隊列移入ACCEPT隊列.
ACCEPT隊列大小=min(backlog, somaxconn) = default is 50
SYNC隊列大小=max(64, tcp_max_sync_backlog)
如果客戶端發送ACK較晚, 服務端直接RST.
TCP 4次揮手
什麼是 TCP四次揮手
TCP關閉連接的過程. 取決於誰先trigger關閉連接:
Q&A
爲什麼是4次?
TCP是全連接(兩邊可以同時收發數據), 所以爲了保證TCP被正常關閉設計的4次揮手.
什麼是TIMED_WAIT
參考上圖.