TCP協議隨筆
傳輸控制協議TCP是面向連接、保證高可靠性(數據無丟失、數據無失序、數據無錯誤、數據無重復到達)傳輸層協議。
TCP/IP結構對應OSI
TCP/IP OSI
應用層 應用層
表示層
會話層
傳輸層 傳輸層
網絡層 網絡層
網絡接口層(又稱數據鏈路層) 數據鏈路層
物理層
TCP報文格式 :
1. 序號:seq序號,占32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
2. 確認序號:ack序號,占32位,只有ACK標誌位為1時,確認序號字段才有效,ack=seq+1。
3. 標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
a. URG:緊急指針有效。
b. ACK:確認序號有效。
c. PSH:指示接收方應該盡快將這個報文段交給應用層而不用等待緩沖區裝滿
d. RST:重置連接(一般表示斷開一個連接)。
e. SYN:發起一個新連接。
f. FIN:釋放一個連接。
*註意: 不要將確認序號Ack與標誌位中的ACK搞混了。
確認方ack=發起方seq+1,兩端配對。
TCP三次握手 :
1. 第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
2. 第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置為1,
ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
3. 第三次握手: Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,
並將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,
Client和Server進入established(已建立連接)狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。
* SYN攻擊: 在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),
此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。
SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地發送SYN包,
Server回復確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,
這些偽造的SYN包將長時間占用未連接隊列,導致正常的SYN請求因為隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。
SYN攻擊是一種典型的DDOS(分布式拒絕服務)攻擊,檢測SYN攻擊的方式非常簡單,
即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:
netstat -nap | grep SYN_RECV
TCP四次揮手 :
1. 第一次揮手: Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
2. 第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),
Server進入CLOSE_WAIT狀態。
3. 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
4. 第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,
確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
* 服務端在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。
而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,
己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些數據給對方後,
再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送。
TCP協議隨筆