1. 程式人生 > >TCP/IP協議棧

TCP/IP協議棧

ip tcp

TCP/IP協議棧全稱是傳輸控制協議/因特網互聯協議,其實是OSI模型的進化版,所以就先解釋一下什麽是OSI模型,OSI的全稱是開放系統互連參考模型,就是為了實現開放系統互連所建立的通信功能分層模型,其目的就是為異種計算機互連提供一個共同的基礎和標準框架,並為保持相關標準的一致性和兼容性提供共同的參考。這裏的開放系統指的是遵循OSI模型和相關協議能夠實現互連的具有各種應用目的的計算機系統。OSI模型一共有七層,TCP模型一共只有四層,分別為應用層,傳輸層,Internet層,網絡訪問層。它定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。

1.應用層包含的所有的高層協議有FTP,TFTP,NFS,SMTP,Tenlet,rlogin,SNMP,DNS

HTTPHTTPS這些都是和用戶打交道的協議

2.傳輸層包含的協議有UDP,TCP,現在通用的網絡傳輸控制協議,使源端口和目的端機器上的對等實體可以進行會話。

3.Internet層的是整個結構體系的關鍵部分,其功能是使主機可以把分組發往任何網絡,並使分組獨立的傳向目標,這些分組可能經由不同的網絡,到達的順序也可能不同。高層如果想要轉發就必須自行處理分組的排序。互聯網層使用因特網協議IP,ICMP,OSPF,ELGRP,IGMP,ARP,RARP

ICMP和IGMP以及其他支持IP的協議幫助IP完成特定的任務,如傳輸差錯控制信息以及主機/路由器之間的控制電文等。網絡層掌管著網絡中主機間的信息傳輸。

4.網絡訪問層並沒有很詳細的定義,就是說主機必須使用某種協議與網絡相連SLIP,CSLIP,PPP,MTU,ISO2110IEEE802IEEE802.2

重點1TCP協議

註意:傳輸層通過端口來確定應用層的協議。

TCP協議特性:

工作在傳輸層面向連接協議

全雙工協議

半關閉:一邊斷開就不連接

錯誤檢查:把沒收到的包通知發送方重新發

將數據打包成段,排序

確認機制

數據恢復,重傳

流量控制,滑動窗口

擁塞控制,慢啟動和擁塞避免算法

TCP包頭信息

------端口

計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用16

位表示的,可推算計算機的端口個數為2^16

----序列號Seq

tcp傳輸數據的時候會把數據切割成很多小的包,每個包都有自己的序列號2^32-1,如果序列號相同,會有其他的選項來區分不同包。

------確認號Ack

如果a給b發送數據,如果包的編號是100,那麽b確認收到的時候會從101回過去確認希望下次收到101的包,,b收到包後在自己這也有一個包的編號可能是10000

-------數據偏移

表示TCP報文段的首部長度,共4位,由於TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出 TCP報文段的數據起始處距離 TCP 報文段的起始處有多遠。該字段的單位是32(4個字節為計算單位), 4位二進制最大表示15,所以數據偏移也就是TCP首部最大60字節

-------標記位

UGR:緊急數據 1

ACK:確認標記位 1數據有效

PSH:如果是1不會存放在緩存區,沒有延遲

RST:如果是1 出錯重設

SYN:請求通訊位1

FIN:請求分手位1

-----窗口

雙方協商發送數據的速度,也就是數據發送量,窗口大小可能會變化。

-----選項

一些額外的功能,比如當兩個包的ip相同的時候可以根據選項來區分兩個包。

重點2TCP協議三次握手

TCP三次握手之後就會建立連接,之所以三次是因為避免資源浪費,但是這樣也會出現Dos(半連接攻擊)拒絕服務,造成服務器宕機,資源耗盡。

一般客戶端向服務器發送請求,經歷五個狀態。

技術分享


解析:首先來說SYN是用來同步的,ACK報文是用來應答的。當客戶端向服務器端請求連接的時候一共經歷了五種狀態,首先客戶端在打開自己向客戶端發送請求,此時的同步序號SYN=1(因為沒有收到任何TCP報文段所以不用確認報文段)表明客戶端請求連接,請求連接的報文段的第一個字節的序列號為x,假設同時段的服務器端並沒有被其他客戶端訪問,(服務器端很少有關閉的狀態,因為一斷開跟一臺客戶端的連接,立馬就轉換到監聽狀態)那麽服務器就一直處於監聽狀態,等待客戶端 的訪問 ;服務器端收到客戶端的請求,同意客戶端的連接,此時就發出SYN=1ACK=1,表明同意對方的連接 SYN=1表示服務端收到請求後同意連接,它自己也會發送一個請求連接的請求,ACK=1,表示確認收到服務端的請求連接的報文,所以應答對方建立連接。客戶端發送的報文在客戶端的報文段的序列號是x,在服務端的報文段的序列號就是可能是y,ack=x+1表示確認收到服務端的請求連接的報文段,希望下次收到的報文段是x+1;雙方建立連接,當服務端收到客戶端的同意連接請求後,客戶端也會回應一下確認收到了服務端的同意請求連接,此時客戶端發送的回應報文段就是第x+1,確認收到對方的報文段,希望下次收到的報文段是y+1。三次完成後就建立連接成功,數據就可以正常傳送。

重點3TCP協議的四次揮手

技術分享

解析:當服務端接到客戶端的FIN的請求分手的報文後,然後客戶端立馬進入終止等待1的狀態意思是說我客戶端沒有數據要發給你了,但是你如果還有數據沒有發送完成,則不必著急關閉接口,可以繼續發送數據,你服務端可以先發送一個確認收到我分手的請求,告訴我客戶端“我收到你的請求了,但是我還沒準備好,請你繼續等待我的消息”,此時客戶端進入等待2狀態,服務端可以繼續發送數據,當服務端的數據傳送完成後,服務端就發送一個FIN請求分手的報文,告訴客戶端我數據發送完畢,也同意你的分手請求,服務端發送的報文段就不是v+1了(因為中間發送了其他的數據包),確認收到並且希望下次發送的包還是u+1(因為中間客戶端並沒有給服務端發送任何數據),服務端的請求分手的報文段發送完畢後立馬進入最後確認階段,雖然客戶端收到報文知道可以關閉連接了,但是還是不相信網絡,擔心服務端不知道要斷開連接,所以客戶端發送ACK確認後進入TIME-WAIT時間等待狀態,如果服務端沒有收到ACK可以重傳。服務端收到ACK後就知道斷開連接了。客戶端2MSL後依然沒有收到回復,就證明服務端已經斷開連接,那麽客戶端也就進入關閉階段斷開連接了。此時所有的資源都會被釋放,包括端口號,立馬切入listen狀態。

還有一個closing狀態,就是同時發送FIN請求。

問題1:那麽為什麽連接的時候是三次握手,關閉的時候卻是四次揮手?

解析:因為服務端收到客戶端的SYN連接的請求後,可以直接發送SYN+ACK報文直接同意連接。SYN是同步連接請求的,ACK是用來應答同步請求的。但是關閉連接的時候,服務端收到報文並不會立即同意關閉連接,所以就會先發送一個ACK,告訴客戶端我收到FIN這個報文。只有等我把所有的數據發送完畢後,我才能一起發送FIN=1ACK=1.所以需要四步。

問題2:為什麽TIME-WAIT狀態需要2MSL才能返回close

TIME-WAIT是為了處理最後一個ACK丟失,如果丟失了可以重傳,因為分手經過的時間越長就會風險越大,也就越不可靠,所以可能會出現ACK丟失的情況。

以上說的是傳輸層的很重要的協議,記住了很重要,很重要,重要的事情說三遍。但是網絡層也有幾個很重要的協議,下面來細細介紹一下IP,ICMP,ARP,RARP這四個協議。

重點4ICMP網際控制報文協議

其實這個就是為了提高數據報交付成功的機會。報告網絡異常和和差錯。它是網絡層數據報的數據,加上數據報的首部,組成ip數據報發送出去,需要註意的是多播地址的數據報都不發送,還有回環地址和未知地址也不發送。裏面有幾個比較重要的字段 如下圖抓包的數據。

技術分享

其中類型是表示ICMP數據包類型,長度就是八位字段,還有源Mac地址。

重點5APP地址解析協議,其實就是把網絡層的IP地址解析成Mac地址。它最初獲取對方的Mac地址需要廣播,找到Mac地址後的回應並不需要廣播,還有就是ARP廣播並不是跨路由的,它的緩存區的表會記錄Mac地址,存放在緩存中,一段時間斷開訪問就會被清除掉,下次使用還是會發ARP廣播。這樣做也是為了節約資源,需要註意的是地址解析協議時建立在網絡中各個主機互相信任的基礎上的,各個主機可以自主發送ARP應答消息,而且其他主機收到應答報文的時候不會檢測報文的真實性就會將記錄記入本機的ARP緩存中,由此看來ARP並不安全,可能會有其他的不法主機發送一些錯誤消息,或者是截獲消息使其無法到達預期的主機,這就是ARP欺騙。如下:

技術分享

可以看出當A 主機要訪問到B 的時候A 主機會發送廣播給同一個網段的其他主機,上圖使用路由隔開了AB,所以B 並不能立即接收到A的廣播,A首先會給同一網段的路由發送廣播,看到底能不能找到B主機,所以源ipA目的ipB(首先肯定會知道對方的ip地址),源Mac地址是A自己的,目標MAC地址就是路由R1鄰近自己的那個接口的Mac地址,路由R1也找不到主機B MAC地址,就會通過ARP廣播發送給路由R2,路由器R2發送了一個ARP廣播發現目標主機在自己這個網段,整個過程ARP就會記錄在自己的緩存中。所以其中有風險的就是,當攻擊者向目標主機發送偽ARP應答報文,就會篡改本地的Mac地址表,然後導致目標網絡與網關通訊失敗,而且所有的信息都會通過攻擊者的機器,也會存在很大的風險。

當然還有幾條關於ARP的命令如下:

arp -n 查找arp記錄

Ip neig 查詢arp

技術分享

arp -d 刪除arp

arp -s ip地址 可以刪除一個arp記錄

arping -I eth IP地址 可以查看到沖突的ip地址,並且可以查到對方的MAC地址可以用來測試。

小貼士:反向ARP

現在有很多無盤工作站,比如銀行,防止遇到攻擊和數據泄露,物理機器從網關服務器的ARP表或者緩存上根據MAC地址請求ip地址的協議,首先查詢主機向網路送出一個RARPrequest的廣播包,向別的主機查詢自己的ip地址。這時候RARP服務器就會將發送端的IP地址用RARPREPLY包回應給查詢者,這樣查詢主機就獲得自己的IP地址了。

重點6IP地址

IP地址可唯一標識ip網絡中的每臺設備。每臺主機都必須具有唯一的地址。主要有兩部分組成,第一是網絡id,標識網絡,每個網段分配一個網絡id;第二是主機id,標識單個主機,由組織分配給各設備。

例如:172.17.0.100 網段是一樣的,但是主機號不一樣。可以說IP地址跟人的名字很像,Mac地址就像是身份證號。IP地址主要是給人看的,比較好識別,Mac地址就是計算機識別的,比較不好記。

IP地址分類:

--------公式:

主機數=2^(主機id位數)-2=2^(32-網絡id位數)-2

網絡數=2^可變網絡id位數

網絡id值=ip和naetmask相與

劃分子網數=2^網絡id向主機id借的位數

損失id=2*(子網數-1)

--------A類地址:

前八位網絡id,24位主機id,最高位為0

表示格式:0xxxxxxx.A.B.C

00000000 未知地址,網絡id全為0,當機器剛啟動的時候就是0.0.0.0

01111111 127回環地址(廣播地址),網絡id全為1,雖然可以ping通,但是是自己主機地址,以上兩個都不能用,所以要去掉0127這兩個值,剩下的就是可以用的

1-126.A.B.C

每個網絡的主機數:2^24-2=16777214

255.0.0.0

---------B類地址

B

16位網絡id,16位主機id

10xxxxxx.xxxxxxxx.B.C

網絡數: 2^14

10000000

10111111

128-191.A.B.C

主機數:2^16-2=65534

255.255.0.0

---------C公有地址

24位網絡id,8位主機id

110xxxxx.xxxxxxxx.xxxxxxxx.C

11000000

11011111

每個網絡的主機數:2^8-2=254

網絡數=2^21=2M

192-223.A.B.C

255.255.255.0

-----D類組播地址

11100000-11101111:224-239

--------E類廣播地址240-254

需要知道的是,這些ip地址有很多都是公有ip地址,公有ip都是由互聯組織分配,下面這個圖就是剩下的私有ip.用於局域網,比較安全,能訪問到互聯網的別人的用戶,但是互聯網的用戶不能訪問到自己家。

技術分享

重點7:無類別域間路由(CIDR

在域名系統出現以後的第一個十年裏,基於分類網絡進行地址分配和路由分配ip數據包的設計就明顯顯得可擴充性不足,為了解決這個問題,互聯網工程小組發布了新的分配IP地址和ipv4數據包的方法。ip數據包包含兩個部分:前綴和緊接著的這個網絡內的主機地址。在之前的分類網絡中IP地址的分配把32位按照每8位為一段分開。這就使得前綴必須是8,16,或者是24位。因此在D類網絡中,最小的每個網絡段只能分256個地址,這對於很多大企業來說明顯是不夠的,而B類地址的每個網絡的主機ip可以到達65534個,這對於很多小企業來說又會太多了。這就導致了不能充分使用IP地址和加重路由的負擔。所以這個時候無類別域間路由就出現了,它最好的地方就體現在可以認為調整網絡id的位數。

CIDR表示法:ip/網絡id=ip/(32-主機id位數),也就是說當網絡id位確定了,主機id自然就知道了。

介紹了這些,那麽無類域間路由又是怎麽工作的呢?

這個時候就出現了子網掩碼,無類域間路由通過子網掩碼才能知道哪些位是網絡位,哪些又是主機位的id,網絡id在主機id的前面,子網掩碼一共32位,對應的網絡id1,對應的主機id位是0。所以就有以下幾種情況。

00000000 0

10000000 128

11000000 192

11100000 224

11110000 240

11111000 248

11111100 252

11111110 254

11111111 255

1:172.17.0.100/26 netmask?每個網絡主機數?網絡id值?

netmask?

255.255.255.192

主機數:2^(32-26)-2=62

網絡id值:172.17.0.01000000

172.17.0.64/26

解析:知道這個ip的網絡id的位數26位,前二十六位都是1,所以子網掩碼就是255.255.255.192,每個網絡的主機數就是減去網絡id的位數,然後減去兩個不能用的主機id2^32-26-2=62,網絡id的值就比較好計算了,前24位不變,還有兩位就是占用了最後八位的主機idIP地址和子網掩碼相與就是網絡id的值了,100的二進制就是01100100,192的二進制就是11000000,結果就是64,所以網絡id的值就是172.17.0.64/26.

2:110.110.244.100/22

netmask?

255.255.252.0

主機數?

2^(32-22)-2=1022

網絡id值?

110.110.244.0/22

110.110.111101 00.100

255.255.111111 00.0

110.110.11110100.0(110.110.224.0

重點8:劃分子網

就是將一個大網絡(主機id位多)劃分成多個子網(主機id少),那麽網絡id就像主機id借位,網絡id變多,主機id少,這樣可以資源更好的利用,也可以降低路由的負擔。

但是註意的是每劃分一個子網會損失兩個邊界主機id。例如:10.0.0.0/9劃分成兩個子網,就會向主機id借一位,最小的id就是10.0 0000000.0.1/9,最大的id就是10.1 1111111.255.254/9,就會損失兩個id:10.0 1111111.255.255和10.1 0000000.0.0

3:10.0.0.0/8劃分32個子網

每個網絡的netmask255.248.0.0

主機數:2^32-13-2=2524286

最小子網的netid 10.00000 000.0.0/13(10.0.0.0/13)

最大的ip範圍10.11111 000.0.1-10.11111 111.255.254(10.248.0.1-10.255.255.254)

4:10.0.0.0/8 劃分32個子網,第十個子網是河南省,對子網劃分64個

10.01001 000.0.0

10.01001 000.000 00000.0

10.72.0.1/13

255.255.224.0

主機數:2^(19-13)-2=8190

最小子網id

10.01001 000.000 00000.00000001

10.72.0.1/19

ip範圍:

10.01001 111.111 00000.00000001

10.01001 111.111 11111.11111110

10.79.224.1-10.79.255.254

5:172.200.249.200/22劃分16個子網

netmask:255.255.255.192

主機數:2^(32-26(=22+4))-2=62

最小子網的NetID:172.200.248.0/26

最大的ip範圍:172.200.111110 11.11 000001-172.200.111110 11.11 111110

小貼士:劃分超網:主機id向網絡id借位

例如:220.78.168.0

220.78.10101 000.0/21(大網絡id+新的網絡id+主機號)

今天就先分享到這了~~~~~~~~~~


TCP/IP協議棧