天天看點

熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

OSI七層模型

程式員硬核書籍資源,點選檢視! 程式員必備資源,點選下載下傳!
熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

實體層:主要定義實體裝置标準,如網線的接口類型、光纖的接口類型、各種傳輸媒體的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地後再轉化為1、0,也就是我們常說的數模轉換與模數轉換)。這一層的資料叫做比特。

資料鍊路層:定義了如何讓格式化資料以幀為機關進行傳輸,以及如何讓控制對實體媒體的通路。這一層通常還提供錯誤檢測和糾正,以確定資料的可靠傳輸。如:序列槽通信中使用到的115200、8、N、1

網絡層:在位于不同地理位置的網絡中的兩個主機系統之間提供連接配接和路徑選擇。Internet的發展使得從世界各站點通路資訊的使用者數大大增加,而網絡層正是管理這種連接配接的層。

傳輸層:定義了一些傳輸資料的協定和端口号(WWW端口80等),如:TCP(傳輸控制協定,傳輸效率低,可靠性強,用于傳輸可靠性要求高,資料量大的資料),UDP(使用者資料報協定,與TCP特性恰恰相反,用于傳輸可靠性要求不高,資料量小的資料,如QQ聊天資料就是通過這種方式傳輸的)。 主要是将從下層接收的資料進行分段和傳輸,到達目的位址後再進行重組。常常把這一層資料叫做段。

會話層:通過傳輸層(端口号:傳輸端口與接收端口)建立資料傳輸的通路。主要在你的系統之間發起會話或者接受會話請求(裝置之間需要互相認識可以是IP也可以是MAC或者是主機名)。

表示層:可確定一個系統的應用層所發送的資訊可以被另一個系統的應用層讀取。例如,PC程式與另一台計算機進行通信,其中一台計算機使用擴充二一十進制交換碼(EBCDIC),而另一台則使用美國資訊交換标準碼(ASCII)來表示相同的字元。如有必要,表示層會通過使用一種通格式來實作多種資料格式之間的轉換。

應用層:是最靠近使用者的OSI層。這一層為使用者的應用程式(例如電子郵件、檔案傳輸和終端仿真)提供網絡服務。

TCP/IP四層模型

熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

協定的概念

什麼是協定

從應用的角度出發,協定可了解為“規則”,是資料傳輸和資料的解釋的規則。

假設,A、B雙方欲傳輸檔案。規定:

第一次,傳輸檔案名,接收方接收到檔案名,應答OK給傳輸方;

第二次,發送檔案的尺寸,接收方接收到該資料再次應答一個OK;

第三次,傳輸檔案内容。同樣,接收方接收資料完成後應答OK表示檔案内容接收成功。

由此,無論A、B之間傳遞何種檔案,都是通過三次資料傳輸來完成。A、B之間形成了一個最簡單的資料傳輸規則。雙方都按此規則發送、接收資料。A、B之間達成的這個互相遵守的規則即為協定。

這種僅在A、B之間被遵守的協定稱之為原始協定。當此協定被更多的人采用,不斷的增加、改進、維護、完善。最終形成一個穩定的、完整的檔案傳輸協定,被廣泛應用于各種檔案傳輸過程中。該協定就成為一個标準協定。最早的ftp協定就是由此衍生而來。

TCP協定注重資料的傳輸。http協定着重于資料的解釋。

典型協定

傳輸層 常見協定有TCP/UDP協定。

應用層 常見的協定有HTTP協定,FTP協定。

網絡層 常見協定有IP協定、ICMP協定、IGMP協定。

網絡接口層 常見協定有ARP協定、RARP協定。

TCP傳輸控制協定(Transmission Control Protocol)是一種面向連接配接的、可靠的、基于位元組流的傳輸層通信協定。

UDP使用者資料報協定(User Datagram Protocol)是OSI參考模型中一種無連接配接的傳輸層協定,提供面向事務的簡單不可靠資訊傳送服務。

HTTP超文本傳輸協定(Hyper Text Transfer Protocol)是網際網路上應用最為廣泛的一種網絡協定。

FTP檔案傳輸協定(File Transfer Protocol)

IP協定是網際網路互聯協定(Internet Protocol)

ICMP協定是Internet控制封包協定(Internet Control Message Protocol)它是TCP/IP協定族的一個子協定,用于在IP主機、路由器之間傳遞控制消息。

IGMP協定是 Internet 組管理協定(Internet Group Management Protocol),是網際網路協定家族中的一個多點傳播協定。該協定運作在主機群組播路由器之間。

ARP協定是正向位址解析協定(Address Resolution Protocol),通過已知的IP,尋找對應主機的MAC位址。

RARP是反向位址轉換協定,通過MAC位址确定IP位址。

網絡應用程式設計模式

C/S模式

傳統的網絡應用設計模式,客戶機(client)/伺服器(server)模式。需要在通訊兩端各自部署客戶機和伺服器來完成資料通信。

B/S模式

浏覽器()/伺服器(server)模式。隻需在一端部署伺服器,而另外一端使用每台PC都預設配置的浏覽器即可完成資料的傳輸。

優缺點

對于C/S模式來說,其優點明顯。用戶端位于目标主機上可以保證性能,将資料緩存至用戶端本地,進而提高資料傳輸效率。且,一般來說用戶端和伺服器程式由一個開發團隊創作,是以他們之間所采用的協定相對靈活。可以在标準協定的基礎上根據需求裁剪及定制。例如,騰訊公司所采用的通信協定,即為ftp協定的修改剪裁版。

是以,傳統的網絡應用程式及較大型的網絡應用程式都首選C/S模式進行開發。如,知名的網絡遊戲魔獸世界。3D畫面,資料量龐大,使用C/S模式可以提前在本地進行大量資料的緩存處理,進而提高觀感。

C/S模式的缺點也較突出。由于用戶端和伺服器都需要有一個開發團隊來完成開發。工作量将成倍提升,開發周期較長。另外,從使用者角度出發,需要将用戶端安插至使用者主機上,對使用者主機的安全性構成威脅。這也是很多使用者不願使用C/S模式應用程式的重要原因。

B/S模式相比C/S模式而言,由于它沒有獨立的用戶端,使用标準浏覽器作為用戶端,其工作開發量較小。隻需開發伺服器端即可。另外由于其采用浏覽器顯示資料,是以移植性非常好,不受平台限制。如早期的偷菜遊戲,在各個平台上都可以完美運作。

B/S模式的缺點也較明顯。由于使用第三方浏覽器,是以網絡應用支援受限。另外,沒有用戶端放到對方主機上,緩存資料不盡如人意,進而傳輸資料量受到限制。應用的觀感大打折扣。第三,必須與浏覽器一樣,采用标準http協定進行通信,協定選擇不靈活。

是以在開發過程中,模式的選擇由上述各自的特點決定。根據實際需求選擇應用程式設計模式。

通信過程

兩台計算機通過TCP/IP協定通訊的過程如下所示:

熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

上圖對應兩台計算機在同一網段中的情況,如果兩台計算機在不同的網段中,那麼資料從一台計算機到另一台計算機傳輸過程中要經過一個或多個路由器,如下圖所示:

熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

跨路由通信

鍊路層有以太網、令牌環網等标準,鍊路層負責網卡裝置的驅動、幀同步(即從網線上檢測到什麼信号算作新幀的開始)、沖突檢測(如果檢測到沖突就自動重發)、資料差錯校驗等工作。交換機是工作在鍊路層的網絡裝置,可以在不同的鍊路層網絡之間轉發資料幀(比如十兆以太網和百兆以太網之間、以太網和令牌環網之間),由于不同鍊路層的幀格式不同,交換機要将進來的資料包拆掉鍊路層首部重新封裝之後再轉發。

網絡層的IP協定是構成Internet的基礎。Internet上的主機通過IP位址來辨別,Inter-net上有大量路由器負責根據IP位址選擇合适的路徑轉發資料包,資料包從Internet上的源主機到目的主機往往要經過十多個路由器。路由器是工作在第三層的網絡裝置,同時兼有交換機的功能,可以在不同的鍊路層接口之間轉發資料包,是以路由器需要将進來的資料包拆掉網絡層和鍊路層兩層首部并重新封裝。IP協定不保證傳輸的可靠性,資料包在傳輸過程中可能丢失,可靠性可以在上層協定或應用程式中提供支援。

網絡層負責點到點(ptop,point-to-point)的傳輸(這裡的“點”指主機或路由器),而傳輸層負責端到端(etoe,end-to-end)的傳輸(這裡的“端”指源主機和目的主機)。傳輸層可選擇TCP或UDP協定。

TCP是一種面向連接配接的、可靠的協定,有點像打電話,雙方拿起電話互通身份之後就建立了連接配接,然後說話就行了,這邊說的話那邊保證聽得到,并且是按說話的順序聽到的,說完話挂機斷開連接配接。也就是說TCP傳輸的雙方需要首先建立連接配接,之後由TCP協定保證資料收發的可靠性,丢失的資料包自動重發,上層應用程式收到的總是可靠的資料流,通訊之後關閉連接配接。

UDP是無連接配接的傳輸協定,不保證可靠性,有點像寄信,信寫好放到郵筒裡,既不能保證信件在郵遞過程中不會丢失,也不能保證信件寄送順序。使用UDP協定的應用程式需要自己完成丢包重發、消息排序等工作。

目的主機收到資料包後,如何經過各層協定棧最後到達應用程式呢?其過程如下圖所示:

熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

以太網驅動程式首先根據以太網首部中的“上層協定”字段确定該資料幀的有效載荷(payload,指除去協定首部之外實際傳輸的資料)是IP、ARP還是RARP協定的資料報,然後交給相應的協定處理。假如是IP資料報,IP協定再根據IP首部中的“上層協定”字段确定該資料報的有效載荷是TCP、UDP、ICMP還是IGMP,然後交給相應的協定處理。假如是TCP段或UDP段,TCP或UDP協定再根據TCP首部或UDP首部的“端口号”字段确定應該将應用層資料交給哪個使用者程序。IP位址是辨別網絡中不同主機的位址,而端口号就是同一台主機上辨別不同程序的位址,IP位址和端口号合起來辨別網絡中唯一的程序。

雖然IP、ARP和RARP資料報都需要以太網驅動程式來封裝成幀,但是從功能上劃分,ARP和RARP屬于鍊路層,IP屬于網絡層。雖然ICMP、IGMP、TCP、UDP的資料都需要IP協定來封裝成資料報,但是從功能上劃分,ICMP、IGMP與IP同屬于網絡層,TCP和UDP屬于傳輸層。

協定格式

資料包封裝

傳輸層及其以下的機制由核心提供,應用層由使用者程序提供(後面将介紹如何使用socket API編寫應用程式),應用程式對通訊資料的含義進行解釋,而傳輸層及其以下處理通訊的細節,将資料從一台計算機通過一定的路徑發送到另一台計算機。應用層資料通過協定棧發到網絡上時,每層協定都要加上一個資料首部(header),稱為封裝(Encapsulation),如下圖所示:

熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

TCP/TP資料包封裝

不同的協定層對資料包有不同的稱謂,在傳輸層叫做段(segment),在網絡層叫做資料報(datagram),在鍊路層叫做幀(frame)。資料封裝成幀後發到傳輸媒體上,到達目的主機後每層協定再剝掉相應的首部,最後将應用層資料交給應用程式處理。

以太網幀格式

以太網的幀格式如下所示:

熬夜為學弟學妹整理的網絡程式設計基礎知識(一)!

其中的源位址和目的位址是指網卡的硬體位址(也叫MAC位址),長度是48位,是在網卡出廠時固化的。可在shell中使用ifconfig指令檢視,“HWaddr 00:15:F2:14:9E:3F”部分就是硬體位址。協定字段有三種值,分别對應IP、ARP、RARP。幀尾是CRC校驗碼。

以太網幀中的資料長度規定最小46位元組,最大1500位元組,ARP和RARP資料包的長度不夠46位元組,要在後面補填充位。最大值1500稱為以太網的最大傳輸單元(MTU),不同的網絡類型有不同的MTU,如果一個資料包從以太網路由到撥号鍊路上,資料包長度大于撥号鍊路的MTU,則需要對資料包進行分片(fragmentation)。ifconfig指令輸出中也有“MTU:1500”。注意,MTU這個概念指資料幀中有效載荷的最大長度,不包括幀頭長度。

ARP資料報格式

在網絡通訊時,源主機的應用程式知道目的主機的IP位址和端口号,卻不知道目的主機的硬體位址,而資料包首先是被網卡接收到再去處理上層協定的,如果接收到的資料包的硬體位址與本機不符,則直接丢棄。是以在通訊前必須獲得目的主機的硬體位址。ARP協定就起到這個作用。源主機發出ARP請求,詢問“IP位址是192.168.0.1的主機的硬體位址是多少”,并将這個請求廣播到本地網段(以太網幀首部的硬體位址填FF:FF:FF:FF:FF:FF表示廣播),目的主機接收到廣播的ARP請求,發現其中的IP位址與本機相符,則發送一個ARP應答資料包給源主機,将自己的硬體位址填寫在應答包中。 每台主機都維護一個ARP快取記錄,可以用arp -a指令檢視。緩存表中的表項有過期時間(一般為20分鐘),如果20分鐘内沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬體位址。想一想,為什麼表項要有過期時間而不是一直有效?

ARP資料報的格式如下所示:

源MAC位址、目的MAC位址在以太網首部和ARP請求中各出現一次,對于鍊路層為以太網的情況是多餘的,但如果鍊路層是其它類型的網絡則有可能是必要的。硬體類型指鍊路層網絡類型,1為以太網,協定類型指要轉換的位址類型,0x0800為IP位址,後面兩個位址長度對于以太網位址和IP位址分别為6和4(位元組),op字段為1表示ARP請求,op字段為2表示ARP應答。

看一個具體的例子。

請求幀如下(為了清晰在每行的前面加了位元組計數,每行16個位元組):

以太網首部(14位元組)

0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06

ARP幀(28位元組)

0000: 00 01

0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37

0020: 00 00 00 00 00 00 c0 a8 00 02

填充位(18位元組)

0020: 00 77 31 d2 50 10

0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太網首部:目的主機采用廣播位址,源主機的MAC位址是00:05:5d:61:58:a8,上層協定類型0x0806表示ARP。

ARP幀:硬體類型0x0001表示以太網,協定類型0x0800表示IP協定,硬體位址(MAC位址)長度為6,協定位址(IP位址)長度為4,op為0x0001表示請求目的主機的MAC位址,源主機MAC位址為00:05:5d:61:58:a8,源主機IP位址為c0 a8 00 37(192.168.0.55),目的主機MAC位址全0待填寫,目的主機IP位址為c0 a8 00 02(192.168.0.2)。

由于以太網規定最小資料長度為46位元組,ARP幀長度隻有28位元組,是以有18位元組填充位,填充位的内容沒有定義,與具體實作相關。

應答幀如下:

以太網首部

0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06

ARP幀

0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02

0020: 00 05 5d 61 58 a8 c0 a8 00 37

填充位

以太網首部:目的主機的MAC位址是00:05:5d:61:58:a8,源主機的MAC位址是00:05:5d:a1:b8:40,上層協定類型0x0806表示ARP。

ARP幀:硬體類型0x0001表示以太網,協定類型0x0800表示IP協定,硬體位址(MAC位址)長度為6,協定位址(IP位址)長度為4,op為0x0002表示應答,源主機MAC位址為00:05:5d:a1:b8:40,源主機IP位址為c0 a8 00 02(192.168.0.2),目的主機MAC位址為00:05:5d:61:58:a8,目的主機IP位址為c0 a8 00 37(192.168.0.55)。

繼續閱讀