1. 程式人生 > >第六章 網絡編程-SOCKET開發

第六章 網絡編程-SOCKET開發

什麽是 指向 可能 mit pen 協議頭 digital 交換 cmp

6.1 C/S架構介紹

  • 6.2 TCP/IP 各層詳解
  • 6.3 Socket介紹
  • 6.4 Socket代碼實例
  • 6.5 粘包現象與解決方案
  • 6.6 通過socket發送文件
  • 6.7 本章總結

6.1C/S架構介紹

什麽是C/S架構

C指的是client(客戶端軟件),S指的是Server(服務端軟件),本章的重點就是教大家寫一個C/S架構的軟件,實現服務端軟件與客戶端軟件基於網絡通信。

計算機基礎知識

作為應用開發程序員,我們開發的軟件都是應用軟件,而應用軟件必須運行於操作系統之上,操作系統則運行於硬件之上,應用軟件是無法直接操作硬件的,應用軟件對硬件的操作必須調用操作系統的接口,由操作系統操控硬件。

比如客戶端軟件想要基於網絡發送一條消息給服務端軟件,流程是:

1、客戶端軟件產生數據,存放於客戶端軟件的內存中,然後調用接口將自己內存中的數據發送/拷貝給操作系統內存

2、客戶端操作系統收到數據後,按照客戶端軟件指定的規則(即協議)、調用網卡發送數據

3、網絡傳輸數據

4、服務端軟件調用系統接口,想要將數據從操作系統內存拷貝到自己的內存中

5、服務端操作系統收到4的指令後,使用與客戶端相同的規則(即協議)從網卡接收到數據,然後拷貝給服務端軟件

技術分享圖片

什麽是網絡

硬件之上安裝好操作系統,然後裝上軟件你就可以正常使用了,但此時你也只能自己使用,像下圖這樣,每個人都擁有一臺自己的機器,然而彼此孤立

技術分享圖片

如何能大家一起玩耍,那就是聯網了,即internet

技術分享圖片

然而internet為何物?舉一個簡單的例子: 如果把一個人與這個人的有線電話比喻為一臺計算機,那麽其實兩臺計算機之間通信與兩個人打電話之間通信的原理是一樣的。 兩個人之間想要打電話首先一點必須是接電話線,這就好比是計算機之間的通信首先要有物理鏈接介質,比如網線,交換機,路由器等網絡設備。 通信的線路建好之後,只是物理層面有了可以承載數據的介質,要想通信,還需要我們按照某種規則組織我們的數據,這樣對方在接收到數據後就可以按照相同的規則去解析出數據,這裏說的規則指的就是:中國有很多地區,不同的地區有不同的方言,為了全中國人都可以聽懂,大家統一講普通話

技術分享圖片

普通話屬於中國國內人與人之間通信的標準,那如果是兩個國家的人交流呢?

技術分享圖片

問題是,你不可能要求一個人/計算機掌握全世界的語言/標準,於是有了世界統一的通信標準:英語

技術分享圖片

英語成為世界上所有人通信的統一標準,計算機之間的通信也應該有一個像英語一樣的通信標準,這個標準稱之為互聯網協議, 可以很明確地說:互聯網協議就是計算機界的英語,網絡就是物理鏈接介質+互聯網協議。 我們需要做的是,讓全世界的計算機都學會互聯網協議,這樣任意一臺計算機在發消息時都嚴格按照協議規定的格式去組織數據,接收方就可以按照相同的協議解析出結果了,這就實現了全世界的計算機都能無障礙通信。 按照功能不同,人們將互聯網協議分為osi七層或tcp/ip五層或tcp/ip四層(我們只需要掌握tcp/ip五層協議即可),這種分層就好比是學習英語的幾個階段,每個階段應該掌握專門的技能或者說完成特定的任務,比如:1、學音標 2、學單詞 3、學語法 4、寫作文。

技術分享圖片

每層運行常見物理設備(了解)

技術分享圖片

什麽是TCP/IP?

Transmission Control Protocol/Internet Protocol的簡寫,中譯名為傳輸控制協議/因特網互聯協議,又名網絡通訊協議,是Internet最基本的協議、Internet國際互聯網絡的基礎

TCP/IP的起源

20世紀50年代末,正處於冷戰時期。當時美國軍方為了自己的計算機網絡在受到襲擊時,即使部分網絡被摧毀,其余部分仍能保持通信聯系,便由美國國防部的高級研究計劃局(ARPA)建設了一個軍用網,叫做“阿帕網”(ARPAnet)。阿帕網於1969年正式啟用,當時僅連接了4臺計算機,供科學家們進行計算機聯網實驗用,這就是因特網的前身。

到70年代,ARPAnet已經有了好幾十個計算機網絡,但是每個網絡只能在網絡內部的計算機之間互聯通信,不同計算機網絡之間仍然不能互通。為此, ARPA又設立了新的研究項目,支持學術界和工業界進行有關的研究,研究的主要內容就是想用一種新的方法將不同的計算機局域網互聯,形成“互聯網”。研究人員稱之為“internetwork”,簡稱“Internet”,這個名詞就一直沿用到現在。

終於到1974年,TCP/IP誕生啦,TCP/IP有一個非常重要的特點,就是開放性,即TCP/IP的規範和Internet的技術都是公開的。目的就是使任何廠家生產的計算機都能相互通信,使Internet成為一個開放的系統,這正是後來Internet得到飛速發展的重要原因。

OSI七層模型

美國國防部在開發tcp/ip的同時,還有一些其它大廠商也開發出了自己的網絡體系,實際上世界上第一個網絡體系結構由IBM公司提出(也是74年,比TCP/IP略早,SNA),以後其他公司也相繼提出自己的網絡體系結構如:Digital公司的DNA,美國國防部的TCP/IP等,多種網絡體系結構並存,其結果是若采用IBM的結構,只能選用IBM的產品,只能與同種結構的網絡互聯。

這就像中國人說中文,美國人說英語,日本人說日本話一樣,同一國家的人溝通沒問題,但不同國家之間的人沒法通信。為了解決網絡通信中這樣不互通的問題,國際標準化組織ISO於1977年成立了一個委員會,在現有網絡的基礎上,提出了不基於具體機型、操作系統或公司的網絡體系結構,稱為開放系統互聯模型。

OSI/RM模型(Open System Interconnection / Reference Model)的設計目的是成為一個所有計算機廠商都能實現的開放網絡模型,來克服使用眾多私有網絡模型所帶來的困難和低效性。

6.2 TCP/IP各層詳解

TCP/IP五層模型講解

我們將應用層,表示層,會話層並作應用層,從tcp/ip五層協議的角度來闡述每層的由來與功能,搞清楚了每層的主要協議

就理解了整個互聯網通信的原理。

首先,用戶感知到的只是最上面一層應用層,自上而下每層都依賴於下一層,所以我們從最下一層開始切入,比較好理解

每層都運行特定的協議,越往上越靠近用戶,越往下越靠近硬件

物理層:

物理層由來:上面提到,孤立的計算機之間要想一起玩,就必須接入internet,言外之意就是計算機之間必須完成組網

技術分享圖片

物理層功能:主要是基於電器特性發送高低電壓(電信號),高電壓對應數字1,低電壓對應數字0

數據鏈路層

數據鏈路層由來:單純的電信號0和1沒有任何意義,必須規定電信號多少位一組,每組什麽意思

數據鏈路層的功能:定義了電信號的分組方式

以太網協議:

早期的時候各個公司都有自己的分組方式,後來形成了統一的標準,即以太網協議ethernet

ethernet規定

  • 一組電信號構成一個數據包,叫做‘幀’
  • 每一數據幀分成:報頭head和數據data兩部分
headdata

head包含:(固定18個字節)

  • 發送者/源地址,6個字節
  • 接收者/目標地址,6個字節
  • 數據類型,6個字節

data包含:(最短46字節,最長1500字節)

  • 數據包的具體內容

head長度+data長度=最短64字節,最長1518字節,超過最大限制就分片發送

mac地址:

head中包含的源和目標地址由來:ethernet規定接入internet的設備都必須具備網卡,發送端和接收端的地址便是指網卡的地址,即mac地址

mac地址:每塊網卡出廠時都被燒制上一個世界唯一的mac地址,長度為48位2進制,通常由12位16進制數表示(前六位是廠商編號,後六位是流水線號)

技術分享圖片

廣播:

有了mac地址,同一網絡內的兩臺主機就可以通信了(一臺主機通過arp協議獲取另外一臺主機的mac地址)

ethernet采用最原始的方式,廣播的方式進行通信,即計算機通信基本靠吼

技術分享圖片

網絡層

網絡層由來:有了ethernet、mac地址、廣播的發送方式,世界上的計算機就可以彼此通信了,問題是世界範圍的互聯網是由

一個個彼此隔離的小的局域網組成的,那麽如果所有的通信都采用以太網的廣播方式,那麽一臺機器發送的包全世界都會收到,

這就不僅僅是效率低的問題了,這會是一種災難

技術分享圖片

上圖結論:必須找出一種方法來區分哪些計算機屬於同一廣播域,哪些不是,如果是就采用廣播的方式發送,如果不是,

就采用路由的方式(向不同廣播域/子網分發數據包),mac地址是無法區分的,它只跟廠商有關

網絡層功能:引入一套新的地址用來區分不同的廣播域/子網,這套地址即網絡地址

IP協議:
  • 規定網絡地址的協議叫ip協議,它定義的地址稱之為ip地址,廣泛采用的v4版本即ipv4,它規定網絡地址由32位2進制表示
  • 範圍0.0.0.0-255.255.255.255
  • 一個ip地址通常寫成四段十進制數,例:172.16.10.1

子網掩碼

所謂”子網掩碼”,就是表示子網絡特征的一個參數。它在形式上等同於IP地址,也是一個32位二進制數字,它的網絡部分全部為1,主機部分全部為0。比如,IP地址172.16.10.1,如果已知網絡部分是前24位,主機部分是後8位,那麽子網絡掩碼就是11111111.11111111.11111111.00000000,寫成十進制就是255.255.255.0。

子網掩碼是用來標識一個IP地址的哪些位是代表網絡位,以及哪些位是代表主機位。子網掩碼不能單獨存在,它必須結合IP地址一起使用。子網掩碼只有一個作用,就是將某個IP地址劃分成網絡地址和主機地址兩部分。

蒙蔽的你肯定想問,我要區分網絡位和主機位幹鬼用?

這就像寄信,你給你的南方姑娘寄信,她肉身在廈門,詳細地址是廈門鼓浪嶼三街27號,那網絡位就相當於城市,詳細地址就是主機位,網絡位幫你定位到城市,主機位幫你找到你的南方姑娘。 路由器通過子網掩碼來確定哪些是網絡位,哪些是主機位

區分網絡位和主機位是為了劃分子網,就是把一個大網絡分成多個小網絡,為什麽要分子網呢?

  • 廣播風暴:6萬臺主機在一個網段裏,通信基本靠吼,任何一個人要吼一嗓子,6萬多個人必須被動聽著,一會你的網絡就癱瘓啦。
  • 地址浪費:運營商在公網上有很多級聯的路由器,有時候2個路由器之間只會用掉幾個IP,如果不進行子網劃分,那同網段的其它主機也就都不能用了。舉例兩個級聯路由器的接口ip分別為222.34.24.12/24,222.34.24.13/24, 此可承載255個主機的網段只用了2個IP,那其它的就全浪費了,因為不能再分配給別人。

劃分子網本質上就是借主機位到給網絡位,每借一位主機位,這個網段的可分配主機就會越少,比如192.168.1.0/24可用主機255個,借一位變成192.168.1.0/25,那可用主機就從255-128=127個了(從最大的值開始借),再借一位192.168.1.0/26,那可用主機數就變成了255-(128+64)=63個啦

IP地址分類:

IP地址根據網絡ID的不同分為5種類型,A類地址、B類地址、C類地址、D類地址和E類地址。

  1. A類IP地址:一個A類IP地址由1字節的網絡地址和3字節主機地址組成,網絡地址的最高位必須是“0”, 地址範圍從1.0.0.0 到126.0.0.0。可用的A類網絡有126個,每個網絡能容納1億多個主機。
  2. B類IP地址 :一個B類IP地址由2個字節的網絡地址和2個字節的主機地址組成,網絡地址的最高位必須是“10”,地址範圍從128.0.0.0到191.255.255.255。可用的B類網絡有16382個,每個網絡能容納6萬多個主機 。
  3. C類IP地址:一個C類IP地址由3字節的網絡地址和1字節的主機地址組成,網絡地址的最高位必須是“110”。範圍從192.0.0.0到223.255.255.255。C類網絡可達209萬余個,每個網絡能容納254個主機。
  4. D類地址用於多點廣播(Multicast): D類IP地址第一個字節以“lll0”開始,它是一個專門保留的地址。它並不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次尋址一組計算機,它標識共享同一協議的一組計算機。
  5. E類IP地址 以“llll0”開始,為將來使用保留。

全零(“0.0.0.0”)地址對應於當前主機。全“1”的IP地址(“255.255.255.255”)是當前子網的廣播地址。

回環地址(127.0.0.1) 又稱為本機地址,那它跟0.0.0.0是什麽區別呢?那得先了解回環接口

技術分享圖片

環回接口(loopback)。平時我們用127.0.0.1來嘗試自己的機器服務器好使不好使。走的就是這個loopback接口。對於環回接口,有如下三點值得註意:

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

IP協議是TCP/IP協議的核心,所有的TCP,UDP,IMCP,IGCP的數據都以IP數據格式傳輸,要註意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種數據未傳達以後的處理機制--這被認為是上層協議--TCP或UDP要做的事情。所以這也就出現了TCP是一個可靠的協議,而UDP就沒有那麽可靠的區別。這是後話,暫且不提。

IP協議頭

技術分享圖片

挨個解釋它是教科書的活計,我感興趣的只是那八位的TTL字段,還記得這個字段是做什麽的麽?這個字段規定該數據包在穿過多少個路由之後才會被拋棄(這裏就體現出來IP協議包的不可靠性,它不保證數據被送達),某個ip數據包每穿過一個路由器,該數據包的TTL數值就會減少1,當該數據包的TTL成為零,它就會被自動拋棄。這個字段的最大值也就是255,也就是說一個協議包也就在路由器裏面穿行255次就會被拋棄了,根據系統的不同,這個數字也不一樣,一般是32或者是64

ARP協議

arp協議由來:計算機通信基本靠吼,即廣播的方式,所有上層的包到最後都要封裝上以太網頭,然後通過以太網協議發送,在談及以太網協議時候,我門了解到

通信是基於mac的廣播方式實現,計算機在發包時,獲取自身的mac是容易的,如何獲取目標主機的mac,就需要通過arp協議

arp協議功能:廣播的方式發送數據包,獲取目標主機的mac地址

協議工作方式:每臺主機ip都是已知的

例如:主機172.16.10.10/24訪問172.16.10.11/24

一:首先通過ip地址和子網掩碼區分出自己所處的子網

場景數據包地址
同一子網 目標主機mac,目標主機ip
不同子網 網關mac,目標主機ip

二:分析172.16.10.10/24與172.16.10.11/24處於同一網絡(如果不是同一網絡,那麽下表中目標ip為172.16.10.1,通過arp獲取的是網關的mac)

源mac目標mac源ip目標ip數據部分
發送端主機 發送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 數據

三:這個包會以廣播的方式在發送端所處的子網內傳輸,所有主機接收後拆開包,發現目標ip為自己的,就響應,返回自己的mac

查看本機arp表的命令

Alexs-MacBook-Pro:~ alex$ arp -a
? (192.168.0.3) at 0:21:cc:65:52:f0 on en4 ifscope [ethernet]
? (192.168.0.64) at 68:f7:28:d0:4b:21 on en4 ifscope [ethernet]
? (192.168.0.233) at 84:d9:31:3:ae:8b on en4 ifscope [ethernet]
? (192.168.0.254) at 60:da:83:be:c2:5a on en4 ifscope [ethernet]
? (192.168.0.255) at (incomplete) on en4 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en4 ifscope permanent [ethernet]

ICMP

前面講到了,IP協議並不是一個可靠的協議,它不保證數據被送達,那麽,自然的,保證數據送達的工作應該由其他的模塊來完成。其中一個重要的模塊就是ICMP(網絡控制報文)協議。

當傳送IP數據包發生錯誤--比如主機不可達,路由不可達等等,ICMP協議將會把錯誤信息封包,然後傳送回給主機。給主機一個處理錯誤的機會.

我們一般主要用ICMP協議檢測網絡是否通暢,基於ICMP協議的工具主要有ping 和traceroute

ping

Alexs-MacBook-Pro:~ alex$ ping www.baidu.com
PING www.a.shifen.com (111.13.100.91): 56 data bytes
64 bytes from 111.13.100.91: icmp_seq=0 ttl=54 time=6.563 ms
64 bytes from 111.13.100.91: icmp_seq=1 ttl=54 time=6.320 ms
64 bytes from 111.13.100.91: icmp_seq=2 ttl=54 time=6.698 ms
64 bytes from 111.13.100.91: icmp_seq=3 ttl=54 time=6.445 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 6.320/6.506/6.698/0.140 ms

ping這個單詞源自聲納定位,而這個程序的作用也確實如此,它利用ICMP協議包來偵測另一個主機是否可達。原理是用類型碼為0的ICMP發請 求,受到請求的主機則用類型碼為8的ICMP回應。ping程序來計算間隔時間,並計算有多少個包被送達。用戶就可以判斷網絡大致的情況。我們可以看到, ping給出來了傳送的時間和TTL的數據。

traceroute

用來查看從當前主機到某地址一共經過多少跳路由

$ traceroute www.baidu.com

traceroute: Warning: www.baidu.com has multiple addresses; using 111.13.100.91
traceroute to www.a.shifen.com (111.13.100.91), 64 hops max, 52 byte packets
 1  192.168.0.254 (192.168.0.254)  0.458 ms  0.274 ms  0.246 ms
 2  122.71.64.1 (122.71.64.1)  2.006 ms  1.788 ms  1.626 ms
 3  * 222.35.254.253 (222.35.254.253)  2.024 ms  2.243 ms
 4  222.35.254.241 (222.35.254.241)  9.333 ms
    61.233.9.50 (61.233.9.50)  4.960 ms
    61.233.9.93 (61.233.9.93)  3.010 ms
 5  61.237.2.202 (61.237.2.202)  3.442 ms  3.497 ms

 ......

傳輸層

傳輸層的由來:網絡層的ip幫我們區分子網,以太網層的mac幫我們找到主機,然後大家使用的都是應用程序,你的電腦上可能同時開啟qq,暴風影音,迅雷等多個應用程序,

那麽我們通過ip和mac找到了一臺特定的主機,如何標識這臺主機上的應用程序呢?答案就是端口,端口即應用程序與網卡關聯的編號。

傳輸層功能:建立端口到端口的通信

補充:端口範圍0-65535,0-1023為系統占用端口

傳輸層有兩種協議,TCP和UDP,見下圖

技術分享圖片

tcp協議

可靠傳輸,TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。

以太網頭ip 頭tcp頭數據

為什麽tcp是可靠的數據傳輸呢?

最可靠的方式就是只要不得到確認,就重新發送數據報,直到得到對方的確認為止。

tcp報文

技術分享圖片

tcp的3次握手和4四揮手

![image_1c1phb5ao10jb183v1l3i1psgo6037.png-281.7kB][17]

udp協議

不可靠傳輸,”報頭”部分一共只有8個字節,總長度不超過65,535字節,正好放進一個IP數據包。

以太網頭ip頭udp頭數據

總結

TCP協議雖然安全性很高,但是網絡開銷大,而UDP協議雖然沒有提供安全機制,但是網絡開銷小,在現在這個網絡安全已經相對較高的情況下,為了保證傳輸的速率,我們一般還是會優先考慮UDP協議!

[17]: http://static.zybuluo.com/agocan/gbg90sa2fn94tkk3asobet6u/image_1c1phb5ao10jb183v1l3i1psgo6037.png

第六章 網絡編程-SOCKET開發