TCP
序號
序號:在一個TCP連接中傳輸的字節流中的每一個字節都按順序編號,本字段表示本報文段所發送數據的第一個字節的序號。
確認號
確認號:期望收到對方下一個報文段的第一個數據字節的序號。若確認號為N,則證明到序號N-1為止的所有數據都已正確收到。
數據偏移(4位)
數據偏移(首部長度):TCP報文段的數據部分起始處 距離TCP首部的起始處的距離,以4B為單位,即一個數值是4B。
6個控制位(每個一位)
緊急位URG:URG=1時,表明此報文段中有緊急數據,是高優先級的數據,應盡快傳遞,不用再緩沖中排隊,配合緊急指針字段使用。
確認位ACK:ACK=1時,確認號有效,在連接建立后所有傳送的報文段都必須把ACK置為1。
推送位PSH:PSH=1時,接收方盡快交付接收應用進程,不再等到緩存填滿再向上交付。
復位RST :RST=1時,表明TCP連接出現險種差錯,必須釋放連接,然后重新建立傳輸鏈接。
同步位SYN:SYN=1時,表明是一個連接請求/連接接受報文。
終止位FIN:FIN=1時,表明此報文段發送方數據已發送完,要釋放連接。
窗口
窗口:指的是發送本報文段的一方的接收窗口,即現在允許對方發送的數據量。
檢驗和
檢驗和:檢驗首部+數據,檢驗時要加上12B偽首部,第四個字段為6.
緊急指針
緊急指針:URG = 1時才有意義,指出本報文段中緊急數據的字節數。緊急數據在數據部分的開始。
選項
選項:最大報文段長度MSS(每個TCP報文段中的數據最大字段長度),窗口擴大、時間戳、選擇確認...
TCP的連接建立
三次握手
ROUND1:客戶端發送連接請求報文段,無應用層數據。
SYN = 1
,seq = x
(隨機)
ROUND2:服務器端為該TCP連接分配緩存和變量,並向客戶端返回確認報文段,允許連接,無應用層數據。
SYN = 1
,ACK = 1
,seq = y
(隨機),ack = x + 1
ROUND3:客戶端為該TCP連接分配緩存和變量,並向服務器端返回確認的確認,可以攜帶數據。
SYN = 0
,ACK = 1
,seq = x + 1
,ack = y + 1
解決SYN攻擊的方法:SYN cookie
四次揮手
ROUND1:客戶端發送連接釋放報文段,停止發送數據,主動關閉TCP連接。
FIN = 1
,seq = u
ROUND2:服務器端回送一個確認報文段,客戶到服務器這個方向的連接就釋放了,就是半關閉狀態。
ACK = 1
,ack = u+1
,seq = v
SYN = 1
,ACK = 1
,seq = y
(隨機),ack = x + 1
ROUND3:服務器端發送完數據,就發送連接釋放報文段,主動關閉TCP連接。
FIN = 1
,ACK = 1
,seq = w
,ack = u + 1
ROUND4:客戶端回送一個確認報文段,再等到時間等待計時器設置的2MSL(最長報文段壽命)后,連接徹底關閉。
Wireshark 抓包
frame:物理層
Ethernet:數據鏈路層
Internet:網絡層
Transmission:傳輸層
抓包分析:
三次握手:
四次揮手(我這里不知道是不是沒有抓取完畢):
參考鏈接:王道考研