tcp協議的主要功能是什么_前端要知道的網絡知識一:TCP/IP 協議到底在講什么...

5722ab28274e3738fed019c163eaad31.png

你之所以不知道那套書在講什么,是因為你還沒有認識到網絡協議有什么用,怎么用,以什么形式在使用,網絡協議的概念很簡單,就幾句話,你只知道網絡協議的概念,只知道很多大神都推薦這套書,都強調網絡協議的重要性,于是你就去找了這本書,然后看著書上的每個字你認得,串在一起就不知道在講什么!那是因為網絡協議本來就很抽象,你要把抽象的網絡協議形象化才能更好的理解,最好是先理解具體的網絡協議是起什么作用,然后再學習它的工作過程。

你把網絡協議想象成人與人之間的禮儀行為,不同的場合有不同的禮儀行為,人是實施不同禮儀行為的主體。同樣,網絡設備是實施網絡協議的主體,網絡設備通過運行網絡協議與其他的網絡設備進行交流。同樣的道理,你的電腦想要與網絡設備交流,也要與網絡設備一樣運行網絡協議,網絡協議也是一個軟件,是以系統組件的方式安裝在你的電腦的操作系統里的。想象一下,你想在你的電腦上通過QQ與朋友聊天的前提是不是你的電腦和朋友的電腦上都安裝有QQ這個軟件?

我一直覺得對于計算機網絡初學者來說,知道“為什么這么做”比“知道怎么做”更重要,雖然經歷知道“為什么這么做?”的過程很痛苦,但一旦過了這個階段,“知道怎么做”也就水到渠成了。但是對于初學者來說,真沒必要那么深入地學習網絡協議的細節,你只需要理解常見協議(例如HTTP、FTP、DHCP、DNS、ARP等常見協議)的工作過程,你理解了這些協議,理解其他的協議就是依葫蘆畫瓢,雖然計算機網絡很講究知識的積累,但如果你一開始把太多的精力放在了解細節上就會陷進只見樹木不進森林的境地。

例如,數據包的結構,瀏覽一下各字段的作用就可以了,能記住就記住,記不住也沒關系,你只需要先重點理解ip頭部里的目的地址、源地址和tcp頭部里的目的端口號、源端口號。

9b870e3b1370bf6b942cf705614dca4c.png

在日常生活中,我們要傳遞信息,以前最常用的手段是郵寄信件,想象一下你寫信寄信的過程,寫信產生數據,寄信傳遞數據,標準的信件格式是要在信封上寫“收信人地址”和“寄信人地址”(由此引入IP地址),“收信人地址”對應數據包里IP頭部中的“目的ip地址”,“寄信人地址”對應數據包里IP頭部中的“源ip地址”,寫上寄信、收信兩個地址就可以保證信件可以郵寄到目的地了。

2780cd55d44422512f30d7a0868bcaae.png

但信件郵寄到目的地址后由誰來收?從上面這封信的收件人地址檢索到這個地址是“沈陽大學”的,沈陽大學里可能住著幾萬人,那你這封信是郵寄給居住沈陽大學里的那個人的?收件人不明確,郵局就算幫你把信件送到這個地址,也沒辦法幫你投遞到具體的收信人。

因此,我們郵件信件需要填寫“收件人姓名”、“收件人地址”和“寄件人姓名”、“寄件人地址”的組合,這樣才能保證信件能準確投遞到具體的收件人手中。

25a263d75aea2da1ff34797dc553a40a.png

所以我們要在信件上添加收信人姓名寄信人姓名(由此引入端口號),這個時候收件人姓名就對應數據包里TCP協議頭部中的目的端口號,寄信人姓名對應數據包里TCP協議頭部中的源端口號。

我們再來對比傳遞信件與傳遞數據包的過程:

1.首先是位于南寧的李小明給沈陽的王小花通過QQ發送了一條消息,李小明的電腦將此消息打包成TCP數據包發送到計算機網絡中,計算機網絡通過數據包中的目的IP地址把該數據包準確傳遞到王小花的電腦。

eaf86c569f260dc53363d6f51a7ac1bd.png

2.王小花的電腦收到了李小明的電腦發送過來的數據包,但是王小花的電腦上同時運行有多個程序(例如圖中的QQ和微信),雖然王小花的電腦知道這個數據包是傳輸給它的,但是它不知道該把這個數據包中的數據交給那個程序(就像上面講的,信件雖然郵寄到了沈陽大學,但沈陽大學里住著那么多人,這封信上沒有標示說是郵寄給誰的)。

97ee04af91e772c7e2960747a41c063a.png

3.針對以上的問題。如果我們使用數據包結構中的源端口號和目的端口號,根據不同的程序使用不同的端口號來發送和接受數據,這樣數據包就能像郵寄信件一樣準確投遞到具體的電腦上指定的程序了。例如我們指定QQ和微信使用的端口號分別是8000和8080,那么只要你的電腦接收的數據包里目的端口號是8000,那這個數據包就是傳輸給QQ的。

2dfaeb746efd937e8399a597fff97475.png
553b838f4ae8601602fb1317803e9827.png

由上面的例子我們還可以引申出數據包結構中的其他字段的作用,例如我們收到信后可以簡單地通過信封是否完整來檢查該信件是否被別人在傳輸途中拆開并篡改過信件內容,那么我們怎么保證我們收到的數據包里的數據有沒有在中途被別人拆開修改過呢?數據包結構中有一個字段叫TCP校驗和就是專門做這個工作的。由數據包的字段可以看出,很多字段都有其用處,只是我們一開始學的時候沒必要學的那么仔細而已。

一定要形象地理解數據包,簡單的想一下,計算機網絡不就是幫助我們傳遞信息的嗎?對于郵寄信件來說,信息的載體是信紙和信封,那計算機網絡中信息的載體是什么?就是各種類型的數據包啊! 數據包里有我們關心的信息,也有我們不關心的花銷,我們要學的就是如何使網絡按照我們的要求傳遞信息。例如,我們郵寄信件,有平信,有掛號信,根據不同的應用場景選擇不同的郵寄方式。計算機網絡里信息傳輸也是一樣,針對不同的場景使用不同的協議, 有些場景需要多種協議同時配合使用。

上面那個QQ的例子不太嚴謹,因為QQ和微信的信息都是通過騰訊服務器中轉的,但你是初學者沒必要一開始就深究這些細節,總之要學會把一切抽象的東西都對照生活中的一些場景使之形象化。這樣你的學習過程就不會那么枯燥乏味了。

再來看一下為什么需要網絡協議,我們看下圖的簡單類比

2cfe2050e8923a6b20f59cd8e636f230.png

從上圖可以看出,我們郵寄信件只是想要把我們寫在信紙信息傳遞出去,對于我們來說,郵寄信件需要購買信封和郵票,這對于我們來說是沒有意義的,甚至我們會覺得連信紙都是多余的,因為還要購買信紙,我們只是想傳遞信息而已,信封、郵票和信紙對于我們來說是傳遞信息的額外花銷,但是沒有這些花銷,你的信息就無法通過郵局傳遞。同理,在計算機網絡里也是一樣的,我們的通過計算機網絡傳遞信息也需要額外的花銷,這些花銷體現在計算機網絡里就是TCP/IP的各種協議數據包的頭部(除去應用層數據之外的其他信息)。

你要知道計算機網絡里的數據交換都是像我們日常郵寄信件一樣通過各種的數據包來傳遞的,理解了數據包的作用之后你就應該開始學習計算機網絡是如何把數據包傳輸到目的地的?例如我們的電腦在生成數據包時是怎么知道對方電腦的ip地址的,(由此引入DNS)?我們的信件是最開始是通過郵局幫我們郵寄的,那么我們的電腦的數據包應該由誰來幫我們傳輸呢?(由此引入網關),網關又是如何幫我們把數據包傳輸到目的地的?(由此引入各種路由協議)。

所以,你想要學習網絡協議,就要先把一些基本的協議的作用和工作過程搞清楚,網絡設備還沒智能到人腦的程度,它是由人類創造出來的,它的工作過程肯定是符合人類的交流習慣,按照人類的交流習慣來設計的。所以要以人類的思維方式去理解這些協議。例如,你給別人打電話,不可能電話一接通你就啪啦啪啦地說一大通,萬一對方接通電話后因為有事還沒來得及傾聽呢?這不太符合正常人類的交流習慣。一般是電話接通后,雙方一般會有個交互的過程,一般是你說一聲“你好”,然后對方也回復一聲“你好”,雙方通過各自一句“你好”明確對方的注意力都放在了電話溝通上,然后你們雙方就可以開始交流了,這才是正常的人類交流方式,這個過程體現在計算機網絡里就是網絡協議!我們通過TCP協議在兩臺電腦建立網絡連接之前要先發數據包進行溝通,溝通后再建立連接,然后才是信息的傳輸。而UDP協議就類似于我們的校園廣播,廣播內容已經通過廣播站播放出去了,你能不能聽到,那就與廣播站無關了,正常情況下,不可能你說沒注意聽然后再讓廣播站再播放一次廣播內容。

同理,我們來看一下網絡廣播,對于某一個網絡的網絡廣播,只要發送一個網絡廣播包,這個子網里的所有電腦都能收到這些廣播包,這是一個很方便的通知機制,但是會增加對廣播數據不感興趣主機的處理負荷。類似我們的校園廣播,校園廣播一開啟播放,校園里的所有人都能聽到,但是不是所有人都對廣播內容感興趣,有些人選擇傾聽,有些人選擇忽略。但不管你是傾聽還是忽略,廣播的聲音都會傳到你的耳邊。例如,校園廣播一條失物招領通知,你根本沒丟東西,所以這個廣播內容與你無關,但是廣播的聲音還是會傳到你的耳邊。對比廣場舞音樂,對于跳廣場舞的大媽大嬸來說,這就是音樂,對于想睡覺的您來說,這就是噪音。

怎樣才能更好地理解常見的網絡協議?學習網絡協議就是要先學習它的工作過程,例如DHCP協議,協議大概是這樣講的:啟用了DHCP協議的電腦啟動后便會發送廣播數據包網絡中尋找DHCP服務器,如果網絡中有DHCP服務器,這臺DHCP服務器便會發送廣播數據包與你的電腦進行響應。

這個過程很簡單,就是我想要獲取ip地址,然后你給我提供一個。想象一下如果你是DHCP協議的設計者,你會考慮到在ip獲取和分配過程中會有哪些特殊情況呢?

第一種,如果在你啟動電腦的過程中網絡中的dhcp服務器剛好宕機了,這時怎么辦?讓你的電腦一直徒勞地發送尋找DHCP服務器的廣播包嗎?還是在發現沒有DHCP服務器與你響應后就再也不發了?還是每隔一段時間就再發送一次尋找DHCP服務器的廣播包?

第二種,如果DHCP服務器的可用ip地址剛好已經分配完了,那又怎么處理?

第三種,如果網絡中同時有兩臺以上的DHCP服務器,那又該怎么處理?

第四種,對于已經分配出去的ip地址就這么一直保持分配出去的狀態嗎?還是要回收?如果要回收?是我去問你還要不要使用這個ip地址?還是我設定一個回收的時間?只要你在這個時間段內你沒有再次聯系我重新獲取這個ip地址我就把它回收?

通過這樣的思考你可以發現,網絡協議其實也是按照人的思維方式在工作,但是網絡設備不會像人一樣思考,所以我們當初給它設計各種協議的時候就要盡可能地為它想到這些協議所要應對的場景。例如,你可以先學習ARP協議的工作過程,然后再百度搜索ARP攻擊是怎么回事?就是利用ARP協議設計的不嚴謹,偽造ARP數據包篡改網絡里其他電腦的ARP緩存列表。ARP協議采用廣播發送協議數據包,這就導致里網絡里的每一臺電腦都會收到ARP的協議數據包,而ARP協議規定即使你的電腦沒有發出arp請求,只要有ARP回應包到達你的主機,你就要對這些協議包進行處理,并將回應包中的mac和ip對應關系放入自己的arp緩存。如果ARP回應包里面的網關IP與ARP對應關系是正確的,這個問題不大,但如果有人在網絡中偽造了錯誤的網關IP與ARP對應關系并廣播到網絡里,那就出問題了,你可能也意識到你上不了網是因為網關IP對應的ARP對應關系出錯,但是沒有辦法,因為你的電腦上運行的ARP協議規定,你的電腦必須要接受這個錯誤的對應關系,這就是網絡協議設計的不嚴謹,設計和實現ARP協議的時候沒有想到居然會有人在網絡中偽造ARP回應包并廣播到網絡中。

如果你看《TCP/IP詳解》這套書覺得很吃力,那就建議暫時不要看了,強烈建議你先看《計算機網絡自頂向下方法與Internet特色》這本書,這本書對常見的網絡協議的工作過程進行了分析,可讀性很強,看起來比《TCP/IP詳解》輕松多了,了解了常見協議的工作過程你就可以動手做實驗來驗證這個協議的工作過程了,建議先使用模擬器來做實驗,像cisco packet tracer 就很好用,它有個模擬功能可以像看動畫一樣看到網絡數據包是如何在網絡拓撲結構中傳輸和交互的,對了解協議的工作過程非常有用,還有抓取數據包的功能,可以抓去指定協議的數據包進行查看。

使用真實設備通過在電腦上安裝抓包工具進行抓包也可以,只不過沒有模擬器上看得那么直觀,對于初學者還是建議先以模擬器做實驗為主,因為你可以很直觀地觀察你所設計的網絡的運行情況,更容易把心放在學習網絡協議的工作過程上。

你提問的是“TCP/IP協議到底在講什么?”,你可能不太了解,TCP/IP協議是一個協議族,是一大堆網絡協議的集合,你看的那套書有三卷,每一卷都是很厚的,就算其他大神能幫你用通俗易懂的文字表達出來,我估計這個帖子打印出來也不會比那本書薄很多,還是先從簡單的學起吧!

鏈接文章

https://www.zhihu.com/question/51074319/answer/124733136

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396970.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php統計字符個數,php中3種方法統計字符串中每種字符的個數并排序

//這個方法純粹是背函數,不解釋;function countStr($str){$str_arraystr_split($str);$str_arrayarray_count_values($str_array);arsort($str_array);return $str_array;}//以下是例子;$str"asdfgfdas323344##$\$fdsdfg*$**$*$**$$4435…

mysql創建定時器(event),查看定時器,打開定時器,設置定時器時間

為什么80%的碼農都做不了架構師?>>> 由于項目需要創建定時器(evevt),所以就百度了一下,發現基本都是來源于一個模板,有些功能還不全,現在自己總結一下。 注:mysql版本是…

音頻視頻

1.IOS視頻播放代碼(添加MediaPlayer.framework和#import) -(void)playMovie:(NSString *)fileName{//視頻文件路徑NSString *path [[NSBundle mainBundle] pathForResource:fileName ofType:"mp4"];//視頻URLNSURL *url [NSURL fileURLWithP…

二分查找、變形及應用

[LeetCode] 35 Search Insert Position 題目 Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.You may assume no duplicates in the array. 測試案例 Input: […

linux內核怎么修改屏幕旋轉方向_樹莓派4—屏幕旋轉

配置:樹莓派4raspberry pi系統,HDMI顯示,非觸屏。問題:想將屏幕旋轉90,按網上說的,方法一:在config.txt文件中添加display_rotate1,或者添加display_hdmi_rotate1,保存后…

周記隨筆-php5.6與apache2.4的windows32安裝

原材料:php.net , httpd.apache.org/download.cgi Apache的安裝 ,在下載頁面有依賴關系的說明 。 下載對應版本的壓縮包,解壓至目標目錄,例如D盤根目錄,首先修改配置 1 serverRoot: ServerRoot "c:/Apache24"…

獨家直播!阿里移動前端開源框架Weex揭秘

或許你寫過了很多行代碼,修過許多的bug,學過各種各樣的語言,卻只在一個最好的時機遇見了他…… 是啥? 敲!黑!板!跟!我!念!Weex~~&…

python異常值處理實例_利用Python進行異常值分析實例代碼

前言 異常值是指樣本中的個別值,也稱為離群點,其數值明顯偏離其余的觀測值。常用檢測方法3σ原則和箱型圖。其中,3σ原則只適用服從正態分布的數據。在3σ原則下,異常值被定義為觀察值和平均值的偏差超過3倍標準差的值。P(|x?μ|…

MSSQL 發布訂閱,實現讀寫分離

主庫做增刪改,從庫只讀。 大部分的數據庫壓力,都是由查詢引起的,讀寫分離可以減輕數據庫的壓力。 1、在(主)數據庫上對需要同步的數據進行發布。 2、在(從)數據庫上對(主)數據庫的發布進行訂閱。 注:發布訂閱都需要實際的服務器名…

php get為空,php – $_GET在url有變量時為空

我有一個看起來像這個reglph的文件?lang no_NO& passkey test并試圖獲取密碼變量,但它一直顯示為空白.當我嘗試print_r($_ GET);它打印Array()?!怎么會發生這種情況?該網站看起來像這樣print_r($_GET);include(..\libs\Smarty.class.php);?>A…

Block

1、認識Block Block封裝了一段代碼,可以在任何時候執行Block可以作為函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值,它和傳統的函數指針很類似,但是有區別:block是inline(內聯函數)的&#x…

堅持學習WF(8):本地服務之調用外部方法

WF提供了一組核心服務,例如在SQL 數據庫中存儲工作流實例的執行詳細信息的持久性服務,計劃服務,事務服務和跟蹤服務。除了這些WF也提供了另外一種服務,叫做Local Service也可以叫做Data exchange service。主要是實現工作流和宿主…

c++歸并排序_合并排序法

一、合并排序(Merge Sort) 就是將多個有序數據表合并成一個有序數據表。如果參與合并的只有兩個有序表,那么稱為二路合并。對于一個原始的待排序序列,往往可以通過分割的方法來歸結為多路合并排序。二、一個待排序的原始數據序列進行合并排序的基本思路是…

golang json數組拼接

2016年06月16日 15:38:25 閱讀數:2575 標簽: golang json 數組 更多 個人分類: golang func main() {a : []byte({"Parents": [ "aaaaa", "bbbbbbb" ]})b : []byte({"Parents": [ "Gomez"…

php課程設計實驗心得,PHP程序設計教程實驗及課程設計

部分 教程1 基礎教程1.1 簡介1.2 WampServer安裝1.3 PHP語法1.4 變量1.5 echo和print語句1.6 數據類型1.7 字符串函數1.8 常量1.9 運算符1.10 條件語句1.11 Switch語句1.12 循環語句1.13 函數部分 教程1 基礎教程1.1 簡介1.2 WampServer安裝1.3 PHP語法1.4 變量1.5 echo和print…

DRUID連接池的簡單使用

DRUID——為監控而生的DB池 1. DRUID介紹 DRUID是阿里巴巴開源平臺上一個數據庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日志監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池…

微習慣雖好,但是最重要的還是堅持

2019獨角獸企業重金招聘Python工程師標準>>> “微習慣”一詞是由美國的斯蒂芬蓋斯提出的。他以前是個宅男,懶蟲,為了改變自己而找到了這個方法。并且在自己身上實驗成功。養成了好的讀書、寫作和健身的習慣,實現了人生的華麗轉身。…

php手機端多圖預覽上傳,JS實現多圖預覽上傳的實例代碼

這篇文章主要介紹了JS實現多張圖片預覽同步上傳功能的相關資料,需要的朋友可以參考下廢話不多說了,直接給大家貼代碼了,具體代碼如下所示:/*** Created by liujing on 2017/5/10.*/$(document).ready(function($) {function changef(which,bu…

帶你了解zabbix整合ELK收集系統異常日志觸發告警~

今天來了解一下關于ELK的“L”-Logstash,沒錯,就是這個神奇小組件,我們都知道,它是ELK不可缺少的組件,完成了輸入(input),過濾(fileter),output(輸…

用python設計學生管理系統_Python實現GUI學生信息管理系統

本文實例為大家分享了Python實現GUI學生信息管理系統的具體代碼,供大家參考,具體內容如下 項目環境: 軟件環境: OS:RedHat6.3 Lib:Pygtk Language:Python Support tool:Glade3 項目簡述: ①Glade3設計用戶的登錄窗口,功…