問題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】為什麼不能用兩次握手進行連線?
答:3次握手完成兩個重要的功能,既要雙方做好傳送資料的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被傳送和確認。
現在把三次握手改成僅需要兩次握手,死鎖是可能發生的。作為例子,考慮計算機s和c之間的通訊,假定c給s傳送乙個連線請求分組,s收到了這個分組,併發 送了確認應答分組。按照兩次握手的協定,s認為連線已經成功地建立了,可以開始傳送資料分組。可是,c在s的應答分組在傳輸中被丟失的情況下,將不知道s 是否已準備好,不知道s建立什麼樣的序列號,c甚至懷疑s是否收到自己的連線請求分組。在這種情況下,c認為連線還未建立成功,將忽略s發來的任何資料分 組,只等待連線確認應答分組。而s在發出的分組超時後,重**送同樣的分組。這樣就形成了死鎖。
【問題4】如果已經建立了連線,但是客戶端突然出現故障了怎麼辦?
tcp還設有乙個保活計時器,顯然,客戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到客戶端的任何資料,伺服器就會傳送乙個探測報文段,以後每隔75秒鐘傳送一次。若一連傳送10個探測報文仍然沒反應,伺服器就認為客戶端出了故障,接著就關閉連線。
【問題5】time_wait狀態下對接收到的資料報如何處理
如果是rst包的話,並且系統配置sysctl_tcp_rfc1337(預設情況下為0,參見/proc/sys/net/ipv4/tcp_rfc1337)的值為0,這時會立即釋放time_wait傳輸控制塊,丟掉接收的rst包。
如果是ack包,則會啟動time_wait定時器後丟掉接收到的ack包。
接下來是對syn包的處理。前面提到了,如果在time_wait狀態下接收到序列號比上乙個連線的結束序列號大的syn包,可以接受,並建立新的連線。
【問題6】如何盡量處理timewait過多?
net.ipv4.tcp_syncookies = 1 表示開啟syn cookies。當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊,預設為0,表示關閉;net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將time-wait sockets重新用於新的tcp連線,預設為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟tcp連線中time-wait sockets的快速**,預設為0,表示關閉。
net.ipv4.tcp_fin_timeout 修改系預設的 timeout 時間
常見面試題 TCP和UDP的區別?
關於tcp和udp的區別,是乙個老生常談的問題了。在面試的時候很容易被問到,那麼兩者到底有什麼區別呢?首先看我從網上找的乙個圖。而tcp呢,是乙個面向連線的服務,也就是說只有先建立連線,才能傳送資料,同樣在結束時還要釋放連線,同樣tco不提供廣播或者多播服務。那麼為什麼tcp傳輸時可靠的呢?1.應用...
TCP與UDP的區別(常見面試題)
1 tcp是面向連線的,可靠性高 udp是基於非連線的,可靠性低 2 由於tcp是連線的通訊,需要有三次握手 重新確認等連線過程,會有延時,實時性差,同時過程複雜,也使其易於攻擊 udp沒有建立連線的過程,因而實時性較強,也稍安全 3 在傳輸相同大小的資料時,tcp首部開銷20位元組 udp首部開銷...
常見面試題
1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...