1. tcp 連線的建立
三報文握手: 客戶端主動開啟連線,伺服器被動開啟連線
(1)tcp客戶端建立傳輸控制模組tcb,向伺服器發出連線請求報文段,不能攜帶資料。
(2)伺服器接收請求報文段,如果同意建立了請求,則向客戶端傳送確認。
(3)客戶端還要向伺服器傳送確認,可以攜帶資料,防治已經失效的請求突然又傳送到了伺服器,例如a傳送請求報文段給b,這個請求報文段在某網路結點延遲,等到b收到該請求報文段,a已經關閉了連線,b傳送響應,a收不到響應,這樣b就會一直等待,浪費資源。
三報文握手如下圖所示(該圖出自《計算機網路第七版》,謝希仁老師編著,下同)。
2. tcp 連線的釋放
(1)客戶端 傳送 連線釋放報文段,並停止再傳送資料,主動關閉tcp連線。
(2)伺服器 收到 客戶端 的連線釋放報文段 後即發出確認。
(3)伺服器 再傳送連線釋放報文段給 客戶端。
(4)客戶端 收到 伺服器 的連線釋放報文段後即發出確認。等待 2msl(msl : 最長報文段壽命) ,因為如果 伺服器 如果沒有收到 這個確認,會在傳送乙個連線釋放報文段 給客戶端。
tcp 還有乙個保活計時器,一般為 2 個小時,伺服器在兩個小時沒有收到客戶端的資料,伺服器就會給客戶端傳送探測報文段,每隔 75 秒中傳送一次,傳送十個探測報文段給客戶單,如果客戶端一直無響應就關閉該鏈結。
3. 一些問題
【問題1】為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
因為當server端收到client端的syn連線請求報文後,可以直接傳送syn+ack報文。其中ack報文是用來應答的,syn報文是用來同步的。但是關閉連線時,當server端收到fin報文時,很可能並不會立即關閉socket,所以只能先回覆乙個ack報文,告訴client端,"你發的fin報文我收到了"。只有等到我server端所有的報文都傳送完了,我才能傳送fin報文,因此不能一起傳送。故需要四步握手。
【問題2】為什麼time_wait狀態需要經過2msl(最大報文段生存時間)才能返回到close狀態?
雖然按道理,四個報文都傳送完畢,我們可以直接進入close狀態了,但是我們必須假象網路是不可靠的,有可以最後乙個ack丟失。所以time_wait狀態就是用來重發可能丟失的ack報文。在client傳送出最後的ack回覆,但該ack可能丟失。server如果沒有收到ack,將不斷重**送fin片段。所以client不能立即關閉,它必須確認server接收到了該ack。client會在傳送出ack之後進入到time_wait狀態。client會設定乙個計時器,等待2msl的時間。如果在該時間內再次收到fin,那麼client會重發ack並再次等待2msl。所謂的2msl是兩倍的msl(maximum segment lifetime)。msl指乙個片段在網路中最大的存活時間,2msl就是乙個傳送和乙個回覆所需的最大時間。如果直到2msl,client都沒有再次收到fin,那麼client推斷ack已經被成功接收,則結束tcp連線。
【問題3】如果已經建立了連線,但是客戶端突然出現故障了怎麼辦?
tcp還設有乙個保活計時器,顯然,客戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到客戶端的任何資料,伺服器就會傳送乙個探測報文段,以後每隔75秒鐘傳送一次。若一連傳送10個探測報文仍然沒反應,伺服器就認為客戶端出了故障,接著就關閉連線。
介紹下close_wait
服務端在收到客戶端發來的fin請求,返回乙個ack後就會進入close_wait狀態,此時伺服器在等待上層應用呼叫close()方法斷開連線,假如此時上層應用出現異常退出,沒有close,就會卡死在這裡。
close_wait過多的原因:上層程式設計有問題,沒能呼叫close()函式
三次握手 四次揮手
1.tcp連線的建立 1 首先是伺服器初始化的過程,從 closed 關閉 狀態開始通過順序呼叫 socket bind listen 和accept 原語建立 socket 套接字,進入 listen 監聽 狀態,等待客戶端的 tcp傳輸連線請求。2 客戶端最開始也是從 closed 狀態開始呼叫...
三次握手,四次揮手
三次握手 three times handshake three way handshake 所謂的 三次握手 即對每次傳送的 資料量是怎樣跟蹤進行協商使 資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送 接收完畢後何時撤消聯絡,並建立虛連線。為了提供可靠的傳送,tcp在傳送...
三次握手 四次揮手
在tcp ip 協議中,tcp 協議提供可靠的連線服務,採用三次握手建立乙個連線,如圖1所示。1 第一次握手 建立連線時,客戶端a 傳送syn 包 syn j 到伺服器b 並進入syn send 狀態,等待伺服器b 確認。2 第二次握手 伺服器b 收到syn 包,必須確認客戶a 的syn ack j...