在計算機網路的學習中tcp協議與http協議是我們必須掌握的內容,其中tcp協議屬於傳輸層,而http協議屬於應用層,本部落格主要講解tcp協議中的三次握手與四次揮手。
第一次握手:請求建立聯機,建立連線時,客戶端傳送syn位碼為1,隨機產生seq number=1234567的資料報到伺服器,進入syn_send狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的syn,同時自己也傳送乙個syn包,即syn+ack包,包括ack number=(客戶的seq+1),syn=1,ack=1,隨機產生的seq,此時伺服器 進入syn_recv狀態;
第三次握手:客戶端收到伺服器的syn+ack包,檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1。若正確,客戶端會再向伺服器傳送ack number=(伺服器的seq+1),ack=1,伺服器收到後確認seq值與ack=1則連線建立成功。此包傳送完畢,客戶端和伺服器進入 established狀態,完成三次握手。
通過這樣的三次握手,客戶端與服務端建立起可靠的雙工的連線,開始傳送資料。三次握手的最主要目的是保證連線是雙工的,可靠更多的是通過重傳機制來保證的。
[注]:關於握手標誌位
位碼即tcp標誌位,有以下幾種標示:
syn(synchronous建立聯機)
ack(acknowledgement 確認)
psh(push傳送)
fin(finish結束)
rst(reset重置)
urg(urgent緊急)
sequence number(順序號碼)
acknowledge number(確認號碼)
三次握手用圖示表示如下:
那麼為何需要三次握手呢?為何不是兩次,即客戶端給伺服器端傳送請求,伺服器端應答請求做出回應。
最本質的原因是網路是乙個複雜的環境,很可能存在網路環境較差的情況,即網路中可能存在某些資訊滯留的情況,需要第三次握手(即客戶端還要對伺服器端的同步包做出確認才能建立連線)是為了防止已失效的連線請求報文段突然又傳到了伺服器端。現在我們考慮兩種情況:
第一種情況:已失效的報文段丟失了,a發出連線請求,但因為丟失了,故而不能收到b的確認。於是a重新發出請求,然後收到確認,建立連線,資料傳輸完畢後,釋放連線,a發了2個,乙個丟掉,乙個到達,沒有「已失效的報文段」
第二種情況:已失效的報文段沒丟失,僅僅在網路中某個節點滯留了,延誤到達,本來這是乙個早已失效的報文段,但是在a傳送第二個,並且得到b的回應,建立了連線以後,這個報文段竟然到達了,於是b就認為,a又傳送了乙個新的請求,於是傳送確認報文段,同意建立連線,假若沒有三次的握手,那麼這個連線就建立起來了(有乙個請求和乙個回應),此時,a收到b的確認,但a知道自己並沒有傳送建立連線的請求,因為不會理睬b的這個確認,於是呢,a也不會傳送任何資料,而b呢卻以為新的連線建立了起來,一直等待a傳送資料給自己,此時b的資源就被白白浪費了。但是採用三次握手的話,a就不傳送確認,那麼b由於收不到確認,也就知道並沒有要求建立連線。
本質上是兩個二次揮手過程。用圖示表示如下:
fin_wait_1::這個是已經建立連線之後,其中一方(通常為客戶端)請求終止連線,等待對方的fin報文。
fin_wait-2狀態:這就是著名的半關閉的狀態了,伺服器端收到連線釋放報文段後就立即傳送確認,然後就進入close-wait狀態,當客戶端收到伺服器端的確認後就進入fin_wait-2狀態。這是在關閉連線時,客戶端和伺服器兩次握手之後的狀態。此時從客戶端到伺服器端的連線就釋放了。即「半關閉」狀態。即客戶端不可以傳送資訊給伺服器端,但是伺服器端可以傳送給客戶端,即此時客戶端只能接受資料,這也很好理解因為是客戶端請求與伺服器端斷開連線,所以從客戶端到伺服器端的連線被釋放。
此時,若伺服器端沒有資料報要傳送給客戶端了,其應用程序就通知tcp釋放連線,然後傳送給客戶端連線釋放報文段,此時伺服器端等待確認進入last_ack狀態,該狀態是為了等待對方的ack報文,當收到ack報文後,也即可以進入到closed可用狀態了。
客戶端傳送確認後,進入time-wait,注意,此時tcp連線還沒有釋放掉,然後經過時間等待計時器設定的2msl後,客戶端才進入到close狀態。
為什麼要等待呢?
①、為了保證客戶端傳送的最後乙個ack報文段能夠到達伺服器端。即最後這個確認報文段很有可能丟失,那麼b會超時重傳,然後客戶端再一次確認,同時啟動2msl計時器,如此下去。如果沒有等待時間,傳送完確認報文段就立即釋放連線的話,伺服器端就無法重傳了(連線已被釋放,任何資料都不能出傳了),因而也就收不到確認,就無法按照步驟進入close狀態,即必須收到確認才能close。
②、防止「已失效的連線請求報文段」出現在連線中。經過2msl(報文段最大生存時間msl(maximum segment lifetime)),那些在這個連線持續的時間內,產生的所有報文段就可以都從網路中消失。即在這個連線釋放的過程中會有一些無效的報文段滯留在樓閣結點,但是呢,經過2msl這些無效報文段就肯定可以傳送到目的地,不會滯留在網路中。這樣的話,在下乙個連線中就不會出現上乙個連線遺留下來的請求報文段了。
可以看出:伺服器端結束tcp連線的時間比客戶端早一點,因為伺服器端收到確認就斷開連線了,而客戶端還得等待2msl。
面試之計算機網路
常見的路由選擇協議有 rip協議 ospf協議。rip協議 底層是貝爾曼福特演算法,它選擇路由的度量標準 metric 是跳數,最大跳數是15跳,如果大於15跳,它就會丟棄資料報。ospf協議 底層是迪傑斯特拉演算法,是鏈路狀態路由選擇協議,它選擇路由的度量標準是頻寬,延遲。http協議執行在tcp...
計算機網路 TCP協議三次握手過程分析
tcp transmission control protocol 傳輸控制協議 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線 位碼即tcp標誌位,有6種標示 syn synchronous建立聯機 ack acknowledgement 確認 psh pus...
計算機網路(四),TCP三次握手
1.三次握手詳情 2.為什麼需要三次握手才能建立連線 3.首次握手的隱患 syn超時的問題 4.建立連線之後,client出現故障 1 一開始,客戶端和伺服器端都處於關閉狀態 closed 然後開啟服務,服務端這個時候處於監聽狀態 listen 2 客戶端傳送乙個連線請求報文,裡面syn等於1,se...