一些基本的概念可以先看另一篇部落格:
這篇直接對tcp連線過程做筆記
1.tcp連線詳細過程
假設執行在主機(客戶)的乙個程序想跟另一台主機(伺服器)上程序建立乙個連線
第一步:客戶端的tcp首先向服務端的tcp傳送乙個特殊的tcp報文段。該報文段不包含應用層資訊。報文段的syn(標誌位)置1。因此這個報文段也叫syn報文段。另外客戶會隨機選擇初始序號放在tcp 報文段的序號欄位中。報文段會封裝在ip資料報,並傳送給伺服器。為了避免某些安全攻擊,會適當隨機化初始序號(client_isn)。
第二步:一旦tcp syn報文段的ip資料報到達伺服器主機,伺服器會取出該報文段,為tcp連線分配報文段和快取,並向客戶傳送允許連線的報文段,這個報文段也不包括應用層資料。
報文段包括三個重要資訊。
1.syn置1
2.確認號字段置為client_isn+1
3.選擇自己的初始序號
這個報文段表明伺服器已經接收到客戶的syn分組,表示同意該連線,所以初始化好了序號,並用確認號表明期望下一次從客戶端收到序號是client_isn+1的報文段。該報文段也叫做synack報文段
第三步:收到synack報文段之後,客戶也要分配給連線快取和變數。客戶主要給伺服器傳送另乙個報文段,這最後乙個報文段對伺服器的允許連線的報文段進行確認(將server_isn+1作為確認號)。連線被確認之後,syn置0.這個報文段可以攜帶客戶到服務端的應用層資訊。
連線建立好之後syn就置0
為什麼是三次握手,而不是兩次呢,可以看看知乎的回答,都太有才了啊
兩次握手主要是防止失效的客戶端連線被服務端接受引起錯誤
為什麼連線建立需要三次握手,而不是兩次握手?
防止失效的連線請求報文段被服務端接收,從而產生錯誤。
若建立連線只需兩次握手,客戶端並沒有太大的變化,仍然需要獲得服務端的應答後才進入established狀態,而服務端在收到連線請求後就進入established狀態。此時如果網路擁塞,客戶端傳送的連線請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收並確認應答,雙方便開始通訊,通訊結束後釋放連線。此時,如果那個失效的連線請求抵達了服務端,由於只有兩次握手,服務端收到請求就會進入established狀態,等待傳送資料或主動傳送資料。但此時的客戶端早已進入closed狀態,服務端將會一直等待下去,這樣浪費服務端連線資源。
客戶應用程式發出關閉連線命令
第一步:客戶tcp向伺服器傳送特殊的tcp報文段,首部的標誌位fin置1
第二步:伺服器回送乙個確認報文段。
第三步:伺服器傳送終止報文段,fin置1.
第四步:客戶對伺服器的終止報文段進行確認
最後兩個主機釋放所有tcp資源
TCP連線管理
tcp是面向連線的協議,因此每個tcp連線都有三個階段 連線建立 資料傳送和連線釋放。tcp連線的管理就是使運輸連線的建立和釋放都能正常進行。在tcp連線建立的過程中,要解決以下三個問題 要使每一方都能確知對方的存在。要允許雙方協商一些引數 如最大視窗值 是否使用視窗擴 項 時間戳選項以及服務質量等...
TCP 連線管理
本節將介紹一條tcp連線是如何建立和拆除的。此處假設客戶機a上面的乙個程序想要和服務 器b上的乙個程序建立一條tcp連線。本文前面介紹的是比較正常的連線和拆除,特殊的會在後面介紹。第一步客戶機a的tcp會向伺服器的tcp傳送乙個不包含應用層資料的資料的tcp報文段。該報文段中首部標誌位s yn被置為...
TCP的連線管理
tcp是面向連線的協議。運輸連線是用來傳送tcp報文的。連線運輸就有三個階段,即 連線建立 資料傳送和連線釋放。在tcp連線建立過程中要解決以下三個問題 1 要使每一方能夠確知對方的存在。2 要允許雙方協商一些引數 如最大視窗值 是否使用視窗擴 項和時間戳選項以及服務質量等 3 能夠對運輸實體資源 ...