計網 TCP的三次握手和四次揮手

2021-07-10 19:38:38 字數 1613 閱讀 6167

昨天被360的筆試虐到了。。。=  =。。。。辣麼多道c++。。。。引號還不能好好打,用中文的,我還以為選項是錯的。。tat

不過考了幾道前端題也發現tcp的過程還是不大了解。。這麼經典的題目。。

幾個字段:

syn(synchronize)=> 在建立連線的時候用

ack(acknowledge number)=> 用於確認序號

seq(sequence number)=> 用於識別序號

fin => 在結束連線的時候傳送(沒找到全稱。。。)

tcp的報文分成兩塊,頭部塊和資料塊。頭部一般是20位元組(udp的頭部是八個位元組),包含了源埠號,目的埠號和其他的字段。傳送資料的大小一般根據本地的最大鏈路層幀長度(就是看網路層最多能傳輸的資料大小,mss)。如果傳輸的資料比較大,tcp會把它分成data_size/(每個報文攜帶的資料大小)這麼多個報文段傳送,並且會為每個報文分配相應的序號來使對方可以識別順序。由於接收方(b)需要根據先後收到的資料來把檔案拼接起來,所以判斷報文的順序很重要。

在傳輸的時候,對於任何一端,ack表示自己要傳送的資料的對應序號,seq表示期望從對方那裡收到的序號。

上圖客戶端傳送序號為42的資料,等待序號為79的資料。伺服器返回序號為79的資料,並且剛剛收到了序號為42的資料,所及期待序號問43的資料。

這樣來回來確認自己收到的資料是有序的。

在這個基礎上來看tcp連線剛剛建立的時候。

三次握手:(isn是起始的序號)

tcp的三次握手的報文是特殊的報文,成為syn報文。因為要建立連線,所以頭部的syn欄位設為1,並且傳送客戶端的起始序號ack(隨機選取,減少和之前的連線序號衝撞)。伺服器接收到後同意建立連線,就把他的報文頭部的syn設為1,返回伺服器端的起始序號ack(隨機),並且返回客戶端的ack+1,表示期望接收下乙個資料。客戶端收到之後,就把syn設為0,確認伺服器剛剛傳送的報文。

四次揮手:

任意一方都可以關閉連線,要把報文報頭的fin欄位設為1表示要關閉連線,另一方收到了就傳送ack報文表示確認,然後再傳送乙個fin報文(fin設為1)表示自己要關閉連線了,然後初始方再傳送ack報文表示自己知道對方關閉了。

為什麼需要三次握手:

因為如果在第一次請求的時候延時了或者丟包了,後來可能包又傳送到了伺服器上,伺服器就傳送syn報文,開啟連線了。然而這時候客戶端又不需要這個連線了,會導致伺服器的這個連線無響應,浪費資源

為什麼需要四次揮手:

在a傳送fin給b後,b表示收到了關閉連線,如果這個時候b的資源還沒有傳送完成,可以繼續傳送。傳送結束後,像a傳送fin報文,表示自己要關閉連線了。如果只有三次,在最後b傳送fin的時候丟包了,a就不知道b是否關閉了,這樣連線就不安全。因此a還要傳送乙個ack確認報文確認自己知道了對方要關閉。這樣雙方都可以關閉連線了。b在等待a最後的ack報文,如果超時了就重傳fin報文,來保證a知道了b要關閉連線。

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

計網 TCP的三次握手及四次揮手詳解

運輸層連線有三個階段 1.三次握手建立 tcp 連線的各狀態 2.建立連線過程分析 1 第一次握手 a 向 b 發出連線請求報文段,其首部中的同步位 syn 1,並選擇序號 seq x,表明傳送資料時的第乙個資料位元組的序號是 x。2 第二次握手 b 收到連線請求報文段後,同意a的請求,發回確認,b...

TCP三次握手和四次揮手

一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...