從大學就開始接觸到了網(wǎng)絡協(xié)議求豫,零零散散不成體系,那時也沒有理解的多么透徹由缆,更別談將它應用到實際注祖。工作開始漸漸的意識到網(wǎng)絡基礎(chǔ)理論的重要性。寫博客的用意如下均唉,整理自己的知識,查漏補缺肚菠,檢查自己還有哪些沒有理解的舔箭,畢竟基礎(chǔ)知識決定了以后在技術(shù)方面能走多遠;再者就是要能幫到了后來者再好不過了蚊逢。自己知識有限层扶,還望有緣人指正一二,萬分感謝烙荷。
前言:
本篇文章主要講述的是镜会,七層協(xié)議中的物理層到傳輸層協(xié)議,對于應用層協(xié)議中DNS和HTTP會單獨的作為一個模塊闡述终抽,另外網(wǎng)絡協(xié)議精妙復雜戳表,絕不是這一篇文章可以描述清楚的,文章難免會出現(xiàn)不是十分嚴謹或是不太詳細的昼伴,先建立個宏觀體系匾旭,再談些重要的細節(jié)。說明下TCP/IP協(xié)議簇不單只是TCP和IP協(xié)議圃郊。
兵馬未動糧草先行价涝,直接上圖
先用大白話說下OSI參考模型。
1持舆、為什么要分模塊色瘩?
這就好比一個公司,會有很多部門逸寓,每個部門可以理解為只做一個事情居兆,一個部門可能在為另一個部門提供服務,也可能別的部門在服務它席覆。爭取每個部門只做一件事史辙,就像一個函數(shù)只做一件事一樣。作為互聯(lián)網(wǎng)最基礎(chǔ)的網(wǎng)絡,怎么能全部在一起解析了聊倔,還是得分模塊晦毙,這樣才是一個老司機該做的事。不過我覺得這種模塊的劃分還是面向了具體耙蔑,而非抽象见妒。
2、OSI完成的是什么任務甸陌?
當然是通信任務啦须揣,廢話我也知道,能不能具體些钱豁。舉個簡單的例子耻卡,小王在地址欄輸入www.baidu.com按下了回車鍵,這一次點擊發(fā)生了哪些內(nèi)容牲尺。www.baidu.com卵酪?這是什么鬼,我怎么知道這是誰谤碳,他在哪了溃卡。顯然我們首先是找到這個地址在哪里吧,這樣我們才能傳輸一些信息吧蜒简。
第一步:DNS域名解析服務器瘸羡,要想使用www.baidu.com得先注冊才成,不是你輸入什么都可以的搓茬。先不說詳細了犹赖,就知道有個DNS服務器,他就是保存鍵值對信息垮兑,如www.baidu.com對應了115.239.210.27這個地址冷尉。這個叫做IP號,它的作用就是定位系枪,(就像你的家庭地址加上你的名字一樣雀哨,MAC地址像身份證號碼)。
第二步:知道你想要干什么私爷。就是復雜的協(xié)議分裝了雾棺,先進行HTTP封裝,比如你的請求方式(GET)衬浑,URL是什么(www.baidu.com),用的什么協(xié)議(HTTP1.1)捌浩,請求的整個長度是多少。這些都知道了后工秩,百度服務器就知道你要干什么了尸饺,因為協(xié)議有自己的格式进统,也可以根據(jù)這些條件解析出來了。
第三步:將你的請求安全的送達到目的地的哪一個服務器處理浪听。www.baidu.com默認是80端口螟碎,操作系統(tǒng)會根據(jù)端口的不同,將不同的數(shù)據(jù)給相應的進程處理迹栓。瀏覽器的端口假設為53141.有了目標端口和本地端口掉分,就可以知道目標進程和目標服務器也能找到自己的進程了。這時候傳輸層封裝完畢克伊,到達了網(wǎng)絡層酥郭。網(wǎng)絡層會將自己的IP和目標的IP寫入。這樣有了IP和端口就能找到設備中的進程了愿吹。為什么有了IP地址就能找到目標設備了不从,這么神奇。這時候網(wǎng)關(guān)就派上用場了犁跪,網(wǎng)關(guān)多是路由器的IP地址消返,它會根據(jù)子網(wǎng)掩碼判斷你是不是本地的。不是本地的就必須從網(wǎng)關(guān)出發(fā)耘拇,這是到外網(wǎng)的必經(jīng)之路。你的設備通過ARP協(xié)議廣播192.168.1.1這個網(wǎng)關(guān)的MAC地址是多少宇攻?知道了MAC地址后惫叛,開始封裝數(shù)據(jù)鏈路層,將你的MAC地址和網(wǎng)關(guān)的MAC地址寫入逞刷。根據(jù)數(shù)據(jù)鏈路層判斷下一個數(shù)據(jù)包是給哪個設備嘉涌,而網(wǎng)絡層的IP是最終的目標IP。每走一跳夸浅,數(shù)據(jù)鏈路層的目標和源MAC地址都會變仑最。然后到達了物理層,它解決的是與硬件的關(guān)系帆喇,如大于多少伏的電壓代表1警医,小于多少代表0,因為本質(zhì)上電腦只識別0和1坯钦。再如预皇,模擬信號和電信號的轉(zhuǎn)換痊土。這樣就一步一步的到達了目標百度服務器嚎货,一步一步從物理層反過來解析,最后將消息轉(zhuǎn)給的監(jiān)聽80端口的進程處理梅鹦。一次簡單的過程就這樣了突颊,百度服務器終于收到了我們的一次請求了鲁豪。
問題:集線器潘悼、交換器、路由器大體是怎么工作的爬橡?
- 1治唤、集線器,主要功能是對接收到的信號進行再生整形放大堤尾,以擴大網(wǎng)絡的傳輸距離肝劲。收到了一位bit就進行轉(zhuǎn)發(fā),不解析不處理郭宝。
- 2辞槐、交換器,收到字節(jié)流后粘室,解析出數(shù)據(jù)幀榄檬,并查看目標的MAC地址,判斷出從哪個交換機口進行轉(zhuǎn)發(fā)出去衔统。它是二層設備鹿榜。
- 3、路由器锦爵,不僅會解析出MAC地址還會解析出目標的IP舱殿,檢查是否丟棄還是轉(zhuǎn)發(fā)給下一跳哪個設備。它是三層設備险掀。
一沪袭、網(wǎng)絡層
1、IP地址
眾所周知樟氢,Windows系統(tǒng)查詢網(wǎng)絡IP地址為ipconfig冈绊,Linux中為ifconfig或者ip addr命令。Windows如下圖所示埠啃。
IPv4的IP地址是32個字節(jié)的死宣,如百度的115.239.210.27就是一個IP地址,它的作用是一個網(wǎng)卡的地址碴开,具有定位作用∫愀茫現(xiàn)在想一想MAC地址是一個網(wǎng)卡出廠就具備的全球唯一的地址,那么有了MAC地址后叹螟,怎么還需要IP地址了鹃骂?答案就是沒有IP地址根本定位不了,給你一個百度的服務器MAC地址罢绽,你怎么能找到他了畏线。MAC地址就像我們的身份證,IP地址就如同我們的家庭住址+名字良价。比如給你小王的MAC地址寝殴,你也不可能找到他蒿叠,只有先通過他的家庭住址和名字,才能找到他蚣常。所以說MAC地址不具備大范圍的定位作用市咽,只有在局域網(wǎng)內(nèi)才有作用,這就是MAC地址和IP地址的一個區(qū)別抵蚊。
32位的IP地址被分成了一下五類施绎,又大大的減少了IP地址數(shù)量。A贞绳、B谷醉、C是有網(wǎng)絡號和主機號組成的。這樣是為了區(qū)別是不是在同一個局域網(wǎng)內(nèi)冈闭,網(wǎng)絡號代表的是小區(qū)俱尼,主機號代表的是哪一號房間。這樣不同的小區(qū)就可以都有1001號房間了萎攒,但不會產(chǎn)生沖突遇八,因為他們的網(wǎng)絡號不同。
如下圖所示耍休,A刃永、B、C三類的最大主機數(shù)量羊精,很容易產(chǎn)生浪費揽碘。私密地址代表什么了,我們上學的時候IP都是172.16開頭的园匹,貌似很多大學的IP都是一樣的,你會問這不是產(chǎn)生沖突了嗎劫灶,只能說裸违,這些IP在局域網(wǎng)里面是正常使用的,一段到了公網(wǎng)后本昏,這個就會被替換成一個不沖突的IP了供汛,數(shù)據(jù)請求返回時,再被替換回來涌穆,這樣就保證了不沖突怔昨,詳情下面會說,現(xiàn)在有個概念就可以了宿稀。
怎么判斷是否是同一個局域網(wǎng)的IP地址了趁舀?
通過配置的子網(wǎng)掩碼。如下圖是一個C類的私有IP地址祝沸,網(wǎng)絡號為24位矮烹,主機號位8位越庇,廣播地址為192.168.1.255,一般默認的網(wǎng)關(guān)為192.168.1.1.將子網(wǎng)掩碼和IP地址按位與計算后奉狈,就可以得到網(wǎng)絡號了卤唉,也就可以判斷目標IP是否是要出網(wǎng)關(guān)了。
D類地址是組播地址仁期,也就是說這個組的網(wǎng)卡都會收到改組的數(shù)據(jù)桑驱。
此外還介紹一個特殊的IP地址,127.0.0.1跛蛋。他是個環(huán)回接口熬的,這個地址用于本機通信,經(jīng)過內(nèi)核處理后直接返回給本機问芬。
Linux中配置IP地址如下:
sudo ifconfig eth1 192.168.1.174/24 //給eth1這個網(wǎng)卡配置IP和子網(wǎng)掩碼
sudo ifconfig eth1 up // 啟動
簡單的數(shù)據(jù)發(fā)送過程:系統(tǒng)會判斷數(shù)據(jù)包的目標IP是不是在同一個網(wǎng)段中悦析,如果是是同一個網(wǎng)段,他會通過ARP協(xié)議廣播獲取目標IP的MAC地址此衅,直接發(fā)送給目標即可强戴。如果是跨網(wǎng)段,那么獲取網(wǎng)關(guān)的MAC地址挡鞍,把數(shù)據(jù)發(fā)給網(wǎng)關(guān)就不管了骑歹。
2、DHCP協(xié)議(動態(tài)路由協(xié)議)
日常生活中墨微,我們都是插上網(wǎng)線就可以用了道媚,并沒有配置IP啊。那么這個過程就會使用到了DHCP協(xié)議翘县,由DHCP服務器管理了IP的分配最域,并分給剛來的網(wǎng)卡一個可用的IP。
簡單說DHCP就是負責管理IP地址的锈麸,簡單镀脂。不過我所在的公司為了可控都是采用靜態(tài)IP的。需要管理員分配IP并配置忘伞。
DHCP工作工程:
想想一個剛來的電腦怎么才能和DHCP服務器聯(lián)系了薄翅,畢竟它什么也不知道,這時候廣播地址就派上用場了氓奈。新的電腦就會使用0.0.0.0這個IP地址翘魄,目的IP為255.255.255.255.源端口為68,目標端口為67舀奶,發(fā)送一個UDP的廣播暑竟。這樣DHCP服務器收到了,就知道新來了一個電腦需要IP育勺,服務器就選擇一個IP光羞,也是通過廣播的方式發(fā)送IP绩鸣、子網(wǎng)掩碼、網(wǎng)關(guān)等相關(guān)信息纱兑。這樣新的電腦會收到了一個IP地址呀闻,但是如果要是多個DHCP發(fā)送了多個IP了?新的電腦會選擇一個IP潜慎,繼續(xù)發(fā)送廣播包捡多,告訴DHCP服務器,自己所選用的IP號和一些其他信息铐炫,當然DHCP服務器收到了廣播后垒手,會返回給新電腦一個ACK確認包,這樣一次完整的DHCP過程才算結(jié)束倒信。
DHCP服務器會不僅可以動態(tài)分配IP科贬,還可以回收IP,正所謂有借有還再借不難嘛鳖悠,DHCP服務器會在租期時間結(jié)束的時候自動的回收IP該IP榜掌。但如果網(wǎng)卡的IP還要用該怎么辦了?客戶端租期時間過去的時候就重新向服務器發(fā)送請求乘综,客戶端收到服務器的返回后憎账,就會更新新的租賃參數(shù)。
3卡辰、從物理層到數(shù)據(jù)鏈路層
開始我們就說了胞皱,物理層解決的是,如何在傳輸媒體上傳輸比特流九妈,而不是指具體的媒體反砌,如雙絞線、無線等萌朱,抽象的作用于颖。通過調(diào)制解調(diào)器將電信號和模擬信號進行轉(zhuǎn)化等等。物理層完成的是對硬件層的封裝嚷兔。
此外物理層還需要對數(shù)據(jù)幀再次封裝,加一個起始頭做入,不然怎么知道這是不是一個數(shù)據(jù)幀了冒晰。
接下來是數(shù)據(jù)鏈路層:
先給拋幾個問題:
- 1、數(shù)據(jù)包是誰都可以接收嗎竟块?
- 2壶运、發(fā)送的時候有錯誤該怎么辦?
- 3浪秘、解析的時候怎么正確的解析蒋情,而不導致錯誤埠况,如ARP協(xié)議和IP協(xié)議格式肯定不一樣。
- 4棵癣、發(fā)送的時候會不會有順序的問題了辕翰?
為了解決上面幾個問題,先給出數(shù)據(jù)幀的封裝格式:
第一個問題:數(shù)據(jù)包當然不是誰都可以接收的狈谊,但都在一個局域網(wǎng)里面喜命,你發(fā)送的數(shù)據(jù)肯定都能收的到,只不過不是目標網(wǎng)卡自動過濾了消息罷了河劝。只有數(shù)據(jù)幀的目標MAC和自身網(wǎng)卡的MAC地址相匹配才可以接收壁榕。當然這本身就是個漏洞,自己捯飭捯飭不是自己MAC的數(shù)據(jù)幀也能收到赎瞎,所以在網(wǎng)上傳輸?shù)臄?shù)據(jù)本身就是不安全的牌里。
第二個問題:為了保證數(shù)據(jù)的完整值,總得有個標志對吧务甥。因為在網(wǎng)上傳輸?shù)倪^程中很有可能出現(xiàn)錯誤的情況牡辽。當封裝成幀發(fā)送的時候,會將數(shù)據(jù)通過算法生成一個CRC檢驗值缓呛。這樣下一跳收到的時候催享,也會生成該數(shù)據(jù)的CRC。如果兩者的CRC校驗值是相等的哟绊,那么就認為是完整的因妙,才會走下列流程。反之票髓,丟棄不管了攀涵。
第三個問題:通過兩字節(jié)的類型就可以判斷此時傳輸?shù)氖鞘裁磪f(xié)議,通過標志來代表是什么業(yè)務洽沟。筆者在制定公司的通訊的協(xié)議時以故,也是通過和服務端協(xié)商將不同的標志代表不同的業(yè)務。如果是IP數(shù)據(jù)就用IP格式的方式解析即可裆操。
第四個問題:
當在局域網(wǎng)發(fā)送數(shù)據(jù)幀的時候怒详,先偵聽信道是否空閑 ,若空閑,則立即發(fā)送數(shù)據(jù)踪区。若信道忙碌昆烁,則等待一段時間至信道中的信息傳輸結(jié)束后再發(fā)送數(shù)據(jù);若在上一段信息發(fā)送結(jié)束后缎岗,同時有兩個或兩個以上的節(jié)點都提出發(fā)送請求静尼,則判定為沖突。若偵聽到?jīng)_突,則立即停止發(fā)送數(shù)據(jù),等待一段隨機時間,再重新嘗試鼠渺。這就是CSMA/CD協(xié)議鸭巴,由于沖突的認定的時間為2T,小于2T的時間內(nèi)又回來了拦盹,這說明信道空閑則發(fā)送鹃祖。所以數(shù)據(jù)幀的最小大小要為64byte,而且數(shù)據(jù)線還不能大于100米掌敬,否則會造成認定時間錯誤惯豆。
當出了局域網(wǎng)后,進入了公網(wǎng)奔害。不管三七二十一楷兽,有數(shù)據(jù)包出來就發(fā)送。這樣造成了數(shù)據(jù)沖突怎么辦华临,他就不管了芯杀,反正他也管不了,沒法知道數(shù)據(jù)已經(jīng)沖突了雅潭,這就交給傳輸層解決揭厚。反正數(shù)據(jù)鏈路層我就是盡量的發(fā)送。
此外還可以通過劃分信道的方式扶供。如ADSL技術(shù)筛圆,早期的時候用電話線邊打電話邊上網(wǎng)。ADSL技術(shù)采用頻分復用技術(shù)把普通的電話線分成了電話椿浓、上行和下行三個相對獨立的信道太援,即電話和上網(wǎng)發(fā)送數(shù)據(jù)的頻率不一致。從而避免了相互之間的干擾扳碍。用戶可以邊打電話邊上網(wǎng)提岔,不用擔心上網(wǎng)速率和通話質(zhì)量下降的情況。
工作在數(shù)據(jù)鏈路層的設備是交換機笋敞。接下來說明下交換機和集線器的區(qū)別:
集線器很簡單碱蒙,當有數(shù)據(jù)包經(jīng)過他的時候,什么也不管不判斷夯巷,直接進行廣播轉(zhuǎn)發(fā)了赛惩。
相比較集線器,交換機就智能多了趁餐,他增加了判斷功能喷兼。如下圖,機器1發(fā)送一個ARP廣播尋找機器2的MAC地址的時候澎怒。當2收到了之后,他會直接響應,當交換機A也能收到喷面,他也會進行發(fā)送廣播給右邊的局域網(wǎng)星瘾,但是交換機A會發(fā)現(xiàn)機器2的MAC地址不是在右邊。所以當機器1再次通過ARP尋找機器2MAC地址的時候惧辈,交換機A就不會再轉(zhuǎn)發(fā)到右邊的局域網(wǎng)中了琳状,因為它可以記住。若是換成Hub(集線器)盒齿,它從不解析包念逞,直接轉(zhuǎn)發(fā)。
但是這么好用的交換機也會帶來新的問題边翁,如果交換器成一個環(huán)的時候翎承,那么就會出現(xiàn)無限循環(huán)-復制-再循環(huán)的問題,最終會塞滿整個網(wǎng)絡符匾。解決辦法就是將一個環(huán)通過算法解析成一棵樹的形式叨咖,這就是STP協(xié)議。詳細內(nèi)容我也不太懂啊胶,感覺意義不太甸各,以后有空再研究了。
4焰坪、ICMP協(xié)議(互聯(lián)網(wǎng)控制報文協(xié)議)
首先為什么未出現(xiàn)這個協(xié)議了趣倾?ICMP協(xié)議是在網(wǎng)絡層中,它是在IP協(xié)議的上面某饰,說明IP協(xié)議是為ICMP協(xié)議服務的儒恋。因為網(wǎng)絡世界錯綜復雜,當一個數(shù)據(jù)包在網(wǎng)絡傳輸不能到達的時候露乏,你得知道是怎么回事吧碧浊,是生命周期都用完了都找不到,還是終點不可到達了瘟仿。作為一個成熟的網(wǎng)絡協(xié)議箱锐,必須要心里有數(shù)。有了問題我就給你發(fā)個ICMP包劳较,這樣你就知道當前是什么情況了驹止。
通過TYPE和CODE就知道當前是問題了,下面是從百度百科中截取的部分對照表观蜗。
ICMP的一個方式就是差錯報文類型臊恋,另一個是查詢報文類型ping命令。
從TYPE角度來看墓捻,終點不可達為3抖仅,源主機抑制為4(目標主動停止),超時為11(生命周期SST用完了)。這樣就知道當前怎么回事了撤卢。CODE是更加詳細的問題描述环凿,0代表網(wǎng)絡不可達,1代表主機不可達等等放吩。
ping命令
在公司智听,每次連不上服務器,運維大佬都會先說下渡紫,先ping一下到推,檢查網(wǎng)絡之間是不是通的。當然這個也不是十分準確的惕澎,有的時候服務器會過濾掉ICMP協(xié)議的內(nèi)容莉测,最好改用Telnet。
這個ping命令發(fā)出去的包是符合ICMP協(xié)議的集灌。這個是主動查詢報文類型悔雹,如上圖的ICMP報文格式中,ping的類型多了標識符欣喧,序號和數(shù)據(jù)腌零。其中標識符代表不同的任務,序號代表為了這個任務發(fā)送了多個數(shù)據(jù)包唆阿,總得給不同的數(shù)據(jù)包標個序號吧益涧,這樣就會知道誰回來啦,誰沒回來驯鳖。
比如ping 192.168.1.2(位于筆者電腦同一個局域網(wǎng)中)
開始執(zhí)行的時候闲询,主機會構(gòu)建一個ICMP包,TYPE為8浅辙,CODE為0扭弧。這樣就代表ping請求了。并分配一個標識符记舆,和順序號鸽捻,每發(fā)一個數(shù)據(jù)包,順序號都會自動加一泽腮。有了順序號就會就算往返時間了御蒲,在一定時間沒返回,就會被認為是不可到達诊赊。ICMP數(shù)據(jù)包就會到達IP層厚满,封裝層IP數(shù)據(jù)包。當然也會用到192.168.1.2碧磅、ARP獲取目標MAC地址等等碘箍。這樣目標收到后遵馆,開始解析,對比是不是自己的丰榴。數(shù)據(jù)鏈路層檢查后团搞,交給IP層,最后再到了ICMP層多艇。ICMP會分析傳遞的內(nèi)容,并構(gòu)建一個響應的ICMP像吻,TYPE=0峻黍,CODE=0,順序號一致拨匆,返回回去姆涩。這樣一個簡單的ping操作就完成了。
ICMP差錯報文類型的使用
Windows中使用tracert ip命令惭每,就可以查看每一跳的IP地址了骨饿,這就是利用了ICMP協(xié)議,通過設置TTL值台腥。當TTL=1的時候宏赘,那么經(jīng)過了第一個網(wǎng)卡后就掛了,會返回一個帶有當前IP的ICMP數(shù)據(jù)包黎侈。再設置TTL=2察署,這樣就拿到了第一個網(wǎng)卡的IP地址。通過欺騙的方式還有很多峻汉,通過設置數(shù)據(jù)包不分片來獲取沿途的MTU大小贴汪。當然還有其它的應用了。
5休吠、IP協(xié)議
一臺電腦怎么上網(wǎng)扳埂?先配置網(wǎng)卡,IP地址瘤礁、子網(wǎng)掩碼和默認網(wǎng)關(guān)阳懂。DHCP可以默認配置的。網(wǎng)關(guān)是很重要的蔚携,沒有網(wǎng)關(guān)希太,你的電腦根本到不了其他的網(wǎng)段,因為網(wǎng)關(guān)是到達英特網(wǎng)的下一跳酝蜒。
IP是面向點對點的誊辉,通俗的說就是找到該網(wǎng)卡的設備。如上圖所示亡脑,先說明每個字段的基本含義再說堕澄。
- 版本 : IP版本邀跃,IPV4(32位) 、IPV6(128位)
- 首部長度:頭部長度
- TOS:設置優(yōu)先級蛙紫、吞吐量拍屑、延遲信息
- 總長度: 首部和數(shù)據(jù)之和的長度
- 標識:IP軟件在存儲器中維持一個計數(shù)器,每產(chǎn)生一個數(shù)據(jù)報坑傅,計數(shù)器就加1僵驰,并將此值賦給標識字段。當數(shù)據(jù)報由于長度超過網(wǎng)絡的MTU而必須分片時唁毒,這個標識字段的值就被復制到所有的數(shù)據(jù)報的標識字段中蒜茴。相同的標識字段的值使分片后的各數(shù)據(jù)報片最后能正確地重裝成為原來的數(shù)據(jù)報。
- 標志:前只有2位有意義浆西。MF=1即表示后面“還有分片”的數(shù)據(jù)報粉私。MF=0表示這已是若干數(shù)據(jù)報片中的最后一個。只有當DF=0時才允許分片近零。
- 片偏移:較長的分組在分片后诺核,某片在原分組中的相對位置。
- 生存時間:每到一個路由器久信,就需要減一窖杀,到0時候停止發(fā)送。
- 協(xié)議:協(xié)議字段指出此數(shù)據(jù)報攜帶的數(shù)據(jù)是使用何種協(xié)議裙士,TCP/UDP/ICMP/IGMP,以便使目的主機的IP層知道應將數(shù)據(jù)部分上交給哪個處理過程陈瘦。
- 首部校驗和:路由器都要重新計算一下首部檢驗和
- 最主要的是目標IP和源IP地址(代表了面向點對點)
你的電腦訪問另外一臺電腦可以分為兩種情況,一是同網(wǎng)段的訪問潮售,另一種便是不同網(wǎng)段的訪問痊项。
公共點:都先要通過子網(wǎng)掩碼判斷是不是同一個網(wǎng)段,若是同一個網(wǎng)段就不關(guān)網(wǎng)關(guān)什么事了酥诽。
如果判斷是不同網(wǎng)段鞍泉,那就開始分裝傳輸層、IP協(xié)議頭肮帐、將自己和網(wǎng)關(guān)的MAC地址分裝起來咖驮,開始發(fā)送。網(wǎng)關(guān)會開始解析出目標MAC地址训枢,發(fā)現(xiàn)是自己的托修。然后在解析出IP頭,判斷這個數(shù)據(jù)包要到那里去恒界。這里可以通過靜態(tài)路由表或者動態(tài)路由來查詢下一跳是誰睦刃。然后將解析出的數(shù)據(jù)包開始一層層的分裝。只不過這時候的源MAC地址是網(wǎng)關(guān)的十酣,目標MAC地址改成了下一跳的MAC地址了涩拙。所以說际长,每經(jīng)過一跳MAC地址都會改變。
從網(wǎng)關(guān)的角度劃分兴泥,可以分為轉(zhuǎn)發(fā)網(wǎng)關(guān)和NAT網(wǎng)關(guān)工育。
為什么會出現(xiàn)NAT網(wǎng)關(guān)了?這是因為私有IP的出現(xiàn)搓彻,比如你學校上網(wǎng)的IP是192.168.1.101如绸,合工大的也有一個IP叫做192.168.1.101。這個時候你去訪問他旭贬,你要是直接進行訪問竭沫,那是不可能的教届,你的電腦直接就會判斷這是訪問我自己的钞翔。所以這個時候要進行轉(zhuǎn)換IP泣洞,NAT網(wǎng)關(guān)就是這樣作用的。
現(xiàn)在就以NAT網(wǎng)關(guān)為例靶端,探討A與B通信過程:
顯然服務器A和B的地址是一樣的,但是這個地址僅限于局域網(wǎng)中凛膏,首先服務器B有一個國際的IP杨名,假設是192.168.56.2。網(wǎng)關(guān)B上有一個記錄猖毫,192.168.56.2對應了局域網(wǎng)中的192.168.1.101這個地址台谍。
這個時候A開始發(fā)送數(shù)據(jù)包了:
源IP為192.168.1.101,目標IP為192.168.56.2吁断,目標MAC為網(wǎng)關(guān)A的趁蕊。
網(wǎng)關(guān)A收到了數(shù)據(jù)包后,開始解析仔役。找到下一跳掷伙,并發(fā)送給了192.168.56.2,此時A也要有個國際的身份192.168.56.1又兵,那么發(fā)送包的內(nèi)容是:
源IP為192.168.56.1任柜,目標IP為192.168.56.2,目標MAC為192.168.56.2的沛厨。
數(shù)據(jù)包到達了192.168.56.2這個口后宙地,因為路由器B是一個NAT網(wǎng)關(guān),開始將192.168.56.2這個地址轉(zhuǎn)換成192.168.1.101逆皮,于是改成訪問了192.168.1.101這個網(wǎng)卡了宅粥。經(jīng)過這樣的過程就達到了替換的過程了。當然了真實的替換是比較復雜的电谣,都會有相應的算法記錄粹胯,絕不是簡簡單單的通過IP地址來的蓖柔,這里就一帶而過了。
通過訪問https://www.whatismyip.com就可以訪問到自己公共的IP地址了风纠。
IP路由協(xié)議:
接下來說說IP路由協(xié)議况鸣,網(wǎng)絡層的一個很重要的作用就是提供IP選址的服務。路由協(xié)議分為靜態(tài)路由協(xié)議和動態(tài)路由協(xié)議竹观。
靜態(tài)路由協(xié)議:
配置靜態(tài)路由镐捧,就是給一個網(wǎng)卡設置一個路由規(guī)則,一個簡單的路由規(guī)則包括目標IP臭增、從哪個口出去懂酱、下一跳的網(wǎng)關(guān)。
Windows中靜態(tài)路由操作:
route add 10.253.251.0 mask 255.255.255.0 -p 192.254.1.1 //添加一條靜態(tài)路由
route add 10.253.251.0 mask 255.255.255.0 -p 192.254.1.1 // 刪除
靜態(tài)路由一般用于網(wǎng)絡的拓撲簡單的情況下誊抛。復雜的網(wǎng)絡下列牺,會牽一發(fā)動全身,復雜會指數(shù)的增加拗窃。
動態(tài)路由協(xié)議:
如果能夠動態(tài)的根據(jù)網(wǎng)絡的實際情況生成路由表瞎领,那就太好了,別怕随夸,動態(tài)路由算法拯救你九默。歸根結(jié)底,網(wǎng)絡就是一張復雜的圖宾毒,動態(tài)路由協(xié)議就是找一個最小路徑驼修。大學的數(shù)據(jù)結(jié)構(gòu)中,有兩種策略诈铛,一種是深度遍歷乙各,另一個是廣度遍歷。
第一大類算法是基于BellmanFork算法的距離矢量路由幢竹∶俜幔基本思路是:每個路由器都會保存一個全局的路由表,每條數(shù)據(jù)就是目標IP和到達目標IP的距離妨退。每隔一段時間妇萄,每個路由器就將自己的路由表情況告訴鄰居,每個路由表在對照自己的路由表咬荷,進行更新操作冠句。
缺點就是:每次發(fā)送全局的路由表,極度的冗余幸乒;對于一個路由器掛掉了這樣的消息就有問題了懦底,別的路由器會一直的從鄰居那里獲取到達壞掉的路由器的距離,這樣一直一直增長超過最大值罕扎,才會認為這個路由器斷掉了聚唐。
第二類算法是基于Dijkstra算法的鏈路狀態(tài)路由算法丐重。他的基本思路就是,一個路由啟動的時候杆查,他會給鄰居發(fā)一個消息扮惦,鄰居在回復,時間除以二就是距離了亲桦。再將這個路由廣播出去崖蜜,這樣整個網(wǎng)絡就知道了。每個路由器就有了一張圖客峭,再用路由表進行Dijkstra算法找到最短路徑豫领。
6、UDP協(xié)議(傳輸層):
先回顧下舔琅,網(wǎng)絡層完成的是找到目標設備等恐,但是找到了目標設備還遠遠的不夠,因為一個設備有很多進程备蚓。所以傳輸層的任務就是找到目標地址的目標端口课蔬。
簡單的說下,UPD和TCP的區(qū)別:1星著、TCP是面向連接的,UDP是無連接的粗悯。所謂的建立連接虚循,是指客戶端和服務端通過三次握手,建立一個雙方的數(shù)據(jù)結(jié)構(gòu)样傍,這樣就知道對方處于什么狀態(tài)下了横缔,就這叫做面向連接的。2衫哥、TCP的面向連接茎刚,可以做到可靠性的數(shù)據(jù)傳輸,UDP則是不安全的撤逢。3膛锭、TCP是面向字節(jié)流的,這意味著接受者接收的時候接收的一個流蚊荣,而UDP繼承了IP包特性初狰,發(fā)和收都是一個個包。4互例、TCP是通過擁塞窗口可以做到擁塞控制奢入。
從UDP協(xié)議頭就可以看出UDP相當簡單,源目標端口號媳叨、長度腥光、校驗值和數(shù)據(jù)外就沒了关顷。
因為簡單,在已下的場景用的比較多:
- 內(nèi)網(wǎng)情況武福,網(wǎng)絡比較好议双。
- 對丟包不太敏感的,如直播
- 廣播主播的應用艘儒,不是一對一建立連接的聋伦。
雖然UDP比較簡單,但應用比較多界睁,很多是基于UDP協(xié)議進行的二次封裝觉增,這樣既保證了可靠性,也具備了速度翻斟。如谷歌提出的QUIC應用層協(xié)議逾礁,可以快速的建立連接、減少重傳時延访惜、自適應擁塞控制等等嘹履;
7、TCP協(xié)議
摘自百度百科债热,看戲每個字段的含義:
- Source Port是源端口砾嫉,16位。
- Destination Port是目的端口窒篱,16位焕刮。
- Sequence Number是發(fā)送數(shù)據(jù)包中的第一個字節(jié)的序列號,32位墙杯。
- Acknowledgment Number是確認序列號配并,32位。
- Data Offset是數(shù)據(jù)偏移高镐,4位溉旋,該字段的值是TCP首部(包括選項)長度除以4。
- 標志位: 6位嫉髓,URG表示Urgent Pointer字段有意義:
- ACK表示Acknowledgment Number字段有意義
- PSH表示Push功能观腊,RST表示復位TCP連接
- SYN表示SYN報文(在建立TCP連接的時候使用)
- FIN表示沒有數(shù)據(jù)需要發(fā)送了(在關(guān)閉TCP連接的時候使用)
- Window表示接收緩沖區(qū)的空閑空間,16位算行,用來告訴TCP連接對端自己能夠接收的最大數(shù)據(jù)長度恕沫。由此做到流量控制。
- Checksum是校驗和纱意,16位婶溯。
- Urgent Pointers是緊急指針,16位,只有URG標志位被設置時該字段才有意義迄委,表示緊急數(shù)據(jù)相對序列號(Sequence Number字段的值)的偏移褐筛。
TCP三次握手
- 開始都是CLOSED狀態(tài),A發(fā)送一個SYN=1叙身,代表開始同步請求渔扎,seq=x代表數(shù)據(jù)包第一個字節(jié)的序列號。A由此進入到SYN-SENT等待連接狀態(tài)信轿。
- B收到A請求連接后晃痴,由LISTEN監(jiān)聽狀態(tài)到達SYS-RCVD狀態(tài)〔坪觯回復數(shù)據(jù)包括倘核,SYN=1代表我也是請求連接,seq=y代表我的開始字節(jié)號是y即彪。ACK=1代表收到了你的請求紧唱,ack=x+1代表是對你的序號為x的確定。
- A收到了B的響應后就進入到了連接狀態(tài)了隶校,那么對于A來說已經(jīng)處于連接狀態(tài)漏益,B還不是,所以A還要個B發(fā)一個響應深胳。ACK=1 ack=y+1代表對序列號為y的確認绰疤。B收到后,才算三次握手結(jié)束舞终。
面試的時候總是問轻庆,為什么要三次握手了,兩次行不行权埠?三次握手是個折中辦法榨了,并不是非臣宓可靠攘蔽,100次握手也不可靠,但肯定不能無限的握手吧呐粘,所以就三次了满俗。兩次不行的原因是,A來說一次響應一次回復收到作岖,代表A連接成功唆垃,那么B卻是只發(fā)了一個請求,并沒與響應痘儡,對B來說就一點也不可靠了辕万。所以得B也收到了響應才算握手成功。只要雙方的消息都有來有回就可以了。
三次握手的作用處理建立連接之外渐尿,還是雙方確定對方數(shù)據(jù)包的開始位置即序號的起始醉途。這樣才可以為為以后收發(fā)數(shù)據(jù)做好準備了。
TCP四次揮手
為什么揮手要四次砖茸,握手三次就可以了隘擎?因為A數(shù)據(jù)傳輸結(jié)束后想結(jié)束握手,但不確定B的數(shù)據(jù)就一定傳輸完成了啊凉夯,只有B的數(shù)據(jù)傳輸完成后才會發(fā)送傳輸結(jié)束請求货葬。
- 開始A發(fā)送FIN=1代表想結(jié)束這次會話開始進入到FIN-WINT-1狀態(tài)
- B收到了,響應A剛才的請求劲够,代表我同意你的結(jié)束請求震桶,但此時并不是真正的斷開連接。
- 等到B數(shù)據(jù)傳輸完成后再沧,也發(fā)一個斷開連接請求尼夺,F(xiàn)IN=1,ACK=1炒瘸,同時也是對上一次響應的回復淤堵。
- A收到了斷開連接請求并沒有馬上進入到CLOSED狀態(tài),這是防止發(fā)給B的響應B并沒有收到顷扩,只有需要等待2MSL周期才認為結(jié)束拐邪,同時B收到了A的響應消息就進入到了CLOSED狀態(tài)。A在超過2MSL外又收到了B的斷開連接請求后隘截,會發(fā)送一個RST=1的響應扎阶,告訴B我早就斷開連接了。
滑動窗口機制
首先滑動窗口機制解決了數(shù)據(jù)包的順序問題婶芭、丟包問題和流量控制东臀。它是發(fā)送方的一個機制,記錄了當前發(fā)送方的數(shù)據(jù)包發(fā)送情況犀农,哪些發(fā)送了惰赋,哪些確認了,哪些需要重發(fā)等等呵哨。如圖所示:
- 1-3 代表了服務端響應已經(jīng)收到了赁濒,這時客戶端就可以將其從緩存中去掉
- 4-9 代表了客戶端已經(jīng)發(fā)送了,但還沒得到確認孟害,至于服務端收沒收到不確定
- 10-12 代表了還沒發(fā)送卻可以發(fā)送拒炎,因為當前網(wǎng)絡是可以忙的過來的
- 13-15 代表了不僅沒發(fā)送,這會還不能發(fā)送挨务,要不然會讓網(wǎng)絡擁塞
- 1-5代表我也經(jīng)接收了击你,并且已經(jīng)確認過的
- 6-14代表還沒接收到玉组,這是接收端還能接收到的最大數(shù)量了
- 15代表,不能接收的丁侄,接收了就處理不過來了
此時接收端的滑動窗口大小為:等待接收未確認的這部分球切,接收端會將這個值一同的返回給發(fā)送端,和發(fā)送端一起調(diào)節(jié)流量發(fā)送速度绒障。
順序問題和丟包問題
假設8和9接收端已經(jīng)收到了吨凑。但是這時還不能接收,因為6/7還沒有來户辱,這就出現(xiàn)了順序問題鸵钝。假設4-7全部丟失了,那么接收端該怎么處理了庐镐,其實接收端會有個計時器恩商,如果超過一定的時間(時間是根據(jù)網(wǎng)絡情況自動的調(diào)節(jié)的),就默認丟了必逆,就會重新的發(fā)送怠堪。
流量問題
流量是針對接收方來說的,如果接收方處理不過來名眉,就會響應時一并發(fā)送窗口大小粟矿,如果窗口不斷的變小,那么接收端也會調(diào)節(jié)大小损拢。這樣就會使接收方發(fā)送的數(shù)據(jù)減少陌粹。
擁塞窗口機制
擁塞窗口是為了解決網(wǎng)絡擁塞的問題,滑動窗口則是解決接收端緩存過大問題福压。
擁塞窗口采用的慢開始掏秩、擁塞控制、快重傳荆姆、快恢復的方法蒙幻。
發(fā)送端建立一個擁塞窗口,該窗口大小使用擁塞窗口和滑動窗口一并控制的胆筒。發(fā)送端先發(fā)送一個1字節(jié)的試探報文邮破,這叫做慢開始。當收到第一個字節(jié)的數(shù)據(jù)的確認后腐泻,再發(fā)送2個字節(jié)的報文决乎;依次以2次方數(shù)量發(fā)送队询,發(fā)送到什么時候為止了派桩,這就開始設置一個閾值。小于它就指數(shù)增長蚌斩,大于的時候就改用線性增長铆惑,每次加一個字節(jié)。當出現(xiàn)丟包的時候,就將發(fā)送值改成1字節(jié)员魏,再將慢開始門限設為原先的一半丑蛤,重新的走遍開始的流程。
當接收端發(fā)現(xiàn)中間丟失了一個數(shù)據(jù)包的時候撕阎,發(fā)送三個前一個數(shù)據(jù)包的確認包受裹,于是發(fā)送端就是快速重傳,這就是快重傳虏束。將起點設置為之前的一半棉饶,這樣就不用從1個數(shù)據(jù)包開始發(fā)了。但是之后就改成了線性增長了镇匀。