答:因為當server端收到client端的syn連線請求報文後,可以直接傳送syn+ack報文。其中ack報文是用來應答的,syn報文是用來同步的。但是關閉連線時,當server端收到fin報文時,很可能並不會立即關閉socket,所以只能先回覆乙個ack報文,告訴client端,"你發的fin報文我收到了"。只有等到我server端所有的報文都傳送完了,我才能傳送fin報文,因此不能一起傳送。故需要四步握手。
答:雖然按道理,四個報文都傳送完畢,我們可以直接進入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次握手完成兩個重要的功能,既要雙方做好傳送資料的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被傳送和確認。
現在把三次握手改成僅需要兩次握手,死鎖是可能發生的。作為例子,考慮計算機s和c之間的通訊,假定c給s傳送乙個連線請求分組,s收到了這個分組,併發 送了確認應答分組。按照兩次握手的協定,s認為連線已經成功地建立了,可以開始傳送資料分組。可是,c在s的應答分組在傳輸中被丟失的情況下,將不知道s 是否已準備好,不知道s建立什麼樣的序列號,c甚至懷疑s是否收到自己的連線請求分組。在這種情況下,c認為連線還未建立成功,將忽略s發來的任何資料分 組,只等待連線確認應答分組。而s在發出的分組超時後,重**送同樣的分組。這樣就形成了死鎖。
答:tcp還設有乙個保活計時器,顯然,客戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到客戶端的任何資料,伺服器就會傳送乙個探測報文段,以後每隔75分鐘傳送一次。若一連傳送10個探測報文仍然沒反應,伺服器就認為客戶端出了故障,接著就關閉連線。
TCP三次握手及四次揮手詳解及常見面試題
2018年05月24日 11 51 38 1.源埠號 表示傳送端埠號,字段長為16位。2.目標埠號 表示接收埠號,字段長為16位。3.序列號 表示傳送資料的位置,字段長為32位。每傳送一次資料,就累加一次該資料位元組數的大小。注意 序列號不會從0或1開始,而是在建立連線時由計算機生成的乙個隨機數作為...
三次握手和四次揮手以及面試題
在正常情況下,tcp要經過三次握手建立連線,四次揮手斷開連線。客戶端呼叫connect 傳送乙個帶syn標誌的tcp報文 syn j 到伺服器。並進入syn send狀態,阻塞等待伺服器應答。伺服器收到syn包,必須確認客戶的syn ack j 1 同時自己也傳送乙個syn包 syn k 即syn ...
三次握手 四次揮手
1.tcp連線的建立 1 首先是伺服器初始化的過程,從 closed 關閉 狀態開始通過順序呼叫 socket bind listen 和accept 原語建立 socket 套接字,進入 listen 監聽 狀態,等待客戶端的 tcp傳輸連線請求。2 客戶端最開始也是從 closed 狀態開始呼叫...