目錄
tcp報文
source port(源埠)/destination port(目標埠)
sequence number(拆包序列號)
acknowledge number(回應序號)
data offset(資料偏移量)
reserved(保留字段)
code(control flag控制標誌碼)
window(滑動視窗)
checksum(確認檢查碼)
urgent pointer(緊急指標)
options(任意資料)
padding(補足字段)
三次握手流程
a: 報文發起
b: 報文接收與確認報文傳送
c: 回送確認報文
d: 取得最後確認
總結閱讀目標
了解tcp協議報文格式
了解三次握手具體細節
tcp報文
報文一般分為兩部分:報頭和資料(如下圖)。下面我們分析一下tcp協議的報頭都包含著哪些資訊。
source port(源埠)/destination port(目標埠)
sequence number(拆包序列號)
在網路傳輸中,當資料量過大時,傳送端(包括客戶端傳送和服務端傳送) 會對資料進行拆包,接收端每次做響應時(告知傳送端已收到資料),都是通過ack number告知下次我要接收的資料編號,該編號就是sequence number,計算方式為傳送端的seq加上資料length。三次握手會用到
acknowledge number(回應序號)
ack flag 置 1 時才有效,指接收方期待的下乙個報文段的序列號,計算方式為傳送端的seq+資料length。三次握手會用到
data offset(資料偏移量)
其實就是tcp頭部長度,可以理解為tcp首部佔32bit位元組的數目(可以按照上圖理解為佔了幾行)
本身為4位,能表示的二進位制最大數為1111,換算成十進位制為15,而且因為上圖每一行是4個位元組,所以tcp頭部最大為最大長度為154=60個位元組
在上圖中因為除了options和pading部分其他都是必須的,所以tcp頭部最小為為54=20個位元組
reserved(保留字段)
未使用的保留字段
code(control flag控制標誌碼)
當我們在進行網路聯機的時候,必須要說明這個聯機的狀態,好讓接收端了解這個封包的主要動作。 這可是乙個非常重要的控制代碼。這個字段共有 6 個 bits ,分別代表 6 個控制代碼,若為 1 則為啟動。分別說明如下:
urg(urgent):若為 1 則代表該封包為緊急報文, 接收端應該要緊急處理。後面的urgent pointer 欄位也會被啟用。
ack(acknowledge):若為 1 代表這個封包為響應報文, acknowledge number會被賦值。三次握手會用到
psh(push function):若為 1 時,代表要求對方立即傳送緩衝區內的其他對應報文,而無須等待緩衝區滿了才送。
rst(reset):如果 rst 為 1 的時候,表示聯機會被馬上結束,而無需等待終止確認手續。這也就是說, 這是個強制結束的聯機,且傳送端已斷線。四次揮手會用到
syn(synchronous):若為 1,表示傳送端希望雙方建立同步處理, 也就是要求建立聯機。通常帶有 syn 標誌的封包表示『主動』要連線到對方的意思。三次握手會用到
fin(finish):若為 1 ,表示傳送結束,所以通知對方資料傳畢, 是否同意斷線,只是傳送者還在等待對方的響應而已。四次揮手會用到
window(滑動視窗)
滑動視窗
在tcp報文段的首部中有乙個「視窗大小」的字段,該字段佔16bit=2byte。該欄位主要用於tcp滑動視窗進行流量控制,很多人喜歡把tcp的mss(max segment size)和「視窗大小」字段混淆,今天在這了做乙個區分說明。
mss是tcp報文段中資料部分的最大長度,如果上層交付下來的資料超過mss就要對交付下來的資料進行分段。在tcp連線的第一次、第二次握手中會分別告知對方mss,從而起到通訊雙方協商mss的效果。
tcp報文段首部中,「視窗大小」字段通常用於告知對方自己的能夠接受的資料量大小。視窗本質就是乙個緩衝區buffer,該字段的值用於告知對方自己剩餘的可用緩衝區大小。在每乙個tcp報文段中都會通過「視窗」字段告知對方自己的所能接收資料的大小。視窗大小通常用滑動視窗流量控制。
checksum(確認檢查碼)
當資料要由傳送端送出前,會進行乙個校驗的動作,並將該動作的檢驗指標注在這個欄位上。而接受者收到這個報文後,會再次的對報文進行驗證,並且對比原傳送的checksum值是否相符,如果相符合就接受,若不符就會假設該包已經損毀,進而要求對方重新傳送此報文。checksum這種校驗非常弱,規則都是透明的,所以不要相信這個校驗和可以幫你防止惡意篡改,它僅僅用來應對網路傳輸中的干擾訊號
urgent pointer(緊急指標)
這個欄位是在code內的urg=1時才會產生作用,可以告知緊急資料所在的位置
options(任意資料)
目前這個字段僅僅用於表示tcp協議最大分段容量,即mss((max segment size))。這個字段用於在第一次和第二次握手告知對方自己能夠接收的最大分段容量,如果不設定,則代表沒有限制。
padding(補足字段)
options和padding一共有32位,由於options欄位不是固定的,所以需要padding 欄位來加以補齊
三次握手流程
在兩台機器建立聯機之前要通過三個確認動作(d不屬於確認動作),該動作被稱為三次握手(three-way-handshake),整個流程如下:
a: 報文發起
當客戶端想要對伺服器聯機時,客戶端隨機取用乙個大於1024以上的埠向伺服器傳送乙個報文,在此報文中,code欄位中的syn位要標記為1,並且生成乙個隨機的序號sequence number,假設此時該值為10001。
報頭資訊: syn=1 seq=10001
b: 報文接收與確認報文傳送
當伺服器接收到這個報文,並且確定要接收這個報文後,會向客戶端傳送乙個報文,該報文做了如下兩件事:
告知客戶端已經收到您的資訊
將code欄位中的ack置為1,並且將接收到的sequence number加一賦值給響應報文的acknowledge number欄位(ack = 10001+1 = 10002)
確認客戶端可以接收伺服器傳送的報文
將code欄位中的syn置為1,並且生成乙個隨機的sequence number,假設此時只為20001。(跟步驟a一樣的操作)
報頭資訊: ack=1 ack=10002 syn=1 seq=20001
c: 回送確認報文
當客戶端收到來自服務端的ack後,就能夠確認a步驟的報文被正確的接收。此時我們還要回應服務端我們是否接收到了他的請求,所以還要在傳送乙個確認報文,流程跟b步驟中的第一步一致
報頭資訊: ack=1 ack=20002
帶有syn標誌的過程是不可以攜帶資料的,也就是說三次握手的前兩次是不可以攜帶資料的(邏輯上看,連線還沒建立,攜帶資料好像也有點說不過去),但建立連線的第三次握手允許攜帶資料。
d: 取得最後確認
若一切都順利,在伺服器端收到帶有 ack=1 且 ack=20002 序號的封包後,就能夠建立起這次的聯機了。
總結三次握手的對話比喻:
TCP三次握手協議
摘自 syn攻擊原理以及防範技術 tcp握手協議 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack ...
TCP三次握手協議
在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack j 1 同時自己也傳送乙個syn包 syn k 即...
TCP協議三次握手
第一次握手 客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack j 1 同時自己也傳送乙個syn包 syn k 即syn ack包,此時伺服器進入 syn recv 狀態 第三次握手 客戶端 收到伺服器的...