程序員必備的學習筆記《TCP

為什麼會有TCP/IP協議

在世界上各地,各種各樣的電腦運行著各自不同的操作系統為大家服務,這些電腦在表達同一種信息的時候所使用的方法是千差萬別。就好像聖經中上帝打亂 了各地人的口音,讓他們無法合作一樣。計算機使用者意識到,計算機只是單兵作戰並不會發揮太大的作用。只有把它們聯合起來,電腦才會發揮出它最大的潛力。 於是人們就想方設法的用電線把電腦連接到了一起。

但是簡單的連到一起是遠遠不夠的,就好像語言不同的兩個人互相見了面,完全不能交流信息。因而他們需要定義一些共通的東西來進行交流,TCP/IP 就是為此而生。TCP/IP不是一個協議,而是一個協議族的統稱。裡面包括了IP協議,IMCP協議,TCP協議,以及我們更加熟悉的http、ftp、 pop3協議等等。電腦有了這些,就好像學會了外語一樣,就可以和其他的計算機終端做自由的交流了。

TCP/IP協議分層

提到協議分層,我們很容易聯想到ISO-OSI的七層協議經典架構,但是TCP/IP協議族的結構則稍有不同。如圖所示:

程序員必備的學習筆記《TCP/IP詳解(一)》

TCP/IP協議族按照層次由上到下,層層包裝。最上面的就是應用層了,這裡面有http,ftp,等等我們熟悉的協議。而第二層則是傳輸層,著名 的TCP和UDP協議就在這個層次(不要告訴我你沒用過udp玩星際)。第三層是網絡層,IP協議就在這裡,它負責對數據加上IP地址和其他的數據(後面 會講到)以確定傳輸的目標。第四層是叫數據鏈路層,這個層次為待傳送的數據加入一個以太網協議頭,並進行CRC編碼,為最後的數據傳輸做準備。再往下則是 硬件層次了,負責網絡的傳輸,這個層次的定義包括網線的制式,網卡的定義等等(這些我們就不用關心了,我們也不做網卡),所以有些書並不把這個層次放在 tcp/ip協議族裡面,因為它幾乎和tcp/ip協議的編寫者沒有任何的關係。發送協議的主機從上自下將數據按照協議封裝,而接收數據的主機則按照協議 從得到的數據包解開,最後拿到需要的數據。這種結構非常有棧的味道,所以某些文章也把tcp/ip協議族稱為tcp/ip協議棧。

一些基本的常識

在學習協議之前,我們應該具備一些基本知識。

1互聯網地址(ip地址)

網 絡上每一個節點都必須有一個獨立的Internet地址(也叫做IP地址)。現在,通常使用的IP地址是一個32bit的數字,也就是我們常說的IPv4 標準,這32bit的數字分成四組,也就是常見的255.255.255.255的樣式。IPv4標準上,地址被分為五類,我們常用的是B類地址。具體的 分類請參考其他文檔。需要注意的是IP地址是網絡號+主機號的組合,這非常重要。

2域名系統

域名系統是一個分佈的數據庫,它提供將主機名(就是網址啦)轉換成IP地址的服務。

3RFC

RFC是什麼?RFC就是tcp/ip協議的標準文檔,在這裡我們可以看到RFC那長長的定義列表,現在它一共有4000多個協議的定義,當然,我們所要學習的,也就是那麼十幾個協議而已。

4端口號(port)

注意,這個號碼是用在TCP,UDP上的一個邏輯號碼,並不是一個硬件端口,我們平時說把某某端口封掉了,也只是在IP層次把帶有這個號碼的IP包給過濾掉了而已。

5應用編程接口

現在常用的編程接口有socket和TLI。而前面的有時候也叫做“Berkeley socket”,可見Berkeley對於網絡的發展有多大的貢獻。

數據鏈路層

數據鏈路層有三個目的:

  • 為IP模塊發送和 接收IP數據報。
  • 為ARP模塊發送ARP請求和接收ARP應答。
  • 為RARP發送RARP請 求和接收RARP應答

ip大家都聽說過。至於ARP和RARP,ARP叫做地址解析協議,是用IP地址換MAC地址的一種協議,而RARP則叫做逆地址解析協議,在tcp/ip協議的後面章節會介紹它們(在局域網裡面用ARP協議可以很容易的搞癱瘓網絡哦)

數據鏈路層的協議還是很多的,有我們最常用的以太網(就是平時我們用的網卡)協議,也有不太常見的令牌環,還有FDDI,當然,還有國內現在相當普及的PPP協議(就是adsl寬帶),以及一個loopback協議。

聯繫linux裡面的ifconfig -a命令,這個命令通常會得到如下的結果:

程序員必備的學習筆記《TCP/IP詳解(一)》

其中,eth0就是以太網接口,而 lo 則是 loopback 接口。這也說明這個主機在網絡鏈路層上至少支持 loopback 協議和以太網協議。

以太網(Ether-net)的定是指數字設備公司( Digital Equipment Corp.)、英特爾公司(Intel Corp.)和 Xerox 公司在1982年聯合公 布的一個標準,這個標準裡面使用了一種稱作 CSMA/CD 的接入方法。而 IEEE802提供的標準集 802.3(還有一部分定義到了802.2中) 也提供了一個 CSMA/CD 的標準。

這兩個標準稍有同,TCP/IP 協議對這種情況的處理方式如下:

  •  以太網的 IP 數據報封裝在 RFC894中定義,而 IEEE802網絡的 IP 數據報封裝在 RFC1042中定義。
  •  一臺主機一定要能發送和接收 RFC894定義的數據報。
  •  一臺主機可以接收 RFC894和 RFC1042的封裝格式的混合數據報。
  •  一臺主機也許能夠發送 RFC1042數據報。。如果主機能同時發送兩種類型的分組數 據,那麼發送的分組必須是可以設置的,而且默認條件下必須是 RFC 894分組。

可見,RFC1042在 TCP/IP 裡面處於一個配角的地位。這兩種不同的數據報格式請參考教材。

ppp(點對點協議)是從 SLIP 的替代品。他們都提供了一種低速接入的解決方案。而每一種數據鏈路層協議,都有一個 MTU(最大傳輸單元)定義, 在這個定義下面,如果 IP 數據報過大,則要進行分片(fragmentation),使得每片都小於 MTU,注意 PPP 的 MTU 並 不是一個物理定義,而是 指一個邏輯定義(個人認為就是用程序控制)。

可以用 netstat 來打印出 MTU 的結果,比如鍵入 netstat -in:

程序員必備的學習筆記《TCP/IP詳解(一)》

就可以觀察到 eth0的 MTU 是1500。而 lo(環回接口)的 MTU 則是16436。

最後說說那個環回接口(loopback)。平時我們用127.0.0.1來嘗試自己的機器服務器好使不好使。走的就是這個 loopback 接口。

對於環回接口,有如下三點值得注意:

  •  傳給環回地址(一般是127.0.0.1)的任何數據均作為 I P 輸入。
  •  傳給廣播地址或多播地址的數據報復制一份傳給環回接口,然後送到以太網上。這是 因為廣播傳送和多播傳送的定義包含主 機本身。
  •  任何傳給該主機 IP 地址的數據均送到環回接口。

另外還有一些關於c++ Linux後臺服務器開發的一些知識點分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,協程,DPDK,webrtc,音視頻等等視頻。

喜歡的朋友可以後臺私信【1】獲取學習視頻


程序員必備的學習筆記《TCP/IP詳解(一)》


分享到:


相關文章: