tcp在傳送資料前必須在彼此間建立連線,建立連線之前,我們要了解tcp的報文格式。
序列號seq:佔4個位元組,用來標記資料段的順序,tcp把連線中傳送的所有資料位元組都編上乙個序號,第乙個位元組的編號由本地隨機產生;給位元組編上序號後,就給每乙個報文段指派乙個序號;序列號seq就是這個報文段中的第乙個位元組的資料編號。
確認號ack:佔4個位元組,期待收到對方下乙個報文段的第乙個資料位元組的序號;序列號表示報文段攜帶資料的第乙個位元組的編號;而確認號指的是期望接收到下乙個位元組的編號;因此當前報文段最後乙個位元組的編號+1即為確認號。
確認ack:佔1位,僅當ack=1時,確認號字段才有效。ack=0時,確認號無效。
同步syn:連線建立時用於同步序號。當syn=1,ack=0時表示:這是乙個連線請求報文段。若同意連線,則在響應報文段中使得syn=1,ack=1。因此,syn=1表示這是乙個連線請求,或連線接受報文。syn這個標誌位只有在tcp建產連線時才會被置1,握手完成後syn標誌位被置0。
終止fin:用來釋放乙個連線。fin=1表示:此報文段的傳送方的資料已經傳送完畢,並要求釋放運輸連線。
ps:ack、syn和fin這些大寫的單詞表示標誌位,其值要麼是1,要麼是0;ack、seq小寫的單詞表示序號。
了解了tcp報文之後,我們看到三次握手。
客戶端向伺服器端傳送乙個連線請求,syn=1,seq=x。
伺服器端接受到客戶端的連線請求後,回覆乙個應答包,syn=1,ack=1,seq=y,ack=x+1。
客戶端收到伺服器端的響應包後,再次返回乙個包,ack=1,seq=x+1,ack=y+1。
客戶端資料傳送完畢,給伺服器端發出乙個斷開請求,fin=1,seq=u。
伺服器端接受到客戶端發的斷開請求,回覆乙個應答包,我收到你的斷開請求了,但是此時還沒接受完資料,ack=1,seq=v,ack=u+1。
伺服器端接受完資料,再次回覆乙個應答包,fin=1,ack=1,seq=w,ack=u+1。
客戶端收到伺服器的斷開請求,回覆乙個應答包,ack=1,seq=u+1,ack=w+1。
帶有syn標誌的包不能傳輸資料。所有在兩次握手後,還要發乙個空包告訴伺服器。
為什麼要第三次握手?(避免客戶端傳送了2個請求包,但是可能有乙個包傳輸慢,在另乙個包傳輸結束後,才到達伺服器端。這時候,伺服器端以為要再次建立連線,就會等客戶端發資料。所以,三次握手在建立連線後還要傳送乙個空包告訴伺服器端。)
為什麼四次揮手的時候,伺服器端要返回兩個應答包?(第一次意思是,我接受到了斷開請求的包,但是資料可能還在傳輸沒有結束,不能斷開連線。第二次意思是,資料傳輸已經結束,我同意斷開連線。)
簡述tcp三次握手 四次揮手
1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。客戶端進入syn send狀態 2 伺服器端回應客戶端的,這個報文同時帶ack標誌和syn標誌。此時伺服器進入syn recv狀態。因為伺服器表示對剛才客戶端syn報文的回應需要用ack確認,同時自己又要傳送syn給客戶...
三次握手與四次揮手
1 三次握手是怎麼個意思?三次握手的是為了是建立可靠的通訊通道,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。這個三次握手只能是客戶端去發起,伺服器端接收確認的。正常來說伺服器是一直在監聽的,客戶端上線後去請求伺服器端,然後通過tcp協議進行連線。沒...
三次握手與四次揮手
三次握手與四次揮手分別對應tcp連線建立過程與斷開過程,先上tcp報文格式 三次握手過程 問題1 為什麼要三次握手?答 三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。第一次握手 client什麼都不能確認...