運輸層連線有三個階段
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 ...