TCP/IP協議詳解內容總結(怒噴一口老血)
來源:互聯網
上載者:User
TCP/IP協議 TCP/IP不是一個協議,而是一個協議族的統稱。裡麵包括IP協議、IMCP協議、TCP協議。 TCP/IP分層:
這裡有幾個需要注意的知識點: 互連網地址:也就是IP地址,一般為網路號+子網號+主機號 網域名稱系統:通俗的來說,就是一個資料庫,可以將主機名稱轉換成IP地址 RFC:TCP/IP協議的標準文檔 連接埠號碼:一個邏輯號碼,IP包所帶有的標記 Socket:應用編程介面 資料連結層的工作特性: 為IP模組發送和接收IP資料報 為ARP模組發送ARP請求和接收ARP應答(ARP:位址解析通訊協定,將IP地址轉換成MAC地址) 為RARP發送RARP請求和接收RARP應答 接下來我們瞭解一下TCP/IP的工作流程: 資料連結層從ARP得到資料的傳遞資訊,再從IP得到具體的資料資訊 IP協議
IP協議頭當中,最重要的就是TTL(IP允許通過的最大網段數量)欄位(八位),規定該資料包能穿過幾個路由之後才會被拋棄。 IP路由選擇
ARP協議工作原理
ICMP協議(網路控制文協議) 將IP資料包不能傳送的錯誤資訊傳送給主機 查詢報文 ping查詢:主機是否可達,通過計算間隔時間和傳送多少個包的數量 子網路遮罩 時間戳記:獲得目前時間 差錯報文 不產生的情況: ICMP差錯報文不產生差錯報文 源地址為零地址、環目地址、廣播位址、多播地址 IP路由器選擇協議 靜態路由選擇 先來看路由選擇工作流程:
靜態路由選擇 配置介面以預設產生路由表項,或者使用route add手動添加表項 ICMP報文(ICMP重新導向報文)更新表項 動態路由選擇(只使用在路由之間) RIP(路由資訊協議) 分布式的基於距離向量(路由器到每一個目的網路的距離記錄)的路由選擇協議 router承擔的工作: 給每一個已知路由器發送RIP請求報文,要求給出完整的路由表 如果接受請求,就將自己的路由表交給要求者;如果沒有,就處理IP請求表項(自己部分+跳數/沒有的部分+16) 接受回應,更新路由表 定期更新路由表(一般為30s,只能說太頻繁~) OSPF(先開啟最短的路徑協議) 分布式鏈路狀態(和這兩個路由器都有介面的網路)協議 當鏈路狀態發生變化時,採用可靠的洪泛法,向所有的路由器發送資訊(相鄰的所有路由器的鏈路狀態) 最終會建立一個全網的拓撲結構圖 TCP/IP的三向交握,四次分手 首先我們先來瞭解TCP報文段
重要的標誌我在圖中也有標記,重點瞭解標誌位 ACK:確認序號有效 RST:重設串連 SYN:發起了一個新串連 FIN:釋放一個串連 三向交握的過程(用戶端我們用A表示,伺服器端用B表示) 前提:A主動開啟,B被動開啟
在建立串連之前,B先建立TCB(傳輸控制塊),準備接受客戶進程的串連請求,處於LISTEN(監聽)狀態 A首先建立TCB,然後向B發出串連請求,SYN置1,同時選擇初始序號seq=x,進入SYN-SEND(同步已發送)狀態 B收到串連請求後向A發送確認,SYN置1,ACK置1,同時產生一個確認序號ack=x+1。同時隨機播放初始序號seq=y,進入SYN-RCVD(同步收到)狀態 A收到確認串連請求後,ACK置1,確認號ack=y+1,seq=x+1,進入到ESTABLISHED(已建立串連)狀態。向B發出確認串連,最後B也進入到ESTABLISHED(已建立串連)狀態。 簡單來說,就是 建立串連時,用戶端發送SYN包(SYN=i)到伺服器,並進入到SYN-SEND狀態,等待伺服器確認 伺服器收到SYN包,必須確認客戶的SYN(ack=i+1),同時自己也發送一個SYN包(SYN=k),即SYN+ACK包,此時伺服器進入SYN-RECV狀態 用戶端收到伺服器的SYN+ACK包,向伺服器發送確認報ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三向交握 在此穿插一個知識點就是SYN攻擊,那麼什麼是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
四次分手的過程(用戶端我們用A表示,伺服器端用B表示) 由於TCP串連時是全雙工系統的,因此每個方向都必須單獨進行關閉。這一原則是當一方完成資料發送任務後,發送一個FIN來終止這一方向的連結。收到一個FIN只是意味著這一方向上沒有資料流動,既不會在收到資料,但是在這個TCP串連上仍然能夠發送資料,知道這一方向也發送了FIN,首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉。
前提:A主動關閉,B被動關閉
有人可能會問,為什麼串連的時候是三向交握,而中斷連線的時候需要四次揮手。 這是因為服務端在LISTEN狀態下,收到建立串連請求的SYN報文後,把ACK和SYN放在一個報文裡發送給用戶端。而關閉串連時,當收到對方的FIN 報文時,僅僅表示對方不再發送資料了但是還能接收資料,己方也未必全部資料都發送給對方了,所以己方可以立即close,也可以發送一些資料給對方後,再 發送FIN報文給對方來表示同意現在關閉串連,因此,己方ACK和FIN一般都會分開發送。
A發送一個FIN,用來關閉A到B的資料傳送,A進入FIN_WAIT_1狀態。 B收到FIN後,發送一個ACK給A,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),B進入CLOSE_WAIT狀態。 B發送一個FIN,用來關閉B到A的資料傳送,B進入LAST_ACK狀態。 A收到FIN後,A進入TIME_WAIT狀態,接著發送一個ACK給B,確認序號為收到序號+1,B進入CLOSED狀態,完成四次揮手。 簡單來說就是 用戶端A發送一個FIN,用來關閉客戶A到伺服器B的資料傳送(報文段4)。 伺服器B收到這個FIN,它發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。 伺服器B關閉與用戶端A的串連,發送一個FIN給用戶端A(報文段6)。 用戶端A發回ACK報文確認,並將確認序號設定為收到序號加1(報文段7)。 A在進入到TIME-WAIT狀態後,並不會馬上釋放TCP,必須經過時間等待計時器設定的時間2MSL(最長報文段壽命),A才進入到CLOSED狀態。為什麼。 為了保證A發送的最後一個ACK報文段能夠到達B 防止“已失效的串連請求報文段”出現在本串連中
OK~是不是很難懂的感覺。那我們來說的“人性化點的”吧 三向交握流程 用戶端發個請求“開門呐,我要進來”給伺服器 伺服器發個“進來吧,我去給你開門”給用戶端 用戶端有很客氣的發個“謝謝,我要進來了”給伺服器 四次揮手流程
用戶端發個“時間不早了,我要走了”給伺服器,等伺服器起身送他 伺服器聽到了,發個“我知道了,那我送你出門吧”給用戶端,等用戶端走 伺服器把門關上後,發個“我關門了”給用戶端,然後等用戶端走(尼瑪~矯情啊) 用戶端發個“我知道了,我走了”,之後自己就走了 OK,先到這吧,還有後續喲~~~