TCP/IP協議的結構參見下圖。有應用層,運輸層,網絡層,鏈路層。

但是如果更細化的話,其實還有幾層沒在這上面體現出來。
1 表示層:數據格式化,代碼轉換,加密。 沒有協議
2 會話層:解除或者建立與其他結點的聯系。沒有協議
3 物理層:以二進制形式在物理鏈路上傳輸數據。協議有ISO2100,IEEE802
在上圖中加上這三層協議。就構成了OSI七層協議網絡模型。從上到下分別是應用層,表示層,會話層,傳輸層,網絡層。數據鏈路層,物理層。
為什么一個數據傳輸要分成這么多層呢。統一為一個模塊不行么。其實不管是多層還是單層,都是可以實現數據傳輸的。但是在OSI7層模型中,每一層都有自己獨特的任務。如果如果只有一層的話。在后期維護的時候,就會出現混亂。沒有一個明確的責任主體
這就好比是一個工廠。工廠有生產線,采購部,質量部,運輸部,財務部,市場部。對一個產品從無到有的過程中,會經歷以上部門的處理。如果有任意一個節點出了問題,只需要處理問題節點即可,其他節點照常運行。OSI7層模型也是一樣的道理。各個層可以看做是生產流水線上各個部門。各司其職,各自負各自的責任。這也體現了分工協作的思想。
那么7層模型中各自的作用是什么呢:
應用層:文件傳輸,電子郵件,文件服務,聊天軟件,視頻播放等各種軟件應用。常用的協議有FTP,TFTP,SNMP,SMTP,DNS,Telent. 作用在於產生數據報文
傳輸層:協議有TCP,UDP,是對數據報文在鏈路上傳輸進行控制的. 作用在於告訴數據報文如何去目的地
網絡層:協議有IP,ICMP,RIP,OSPF,BGP等。是對數據報文進行地址尋址的協議。作用在於告訴數據報文去哪
數據鏈路層:協議有ARP,RARP,PPP等,作用在於告訴數據報文如何在路上行走。
我們來看下報文的結構,從應用層到鏈路層,每一層對自己的數據進行一個打包,交給下一層進行處理。最終形成一個以太網幀。

到了目的地后,對端也是從鏈路層解析到應用層,然后解析出來的數據交給各層進行處理,如下圖。

這種封裝,解封裝的過程就好比是發送一個公司給另外一個公司發送包裹。源公司的各個部門將自己的數據封裝好,最終形成一個總的包裹,目的公司收到包裹后,按照包裹的封裝各層解析,然后交給各個對應的部門
那么下面我們就首先來介紹下IP層協議。
將IP層協議首先介紹IP地址的概念。IP地址在網絡上的作用就好比我們在快遞物品時填寫的地址。每個設備要想在網絡上進行應用交互或者是和其他設備通信,都需要一個IP地址。那么我們的IP地址在哪能查呢。
Windows系統下在cmd界面輸入ipconfig。得到下面的結果。其中IPV4地址就是本機的IP地址。

Linux系統下輸入ifconfig

在查詢出來的信息中,有幾個概念需要介紹下。1 子網掩碼。2 默認網關。
IPV4地址為32bit,分為兩個部分,網絡號和主機號。為什么要這樣區分呢。前面講到IP協議的作用就在於尋址,這個尋址就是尋找不同網絡的地址。網絡地址就是由IP地址的網絡號確定的,不同的網絡號代表不同的網絡地址。如果屬於同一網絡,那么主機號就是區分同一網絡下的設備。就好比有一棟樓,這棟樓的業主要寄包裹。那么地址如下:
XX市XX區XX街道XX小區XX棟Y-Y號。前面紅色標注的地址每個業主都一樣。不一樣的是具體門牌號。紅色標注的地址就好比IP網絡中的網絡地址,Y-Y號就好比主機地址。
IP地址的格式如下,分為A-E類地址。A-E類地址通過最左邊的比特來確定。A類為0,B類為10,C類為110,D類為1110,E類為11110.。 后面的部分就區分為網絡號和主機號

前面介紹了IP地址的作用,那么網絡掩碼是干嘛的呢。網絡掩碼就是用來區分IP地址的網絡號以及主機號分別是多少。計算的方法就是IP地址和網絡掩碼進行與運算,得到的就是網絡地址。
比如192.169.1.1的二進制位11000000 10101001 00000001 00000001
掩碼255.255.255.0的二進制位 11111111 11111111 11111111 00000000

得到的網絡地址就是192.169.1.0。那么主機號就是最后的1個字節(8個bit)。那么在這個網絡下主機IP地址的范圍就是192.169.1.1->192.169.1.254。其中192.169.1.0是網絡號,主機地址不會采用。192.169.1.255是該網絡的廣播地址。因此主機號的bit為全0 或者全1都不會采用. 因此可分配的主機個數為2的n次方(n為主機號的bit個數)-2. 參考上面的這個例子,主機號長度為8. 那么可分配的主機個數為2^8-2=256-2=254。
前面A-E類IP地址的網絡號和主機號都是固定的,對於具體的網絡部署來說並不是很方便,我們可以自己定義網絡號和主機號。也就是自定義網絡號和主機號的長度。這叫做變長子網掩碼。比如剛才的192.169.1.1的網絡號是192.169.1.0. 我們也可以寫成192.169.1.1/24. 這個24表明的是網絡長度。這樣寫的話就比較直觀了。那么邊長子網掩碼就是改寫這個長度,比如192.169.1.1/20 那么網絡號就只占20位。結果如下.由於網絡號只占了20位,因此主機IP地址長度從8擴展為12. 那么可分配的主機號就為2^12-2=4094。

因此如果想一個網絡容納更多主機,那么可以縮短網絡號長度。如果想規划更多的子網,那么可以增加網絡號長度
下面再看下網關的含義:顧名思義,網關就是網絡關口的意思。通俗點說就是告訴網絡下一個地址是在哪。比如前面查出來的網關為192.168.0.1,IP地址為192.168.0.5。 也就是說首先將數據包發給192.168.0.1. 這個192.168.0.1在真實的環境中就是我的無線路由器。連接到到這個無線路由器下的設備都將數據包發送給路由器。然后通過路由器向外轉發。

那么網關是否是必須要配置的呢,其實也不是,只要是L3設備可以通過配置路由和下一跳,這里下一跳就是起到網關的作用。數據發到網關設備后,網關設備會根據自己的路由表找到轉發路徑將數據轉發到目的地址。我們可以用tracert(linux下用traceroute)的命令來看下,比如輸入tracert www.sina.com.cn 就會得到下面的經過的地址。第一個地址就是192.168.1.1網關地址。下面顯示總共經過了8次轉發。
Windows:

Linux:

下面我們來看下IP協議的組成,IPV4中普通的IP首部長20個字節。其中有32位的源IP地址和32位的目的IP地址。
TTL:生存時間。代表了數據包可以經過的最多路由器數。比如TTL為10,意思是如果經過10次路由器轉發,仍然未找到目的地址,則報文丟棄
8位協議指示的是傳輸層承載的協議
16位總長度:指IP數據包的最大長度。16bit那么最長可達65535字節。但是通過鏈路的MTU不會有這么大。因此如果數據包長度超過了MTU,數據包會被分片。如果發生了分片,則需要用到16位標識以及13位片偏移來找到分片的報文。

我們用wiresharK來抓取一個具體的數據包看下IP報文:其中Time to live:128也就是TTL 128.
Protocol: UDP,說明這個是一個UDP報文。 Source和Destination分別是源和目的IP地址

