TCP/IP高频考点之一个数据包的流浪日记
往期推薦
TCP/IP 開胃菜 之 HTTP
面試反客為主 TCP
4 網絡層 IP
數據包的傳輸主要經過應用層、傳輸層、網絡層、鏈路層。承接應用層HTTP、傳輸層TCP講解,應用層數據被傳輸層包裹后接下來就需要被網絡層包裹了,網絡層的核心任務就是實現主機與主機之間的通信。講解IP層之前需鋪墊眾多基礎知識。
4.1 IP 基礎知識
4.1.1 IP 定義
現實生活人能找到人是因為知道彼此的詳細地址,在網絡中要通訊就要知道對方的 IP 地址,IPv4 是由32位二進制數據來表示的,每4位算一組并換算成10進制數據,組與組之間通過 . 分割。
4.1.2 IP 分類
為了便于尋址和層次化的構造網絡,IP地址被分為A、B、C、D、E 五類。
A、B、C三類 IP 中是有 網絡號 跟 主機號共同組成的,我們常說的 IP地址 = 網絡地址 + 主機地址。A、B、C三類 IP 都有若干位固定值表示不同類型,并且網絡號全為 0 的情況下網絡不可用,網絡地址的主機位全部變成1被提前標記為是廣播地址,全部被標記為0表示是主機地址,即是這個網絡中的所有主機的地址。
廣播地址
Broadcast Address 廣播地址 指同時向該局域網上所有的主機發送報文,如136.78.255.255就是B類地址中的一個廣播地址,你將信息送到此地址,就是將信息送給網絡號為136.78的所有主機。
在本網絡內廣播的叫做本地廣播,這個廣播地址發出的 IP 包會被 路由器 屏蔽。
在不同網絡之間的廣播叫做直接廣播。
主機地址
在一個網絡段中主機號全為 0 代表這個網絡段本身,稱之為網絡號 。這個地址是不可以分配給主機的。
多播
D 類網段中的多播用于將包發送給特定組內的所有主機。
主機之間一對一的通訊模式叫單播,主機之間一對所”的通訊模式叫廣播,主機之間一對一組的通訊模式叫多播。
4.1.3 子網掩碼
Subnet Mask 又叫網絡掩碼、地址掩碼,子網掩碼只有一個作用,就是將某個IP地址劃分成網絡地址和主機地址。
子網掩碼是一個32位地址,用于屏蔽IP地址的一部分以區別網絡標識和主機標識,并說明該IP地址是在局域網上,還是在遠程網上。
子網掩碼的主機號部分全部為0,非主機號部分全部為 1。
子網掩碼不能單獨存在,它必須結合IP地址一起使用。
通過子網掩碼,就可以判斷兩個IP在不在一個局域網內部。
子網掩碼可以看出有多少位是網絡號,有多少位是主機號。
用子網掩碼可以得到網絡地址跟主機地址。
將ip地址與子網掩碼轉換成二進制。
將二進制形式的ip地址與子網掩碼做’與’運算,將答案化為十進制便得到網絡地址。
將二進制形式的子網掩碼取反。
將取反后的子網掩碼與ip地址做與運算,將答案化為十進制便得到主機地址。
子網掩碼一般分為兩類,第一類是系統自帶的:
A類地址子網掩碼是 255.0.0.0。
B類地址子網掩碼是 255.255.0.0。
C類地址子網掩碼是 255.255.255.0。
第二類就是自定義子網掩碼,將一個網絡劃分為幾個子網,需要每一段使用不同的網絡號或子網號,實際上我們可以認為是將主機號分為兩個部分:子網號、子網主機號。形式如下:
未做子網劃分的ip地址:網絡號+主機號
做子網劃分后的ip地址:網絡號+子網號+子網主機號
也就是說ip地址在化分子網后,以前的主機號位置的一部分給了子網號,余下的是子網主機號。
4.1.4 無分類地址
IP分類劃分的優點:
簡單明了、根據前面幾位固定值即可判斷。
IP分類劃分的缺點:
生活中你會發現 C 類地址包含最大主機數有點少,而B類又有點大,分配IP無法很好的跟現實網絡需求匹配。
相同的一個網絡下是沒有地址層次的,比如公司用了B類地址,而你的生產、測試、開發三個環節要劃分不同的地址層次。這無法實現。
既然IP分類會導致有這么多不便,人們后面提出了無分類地址的方案,該方案會將32 比特的 IP 地址劃分為兩部分,前面是網絡號,后面是主機號。
比如 10.100.34.33/24,這種地址表示形式就是 CIDR,/24 表示前 24 位是網絡號,剩余的 8 位是主機號。此時具有如下信息:
子網掩碼:255.255.255.0
網絡號:10.100.34.0
可用地址范圍:10.100.34.0 ~ 10.100.34.255
廣播地址:10.100.34.255
4.1.5 私網IP、公網IP
內網跟外網私網IP:一般是在局域網內使用,不同局域網可能有相同的私網IP地址。在電腦想訪問外網上網時,必須使用公網,私網是不被允許的。
公網IP:公網IP世界只有一個,訪問互聯網需要公網IP作為身份的標識,公網 IP 是由 Inter NIC因特網信息中心負責。這些 IP 地址分配給注冊并向Inter NIC提出申請的組織機構。通過它直接訪問因特網。
4.2 IP層 + ?MAC層 基礎信息
4.2.1 ARP、RARP
經過TCP處理數據后,接下來就會通過主機的路由表或路由器的路由表來確定 IP 數據包下一跳到哪兒。這里需注意,數據傳輸的最底層是鏈路層,鏈路層是根據MAC地址傳輸的,所以問題變成了如何通過目標IP獲得下一跳的MAC地址。
Address Resolution Protocol?協議是地址解析協議,ARP是通過解析IP地址得到 MAC 地址,ARP協議的主要工作就是建立、查詢、更新、刪除ARP表項。
ARP 協議引入了 ARP 緩存表的概念,每臺主機或路由器在維護著一個ARP緩存表,這個表包含IP地址到MAC地址的映射關系,表中記錄了對,稱之為ARP表項,ARP表項里的數據一般都是含有TTL屬性的,默認10分鐘。可通過arp -a查看服務器ARP緩存表信息。
ARP 的工作流程:
主機會通過廣播發送 ARP 請求包,該包中包含了想要知道的 MAC 地址的主機 IP 地址。
同一局域網內的所有主機都會接收到這個請求,如果目標IP地址與接收到ARP請求的主機自身IP地址吻合就會返回一個ARP應答,告訴目標MAC地址,接著把數據傳送過去。
如果目標IP跟起始IP不在同一局域網內, 會跳躍到路由器,先查詢路由表,找到目標MAC則返回,找不到則路由器會接著往下跳,每跳一次就會請求MAC地址,然后將數據發送到目標MAC地址的主機上。就這樣通過跳一跳的方式最終把數據發送到目標機器。
操作系統通常會把第一次通過 ARP 獲取的 MAC 地址緩存起來,以便下次直接從緩存中找到對應 IP 地址的 MAC 地址。
同時你會發現在整個數據傳輸期間,源 IP 和目標 IP 始終是不變的,一直變化的是 MAC 地址,因為鏈路層需要 MAC 地址在以太網內進行兩個設備之間的包傳輸。
RARP的功能正好跟ARP相反,它是已知 MAC 地址求 IP 地址。比如打印機等小設備會通過MAC 獲得IP地址,RARP的工作流程大致如下:
主機發送一個本地的RARP廣播,能夠到達局域網上的所有設備,在此廣播包中,聲明自己的MAC地址并且請求任何收到此請求的RARP服務器分配一個IP地址。
本地網段上的RARP服務器收到此請求后,檢查其RARP列表,查找該MAC地址對應的IP地址;
如果存在,RARP服務器就給源主機發送一個響應數據包并將此IP地址提供給對方主機使用。如果不存在,RARP服務器對此不做任何的響應。
源主機收到從RARP服務器的響應信息,就利用得到的IP地址進行通訊,如果一直沒有收到RARP服務器的響應信息,表示初始化失敗。
4.2.1 網卡 MAC
ARP要找MAC,而MAC是在網卡上的。Network Interface Card 網卡工作在鏈路層組件,是局域網中連接計算機和傳輸介質的接口,網線插到網卡上,網卡插在電腦的主板上。起到連接你上網的作用。
網卡上的重要組成單元MAC, Media Access Control 地址是6字節數據燒錄在網卡上的,MAC地址跟人的身份證號一樣具有全球唯一性。網卡上面還裝有處理器和存儲器,包括RAM和ROM,網卡具有如下作用:
數據的封裝跟解封。
鏈路管理,自動處理錯誤幀數據。
編碼與譯碼,數據加工發到網絡,接受網絡數據解析。
IP層拿到MAC地址后,接下來需要網卡將數字信號轉換為電信號,網卡一般通過網卡驅動程序工作。這里大致說下網卡工作流程:
網卡從IP層拿到數據后會復制數據到網卡緩存區。
在數據頭部添加報頭跟起始幀分界符用來表示包的起始位置,尾部添加用于檢測包是否有損壞的幀校驗序列。
最后網卡將最終的電信號發出。
4.2.3 IP 跟 MAC 關系
數據傳輸真實流程主機H1網絡層數據報通過ARP協議將數據交給數據鏈路層的MAC1,然后數據被封裝成幀發送到MAC2,
路由器R1通過MAC2收到MAC幀后,向網絡層傳輸并且解封去掉MAC幀的首部,獲得干凈數據,然后再通過MAC2發送到MAC3,
路由器R2通過MAC3收到MAC幀后,向網絡層傳輸并且解封去掉MAC幀的首部,獲得干凈數據,然后再通過MAC3發送到MAC4,
然后目標路由器收到信息包后不斷拆解,最終把數據發送到H2。
發送時數據從高層下到底層然后才到通信鏈路上傳輸,使用IP地址的IP數據報一旦交給數據鏈路層就加上MAC地址封裝成MAC幀,在實際的傳送過程中,使用的源地址和目的地址都是MAC地址。
有人可能問既然MAC有唯一性,為什么不直接用MAC要用IP呢?Mac地址種類繁多,海量分布。IP地址就像是門牌號,Mac地址就像身份證號。如果只知道身份證號就只能在全世界查找,如果知道 IP地址,那就跟知道了這個人在世界上詳細地址一樣,逐層追蹤即可,查找起來會快很多。
IP層屏蔽了下層很復雜的細節,讓用戶在抽象的網絡層上討論問題,讓用戶使用統一的、抽象的 IP 地址研究主機和主機或主機和路由器之間的通信。通俗一點來說就是有了IP地址,就只通過路由器找到目的主機,屏蔽了下層網絡的異構型,由MAC地址完成下層的實際轉發。
4.2.4 網關、貓
網關作用網關
從一個房間走到另一個房間,必然要經過一扇門。同樣從一個網絡向另一個網絡發送信息,也必須經過一道關口,網關顧名思義 是一個網絡連接到另一個網絡的關口,也就是網絡關卡。
網關 Gateway 這個概念是邏輯層面的,網關一個大概念,不具體特指一類產品,只要連接兩個不同的網絡的設備都可以叫網關,可以是局域網也可以是廣域網。
網關實質上是一個網絡通向其他網絡的IP地址,不同網段通過網關通信。
調制解調器
是一種計算機硬件 ,俗稱貓,它的作用是將電腦想要發送的信息數字信號轉換成網線中的電流脈沖模擬信號從而使信息在網線中傳輸。一般在早期通過電話線上完時候需要用到貓, 最大速度一般不超過56kps,現在幾乎很少使用了。
4.2.5 交換機、集線器
數據經過網卡操作到達交換機Switch,交換機工作在 MAC 層,也被為二層網絡設備。
作用:交換機是用來連接多個終端(電腦、手機、打印機),然后幫各個終端來轉發數據的,適合局域網內互聯。
原理:交換機的轉發原理是記錄下每個終端的 MAC 地址,以及這個 MAC 地址對應哪個接口。然后信息來的時候查表導航即可。這里需注意交換機是沒有MAC地址的。
如果查找MAC地址表發現找不到所需信息,此時交換機會以廣播的形式把包轉發到除源端口外的所有端口上,然后目標端口會自動接收數據,非目標自動屏蔽垃圾數據。這里需注意有個特殊的MAC跟IP地址屬于廣播地址。以下兩個屬于廣播地址:
MAC = ?FF:FF:FF:FF:FF:FF
IP = 255.255.255.255
集線器 hub:
一個口收到的信號,原封不動的發送給所有其他的口,由其他的口上的設備自己決定是否接收信號。有點類似廣播,但是比廣播更純粹。
4.2.6 路由器
數據經過交換機如果發現要訪問的IP不在局域網內就要找路由器了,路由器 Router 一般特指能夠實現路由尋找和轉發的特定類產品,路由器很顯然能夠實現網關的功能。一般說來,路由器作為不同網絡之間互相連接的樞紐,路由器系統構成了基于TCP/IP 的國際互聯網絡Internet 的主體脈絡,也可以說,路由器構成了Internet的骨架。
路由器根據接收到數據包中的網絡層地址以及路由器內部維護的路由表決定輸出端口以及下一跳地址,并且重寫鏈路層數據包頭實現轉發數據包,路由器一般提供如下功能:
網絡互連:實現不同網絡互相通信。
路徑選擇:為經過路由器的每個數據幀尋找一條最佳傳輸路徑進行傳輸。
數據處理:提供分組過濾轉發、優先級、防火墻等功能。
網絡管理:提供配置管理、性能管理、流量控制等功能。
路由器做了2個普通交換機做不了的事:
不同網段互連:每個主機有自己的ip地址,ip地址又是分網段的,要實現不同網段的互連,必須用到路由器。各地的玩家,ip地址一定是不同網段的。
網絡地址轉換:主機在企業內部或者網吧內部,使用的都是私網ip地址,私網ip地址無法進入互聯網,想進入互聯網,必須轉成公網ip。ip地址的轉換也是由路由器來做的。
路由器是基于IP設計的,俗稱三層網絡設備,路由器的每個端口都有MAC地址跟IP地址,路由器會檢查數據幀目標地址字段中的數據鏈路標識。如果它包含了路由器接口標識符或廣播標識符,那么路由器將從幀中剝離出數據包并傳遞給網絡層。
當路由器收到電信號后也會轉化為數字信號然后進行FCS校驗,如果發現發送方的MAC地址是給自己的則接受該幀,否則丟失該幀。
根據目標IP及Routing Table 路由表決定信息如何轉發。路由表中保存著子網的標志信息、網上路由器的個數和下一個路由器的名字等內容。路徑表可以是由系統管理員固定設置好的,也可以由系統動態修改,可以由路由器自動調整,也可以由主機控制。Linux服務器一般用 route -n ?查詢系統當前路由表。
路由規則desc IP 逐個跟路由表中每行的Netmask按位與運算,獲的目標IP,看跟哪一行的Destination相等。
找到目標行,利用Gateway及對應網卡Iface進行。
Gateway 不為空:說明仍然需要利用Gateway繼續上面的路由傳輸。
Gateway 為空 :說明找到 IP 包頭里的目標地址了,到達終點。
進行ARP請求,先從路由緩存嘗試轉換,然后再發送ARP請求。進行頭部MAC地址的替換。
進行數字信號到電信號的轉換,然后將數據發出。
經過交換機到達下個路由器,周而復始,直到到達目標地址。
最后一行Destination和Netmask都是 0.0.0.0,表示是默認網關,如果其他所有條目都無法匹配,就會自動匹配這一行。并且后續就把包發給Gateway。
4.2.7 DHCP
Dynamic Host Configuration Protocol 動態主機配置協議是一個局域網的網絡協議,這是一個應用層協議。當我們將客戶主機ip地址設置為動態獲取方式時,DHCP服務器就會根據DHCP協議給客戶端分配IP,不用用戶自己去設置 IP地址 跟 子網掩碼,然后客戶機能夠利用這個IP上網。
簡單說下DHCP交互流程:
因為客戶端沒有IP地址,所以全程使用UDP廣播的形式發送 DHCP Discover包。
服務器收到后會返回 DHCP Offer包,比如IP地址、子網掩碼、默認網關、IP地址租期等。
客戶端從眾多回復信息中選一個進行配置,向選中的服務器發送 DHCP Request包請求分配IP。
服務器收到Request包后,用DHCP ACK 報文對請求報文進行響應,應答所要求的參數。
這里需注意UDP廣播只在局域網,那難道一個局域網就要有個 DHCP服務器嗎?系統為此引入了DHCP中繼代理,對不同網段的IP地址分配也可以由一個 DHCP 服務器統一進行管理。
DHCP 通常被應用在大型的局域網絡環境中,主要作用是集中的管理、分配IP地址,使網絡環境中的主機動態的獲得IP地址、Gateway地址、DNS服務器地址等信息,并能夠提升地址的使用率。
4.2.8 NAT
NAT私網IP的服務器想要上網的時候需要轉換成公網IP才能跟外界通訊,而 ?Network Address Translation 網絡地址轉換 就是負責干這事的。但需注意 NAT只是實現了IP轉換,所以還是沒有解決IPv4擴容的問題。NAPT 可以實現 IP 地址 + 端口一起進行轉換。這就可以實現不同電腦公用一個公網IP,這種轉換技術叫 網絡地址與端口轉換 。
這個轉換用到的是 NAPT 路由器的轉換表,現在路由器上一般會自動生成跟維護這個表。
缺點:
通信過程中NAT路由器重啟,則TCP連接要重置。
NAT表的生產跟轉換都需生成跟維護的。
公網的IP無法主動跟NAT內部服務器建立連接,因為NAPT表沒記錄。
解決方法:
NAT穿透技術:該技術可以讓網絡程序主動發現自己位于NAT設備上,主動獲得NAT設備公網IP,然后建立NAPT表。
上IPv6:128位二進制絕對夠地球上的終端使用。
4.2.9 ICMP
Internet Control Message Protocol互聯網控制報文協議 。它是TCP/IP協議簇的一個子協議,用于在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。日常你 ping 網絡通不通底層基礎就是ICMP。
ICMP提供一致易懂的出錯報告信息。發送的出錯報文返回到發送原數據的設備,發送設備隨后可根據ICMP報文確定發生錯誤的類型,并確定如何才能更好地重發失敗的數據包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由發送方完成。
ICMP 一般分為兩類:
查詢報文類型:用于診斷的查詢消息。
差錯報文類型:通知出錯原因的錯誤消息。
IPv4 中 ICMP 僅作為一個輔助作用支持 IPv4。也就是說,在 IPv4 時期,即使沒有 ICMP,仍然可以實現 IP 通信。然而,在 IPv6 中,ICMP 的作用被擴大,如果沒有 ICMPv6,IPv6 就無法進行正常通信。
4.3 IP層解析
4.3.1 IP 頭含義
其實經過上面IP層跟鏈路層必備知識的講解,大家再看數據從TCP到IP層就簡單多了,這里我們以IPv4大致說下網絡層核心IP頭字段的含義。
版本號:4位 version 指定IP協議的版本。對IPv4來說,其值是4。其他IPv4協議的擴展版本(如SIP協議和PIP協議),則具有不同的版本號(它們的頭部結構也和圖2-1不同)。
頭部長度:4位 header length 標識該IP頭部有多少個32bit字(4字節)。因為4位最大能表示15,所以IP頭部最長是60字節。
服務類型:8位 Type Of Service,包括一個3位的優先權字段(現在已經被忽略),4位的TOS字段和1位保留字段(必須置0)。4位的TOS字段分別表示:最小延 時,最大吞吐量,最高可靠性和最小費用。其中最多有一個能置為1,應用程序應該根據實際需要來設置它。比如像ssh和telnet這樣的登錄程序需要的是 最小延時的服務,而文件傳輸程序ftp則需要最大吞吐量的服務。
總長度:16位 total length 是指整個IP數據報的長度,以字節為單位,因此IP數據報的最大長度為65535(2^16-1)字節。但由于MTU的限制,長度超過 MTU 的數據報都將被分片傳輸,所以實際傳輸的IP數據報(或分片)的長度都遠遠沒有達到最大值。接下來的3個字段則描述了如何實現分片。
標識:16位 identification 唯一地標識主機發送的每一個數據報。其初始值由系統隨機生成;每發送一個數據報,其值就加1。該值在數據報分片時被復制到每個分片中,因此同一個數據報的所有分片都具有相同的標識值。
標志字段:3位的第一位保留。第二位(Don’t Fragment,DF)表示禁止分片。如果設置了這個位,IP模塊將不對數據報進行分片。在這種情況下,如果IP數據報長度超過MTU的話,IP模塊將丟棄該數據報并返回一個ICMP差錯報文。第三位(More Fragment,MF)表示更多分片。除了數據報的最后一個分片外,其他分片都要把它置1。
分片偏移:13位 fragmentation offset 是分片相對原始IP數據報開始處(僅指數據部分)的偏移。實際的偏移值是該值左移3位(乘8)后得到的。由于這個原因,除了最后一個IP分片外,每個IP分片的數據部分的長度必須是8的整數倍(這樣才能保證后面的IP分片擁有一個合適的偏移值)。
生存時間:8位 Time To Live 是數據報到達目的地之前允許經過的路由器跳數。TTL值被發送端設置(常見的值是64)。數據報在轉發過程中每經過一個路由,該值就被路由器減 1。當TTL值減為 0 時,路由器將丟棄數據報,并向源端發送一個ICMP差錯報文。TTL值可以防止數據報陷入路由循環。
協議:8位 protocol 用來區分上層協議,我們在第1章討論過。/etc/protocols文件定義了所有上層協議對應的protocol 字段的數值。其中,ICMP是1,TCP是6,UDP是17。/etc/protocols文件是RFC 1700的一個子集。
頭部校驗和:16位 header checksum 由發送端填充,接收端對其使用CRC算法以檢驗IP數據報頭部(注意,僅檢驗頭部)在傳輸過程中是否損壞。
源端IP地址和目的端IP地址:32位 用來標識數據報的發送端和接收端。一般情況下,這兩個地址在整個數據報的傳遞過程中保持不變,而不論它中間經過多少個中轉路由器。
選項字段:option 是可變長的可選信息。這部分最多包含40字節,因為IP頭部最長是60字節(其中還包含前面討論的20字節的固定部分)。可用的IP選項包括
記錄路由:record route 告訴數據報途經的所有路由器都將自己的IP地址填入IP頭部的選項部分,這樣我們就可以跟蹤數據報的傳遞路徑。
時間戳:timestamp 告訴每個路由器都將數據報被轉發的時間(或時間與IP地址對)填入IP頭部的選項部分,這樣就可以測量途經路由之間數據報傳輸的時間。
松散源路由選擇:loose source routing 指定一個路由器IP地址列表,數據報發送過程中必須經過其中所有的路由器。
嚴格源路由選擇:strict source routing 和松散源路由選擇類似,不過數據報只能經過被指定的路由器。
4.3.2 ?IPv6
IPv4 的地址是 32 位的,大約可以提供 42 億個地址,但是在 2011 年 IPv4 地址就已經被分配完了。于是又提出了IPv6, IPv6 的地址是 128 位, IPv6 相比于 IPv4 能帶來更好的網絡體驗。
IPv6地址長度是128位,每16位算一組,組跟組之間用 :分割,如果出現連續的 0 時還可以將這些 0 省略,并用兩個冒號 ::隔開。但是一個 IP 地址中只允許出現一次兩個連續的冒號。
版本:和IPv4 一樣,由4比特構成。IPv6其版本號為6,因此在這個字段上的值為6。
通信量類:相當于IPv4的TOS(Type Of Service)字段,也由8比特構成。有TOS在IPv4中幾乎沒有什么建樹,未能成為卓有成效的技術,本來計劃在IPv6中刪掉這個字段,不過出于今后研究的考慮還是保留了該字段。
流標號:由20比特構成,準備用于服務質量控制。
有效荷載長度:有效荷載長度是指包的數據部分。IPv4的TL(Total Length)是指包含首部在內的所有長度。然而IPv6中的這個Playload Length不包括首部,只表示數據部分的長度。
下一個首部:相當于IPv4中的協議字段。由8比特構成。通常表示IP的上一層協議是TCP或UDP。不過在有IPv6擴展首部的情況下,該字段表示后面第一個擴展首部的協議類。
跳數限制:由8比特構成。與IPv4中的TTL意思相同。為了強調可通過路由器個數這個概念,才將名字改為Hop Limit。數據每經過一次路由器就減1,減到0則丟棄數據。
源地址:由128比特構成,表示發送端IP地址。
目標地址:由128比特構成,表示接收端IP地址。
IPv6擴展首部:IPv6的首部長度對固定,無法將可選項將入其中,可通過擴展首部對功能進行了有效擴展。擴展首部通常介于IPv6首部與TCP/UDP首部中間。在IPv4中可選項長度固定為40字節,IPv6的擴展首部可以是任意長度。擴展首部當中還可以包含擴展首部協議以及下一個擴展首部字段。
IPv6改進:
取消了首部校驗字段:因為在傳輸層跟鏈路層都有校驗。
取消可選字段,IPv6首部固定40字節。
取消了分片跟重組;IPv4時數據按幀傳輸,中間會經過拆分跟組合,而IPv6版本只允許在源主機跟目標主機拆分重組,中間不允許了,對傳播速度進行了提速。
按理來說IPv6那么牛應該馬上投入使用替換IPv4,但是因為 IPv4 和 IPv6 不能相互兼容,所以不但要我們電腦、手機之類的設備支持,還需要網絡運營商對現有的設備進行升級,所以目前 IPv6 普及率比較慢。
5 鏈路層 MAC
其實上面已經講解到很多關于鏈路層的設備了,比如網卡、路由器等等。
接收方的MAC地址:全球唯一,6字節。
發送方的MAC地址:全球唯一,6字節。
協議類型:2個字節,大部分的類型是 IP 數據包,然后 IP 里面包含 TCP、UDP,以及 HTTP 等,類型0800 = IP 數據報,類型0806 = ARP請求跟應答。
真正的數據層:一般 46~1500 字節。
CRC校驗:循環冗余檢測。通過 XOR 異或的算法,來計算整個包是否在發送的過程中出現了錯誤。
這里重要說一遍,上圖中從上到下是以此包含的關系!
5.1 鏈路層主要功能
5.1.1 并發性解決
鏈路層主要解決的就是當出現并發的時候,如何解決先后順序跟 數據混亂問題。
分多個車道。每個車一個車道,這在計算機網絡里叫作信道劃分。
今天單號出行,明天雙號出行,輪著來。這在計算機網絡里叫作輪流協議。
不管三七二十一,有事兒先出門,發現特堵,就回去。錯過高峰再出。我們叫作隨機接入協議。著名的以太網用的就是這個方式。
5.1.2 數據發送穩健性
這個包是發給誰的?誰應該接收?發送時出錯咋辦?這里的解決辦法是用一個物理地址,叫作鏈路層地址,也常被稱作 MAC 地址。
5.2 鏈路層服務
數據鏈路層最基本的服務是將源計算機網絡層來的數據可靠的傳輸到相鄰節點的目標計算機的網絡層,為達到這一目的,數據鏈路層必須具備一系列相應的功能:
將數據封裝為frame幀,幀是數據鏈路層的傳送單位。
控制幀的傳輸,包括處理傳輸差錯,調節發送速率與接收方相匹配。
在兩個網絡實體之間提供數據鏈路通路的建立、維持和釋放的管理。
上述這些功能具體表現在以下幾個方面。
5.3 封裝成幀
為向網絡層提供服務,數據鏈路層必須使用物理層提供的服務。而物理層是以比特流進行傳輸的,這時數據鏈路層為了能實現數據有效的差錯控制,就采用了一種幀的數據塊進行傳輸。在一段數據的前后分別添加首部和尾部,這樣就構成了一個幀。接收端在收到物理層上交的比特流后,就能根據首部和尾部的標記,從收到的比特流中識別幀的開始和結束。
采用幀傳輸方式的好處是在發現有數據傳送錯誤時,只需將有差錯的幀再次傳送,而不需要將全部數據的比特流進行重傳,這就在傳送效率上將大大提高。
幀同步需解決問題
如何識別幀的開始與結束,這需要特殊的幀首部跟幀尾部來分割。
重傳的數據幀識別,接收方在接收到重傳的數據幀時是識別成新的數據幀,還是識別成已傳幀的重傳幀呢?這就要靠數據鏈路層的各種幀同步技術來識別了。幀同步技術既可使接收方能從以上并不是完全有序的比特流中準確地區分出每一幀的開始和結束,同時還可識別重傳幀。
5.4 透明傳輸
由于幀的開始和結束的標記是使用專門指明的控制字符,因此傳輸的數據中的任何8比特的組合一定不允許和用作幀定界的控制字符的比特編碼一樣,否則就會出現幀定界的錯誤。
當傳送的幀使用從鍵盤上輸入文本文件組成的幀時,其數據部分顯然不會出現像SOH或EOT這樣的幀定界控制字符。可見不管從鍵盤上輸入什么字符都可以放在這樣的幀中傳輸過去,因此這樣的傳輸就是透明傳輸。
非透明傳輸問題是如果你傳輸的不是從鍵盤輸入的,是二進制代碼的計算機程序或圖像,如果是中間存在EOT則會導致錯誤。解決辦法就是在數據部分如果碰到了EOT或SOH 就添加個ESC轉移字符。填充ESC后幀
5.5 差錯檢測
底層數據傳輸時候出現差錯,主要分為兩大類:
比特差錯:就是比特在傳輸過程中可能會產生差錯,即1可能會變成0,0可能會變成1。
幀丟失、幀重復、幀失序:比如發送的是123,接收到了13、1223、132這樣的順序包。
數據傳輸過程中的衡量指標就是誤碼率Bit Error Rate:就是在一段時間內,傳輸錯誤的比特占所傳輸比特總數的比率。
實際的通信鏈路并非理想的,它不可能使誤碼率下降到零。所以為了保證數據傳輸的可靠性,在計算機網絡傳輸數據時,必須采用各種檢測措施,目前在數據鏈路層廣泛使用了循環冗余檢驗CRC(Cyclic Redundancy Check)的檢測技術。
6 數據傳輸的故事
HTTP講解+ TCP講解 + 本文IP講解 + 鏈路層講解 = 一個數據包的流浪日記,如果純技術性文章感覺太枯燥,接下來我們以一個不太嚴謹的生活舉例,將知識點串聯下:
你叫小S,跟很多小伙伴住在一個小區里,當你想跟小伙伴玩耍的時候就喊一喊(集線器),大家都聽到后,想玩的下來陪你玩。不想跟你玩的人感覺聽到噪音很煩躁,就讓李大爺在傳達室充當交換機,你想跟院子里人玩的時候,跟交換機李大爺說下,李大爺會告知你要找的小伙伴信息。
后來你被限足了,不允許出小區大門。此時你想跟外界小C交流,你把信息發給李大爺,李大爺看到想跟外面通訊。就讓你按照外面統一通信的方式(TCP/IP)把信息寫好,你發現信封收件地址寫的小W收,這地址放到外面沒法派送啊!你找小L問下真實地址,小L拿出了姓名-地址映射薄(DNS)查詢后告訴了你小C真實地址,然后李大爺叫來了專門負責這個小區快遞的快遞員(路由器),這里需注意小區對外只暴露一個公共的地址(公網IP),但是小區不能只有一個人啊!小區里面被分成了N個房間(私網IP),因為小區里N個住戶可能會調換房間,所以每當想對外通訊的時候,快遞員路由器會給你動態的分配個內網IP,并且快遞員牛逼之處在于即使兩個住戶用相同的方式(端口)把信息發出去快遞員也會自動給你重新分配不一樣的端口,這叫NAT技術。
快遞員路由器把你的信息通過順豐/韻達(貓)方式把信息由數字信號變為脈沖信號再發出去,信息不是直達小C小區的哦!就跟你的深圳快遞發送到北京可能經過多個中轉,雖然你的發件人收件人地址固定死了,但中間可能經過各種路由各種中轉,這里其實就用到了ARP包跟根據MAC地址轉發,提供路由功能是因為快遞員有個小本(路由表)記錄著下一站地址, 反正最終信息會到達小C小區的傳達室,傳達室王大爺在鎮守,王大爺會按照相同的方法把信息最終發到小C手里。
你還有個朋友小A,他住的小區由孫大爺看門,因為小A的院子剛蓋好,孫大爺剛來不久,孫大爺沒有李大爺跟王大爺辦公室的電話,李大爺跟王大爺也沒有孫大爺的的電話,這時會有兩種情況:
居委會趙大媽告訴了孫大爺關于李、王兩位大爺的地址,同時趙大媽也告訴了李、王關于孫的地址,這就叫靜態設定路由。
趙大媽病了,孫大爺自己到處發信息,見人就說自己是我是小A他們院子管收發信件的,結果被李、王二位大爺聽到了,就記在了他們的通訊錄(路由表)上,然后李、王就給孫大爺回了個信息說自己是那個院子負責收發信息的,這叫動態設定路由。
有天小S要找小A,小S給李大爺說需求,孫大爺通過通訊錄(路由表)查詢到小A院子孫大爺管著呢,此時目標是找孫大爺,不過有兩種途徑
李大爺直接去找孫大爺。
李大爺找王大爺,讓王大爺去找孫大爺。
李大爺選擇 1 還是 2 這叫做路由選擇。李大爺當然選擇 1 了,因為他遵循最少步驟原則。
前幾天小S和小C吵架了,恰好這些天小S老是給小A打電話,小C心想小S是不是在說我人品不行啊,于是小C決定偷聽小S和小A的通話,但是他又不能出院子,怎么辦呢?小C做了這樣一個決定:首先小C告訴王大爺說 “你給李大爺打電話說小A搬到咱們院子了,以后凡是打給他的電話我來接”,王大爺迷迷糊糊就給李大爺打了電話,說:“現在我來管理小A,孫大爺不管了”,結果李大爺就把他的通訊錄改了,這叫做路由欺騙。
以后小S再找小A,李大爺就轉給王大爺了,王大爺收到了這個信息就轉給了小C,小C收到這個信息就假裝小A和小S通信。因為小C作賊心虛,害怕明天小S和小A見面后當面問他,小C又自己以小S的名義給小A通了個復述了一遍剛才通訊信息,有這就叫數據竊聽。
再后來,小S還是不斷的和小A聯系,小C心里嘀咕 “你小S不是不給我打電話嗎!那我讓你也給小A打不了!
小C聯系了一批狐朋狗友,和他們串通好,每天固定一個時間大家一起給小A院子傳達室發信息,只要傳達室的孫大爺開始接收,就會聽到“打雷啦,下雨收衣服啊!”、“人是人他媽生的,妖是妖他媽生的”、“你媽貴姓”等等,聽的腦袋都大了,不聽又不行,電話不停的響啊!
終于有一天,孫大爺忍不住了,大喊一聲:“我受不了拉!!!!”,于是上吊自殺了!
這就是最簡單的DDOS攻擊,孫大爺心理承受能力弱的現象叫做數據報處理模塊有BUG,孫大爺的自殺叫做路由器癱瘓。
如果孫大爺身體健壯可以應付這些垃圾信息,這叫健壯的數據報處理,能夠抵御任何攻擊。孫大爺癱了之后,小S終于不再給小A打電話了,因為無論他無論如何發信息,對方都是拒絕服務,所以小C的做法還有一個名字叫做拒絕服務攻擊。
新人小B入住幾天后,小C的院子來了一個美麗的女孩,名字叫做小B,小C很喜歡她,可是小B有個很帥的男朋友,小C干瞪眼沒辦法。同時小B是不能出院子的。那個男的想追小B自然只能發信息,于是小C又蠢蠢欲動了。小C了解到王大爺之所以能管理電話是因為他有一個通訊錄,因為同一個院子可能有2個孩子都叫小C,靠名字無法區分,所以通訊錄上每一行只有兩項:門牌(MAC)電話(IP) 一號門?1234567?(一號門里面是小C) 二號門?7654321?(二號門里面是小B)
每次發信息人家都要說出要找的電話號碼(IP),然后通過通訊錄去院子里面敲門,比如人家說我找1234567,王大爺就去敲一號門收信息,如果是找7654321,那他就找二號門收信息。這里的電話號碼就是傳說中的IP地址。這里的門牌號就是傳說中的網卡的MAC地址,每一塊網卡的 MAC 地址都是不一樣的,這是網卡的制造商寫死在網卡的芯片中的。
小C為了泡妞打起了王大爺通訊錄的主意,小C趁王大爺去上廁所時,偷偷的摸進傳達室,小心翼翼的改了王大爺的通訊錄。過了幾天,小B的男朋友又給小B來了信息,對方報的是 7654321,王大爺一看通訊錄:
門牌(MAC)電話(IP) 一號門?1234567?(一號門里面是小C) 一號門?7654321?(被修改成映射到一號門)王大爺不知道改了啊,于是就去找一號門的小C了,小C以小B父親的口吻嚴厲的教訓了那個男的和小B之間不正當的男女關系,并責令小B男朋友立馬跟小B分手。這里小C的行為叫做ARP欺騙,因為在實際的網絡上是通過發送ARP數據包來實現的,所以叫做ARP欺騙。
這里要注意,王大爺現在有兩個通訊錄了,一個是記錄每個院子傳達室電話的本本,叫做路由表,一個是現在說的記錄院子里面詳細信息的本本,叫做ARP表,王大爺為了保證安全可以把表藏起來,這就對應程序加密解密。
王大爺的員工手冊中有一條是這么寫的每個月要重新檢查一下門牌號和電話的對應本,也就是ARP表,這個動作叫做刷新ARP表,每個月的時間限制叫做刷新ARP表的周期。這樣小C為了讓那個男的永遠不能找到小B,之后每個月都要偷偷改一次那個通訊錄,不過這樣也是不得不做的事啊!
補充一點,小C是很聰明的,如果通訊錄(ARP表)被改成了這樣:
門牌(MAC)電話(IP) 一號門?1234567?(這個是小C的) 二號門 1234567 (注意:這個被小C改了,但是他一時頭暈改錯了)計算機就會彈出一個對話框提示出現重復的IP地址,最終會導致王大爺不知所措,于是通知一號門和二號門,你們的電話重復了。這樣小B就知道有人在破壞她的好事,這個現象叫做騙局被揭穿了。
當然小S為了防止自己通話被人竊聽,也可以對通話內容進行加密,這部分細節在 HTTP 中講到了
總結
以上是生活随笔為你收集整理的TCP/IP高频考点之一个数据包的流浪日记的全部內容,希望文章能夠幫你解決所遇到的問題。