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

2021-08-03 04:19:26 字數 3287 閱讀 4478

運輸層連線有三個階段

1.**三次握手建立 tcp 連線的各狀態

2.建立連線過程分析

(1)第一次握手

a 向 b 發出連線請求報文段,其首部中的同步位 syn = 1,並選擇序號 seq = x,表明傳送資料時的第乙個資料位元組的序號是 x。

(2)第二次握手

b 收到連線請求報文段後,同意a的請求,發回確認,b 在確認報文段中設定syn = 1,ack = 1,確認號ack = x+1,自己選擇的序號 seq = y

(3)第三次握手

a收到此報文段後向 b 給出確認,設定 ack = 1,確認號 ack = y +1,然後 a 通知上層應用程序,連線已經建立。

3.建立連線的狀態轉換分析

(1)第一次握手

(2)第二次握手

(3)第三次握手

4.建立連線中的幾個問題

(1)第一次握手中的seq有什麼作用,是不是固定的值?

答:序號seq可以保證有序性,當序號達到最大值時(2的32次方:大約4g),可以重用,這個初始序號會隨時間而改變,因此每乙個連線都擁有不同的初始序列號(防止重疊),這樣也保證了安全性,若序號是固定值,則很容易被偽造,從而打斷tcp的正常連線。

(2)為什麼第二次握手中的ack=x+1?

答:因為第一次握手中的syn請求報文段不攜帶資料,但要消耗乙個序號,所以ack=x+1。

(3)為什麼不是兩次握手?

答:防止已失效的連線請求報文段重連,還會浪費伺服器資源,因為失效的報文段會建立檔案描述符從而消耗核心結構體。

1.**四次揮手釋放 tcp 連線的各狀態

2.釋放連線過程分析

(1)第一次揮手

a 的應用程序先向其 tcp 發出連線釋放報文段,並停止再傳送資料,主動關閉 tcp 連線。a 把連線釋放報文段首部的 fin = 1,其序號seq = u,等待 b 的確認

(2)第二次揮手

b 發出確認,確認號 ack = u+1,而這個報文段自己的序號 seq = v。tcp 伺服器程序通知高層應用程序。從 a 到 b 這個方向的連線就釋放了,tcp 連線處於半關閉狀態,b 若傳送資料,a 仍要接收。

(3)第三次揮手

若 b 已經沒有要向 a 傳送的資料,其應用程序就通知 tcp 釋放連線,請求關閉連線標誌位fin=1,ack=1,確認上乙個報文已收到,可能還有資料傳送,所以seq=w,確認號ack=u+1不變。

(4)第四次揮手

a 收到連線釋放報文段後,必須發出確認,在確認報文段中 ack = 1,確認號 ack=w+1,自己的序號 seq = u + 1。

3.釋放連線的狀態轉換分析

(1)第一次揮手

(2)第二次揮手

(3)第三次揮手

(4)第四次揮手

4.釋放連線中的幾個問題

(1)為什麼第二次揮手沒有fin?

答:因為tcp是全雙工的,服務端可能還要給客戶端傳送資料。

(2)為什麼第三次揮手中還需要ack=1

(3)第四次揮手之後,為什麼需要等待2msl,等待時間是否可以調整(調大或調小有什麼影響)?答:

(4)若出現大量time-wait狀態的原因及解決方法?

答:原因:time_wait狀態下的socket不能被**使用.

解決方法: 檢視當前time_wait的數量 netstat -an | grep time_wait | wc -l

在hkey_local_machine\system\currentcontrolset\services\tcpip\parameters,新增名為tcptimedwaitdelay的dword鍵,設定為60,以縮短time_wait的等待時間

注:紅色箭頭表示對客戶程序的正常變遷,藍色箭頭表示對伺服器程序的正常變遷,黑色箭頭表示異常變遷。

1.為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?

答:因為服務端的listen狀態下的socket當收到syn報文的建連請求後,它可以把ack和syn(ack起應答作用,而syn起同步作用)放在乙個報文裡來傳送。但關閉連線時,當收到對方的fin報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部傳送給對方了,所以你可以未必會馬上會關閉socket,也即你可能還需要傳送一些資料給對方之後,再傳送fin報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ack報文和fin報文多數情況下都是分開傳送的。

2.服務端主動斷開連線之後,可以立即使用原來的埠重新連線嗎?

答:不能,立即重連產生異常,因為該埠已被占用,time-wait時間還沒到,產生的「分身」會在2msl之後消亡。

3.當輸入埠號為0或-1(負數)時會出現異常嗎?

答:當埠號為負數會出現異常,負數會報illegalargumentexception:port out of range異常,0-1023是熟知埠,可能會出現bindexception: address already in use: bind,所以我們一般使用1024-65535之間的埠號。

4.半連線佇列與全連線佇列是什麼?

在linux系統核心中維護了兩個佇列:syns queue和accept queue

5.syn攻擊是什麼及解決辦法?

答:(1)概念

syn攻擊屬於dos攻擊的一種,它利用tcp協議缺陷,通過傳送大量的半連線請求,耗費cpu和記憶體資源。

(2)檢測

使用linux命令 netstat -n -t | grep syn_recv | wc -l 檢視處於syn_recv狀態的連線數

(3)解決方法

參考:

1.《計算機網路 第六版》-謝希仁

2. tcp連線的狀態詳解以及故障排查

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

昨天被360的筆試虐到了。辣麼多道c 引號還不能好好打,用中文的,我還以為選項是錯的。tat 不過考了幾道前端題也發現tcp的過程還是不大了解。這麼經典的題目。幾個字段 syn synchronize 在建立連線的時候用 ack acknowledge number 用於確認序號 seq seque...

TCP三次握手 四次揮手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手 四次揮手

服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...