tcp(transmission control protocol,傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的通訊協議,資料在傳輸前要建立連線,傳輸完畢後還要斷開連線,客戶端在收發資料前要使用 connect() 函式和伺服器建立連線。建立連線的目的是保證ip位址、埠、物理鏈路等正確無誤,為資料的傳輸開闢通道。
在了解三次握手和四次揮手的操作前需要了解下tcp資料報的結構:
重點關注的是資料序號、確認序號、以及標誌位(u、a、p、r、s、f);
資料序號:seq(sequence number)序號佔32位,用來標識從計算機a傳送到計算機b的資料報的序號,計算機傳送資料時對此進行標記。客戶端和服務端連線過程:確認序號:ack(acknowledge number)確認號佔32位,客戶端和伺服器端都可以傳送,ack = seq + 1。
標誌位:每個標誌位占用1bit,共有6個,分別為 urg、ack、psh、rst、syn、fin,具體含義如下:
客戶端呼叫 socket() 函式建立套接字後,因為沒有建立連線,所以套接字處於closed狀態;伺服器端呼叫 listen() 函式後,套接字進入listen狀態,開始監聽客戶端請求
這時客戶端發起請求:
1) 當客戶端呼叫 connect() 函式後,tcp協議會組建乙個資料報,並設定 syn 標誌位,表示該資料報是用來建立同步連線的。同時生成乙個隨機數字假設為1000,填充「序號(seq)」字段,表示該資料報的序號。完成這些工作,開始向伺服器端傳送資料報,客戶端就進入了syn-send狀態。
2) 伺服器端收到資料報,檢測到已經設定了 syn 標誌位,就知道這是客戶端發來的建立連線的「請求包」。伺服器端也會組建乙個資料報,並設定 syn 和 ack 標誌位,syn 表示該資料報用來建立連線,ack 用來確認收到了剛才客戶端傳送的資料報
伺服器生成乙個隨機數假設為 2000,填充「序號(seq)」字段。2000 和客戶端資料報沒有關係。
伺服器將客戶端資料報序號(1000)加1,得到1001,並用這個數字填充「確認號(ack)」字段。
伺服器將資料報發出,進入syn-recv狀態
3) 客戶端收到資料報,檢測到已經設定了 syn 和 ack 標誌位,就知道這是伺服器發來的「確認包」。客戶端會檢測「確認號(ack)」字段,看它的值是否為 1000+1,如果是就說明連線建立成功。
接下來,客戶端會繼續組建資料報,並設定 ack 標誌位,表示客戶端正確接收了伺服器發來的「確認包」。同時,將剛才伺服器發來的資料報序號(2000)加1,得到 2001,並用這個數字來填充「確認號(ack)」字段。
客戶端將資料報發出,進入establised狀態,表示連線已經成功建立。
4) 伺服器端收到資料報,檢測到已經設定了 ack 標誌位,就知道這是客戶端發來的「確認包」。伺服器會檢測「確認號(ack)」字段,看它的值是否為 2000+1,如果是就說明連線建立成功,伺服器進入establised狀態。
至此,客戶端和伺服器都進入了establised狀態,連線建立成功,接下來就可以收發資料了。
建立連線後,客戶端和伺服器都處於establised狀態。這時,客戶端發起斷開連線的請求:
tcp 四次揮手 TCP的三次握手和四次揮手
三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...
TCP的三次握手連線和TCP四次揮手
1.tcp建立連線,三次握手 建立的tcp連線可靠的連線,必須經過三次握手建立連線才能正式通訊彼此傳輸數資料。客戶端請求服務端建立連線 第一次握手 客戶給服務傳送乙個請求報文syn,客戶端的狀態置syn sent狀態 第二次握手 服務端在收到客戶端發過來的syn請求報文後,開始給客戶端傳送ack報文...
TCP連線的三次握手和四次揮手
tcp ip協議是比較重要的網路協議,面試常常會被問到,在這裡我整理一下我對tcp的一些了解。上圖是tcp報文段的首部格式 源埠 源機器埠號 目的埠 目的機器埠號 序列號 即 seq 注意是小寫,在連線時候要用到 表示當前傳送的資料是在整個檔案中的位置 第幾個位元組 資料偏移 記錄tcp報文段,從多...