天天看點

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

TCP/IP協定(本文源自外部連結)

TCP/IP不是一個協定,而是一個協定族的統稱。裡面包括IP協定、IMCP協定、TCP協定。

這裡有幾個需要注意的知識點:

網際網路位址:也就是IP位址,一般為網絡号+子網号+主機号域名系統:通俗的來說,就是一個資料庫,可以将主機名轉換成IP位址RFC:TCP/IP協定的标準文檔端口号:一個邏輯号碼,IP包所帶有的标記Socket:應用程式設計接口資料鍊路層的工作特性:

為IP子產品發送和接收IP資料報為ARP子產品發送ARP請求和接收ARP應答(ARP:位址解析協定,将IP位址轉換成MAC位址)為RARP發送RARP請求和接收RARP應答接下來我們了解一下TCP/IP的工作流程:

資料鍊路層從ARP得到資料的傳遞資訊,再從IP得到具體的資料資訊

IP協定

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

IP協定頭當中,最重要的就是TTL(IP允許通過的最大網段數量)字段(八位),規定該資料包能穿過幾個路由之後才會被抛棄。

IP路由選擇

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

ARP協定工作原理

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

ICMP協定(網絡控制文協定)

将IP資料包不能傳送的錯誤資訊傳送給主機

查詢封包

ping查詢:主機是否可達,通過計算間隔時間和傳送多少個包的數量子網路遮罩時間戳:獲得目前時間差錯封包

不産生的情況:

ICMP差錯封包不産生差錯封包源位址為零位址、環目位址、廣播位址、多點傳播位址IP路由器選擇協定

靜态路由選擇

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

靜态路由選擇

配置接口以預設方式生成路由表項,或者使用route add手動添加表項ICMP封包(ICMP重定向封包)更新表項動态路由選擇(隻使用在路由之間)RIP(路由資訊協定)

分布式的基于距離向量(路由器到每一個目的網絡的距離記錄)的路由選擇協定

router承擔的工作:

給每一個已知路由器發送RIP請求封包,要求給出完整的路由表如果接受請求,就将自己的路由表交給請求者;如果沒有,就處理IP請求表項(自己部分+跳數/沒有的部分+16)接受回應,更新路由表定期更新路由表(一般為30s,隻能說太頻繁~)OSPF(開放最短路徑優先協定)

分布式鍊路狀态(和這兩個路由器都有接口的網絡)協定

當鍊路狀态發生變化時,采用可靠的洪泛法,向所有的路由器發送資訊(相鄰的所有路由器的鍊路狀态)最終會建立一個全網的拓撲結構圖TCP/IP的三次握手,四次分手

首先我們先來了解TCP封包段

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

重要的标志我在圖中也有标記,重點了解标志位

ACK:确認序号有效

RST:重置連接配接

SYN:發起了一個新連接配接

FIN:釋放一個連接配接

三次握手的過程(用戶端我們用A表示,伺服器端用B表示)

前提:A主動打開,B被動打開

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

在建立連接配接之前,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被動關閉

tcp ip協定伺服器,TCP/IP協定詳解内容總結(怒噴一口老血)

有人可能會問,為什麼連接配接的時候是三次握手,而斷開連接配接的時候需要四次揮手?

這是因為服務端在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,先到這吧

舉報/回報