日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速了解必要的网络知识

發布時間:2024/1/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速了解必要的网络知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是一篇非常簡單的文章,幫助程序員快速地、大致地了解下網絡相關的基礎知識。寫這篇文章的目的當然是想幫助許多對網絡知識不了解的朋友用盡量少的時間了解必要的知識,學習網絡相關知識當然少不了去看書,如被奉為經典的《TCP/IP詳解,但對大多數程序員來說,沒那么多時間看完這么枯燥的書,也沒必要(嗯,我承認我這里有點政治不正確了),而當我們想快速補習下這方面的知識而去搜索技術博客或者知乎的時候,得到的回答總是去看XXX書吧……So,我打算提供一些便利,只管有用,不管政治正不正確,呵呵。

1,七層還是四層?

說起網絡,99%的書總是一開始就七層架構,考試的時候也是樂意考這么個填空題,而我們經常能看到的名詞還有“四層架構”,那到底七層還是四層?簡單地說:“七層”是ISO標準,“四層”是TCP/IP。ISO是個標準組織,它定義的網絡七層架構叫OSI標準,而我們現在廣泛使用的TCP/IP網絡則實現了其中四層。我們如今說的網絡一般來說指的就是TCP/IP網絡,所以對我們而言,四層更有現實意義。哪四層?

2,四層架構有哪些相關名詞?

應用層 —— HTTP
傳輸層 —— 端口,TCP
網絡層 —— IP,IP地址,路由
鏈路層 —— MAC地址

我不打算列更多的名詞了,有這些夠了,也許跟你在別處看到的不同,比如我這里的鏈路層別處可能叫“網絡接口層”,不要在意這些細節……

3,對鏈路層要了解哪些東西?

我們電腦連接的有線網絡99.9%是以太網(還有0.1%我沒見過,哈哈),以太網的重要外觀就是用雙絞線連接電腦網口和交換機網口,這個你肯定懂。


以太網是什么?——就是這玩意兒(簡單粗暴^_^)

以太網有以太網的通訊標準,標準由IEEE制定,IEEE和ISO一樣是個標準組織,如今的鏈路層均遵循其標準,這是一系列的標準,相當龐大而復雜(如果細分的話,以太網本身就有多種標準)這個系列標準叫“IEEE 802系列”,IEEE 802系列標準之龐大,包括了幾乎所有我們能見到的網絡——以太網、2G、3G、4G、WIFI、近場通訊……等等,而每個我們熟悉的名詞拆分開又有不同的標準定義,真是煩!——所幸的是我們不需要管那么多,我們只需要知道,在鏈路層上傳輸的單元叫“幀”,而幀中包含了“MAC地址”,俗稱“物理地址”,鏈路層不提供路由功能,若無上層協議的支持,鏈路層只能實現直接連接的節點之間通訊,比如你的電腦的網口連著公司的交換機,只依賴鏈路層的話,你的電腦就只能跟公司的交換機聊聊天。關心鏈路層的人更多的是電子工程師或網管,我等碼農大致看看就好。

4,如何路由?

網絡層是對鏈路層的封裝,最重要的東西應數IP地址,有了IP地址,就有了路由的能力,使得通訊可以跨越多個節點,實現網間通訊了,這相當好理解,交換機理解IP地址和網口的對應關系,它知道這個網絡包(前面叫“幀”,這里叫“包”了,哈哈,真會整人)應該往哪個網口丟,如果實在不知道,那么就往“網關”丟,網關再往別處丟,如果IP地址正確,網絡也沒什么問題,那總歸能抵達目的地的,這就是IP協議最重要的任務——路由。

也許你想問:有沒有不用IP協議的網絡?有啊,藍牙設備通常就不用(藍牙的規范且不在IEEE802系列中),其實是沒必要,因為它通常只作為單點連接,不需要實現網間通訊,反過來說,如果要實現網間通訊,應該沒什么比IP協議更合適的了。

5,為啥要弄個端口出來?

光有IP地址,恐怕還不夠,想想我們電腦上N多程序都需要使用網絡,那么如何區分程序各自的網絡訪問包呢?如果分不開,那豈不是亂了套,所以要用傳輸層包裝,傳輸層包裝里多了一個“端口”的東西。例如:我們在電腦上啟動Web服務器,默認打開了80端口監聽,一個端口只能由一個程序打開,這樣就不會亂套了。端口是對網絡層的進一步擴展,對上層提供了更友好的使用界面。

6,TCP如何做到有連接?

有了TCP協議,從此有了“連接”的概念,否則你想連接從何而來?從網絡層上看,反正都是一個個網絡包,前一個包傳了過去,后一個包被交換機卡住了,沒看出來“連接”在哪里啊,其實“有連接”只是個概念,它的原理是通過那些“握手”、“揮手”、“心跳”、“應答”和“超時檢查”在傳輸的雙方保持了一些“狀態”,所以,準確說是“看起來有連接”而已。

7,對開發者而言網絡到底是怎樣的存在?

那傳輸層體現在應用程序上又是個怎么樣的東西?——是Socket。網絡編程是件挺頭疼的事情,從一開始就是,所以弄了個Socket的概念出來方便我們程序員訪問網絡,這最早是出現在Unix系統上的,后來Windows也借鑒了這套方法,搞了套自己的Socket API,用起來大家都很像。總體的編程思想大概就是(以TCP客戶端為例):指定目標服務器IP地址和端口,連接,獲取到了Socket(通常用一個整型數來表示),以后就往這個Socket上讀寫東西(跟讀寫本地文件有些類似)來實現收發,中間還可以用一些函數查詢這個Socket的狀態,不用了之后就close掉這個Socket以斷開TCP連接。這是比較簡單的情形,事實上,為了更好地挖掘系統的潛能,提高系統的網絡吞吐量,不同的系統還祭出了自己的一些所謂高級網絡編程模型,如Windows的完成端口,Linux的epoll等,但對程序而言,網絡訪問依舊是對Socket進行操作。實際上,程序員們仍然認為Socket是比較底層的東西,需要進一步抽象,于是誕生了如HttpContext之類東西,大伙們不再需要直接操作Socket了,甚至都可以不知道Socket的存在。

8,TCP提供了哪些可靠性?

主要兩方面:成功保障和次序保障。對于成功保障,很好理解,如果網絡包發送成功,對方應答一下,發送方便知道了,認為接收方一定成功接收;而次序保障,則是通過在傳輸包中加入一個次序標識來實現的,當傳輸包抵達對方節點時,TCP根據次序標識對收到的內容重新“組包”。那么,現在考慮一下這種可能性:發送方的包確實已經發送至接收方了,但接收方的應答卻沒有成功發往發送方,這時候是不是會錯誤判斷為發送失敗?——答案是肯定的,所以TCP有個重發機制,當遲遲沒收到應答的時候,會嘗試重發數次,如果依舊出現沒有應答,那就真的判定為失敗了,所以TCP能知道“一定成功”,但卻無法知道“一定失敗”。

9,真的可靠嗎?

TCP連接為我們的程序通信創造了一條“通道”,我們程序間發送數據就變得有保障起來,那根據上面提供的這些信息,你認為這條通道有多牢靠?——事實上是這樣的:如果網絡系統確確實實按照了既定的規則去工作的話,可靠性是顯而易見的,但,誰說網絡上途徑的這么多節點每個都會老老實實工作?有沒有可能在傳輸過程中將我們的包截獲并篡改?或者干脆就直接造一個假的包冒充發送?——我說,這種事情不光可能,而且一直在發生!不需要我證明給你看,你自己想想,有沒有自己建了一個好端端的網站,別人打開的時候卻無緣無故彈出廣告之類的事情發生?而你確信自己的網站沒問題,沒中病毒之類的……恭喜你啊,你的網站被電信劫持了,你的頁面在傳輸中被篡改了,HTTP協議是基于TCP的,所以你說從這個角度看可不可靠?


一個典型的http劫持的例子,看看右下角這個連滾動條都擋住了的廣告

10,如何做到真的可靠?

當然是使用SSL,SSL現在又叫TLS,但舊名字叫慣了就沿用下來,它是在傳輸層上包了一層加密,這層加密實現了這些功能:

  • 密鑰不直接在網絡上傳輸(通過一個非對稱加密實現)
  • 所有數據皆經過加密,即便截獲也沒用
  • 如果試圖偽造或篡改數據包,那接收方一定知道數據不合法并丟棄

另外SSL還可以通過層級證書手段,對傳輸方的身份進行認證。某大牛說過:“沒有SSL的安全都是在假裝安全。”用了SSL之后,傳輸安全了,網站圖標綠了,框也不彈了。另外注意:SSL是用來防范“中間人攻擊”的手段,至于主機上中了木馬之類的,它卻無能為力。

11,關于TCP還有哪些東西沒談?

太多了,比如流量控制,但我不打算說,否則此文就沒什么意義了。一般來說,需要的時候才去學比較好,雖然技不壓身,這個誰都清楚,可學習技術要花不少時間,而且最關鍵的是:人是會遺忘的,尤其是學而不用的話。

12,不是還有個叫UDP的東西嗎?

傳輸層有兩套協議,一是前面提到的TCP,另一是UDP,TCP如今大行其道,而UDP則用得很少,UDP是無連接協議,比TCP簡單得多,最形象的比喻就是以前的“寫信”,我寫好信了之后(發送的數據),把信裝進信封(UDP包),寫上地址和收件人(IP地址端口),扔進郵箱(send)即可,既不等待應答,也不保證次序,也沒有連接通道的概念。由于UDP形式如此簡單,所以在以前某些特定的環境里,它傳輸效率高于TCP,所以被用于一些對傳輸性能要求比較苛刻的場景,如網游,但現在世道變了,網絡資源不再像當年那么緊張,TCP顯然是更好的選擇。當然了,還有些特殊場合是非用UDP不可的,如實現局域網廣播,這個TCP做不到。

13,為什么IP地址仍然不枯竭?

我們常說的IP地址指的是IPv4地址,例如“10.186.3.21”,其實它是個32位整型,表面上看最高可支持2的32次方個節點,即42億多,事實上遠遠沒那么多,首先其中有很多屬于“保留地址”,做特殊用途使用的,其次,大量優質地址段被一些寡頭占據了(主要是美國政府及美國一些科技公司),所以剩下的可用地址可謂寶貴,國人早意識到了這點,所以很早就發力研究IPv6,我在N年前就看到過國內XX大學的教授在帶學生研究IPv6的一些報道,號稱我們走在了世界領先,報道還做了一些技術細節介紹,如IPv4是“xxx.xxx.xxx.xxx”這樣(四段),而IPv6則變成了“xxx.xxx.xxx.xxx.xxx.xxx”(六段),所以地址多了很多……我暈!我雖然讀書少,但也少拿這個來糊弄我了,事實上的IPv6地址高達128位,與之最接近的是什么?——作為程序員,馬上回答!UUID啊!UUID不也128位么?——有點跑題了,回到正題,為啥現在IP地址仍然不枯竭?——那是因為我們絕大多數人都沒有公網地址。這個你可以馬上自己試試,比如你的手機,連著3G,貌似接入了公網了,你還可以在設置中看到自己的IP地址,這是運營商分配的,但我向你保證,這個地址其實是運營商的局域網地址,要證明很簡單,你用手機瀏覽器打開http://www.ip138.com/看看自己的“公網IP”,是不是不一樣?也就是說,你想用手機當服務器讓Internet上的用戶來連是不行的。雖然沒有公網,但通過NAT,我們照樣訪問Internet沒啥問題。至于推IPv6的事情,我覺得還是讓教授們去干吧。

14,為什么到處都是HTTP?

我想那是因為——簡單!HTTP是一個基于TCP的請求/應答模型的協議,客戶端一問,服務器一答,就這么簡單,跟程序里的函數調用似的,所以很多RPC在底下也使用了HTTP協議,HTTP協議還使用了非常易讀的文本格式,一出就被廣泛追捧。如今廣泛使用的HTTP 1.1協議最后的一次修訂是在1999年,距今17年了,看吧,越是簡單基礎的東西越不容易變化。

15,如何抓包分析?

如果僅僅是想抓取HTTP包的話,IE的HttpWatch Pro是不錯的東西,Firefox下有個跟它類似的叫“httpfox”,我不知道現在還在不在,chrome的話本身也提供了一些簡單的查看http包的功能。想專業一點的話可以考慮用Fiddler,Windows環境下的抓包利器,Mac下則用Charles。當然了,最強大(但也很復雜)的抓包神器當然是Wireshark,這玩意兒甚至能看鏈路層的幀。

16,最后講點有趣的?

很多年前我的公司由于網口少,我跟一個同事共用一個網口(通過一個集線器),集線器這玩意兒跟交換機不同,它不會“路由”,收到任何包都是直接廣播到所有網口,于是我用抓包工具抓了一些網絡包,這位同事用MSN的聊天信息我全部都能看到,由于這樣,我后來一直不敢用MSN在公司里亂說話,你想MSN這么爛的東西為啥公司喜歡讓我們用呢?不過幾年后MSN用戶就幾乎絕跡了。

轉載于:https://www.cnblogs.com/guogangj/p/5421990.html

總結

以上是生活随笔為你收集整理的快速了解必要的网络知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。