目錄
數(shù)據(jù)鏈路層
認(rèn)識以太網(wǎng)
局域網(wǎng)轉(zhuǎn)發(fā)的原理
認(rèn)識以太網(wǎng)的MAC報頭
以太網(wǎng)幀格式
認(rèn)識MAC地址
對比理解MAC地址和IP地址
基于MAC幀協(xié)議再次談一談局域網(wǎng)轉(zhuǎn)發(fā)的原理
認(rèn)識MTU
MTU對IP協(xié)議的影響
MTU對UDP協(xié)議的影響
MTU對于TCP協(xié)議的影響
ARP協(xié)議
ARP協(xié)議的作用
ARP數(shù)據(jù)報的格式
ARP協(xié)議的工作流程
其他重要協(xié)議或技術(shù)(簡單了解)
DNS(Domain Name System)
DNS背景
域名簡介
ICMP協(xié)議
ICMP功能
?ICMP的報文格式(了解)
ping命令?
traceroute命令
NAT技術(shù)
NAT技術(shù)背景
NAT IP轉(zhuǎn)換過程
NAPT
NAT技術(shù)的缺陷
NAT和代理服務(wù)器
?
數(shù)據(jù)鏈路層
用于兩個設(shè)備(同一種數(shù)據(jù)鏈路節(jié)點)之間進行傳遞。
認(rèn)識以太網(wǎng)
????????上一篇文章里講了網(wǎng)絡(luò)層IP協(xié)議,知道了IP數(shù)據(jù)包通過路由器轉(zhuǎn)發(fā)可以一跳一跳的到目標(biāo)主機,但是實際在網(wǎng)絡(luò)中“跑”的并不是IP數(shù)據(jù)包,而是MAC幀協(xié)議封裝的數(shù)據(jù)包。
????????要想將數(shù)據(jù)包從主機A跨網(wǎng)絡(luò)發(fā)送給主機B,首先主機A要將數(shù)據(jù)包發(fā)送給離它最近的那個路由器,這個路由器要和主機A處在同一個子網(wǎng)內(nèi),然后通過路徑選擇、路由器轉(zhuǎn)發(fā),最終將數(shù)據(jù)包發(fā)送給主機B。而跨網(wǎng)絡(luò)傳輸?shù)谋举|(zhì)是由無數(shù)個局域網(wǎng)(子網(wǎng))轉(zhuǎn)發(fā)的結(jié)果。要徹底理解跨網(wǎng)絡(luò)轉(zhuǎn)發(fā),首先要理解局域網(wǎng)中報文的轉(zhuǎn)發(fā)原理。
局域網(wǎng)轉(zhuǎn)發(fā)的原理
問個問題:在同一個局域網(wǎng)的主機能不能直接通信?當(dāng)然可以!
舉個例子:就好比老師上課時,叫某一個同學(xué)的名字,并問他為什么作業(yè)沒做?此時處在教室的其他同學(xué)也是可以聽到老師說話的,然后那個同學(xué)對老師說:老師我做了只不過還沒有上交,此時其他同學(xué)依舊可以聽到消息,在局域網(wǎng)中也是一樣的,只不過其他主機辨識到該消息并不是給自己發(fā)的,所以丟棄了。通過上面的例子我們知道,每臺主機都要有唯一標(biāo)識符。
認(rèn)識以太網(wǎng)的MAC報頭
????????IP報文封裝好以后還需要繼續(xù)向下交付給數(shù)據(jù)鏈路層,而數(shù)據(jù)鏈路層要繼續(xù)對數(shù)據(jù)包進行封裝,接下來讓我們一起認(rèn)識MAC報頭格式。
以太網(wǎng)幀格式
- 源地址和目的地址是指網(wǎng)卡的硬件地址(也叫MAC地址), 長度是48位,是在網(wǎng)卡出廠時固化的;
- 幀協(xié)議類型字段有三種值,分別對應(yīng)IP、ARP、RARP;
- 幀末尾是CRC校驗碼。
這里還是那兩個問題,如何分離?如何分用?
- 分離非常簡單,這里的報頭采用的是定長的策略,拿到一個報文,先按固定長度把報頭分離出來。
- 如何向上交付呢?報頭里有個字段是幀協(xié)議類型,通過這個字段可以知道這個分離出來的有效載荷要交付給上層哪個協(xié)議。
- 目的地址就是對方主機的MAC地址,原地址就是自己主機的MAC地址。
認(rèn)識MAC地址
????????MAC地址用來識別數(shù)據(jù)鏈路層中相連的節(jié)點,長度為48位,及6個字節(jié), 一般用16進制數(shù)字加上冒號的形式來表示(例如: 08:00:27:03:fb:19)。在網(wǎng)卡出廠時就確定了,不能修改, MAC地址通常是唯一的(虛擬機中的MAC地址不是真實的MAC地址, 可能會沖突, 也有些網(wǎng)卡支持用戶配置MAC地址)。
對比理解MAC地址和IP地址
IP地址描述的是路途總體的 起點 和 終點;
MAC地址描述的是路途上的每一個區(qū)間的起點和終點。
?
基于MAC幀協(xié)議再次談一談局域網(wǎng)轉(zhuǎn)發(fā)的原理
????????我們現(xiàn)在知道了每個主機都有自己的MAC地址,那么在局域網(wǎng)中發(fā)送數(shù)據(jù)時,封裝好MAC幀報文,再將報文發(fā)送到局域網(wǎng)中,局域網(wǎng)中的每個主機都會將報文拿上來,進行解析,去對比目的地址和自己的地址是否相同,如果不是發(fā)送給自己的就直接丟棄,如果是發(fā)送給自己,那就解析后交付給上層協(xié)議。既然有發(fā)送,那就有回復(fù),回復(fù)也是一樣的,
拓展知識:
在局域網(wǎng)中,網(wǎng)卡有一種模式叫混雜模式,表示不放棄任何一個數(shù)據(jù)幀,直接向上交付,這就是局域網(wǎng)抓包工具的原理。
????????我們的數(shù)據(jù)能被抓到,那么明文傳輸是不安全的(http),所以又產(chǎn)出了新的加密解密的方式以及整數(shù)簽名。這個在前面的文章HTTPS中有講,有興趣可以去看一看。
HTTPS協(xié)議原理_晚風(fēng)不及你的笑427的博客-CSDN博客
????????在局域網(wǎng)中一臺主機可以給另一個主機發(fā)送數(shù)據(jù),但是在同一時刻會不會有其他主機也再向網(wǎng)絡(luò)中發(fā)送數(shù)據(jù)呢?就好比一間教室,老師在向某個同學(xué)提問,同時其他學(xué)生也在下面說話,那么整個教室就會亂糟糟的。所以在局域網(wǎng)中,任何一個時刻,只能有一個主機向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)。
????????那么問題來了,我們怎么知道某個時刻是否有其他主機在發(fā)送消息呢?我們不知道,如果同一個時刻多個數(shù)據(jù)被發(fā)送到網(wǎng)絡(luò)中,就會導(dǎo)致局域網(wǎng)中的數(shù)據(jù)發(fā)生碰撞,發(fā)生碰撞之后數(shù)據(jù)就變成了無效數(shù)據(jù),也就是說如果發(fā)生數(shù)據(jù)碰撞,那個該數(shù)據(jù)會直接被丟棄。那么我們怎么知道數(shù)據(jù)是否發(fā)生碰撞了呢?因為是局域網(wǎng),所以我們發(fā)送的數(shù)據(jù)自己也能收到,如果我們發(fā)現(xiàn)數(shù)據(jù)和之前發(fā)送的對不上,檢驗通不過,我們就知道發(fā)生問題了。而我們把一個局域網(wǎng)稱為一個碰撞域。
? ? ? ? 那我們怎么保證一個時刻只允許一個主機向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)呢?不同的局域網(wǎng)通信標(biāo)準(zhǔn),就有不同的實現(xiàn)方案,1.是令牌環(huán),在局域網(wǎng)中有一部分令牌的數(shù)據(jù),只有持有令牌的主機才能發(fā)送消息,發(fā)送消息后將令牌轉(zhuǎn)到網(wǎng)絡(luò)中帶給下一個人;2.以太網(wǎng),簡單來說就是主機發(fā)送數(shù)據(jù)后檢測到發(fā)生碰撞了,那先不發(fā)了,等一等,這個等的時間根據(jù)情況來定,等過一會再進行重發(fā)策略。這個重發(fā)的策略可不止TCP有數(shù)據(jù)鏈路層也有對應(yīng)的策略,叫主機的碰撞檢測和碰撞避免算法。只要每個主機在MAC幀層都能遵守這個碰撞避免的規(guī)則,那么就能保證一個時刻只有一個主機發(fā)送數(shù)據(jù)。
????????用一個新的視角(系統(tǒng)視角)重新看待局域網(wǎng),因為同一個時刻只有有一個主機發(fā)送消息,局域網(wǎng)就相當(dāng)于是一個臨界資源,那么臨界資源就需要被保護起來,保護的方式有很多,碰撞檢測和碰撞避免就是一種,所以說知識是有關(guān)聯(lián)性的!
- ?局域網(wǎng)能不能很大呢?為什么?
????????不能!因為局域網(wǎng)太大,主機很多,那么任何時刻發(fā)生碰撞的概率就會增加。
????????那如果局域網(wǎng)就是很大怎么辦呢?會在局域網(wǎng)中添加一個交換機,將局域網(wǎng)一分為二,如果左半部分內(nèi)主機想給右半部分的主機發(fā)數(shù)據(jù),交換機識別到左半部分有局部碰撞,那么對碰撞數(shù)據(jù)不做轉(zhuǎn)發(fā);正常情況下,也是該轉(zhuǎn)發(fā)轉(zhuǎn)發(fā),但是左半部分內(nèi)的主機對左半部分內(nèi)的主機發(fā)送數(shù)據(jù),交換機是不會做數(shù)據(jù)轉(zhuǎn)發(fā)的。這樣就是把大的局域網(wǎng)劃成了兩個子區(qū)域,子區(qū)域內(nèi)的主機發(fā)送數(shù)據(jù)是正常的,要跨區(qū)域發(fā)送數(shù)據(jù)就需要交換機來轉(zhuǎn)發(fā)數(shù)據(jù)了,感覺很像路由器有沒有。
- 因為有碰撞域,所以一臺主機發(fā)送的數(shù)據(jù)量是長了好?還是短了好?為什么?
????????如果把兩個方向推向極端化,數(shù)據(jù)量特別長的時候,占用網(wǎng)絡(luò)這個資源的時間就特別長,那么局域網(wǎng)中碰撞的概率就會大大增加,太短的話,一直頻繁的發(fā)也不好,影響效率。所以就規(guī)定MAC幀最大長度不超過1500字節(jié),這個稱為MTU。
認(rèn)識MTU
????????MTU相當(dāng)于發(fā)快遞時對包裹尺寸的限制,這個限制是不同的數(shù)據(jù)鏈路對應(yīng)的物理層,產(chǎn)生的限制。以太網(wǎng)幀中的數(shù)據(jù)長度規(guī)定最小46字節(jié),最大1500字節(jié),ARP數(shù)據(jù)包的長度不夠46字節(jié),要在后面補填充位。最大值1500稱為以太網(wǎng)的最大傳輸單元(MTU),不同的網(wǎng)絡(luò)類型有不同的MTU。
????????如果一個數(shù)據(jù)包從以太網(wǎng)路由到撥號鏈路上,數(shù)據(jù)包長度大于撥號鏈路的MTU了,則需要對數(shù)據(jù)包進行分片(fragmentation)。不同的數(shù)據(jù)鏈路層標(biāo)準(zhǔn)的MTU是不同的。
MTU對IP協(xié)議的影響
????????由于數(shù)據(jù)鏈路層MTU的限制,對于較大的IP數(shù)據(jù)包要進行分包。將較大的IP包分成多個小包,并給每個小包打上標(biāo)簽,每個小包IP協(xié)議頭的 16位標(biāo)識(id) 都是相同的,每個小包的IP協(xié)議頭的3位標(biāo)志字段中, 第2位置為0,表示允許分片,第3位來表示結(jié)束標(biāo)記(當(dāng)前是否是最后一個小包, 是的話置為0,否則置為1)。
????????到達對端時再將這些小包按順序重組,拼裝到一起返回給傳輸層,一旦這些小包中任意一個小包丟失,接收端的重組就會失敗,但是IP層不會負(fù)責(zé)重新傳輸數(shù)據(jù)。
????????我們知道如果數(shù)據(jù)長度超過MTU,IP會進行分片,那么問題來了,路由器會分片嗎?答案是會的,前面說過數(shù)據(jù)鏈路層的標(biāo)準(zhǔn)不同MTU也是不同的,比如下個路由器要求只能收500字節(jié)的數(shù)據(jù)包,你這個路由器要傳給下一個路由器,就只能進行分片,而IP協(xié)議中分片的三個字段也是支持路由器進行再次分片和組裝的。?
????????我們要知道將數(shù)據(jù)包從A主機跨網(wǎng)絡(luò)傳輸?shù)紹主機,可能并不是只有一條路徑供選擇,如果數(shù)據(jù)包在主機已經(jīng)分過片了,將三個標(biāo)志位中禁止分片的標(biāo)志位設(shè)為1,表示路上節(jié)點的路由器禁止分片,如果數(shù)據(jù)長度超過該路由器的MTU,該路由器會直接將數(shù)據(jù)包丟掉,丟掉之后發(fā)送方就要進行超時重傳,重傳時就要重新進行路徑選擇,那么就有可能重新找到一條支持我們這個數(shù)據(jù)包長度轉(zhuǎn)發(fā)的路徑,所以我們就找到一條最大吞吐量的網(wǎng)絡(luò)路徑。網(wǎng)絡(luò)的世界很復(fù)雜,但是演變到今天,一定是有依據(jù)做支撐的。
????????在之前TCP滑動窗口那里有一個細(xì)節(jié)沒有說,就是滑動窗口范圍內(nèi)為什么要有多個報文段?直接把滑動窗口內(nèi)的數(shù)據(jù)搞成一個報文發(fā)送不就完了嗎,為什么還要按一段一段的發(fā)送呢?
????????那是因為數(shù)據(jù)鏈路層不允許一次發(fā)送太大的單個數(shù)據(jù)段,如果執(zhí)意要發(fā)送大數(shù)據(jù)段,那么壓力就到了IP身上,IP被迫進行分片,分片之后丟包概率增加,IP還要背鍋,不能可著一個羊薅毛啊,所以這幾層協(xié)議之間是相互有影響的。
MTU對UDP協(xié)議的影響
讓我們回顧一下UDP協(xié)議:
????????一旦UDP攜帶的數(shù)據(jù)超過1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就會在網(wǎng)絡(luò)層分成多個IP數(shù)據(jù)報。這多個IP數(shù)據(jù)報有任意一個丟失,都會引起接收端網(wǎng)絡(luò)層重組失敗。那么這就意味著,如果UDP數(shù)據(jù)報在網(wǎng)絡(luò)層被分片,整個數(shù)據(jù)被丟失的概率就大大增加了。
MTU對于TCP協(xié)議的影響
讓我們再回顧一下TCP協(xié)議:
????????TCP的一個數(shù)據(jù)報也不能無限大, 還是受制于MTU。TCP的單個數(shù)據(jù)報的最大消息長度,稱為MSS(MaxSegment Size)。
????????TCP在建立連接的過程中,通信雙方會進行MSS協(xié)商,最理想的情況下, MSS的值正好是在IP不會被分片處理的最大長度(這個長度仍然是受制于數(shù)據(jù)鏈路層的MTU)。
????????雙方在發(fā)送SYN的時候會在TCP頭部寫入自己能支持的MSS值,然后雙方得知對方的MSS值之后, 選擇較小的作為最終MSS,MSS的值就是在TCP首部的40字節(jié)變長選項中(kind=2)。
MSS和MTU的關(guān)系
使用ifconfig命令,即可查看ip地址、 mac地址和MTU。
ARP協(xié)議
ARP協(xié)議不是一個單純的數(shù)據(jù)鏈路層的協(xié)議,而是一個介于數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層之間的協(xié)議。
????????數(shù)據(jù)跨網(wǎng)絡(luò)傳輸時通過路由器轉(zhuǎn)發(fā),千里迢迢來到了目標(biāo)主機的子網(wǎng)路由器入口處,但是數(shù)據(jù)包中只有目的主機的IP地址,并沒有目的主機的MAC地址,那么路由器是不知道要把數(shù)據(jù)發(fā)給子網(wǎng)中的哪臺主機的,所以需要有一個過程或功能,讓路由器知道你要發(fā)給它子網(wǎng)內(nèi)的哪臺主機,所以就有了ARP協(xié)議。他可以通過IP地址,獲取目標(biāo)主機的MAC地址。
ARP協(xié)議的作用
ARP協(xié)議建立了主機 IP地址 和 MAC地址 的映射關(guān)系。
????????在網(wǎng)絡(luò)通訊時,源主機的應(yīng)用程序知道目的主機的IP地址和端口號,卻不知道目的主機的硬件地址。數(shù)據(jù)包首先是被網(wǎng)卡接收到再去處理上層協(xié)議的,如果接收到的數(shù)據(jù)包的硬件地址與本機不符,則直接丟棄,因此在通訊前必須獲得目的主機的硬件地址。
ARP數(shù)據(jù)報的格式
前面的三個類型是屬于MAC幀協(xié)議的字段,前面有說過,這里就不介紹了。
- 硬件類型:指鏈路層網(wǎng)絡(luò)類型,1為以太網(wǎng);
- 協(xié)議類型:指要轉(zhuǎn)換的地址類型,0x0800為IP地址。一般指的是將IP地址轉(zhuǎn)化為MAC地址;
- 硬件地址長度:這1個字節(jié)內(nèi)通常填的是6,表示以太網(wǎng)地址為6個字節(jié);
- 協(xié)議地址長度:這1個字節(jié)內(nèi)通常填的是4,表示IP地址為4字節(jié);
- op字段:為1表示ARP請求,op字段為2表示ARP應(yīng)答;
- 后四個字段比較簡單,發(fā)送端填寫自己的MAC地址和IP地址,目的IP地址是知道的,當(dāng)然要填,目的MAC地址填寫成 全F,表示未設(shè)置。
?????????ARP是先對op字段進行解析,看看是請求還是響應(yīng),如果是請求就要封裝響應(yīng)并向下交付,如果是響應(yīng)就構(gòu)建IP和MAC的映射關(guān)系到緩存表中。為什么不先考慮前四個字段,因為前四個字段一般是固定的。
ARP協(xié)議的工作流程
- 源主機發(fā)出ARP請求,詢問“IP地址是192.168.0.1的主機的硬件地址是多少”, 并將這個請求廣播到本地網(wǎng)段(以太網(wǎng)幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播)。
- 目的主機接收到廣播的ARP請求,發(fā)現(xiàn)其中的IP地址與本機相符,則發(fā)送一個ARP應(yīng)答數(shù)據(jù)包給源主機,將自己的硬件地址填寫在應(yīng)答包中。
- 每臺主機都維護一個ARP緩存表,可以用arp -a命令查看。緩存表中的表項有過期時間(一般為20分鐘),如果20分鐘內(nèi)沒有再次使用某個表項,則該表項失效,下次還要發(fā)ARP請求來獲得目的主機的硬件地址。
從上圖可以看到,ARP協(xié)議是在MAC幀協(xié)議之上的單獨的一個協(xié)議,是一個工具類協(xié)議。
????????路由器收到了一個數(shù)據(jù)包,這個數(shù)據(jù)包要轉(zhuǎn)給主機B,但是路由器此時并不知道主機B的MAC地址,只知道IP地址,怎么辦呢?那路由器只好封裝一個ARP請求,再封裝一個MAC幀,以廣播的形式發(fā)送到子網(wǎng)中(MAC幀頭部的目的MAC地址全F)。這時子網(wǎng)內(nèi)的所有主機都可以收到這個MAC幀報文,收到后解析發(fā)現(xiàn)是ARP請求,交給ARP協(xié)議,ARP對這個請求進行解析,發(fā)現(xiàn)目的IP不是自己就直接丟棄,如果是自己,那么就填寫自己的信息,封裝一個ARP應(yīng)答,此時這個應(yīng)答是知道要發(fā)給誰的,所以直接發(fā)送即可,那么路由器收到應(yīng)答后,每臺主機/路由器都有緩存一個ARP緩存表,將IP地址和MAC地址建立映射關(guān)系,就知道主機B的MAC地址了,那么路由器就可以直接把數(shù)據(jù)包轉(zhuǎn)發(fā)給主機B了。
注:?局域網(wǎng)中的發(fā)送不是像我們平時微信聊天一樣直接發(fā)給某一個人,而是將目的MAC地址填寫成具體的主機,這時局域網(wǎng)中的所有主機對對比這個目的MAC地址看是否是給自己發(fā)的,不是就丟棄,是就再繼續(xù)向上層交付。
因為這個緩存表中的表項長時間不使用會失效,所以數(shù)據(jù)包在跨網(wǎng)絡(luò)傳輸時ARP是會伴隨著數(shù)據(jù)包一直發(fā)生的。
- 為什么要有緩存表??
????????從上面可以看到ARP協(xié)議也是比較繁瑣的,你不能來一次數(shù)據(jù)就查一次ARP,短時間內(nèi)數(shù)據(jù)比較頻繁的話,這不是消耗資源、浪費時間嘛,所以內(nèi)部會有緩存表。
- 為什么表項要有過期時間而不是一直有效?
????????之前的文章中說過,因為是路由器是動態(tài)分配IP地址,所以在局域網(wǎng)中IP地址是會變的。IP地址會發(fā)生變化,這個表項長時間存在也沒有意義。
- 我們有可能只知道對方的MAC地址,不知道IP地址,那怎么辦呢?
? ? ? ? 雖然這種情況的概率很小,但是也會發(fā)生,此時就需要RARP,又叫逆地址解析(通過MAC地址得到IP地址),通過ARP我們知道RARP是比較簡單的,為什么?因為ARP不知道對方的MAC地址,需要進行廣播,但是RARP知道對方的MAC地址呀,所以直接針對MAC地址進行封裝RARP,屬于是定向發(fā)送,所以就會簡單很多。
我們知道ARP里有緩存表,并且不用會消失,所以ARP收到應(yīng)答的時候,一般會以最新的為主。
????????假設(shè)在一個子網(wǎng)中,有一個黑客(中間人),它把自己主機的IP地址偽裝成路由器的IP,但是MAC地址是它自己的,然后不斷地給子網(wǎng)內(nèi)的某臺主機(假設(shè)是主機B)發(fā)送ARP請求。因為IP地址和MAC地址只是一串?dāng)?shù)字,這個主機B它并不知道不斷發(fā)送的ARP請求中的IP地址被更改過了,它就把這個黑客的主機當(dāng)成路由器,同時黑客也在用同樣的手段去不斷地給路由器發(fā)送ARP請求,那么主機B以為黑客是路由器,而路由器以為黑客是主機B。如果有數(shù)據(jù)要發(fā)給主機B時,路由器就會將數(shù)據(jù)轉(zhuǎn)給黑客的主機,而黑客獲取到數(shù)據(jù)解析后、封裝好再次轉(zhuǎn)給主機B,主機B是不知道自己的數(shù)據(jù)被截取了的;而主機B向外發(fā)送數(shù)據(jù),則先把數(shù)據(jù)交給黑客,黑客獲取到數(shù)據(jù)解析后、封裝好再次轉(zhuǎn)給路由器,這樣黑客能神不知鬼不覺的截取到主機B的消息,這就叫ARP欺騙。那么只要能截取到一臺主機,那就能截取到局域網(wǎng)內(nèi)的所有主機。
????????這里不涉及網(wǎng)絡(luò)安全方面的知識,只是拋開現(xiàn)象見本質(zhì),當(dāng)然現(xiàn)在互聯(lián)網(wǎng)的網(wǎng)絡(luò)安全還是可以的。在之前的HTTPS一文中有講解,為了應(yīng)對中間人攻擊,而做的一些策略。
其他重要協(xié)議或技術(shù)(簡單了解)
DNS(Domain Name System)
????????DNS是一整套從域名映射到IP的系統(tǒng)。
DNS背景
????????TCP/IP中使用IP地址和端口號來確定網(wǎng)絡(luò)上的一臺主機的一個程序,但是IP地址不方便記憶,于是人們發(fā)明了一種叫主機名的東西,是一個字符串,并且使用hosts文件來描述主機名和IP地址的關(guān)系。
????????最初, 是通過互連網(wǎng)信息中心(SRI-NIC)來管理這個hosts文件的,如果一個新計算機要接入網(wǎng)絡(luò),或者某個計算機IP變更,都需要到信息中心申請變更hosts文件。其他計算機也需要定期下載更新新版本的hosts文件才能正確上網(wǎng),這樣就太麻煩了,于是產(chǎn)生了DNS系統(tǒng)。
DNS系統(tǒng):一個組織的系統(tǒng)管理機構(gòu), 維護系統(tǒng)內(nèi)的每個主機的IP和主機名的對應(yīng)關(guān)系。
????????如果新計算機接入網(wǎng)絡(luò), 將這個信息注冊到數(shù)據(jù)庫中,用戶輸入域名的時候, 會自動查詢DNS服務(wù)器, 由DNS服務(wù)器檢索數(shù)據(jù)庫,得到對應(yīng)的IP地址。至今,我們的計算機上仍然保留了hosts文件,在域名解析的過程中仍然會優(yōu)先查找hosts文件的內(nèi)容。
用指令?cat /etc/hosts 可以查看hosts文件的的內(nèi)容。
域名簡介
主域名是用來識別主機名稱和主機所屬的組織機構(gòu)的一種分層結(jié)構(gòu)的名稱。
?www.baidu.com
域名使用 . 連接,
com:一級域名,表示這是一個企業(yè)域名。同級的還有 "net"(網(wǎng)絡(luò)提供商),"org"(非盈利組織) 等。
baidu:二級域名,表示公司名。
www:只是一種習(xí)慣用法,之前人們在使用域名時,往往命名成類似于ftp.xxx.xxx/www.xxx.xxx這樣的格式,來表示主機支持的協(xié)議。
ICMP協(xié)議
????????ICMP協(xié)議是一個 網(wǎng)絡(luò)層協(xié)議。
????????一個新搭建好的網(wǎng)絡(luò),往往需要先進行一個簡單的測試,來驗證網(wǎng)絡(luò)是否暢通。 但是IP協(xié)議并不提供可靠傳輸,如果丟包了,IP協(xié)議并不能通知傳輸層是否丟包以及丟包的原因。
ICMP功能
ICMP正是提供這種功能的協(xié)議, ICMP主要功能包括:
- 確認(rèn)IP包是否成功到達目標(biāo)地址;
- 通知在發(fā)送過程中IP包被丟棄的原因;
- ICMP也是基于IP協(xié)議工作的,但是它并不是傳輸層的功能,因此人們?nèi)匀话阉鼩w結(jié)為網(wǎng)絡(luò)層協(xié)議;
- ICMP只能搭配IPv4使用,如果是IPv6的情況下, 需要是用ICMPv6;
?ICMP的報文格式(了解)
ICMP大概分為兩類報文:
- 一類是通知出錯原因
- 一類是用于診斷查詢
ping命令?
- 注意,此處 ping 的是域名,而不是 url ! 一個域名可以通過DNS解析成IP地址。
- ping命令不光能驗證網(wǎng)絡(luò)的連通性,同時也會統(tǒng)計響應(yīng)時間和TTL(IP包中的Time To Live,生存周期,也叫最大報文跳數(shù))。
- ping命令會先發(fā)送一個 ICMP Echo Request給對端,對端接收到之后,會返回一個ICMP Echo Reply。
?
注意?。?!有些面試官可能會問: telnet是23端口,ssh是22端口,那么ping是什么端口?
????????ping命令基于ICMP, 是在網(wǎng)絡(luò)層。而端口號, 是傳輸層的內(nèi)容, 在ICMP中根本就不關(guān)注端口號這樣的信息!
?
traceroute命令
也是基于ICMP協(xié)議實現(xiàn), 能夠打印出可執(zhí)行程序主機, 一直到目標(biāo)主機之前經(jīng)歷多少路由器。
NAT技術(shù)
NAT技術(shù)背景
????????之前我們討論了, IPv4協(xié)議中,IP地址數(shù)量不充足的問題。NAT技術(shù)當(dāng)前解決IP地址不夠用的主要手段,是路由器的一個重要功能。
????????NAT能夠?qū)⑺接蠭P對外通信時轉(zhuǎn)為全局IP,也就是就是一種將私有IP和全局IP相互轉(zhuǎn)化的技術(shù)方法:很多學(xué)校,家庭,公司內(nèi)部采用每個終端設(shè)置私有IP, 而在路由器或必要的服務(wù)器上設(shè)置全局IP,全局IP要求唯一, 但是私有IP不需要。 在不同的局域網(wǎng)中出現(xiàn)相同的私有IP是完全不影響的。
NAT IP轉(zhuǎn)換過程
????????NAT路由器將源地址從10.0.0.10替換成全局的IP 202.244.174.37,NAT路由器收到外部的數(shù)據(jù)時, 又會把目標(biāo)IP從202.244.174.37替換回10.0.0.10。在NAT路由器內(nèi)部,有一張自動生成的,用于地址轉(zhuǎn)換的表。當(dāng) 10.0.0.10 第一次向 163.221.120.9 發(fā)送數(shù)據(jù)時就會生成表中的映射關(guān)系 。
那么問題來了, 如果局域網(wǎng)內(nèi),有多個主機都訪問同一個外網(wǎng)服務(wù)器,那么對于服務(wù)器返回的數(shù)據(jù)中,目的IP都是相同的。那么NAT路由器如何判定將這個數(shù)據(jù)包轉(zhuǎn)發(fā)給哪個局域網(wǎng)的主機呢?
????????這時候NAPT來解決這個問題了,使用IP + port來建立這個關(guān)聯(lián)關(guān)系。那么有人會說,怎么還要port呢,直接將主機的源IP+目的IP 和 路由器的源IP + 目的IP 將這兩個二元組建立映射關(guān)系不就好了?
????????我們要知道NAPT不光要解決的是 不同的主機訪問相同的服務(wù)器的IP地址轉(zhuǎn)化問題,還要解決同一臺主機的 不同進程訪問相同服務(wù)器的IP地址轉(zhuǎn)化問題。如果沒有端口號,怎么分辨哪個IP是主機的哪個進程呢。
NAPT
?????????上圖中,在內(nèi)網(wǎng)環(huán)境中一個主機的四元組(目的IP +?端口,源IP + 端口)一定是唯一的,通過NAT路由器轉(zhuǎn)化之后 ,也一定是一個唯一的四元組。也就是說一臺主機的四元組中有任意一元不同,轉(zhuǎn)化后的四元組就是不同的。這個NAT轉(zhuǎn)化表,是一個互為鍵值 的映射表。
????????這種關(guān)聯(lián)關(guān)系也是由NAT路由器自動維護的,例如在TCP的情況下, 建立連接時,就會生成這個表項; 在斷開連接后,就會刪除這個表項。
NAT技術(shù)的缺陷
由于NAT依賴這個轉(zhuǎn)換表, 所以有諸多限制:
- 無法從NAT外部向內(nèi)部服務(wù)器建立連接;
- 裝換表的生成和銷毀都需要額外開銷;
- 通信過程中一旦NAT設(shè)備異常, 即使存在熱備,所有的TCP連接也都會斷開;
?
????????假如有一臺主機從來沒有訪問過外網(wǎng),那么外網(wǎng)是無法直接訪問到內(nèi)網(wǎng)的主機的,為什么呢?因為如果你沒有訪問過外網(wǎng),那么NAT轉(zhuǎn)換表中是沒有你和外網(wǎng)的映射關(guān)系的,所以外網(wǎng)也無法準(zhǔn)確找到你。
雖然NAT技術(shù)有缺陷,但是他的價值遠遠大于缺陷。
NAT和代理服務(wù)器
????????路由器往往都具備NAT設(shè)備的功能, 通過NAT設(shè)備進行中轉(zhuǎn),完成子網(wǎng)設(shè)備和其他子網(wǎng)設(shè)備的通信過程。代理服務(wù)器看起來和NAT設(shè)備有一點像,客戶端像代理服務(wù)器發(fā)送請求,代理服務(wù)器將請求轉(zhuǎn)發(fā)給真正要請求的服務(wù)器,服務(wù)器返回結(jié)果后,代理服務(wù)器又把結(jié)果回傳給客戶端。
那么NAT和代理服務(wù)器的區(qū)別有哪些呢?
- 從應(yīng)用上講,NAT設(shè)備是網(wǎng)絡(luò)基礎(chǔ)設(shè)備之一,解決的是IP不足的問題, 代理服務(wù)器則是更貼近具體應(yīng)用,比如通過代理服務(wù)器進行翻墻,?另外像迅游這樣的加速器,也是使用代理服務(wù)器。
- 從底層實現(xiàn)上講, NAT是工作在網(wǎng)絡(luò)層,直接對IP地址進行替換,代理服務(wù)器往往工作在應(yīng)用層。
- 從使用范圍上講, NAT一般在局域網(wǎng)的出口部署,代理服務(wù)器可以在局域網(wǎng)做,也可以在廣域網(wǎng)做, 也可以跨網(wǎng)。
- 從部署位置上看,NAT一般集成在防火墻, 路由器等硬件設(shè)備上,代理服務(wù)器則是一個軟件程序, 需要部署在服務(wù)器上。
代理服務(wù)器是一種應(yīng)用比較廣的技術(shù)。
- 翻墻:廣域網(wǎng)中的代理。
- 負(fù)載均衡:局域網(wǎng)中的代理。
代理服務(wù)器又分為正向代理和反向代理。
- ????????反向代理用于請求的轉(zhuǎn)發(fā)(例如借助代理繞過反爬蟲)。
- ????????正向代理往往作為一個緩存。
舉個例子:海南芒果很有名,到了成熟的季節(jié),我自己去海南買費時還不省錢很不方便,但是我可以讓在海南工作的表姐去超市買了快遞給我。此時超市看到的買家是我表姐, 我的表姐就是 "反向代理";后來找我表姐買芒果的人太多了, 我表姐覺得天天去超市太麻煩,干脆去超市買了一大批芒果屯在家里, 如果有人來找她代購, 就直接把屯在家里的貨發(fā)出去,而不必再去超市。 此時我表姐就是 "正向代理"。
一句話總結(jié),離服務(wù)器近的是反向代理,離客戶端近的是正向代理。文章來源:http://www.zghlxwxcb.cn/news/detail-601886.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-601886.html
到了這里,關(guān)于Linux網(wǎng)絡(luò)基礎(chǔ) — 數(shù)據(jù)鏈路層的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!