【區塊鏈】(二)之傳統網絡協議

最近在研究區塊鏈,廣義的區塊鏈技術,包含點對點網絡設計、加密技術應用、分佈式算法的實現、數據存儲技術的使用方面。也就是說,區塊鏈是點對點傳輸。我們現在的網絡使用的大多是TCP/IP協議,除此之外還有一些其他類型的網絡體系結構,如Novell公司的IPX/SPX、蘋果公司的Ap-pleTalk(僅限蘋果公司計算機使用)、IBM公司開發的用於構建大規模網絡的SNA以及前DEC公司開發的DECnet等。今天我們複習一下這塊。

 

一、計算機網絡的發展歷程
1、計算機網絡發展

  與其說計算機改變了世界,倒不如說是計算機網絡改變了世界。
 

  計算機與網絡發展大致經歷如下過程:

2、計算機的模式變化
  起初的計算機主要以“單機”形式存在,計算機之間沒有通信可言,而網絡的出現才真正讓計算機變得與以往的工具不同,信息的共享和交流讓計算機成爲劃時代的產物。網絡按照規模可劃分爲:


局域網(LAN):局域網是某一區域內由多臺計算機互聯成的計算機組。一般在幾公里範圍內。
廣域網(WAN):廣域網的範圍很大,幾十公里到幾千公里,可以是一個區域的計算機網也可能是整個國家的計算機網。

  注:我們常見的WLAN是LAN的一種,稱爲無線局域網。在無線局域網WLAN發明之前,人們要想通過網絡進行聯絡和通信,必須使用物理線纜-銅絞線或光纖進行物理線路連接,但這樣的局域網轉載和拆卸都很麻煩。隨着網絡的發展,人民利用射頻(Radio Frequency; RF)的技術,使用電磁波進行網絡架構,實現了無線局域網互聯,讓信息隨身化。

 

二、各種協議
  1、協議的重要性

  計算機之間要實現通信,除了技術支持還需要一些規則來進行信息匹配,方能進行交流。不同的廠商生產不同的計算機,其CPU等內部構造不盡相同,就好比兩個外國人,那麼計算機或者說外國人之間需要實現通信或交流,那麼兩者之間就需要學會同一種交流規則,對於兩個外國人來說,這種交流規則就是語言,而對於計算機來說,這種交流規則就是各種協議。協議的出現讓不同廠商之間生產的計算機只要能夠支持同一種協議就能實現正常通信,進行交流。

 

  下面是一些以前常用的協議(因爲現在基本都是TCP/IP協議):

 

  2、協議的標準:OSI七層模型
  計算機通信誕生之初,系統化與標準化未收到重視,不同廠商只出產各自的網絡來實現通信,這樣就造成了對用戶使用計算機網絡造成了很大障礙,缺乏靈活性和可擴展性


爲解決該問題,ISO(國際標準化組織)制定了一個國際標準OSI(開放式通信系統互聯參考模型)。


  注:TCP/IP並非ISO指定,是由IETF(國際互聯網工程任務組)建議、致力推進標準化的一種協議,其中,大學等研究機構和計算機行業是推動標準化的核心力量,現已成爲業界標準協議。協議的標準化也推動了計算機網絡的普及。


  ISO對協議進行分層,每個分層可以獨立使用,其實系統中某些分層發生變化,也不會影響整個系統,因此可以構造一個擴展性和靈活性都比較強的系統;此外,通過分層可以細分通信功能,更易於單獨實現每個分層的協議,界定各個分層的具體責任和義務。

 

  但過分模塊化,處理變得更加沉重,以及每個模塊都不得不事先相似的處理邏輯等。

各層功能描述:

 

 

1.物理層協議:

負責0、1 比特流(0/1序列)與電壓的高低、逛的閃滅之間的轉換。規定了激活、維持、關閉通信端點之間的機械特性、電氣特性、功能特性以及過程特性;該層爲上層協議提供了一個傳輸數據的物理媒體,只是說明標準。

在這一層,數據的單位稱爲比特(bit)(注:bit和字節Byte,我們常說的1字節8位2進制即:1B=8bit)。屬於物理層定義的典型規範代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45、fddi令牌環網。

2.數據鏈路層協議:
負責物理層面上的互聯的、節點間的通信傳輸(例如一個以太網項鍊的2個節點之間的通信);該層的作用包括:物理地址尋址、數據的成幀、流量控制、數據的檢錯、重發等。
在這一層,數據的單位稱爲幀(frame)。數據鏈路層協議的代表包括:ARP、RARP、SDLC、HDLC、PPP、STP、幀中繼等。

 

 

 

3.網絡層協議:

將數據傳輸到目標地址;目標地址可以使多個網絡通過路由器連接而成的某一個地址,主要負責尋找地址和路由選擇,網絡層還可以實現擁塞控制、網際互連等功能。

在這一層,數據的單位稱爲數據包(packet)。網絡層協議的代表包括:IP、IPX、RIP、OSPF等。

 

4.傳輸層協議(核心層):
傳輸層是OSI中最重要、最關鍵的一層,是唯一負責總體的數據傳輸和數據控制的一層;
傳輸層提供端到端的交換數據的機制,檢查分組編號與次序,傳輸層對其上三層如會話層等,提供可靠的傳輸服務,對網絡層提供可靠的目的地站點信息主要功能。在這一層,數據的單位稱爲數據段(segment)。主要功能:
①:爲端到端連接提供傳輸服務。
②:這種傳輸服務分爲可靠和不可靠的,其中Tcp是典型的可靠傳輸,而Udp則是不可靠傳輸。
③:爲端到端連接提供流量控制,差錯控制,服務質量(Quality of Service,QoS)等管理服務。
包括的協議如下:
TCP:傳輸控制協議,傳輸效率低,可靠性強。

UDP:用戶數據報協議,適用於傳輸可靠性要求不高,數據量小的數據。

 

 

DCCP、SCTP、RTP、RSVP、PPTP等協議。

 

 

 

5.會話層協議:

 

負責建立和斷開通信連接(數據流動的邏輯通路),記憶數據的分隔等數據傳輸相關的管理。

 

6.表示層協議:

數據格式轉換爲標準格式,將應用處理的信息轉換爲適合網絡傳輸的格式,或將來自下一層的數據轉換爲上層能夠處理的格式;主要負責數據格式的轉換,確保一個系統的應用層信息可被另一個系統應用層讀取。具體來說,就是將設備固有的數據格式轉換爲網絡標準傳輸格式,不同設備對同一比特流解釋的結果可能會不同;因此,主要負責使它們保持一致。

7.應用層協議:
①:超文本傳輸協議HTTP:這是一種最基本的客戶機/服務器的訪問協議;瀏覽器向服務器發送請求,而服務器迴應相應的網頁。
②:文件傳送協議FTP:提供交互式的訪問,基於客戶服務器模式,面向連接 使用TCP可靠的運輸服務。主要功能:減少/消除不同操作系統下文件的不兼容性。 
③:遠程登錄協議TELNET:客戶服務器模式,能適應許多計算機和操作系統的差異,網絡虛擬終端NVT的意義。
④:簡單郵件傳送協議SMTP:Client/Server模式,面向連接。基本功能:寫信、傳送、報告傳送情況、顯示信件、接收方處理信件。 
⑤:DNS域名解析協議:DNS是一種用以將域名轉換爲IP地址的Internet服務。
⑥:簡單文件傳送協議TFTP:客戶服務器模式,使用UDP數據報,只支持文件傳輸,不支持交互,TFTP代碼佔內存小。 
⑦:簡單網絡管理協議(SNMP): SNMP模型的4個組件:被管理結點、管理站、管理信息、管理協議。SNMP代理:運行SNMP管理進程的被管理結點。
⑧DHCP動態主機配置協議: 發現協議中的引導文件名、空終止符、屬名或者空,DHCP供應協議中的受限目錄路徑名 Options –可選參數字段,參考定義選擇列表中的選擇文件。
  PS:其實協議分層只是爲了更好地理解我運用協議的作用,而不是絕對的分層,有的層之間協議也是可以共用的,特別是會話層、表示層和應用層這三層。

 

 

 

三、TCP/IP協議
  1、介紹

  Transmission Control Protocol/Internet Protocol的簡寫,中譯名爲傳輸控制協議/因特網互聯協議,又名網絡通訊協議,是Internet最基本的協議、Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議等組成(當然還有其他後來發展起來的網絡協議,還包括 ARP,ICMP,IGMP,UDP,以及讓域名訪問成爲可能的DNS,以及電腦/手機可以自動獲取IP地址的DHCP。當然還有形形色色的應用層的協議如 HTTP / SMTP / FTP 等。)。TCP/IP 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。而IP是給因特網的每一臺聯網設備規定一個地址。

  2、TCP/IP協議的發展歷程
  (以下內容來自百度百科):

  爲了減少網絡設計的複雜性,大多數網絡都採用分層結構。而TCP/IP協議採用了4層的層級結構。

  在阿帕網(ARPA)產生運作之初,通過接口信號處理機實現互聯的電腦並不多,大部分電腦相互之間不兼容。在一臺電腦上完成的工作,很難拿到另一臺電腦上去用,想讓硬件和軟件都不一樣的電腦聯網,也有很多困難。當時美國的狀況是,陸軍用的電腦是DEC系列產品,海軍用的電腦是Honeywell中標機器,空軍用的是IBM公司中標的電腦,每一個軍種的電腦在各自的系裏都運行良好,但卻有一個大弊病:不能共享資源。
  當時科學家們提出這樣一個理念:“所有電腦生來都是平等的。”爲了讓這些“生來平等”的電腦能夠實現“資源共享”就得在這些系統的標準之上,建立一種大家共同都必須遵守的標準,這樣才能讓不同的電腦按照一定的規則進行“談判”,並且在談判之後能“握手”。
  在確定今天因特網各個電腦之間“談判規則”過程中,最重要的人物當數瑟夫(Vinton G.Cerf)。正是他的努力,才使今天各種不同的電腦能按照協議上網互聯。瑟夫也因此獲得了與克萊因羅克(“因特網之父”)一樣的美稱“互聯網之父”。
  瑟夫從小喜歡標新立異,堅強而又熱情。中學讀書時,就被允許使用加州大學洛杉磯分校的電腦,他認爲“爲電腦編程序是個非常激動人心的事,......只要把程序編好,就可以讓電腦做任何事情。”1965年,瑟夫從斯坦福大學畢業到IBM的一家公司當系統工程師,工作沒多久,瑟夫就覺得知識不夠用,於是到加州大學洛杉磯分校攻讀博士,那時,正逢阿帕網的建立,“接口信號處理機”(IMP)的研試及網絡測評中心的建立,瑟夫也成了著名科學家克萊因羅克手下的一位學生。瑟夫與另外三位年輕人(溫菲爾德、克羅克、佈雷登)參與了阿帕網的第一個節點的聯接。此後不久,BBN公司對工作中各種情況發展有很強判斷能力、被公認阿帕網建成作出巨大貢獻的鮑伯·卡恩(Bob Kahn)也來到了加州大學洛杉磯分校。在那段日子裏,往往是卡恩提出需要什麼軟件,而瑟夫則通宵達旦地把符合要求的軟件給編出來,然後他們一起測試這些軟件,直至能正常運行。
  當時的主要格局是這樣的,羅伯茨提出網絡思想設計網絡佈局,卡恩設計阿帕網總體結構,克萊因羅克負責網絡測評系統,還有衆多的科學家、研究生參與研究、試驗。69年9月阿帕網誕生、運行後,才發現各個IMP連接的時候,需要考慮用各種電腦都認可的信號來打開通信管道,數據通過後還要關閉通道。否則這些IMP不會知道什麼時候應該接收信號,什麼時候該結束,這就是我們所說的通信“協議”的概念。1970年12月制定出來了最初的通信協議由卡恩開發、瑟夫參與的“網絡控制協議”(NCP),但要真正建立一個共同的標準很不容易,72年10月國際電腦通信大會結束後,科學家們都在爲此而努力。
  “包切換”理論爲網絡之間的聯接方式提供了理論基礎。卡恩在自己研究的基礎上,認識到只有深入理解各種操作系統的細節才能建立一種對各種操作系統普適的協議,73年卡恩請瑟夫一起考慮這個協議的各個細節,他們這次合作的結果產生了在開放系統下的所有網民和網管人員都在使用的“傳輸控制協議”(TCP,Transmission-Control Protocol)和“因特網協議”(IP,Internet Protocol)即TCP/IP協議。
  通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。而IP是給因特網的每一臺電腦規定一個地址。1974年12月,卡恩、瑟夫的第一份TCP協議詳細說明正式發表。當時美國國防部與三個科學家小組簽定了完成TCP/IP的協議,結果由瑟夫領銜的小組捷足先登,首先制定出了通過詳細定義的TCP/IP協議標準。當時作了一個試驗,將信息包通過點對點的衛星網絡,再通過陸地電纜,再通過衛星網絡,再由地面傳輸,貫串歐洲和美國,經過各種電腦系統,全程9.4萬公里竟然沒有丟失一個數據位,遠距離的可靠數據傳輸證明了TCP/IP協議的成功。
  1983年1月1日,運行較長時期曾被人們習慣了的NCP被停止使用,TCP/IP協議作爲因特網上所有主機間的共同協議,從此以後被作爲一種必須遵守的規則被肯定和應用。2005年9月9日卡恩和瑟夫由於他們對於美國文化做出的卓越貢獻被授予總統自由勳章。
  3、TCP/IP四層模型

 

四、IP協議
  1、介紹

  IP協議(Internet Protocol)是將多個包交換網絡連接起來,它在源地址和目的地址之間傳送一種稱之爲數據包的東西,它還提供對數據大小的重新組裝功能,以適應不同網絡對包大小的要求。IP協議在OSI參考模型中應用於網絡層,以“數據包(Package)”爲單位。其中,IP地址的定義是確認唯一端口號和路由選擇的關鍵,IP地址相當於每臺電話的電話號碼,唯一且是我們互相聯繫的關鍵,因此IP協議也是網絡互連的關鍵。


  2、IP協議特點
①IP協議是一種無連接、不可靠的分組傳送服務的協議。
②IP協議是點-點線路的網絡層通信協議。IP協議是針對原主機-路由器、路由器-路由器、路由器-目的主機之間的數據傳輸的點-點線路的網絡層通信協議。
③IP協議屏蔽了網絡在數據鏈路層、物理層協議與實現技術上的差異。:通過IP協議,網絡層向傳輸層提供的是統一的IP分組,傳輸層不需要考慮互聯網在數據鏈路層、物理層協議與實現技術上的差異,IP協議使得異構網絡的互聯變得容易了。
  3、IPV4和IPV6
  目前,主流IP是基於IPv4的,但IPV4網絡難以實現網絡實名制,一個重要原因就是因爲IP資源的共用,因爲IP資源不夠(IPV4爲32位),所以不同的人在不同的時間段共用一個IP,IP和上網用戶無法實現一一對應。而IPv6(128位,足夠長)的普及將改變現狀,因爲IPv6一個重要的應用將是實現網絡實名制下的互聯網身份證/VIeID,在IPv4下,現在根據IP查人也比較麻煩,電信局要保留一段時間的上網日誌纔行,通常因爲數據量很大,運營商只保留三個月左右的上網日誌,比如查前年某個IP發帖子的用戶就不能實現。IPv6的出現可以從技術上一勞永逸地解決實名制這個問題,因爲那時IP資源將不再緊張,運營商有足夠多的IP資源,那時候,運營商在受理入網申請的時候,可以直接給該用戶分配一個固定IP地址,這樣實際就實現了實名制,也就是一個真實用戶和一個IP地址的一一對應。當一個上網用戶的IP固定了之後,你任何時間做的任何事情都和一個唯一IP綁定,你在網絡上做的任何事情在任何時間段內都有據可查,並且無法否認。因此你可能昨晚剛瀏覽過非法網站後,第二天早上就會有人上門給你開罰款單(嘖嘖)。
  IPv4,是互聯網協議(Internet Protocol,IP)的第四版,也是第一個被廣泛使用,構成現今互聯網技術的基礎的協議。1981年 Jon Postel 在RFC791中定義了IP,Ipv4可以運行在各種各樣的底層網絡上,比如端對端的串行數據鏈路(PPP協議和SLIP協議) ,衛星鏈路等等。局域網中最常用的是以太網。目前的全球因特網所採用的協議族是TCP/IP協議族。IP是TCP/IP協議族中網絡層的協議,是TCP/IP協議族的核心協議之一。目前IP協議的版本號是4(簡稱爲IPv4,v,version版本),它的下一個版本就是IPv6。

  數據報格式如下:首部的長度是以4個字節爲單位,長度可以是20-60字節,這跟首部的HLEN字段有關。

    

1.首部長度:這個4位字段定義了數據報首部的長度,以4字節的字爲單位。當首部沒有選項時,首部長度位20字節;當這個字段值位最大值F時,首部長度最大爲60字節。
2.服務類型:在最初這個字段有一部分用於定義數據報的優先級,剩下的一部分定義了服務類型。IETF已經改變了這個8位字段的解釋,現在定義了一組區分服務。在這種解釋種,前6位構成了碼點(codepoint),最後兩位未使用。當碼點字段最右邊的3位不全爲0時,這6位定義了54種服務,低延時,高吞吐量等等。
3.總長度:這個16位字段定義了數據報總長度,其以字節爲單位。故IPv4數據報總長度上限值位65536字節。注:爲什麼需要這個字段?在許多情況下,我們確實不需要這個字段值。但是有些情況下,封裝在一個幀裏的並不僅僅是數據報,還可能附加了一些填充。比如,以太網協議對幀的數據有最大值(1500字節)和最小值(46字節)的限制,當數據小於46字節時,數據將含有填充數據。
4.標識(identification): 這個16位字段標誌了從源主機發出的一個數據報,這樣就確定了數據報的唯一性。這樣使得數據報被分片後,在到達終點時終點能根據標識號將同一個數據報的分片重新組裝成一個數據報。
5.標誌(flag):第一位保留(未用),第二位爲“不分片(do not fragment)”,第三位位“還有分片(more fragment)”。
6.分片偏移:這個13位字段表示的是分片在整個數據報中的相對位置。這是數據在原始數據報中的偏移量,以8字節位單位。
7.生存時間:這個8位字段用來控制數據報所經過的最大跳數(路由器),每經過一個路由器,這個字段數值都減1,減1後變位0時,路由器就丟棄這個數據報。
8.協議:這個8位字段定義了使用IPv4服務的高層協議,如TCP,UDP,ICMP,IGMP,OSPF等的數據都將被封裝到IP數據報中。這個字段指明數據報必須交付給哪個最終目的協議。
9.檢驗和:檢驗IP數據報首部。
10.源地址:定義了源點的IP地址,這個字段始終保持不變。

11.目的地址:定義了終點的IP地址,這個字段始終保持不變。

  IPV4地址格式:
  IPv4中規定IP地址長度爲32(按TCP/IP參考模型劃分) ,即有2^32-1個地址。 ipv4所存在的問題 一般的書寫法爲4個用小數點分開的十進制數。也有人把4位數字化成一個十進制長整數,但這種標示法並不常見。另一方面,IPv6使用的128位地址所採用的位址記數法,在IPv4也有人用,但使用範圍更少。 過去IANAIP地址分爲A,B,C,D 4類,把32位的地址分爲兩個部分:前面的部分代表網絡地址,由IANA分配,後面部分代表局域網地址。如在C類網絡中,前24位爲網絡地址,後8位爲局域網地址,可提供254個設備地址(因爲有兩個地址不能爲網絡設備使用: 255爲廣播地址,0代表此網絡本身) 。網絡掩碼(Netmask) 限制了網絡的範圍,1代表網絡部分,0代表設備地址部分,例如C類地址常用的網絡掩碼爲255.255.255.0。
IPv6:
  由於IPv4最大的問題在於網絡地址資源有限,嚴重製約了互聯網的應用和發展。IPv6的使用,不僅能解決網絡地址資源數量的問題,而且也解決了多種接入設備連入互聯網的障礙。IPV6號稱可以爲全世界的每一粒沙子編上一個網址。

  發展歷史:2003年1月22日,IETF發佈了IPv6測試性網絡。最初開始於虛擬網絡,它使用IPv6-over-IPv4隧道過渡技術。因此,它是一個基於IPv4互聯網且支持IPv6傳輸的網絡,後來逐漸建立了純IPv6鏈接。從2011年開始,主要用在個人計算機和服務器系統上的操作系統基本上都支持高質量IPv6配置產品。例如,Microsoft Windows從Windows 2000起就開始支持IPv6,到Windows XP時已經進入了產品完備階段。一些應用基於IPv6實現.如BitTorrent點到點文件傳輸協議等,避免了使用NAT的IPv4私有網絡無法正常使用的普遍問題。2012年6月6日,國際互聯網協會舉行了世界IPv6啓動紀念日,這一天,全球IPv6網絡正式啓動。多家知名網站,如Google、Facebook和Yahoo等,於當天全球標準時間0點(北京時間8點整)開始永久性支持IPv6訪問。


  IPV6地址格式:

  IPv6的地址長度爲128b,是IPv4地址長度的4倍。於是IPv4點分十進制格式不再適用,採用十六進制表示。IPv6有3種表示方法。

冒分十六進制表示法:
格式爲X:X:X:X:X:X:X:X,其中每個X表示地址中的16b,以十六進制表示,例如:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,這種表示法中,每個X的前導0是可以省略的,例如:2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A。
0位壓縮表示法:
在某些情況下,一個IPv6地址中問可能包含很長的一段0,可以把連續的一段0壓縮爲“::”。但爲保證地址解析的唯一性,地址中”::”只能出現一次,例如: 
FF01:0:0:0:0:0:0:1101 → FF01::1101 
0:0:0:0:0:0:0:1 → ::1 
0:0:0:0:0:0:0:0 → ::
內嵌IPv4地址表示法:
爲了實現IPv4-IPv6互通,IPv4地址會嵌入IPv6地址中,此時地址常表示爲:X:X:X:X:X:X:d.d.d.d,前96b採用冒分十六進制表示,而最後32b地址則使用IPv4的點分十進制表示,例如::192.168.0.1與::FFFF:192.168.0.1就是兩個典型的例子,注意在前96b中,壓縮0位的方法依舊適用。

 

  IPV6報文格式:

 

 

五、TCP協議

 

 

  1、介紹

 

  TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的, 基於IP的傳輸層協議。TCP在IP報文的協議號是6。TCP是一個超級麻煩的協議,而它又是互聯網的基礎。下面是OSI七層模型圖:

 

TCP工作在網絡OSI的七層模型中的第四層——Transport層(傳輸層),IP在第三層——Network層,ARP 在第二層——Data Link層。在第二層的數據,我們把它叫Frame(數據幀),在第三層的數據叫Packet(數據包),第四層的數據叫Segment(數據段)。 同時,我們需要簡單的知道,數據從應用層發下來,會在每一層都會加上頭部信息,進行封裝,然後再發送到數據接收端。所以數據的發送和接收其實就是數據的封裝和解封裝的過程。 

 

  2、TCP報文格式

 

如上圖所示,TCP數據格式是由若干具有特殊含義字段組成的。其中,


Source Port和Destination Port:分別佔用16位,表示源端口號和目的端口號;用於區別主機中的不同進程, 而IP地址是用來區分不同的主機的,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能唯一 的確定一個TCP連接;
Sequence Number:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據 字節在數據流中的序號;主要用來解決網絡報亂序的問題;
Acknowledgment Number:32位確認序列號包含發送確認的一端所期望收到的下一個序號,因此,確認序號應 當是上次已成功收到數據字節序號加1。不過,只有當標誌位中的ACK標誌(下面介紹)爲1時該確認序列號的字 段纔有效。主要用來解決不丟包的問題;
Offset:給出首部中32 bit字的數目,需要這個值是因爲任選字段的長度是可變的。這個字段佔4bit(最多能 表示15個32bit的的字,即4*15=60個字節的首部長度),因此TCP最多有60字節的首部。然而,沒有任選字段, 正常的長度是20字節;
TCP Flags:TCP首部中有6個標誌比特,它們中的多個可同時被設置爲1,主要是用於操控TCP的狀態機的,依次 爲URG,ACK,PSH,RST,SYN,FIN。
URG:此標誌表示TCP包的緊急指針域(後面馬上就要說到)有效,用來保證TCP連接不被中斷,並且督促 中間層設備要儘快處理這些數據;
ACK:此標誌表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1, 爲1的時候表示應答域有效,反之爲0;
PSH:這個標誌位表示Push操作。所謂Push操作就是指在數據包到達接收端以後,立即傳送給應用程序, 而不是在緩衝區中排隊;
RST:這個標誌表示連接復位請求。用來複位那些產生錯誤的連接,也被用來拒絕錯誤和非法的數據包;
SYN:表示同步序號,用來建立連接。SYN標誌位和ACK標誌位搭配使用,當連接請求的時候,SYN=1, ACK=0;連接被響應的時候,SYN=1,ACK=1;這個標誌的數據包經常被用來進行端口掃描。掃描者發送 一個只有SYN的數據包,如果對方主機響應了一個數據包回來 ,就表明這臺主機存在這個端口;但是由於這 種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全 的主機將會強制要求一個連接嚴格的進行TCP的三次握手;

Window:窗口大小,也就是有名的滑動窗口,用來進行流量控制。這是一個複雜的問題,本文不再論述。

 

 

  3、TCP協議的三次握手

 

  TCP是面向連接的,無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。在TCP/IP協議中,TCP 協議提供可靠的連接服務,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方的序列號和確認號並交換 TCP窗口大小信息。如下圖TCP的通信過程所示:

 

三次握手具體過程(狀態)如下(其實可以類比打電話的過程:甲打電話,並等待接聽→乙收到來電顯示,“並表示可以接聽”→“甲收到乙可以接聽的信息”,甲接聽電話。注:引號部分是打電話過程中沒有的,但在TCP三次握手中存在):


第一次握手:建立連接。客戶端發送連接請求報文段,將SYN位置爲1,Sequence Number爲x;然後,客戶端進入SYN_SEND狀態,等待服務器的確認。(客戶的建立連接並等待確認)


第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設置Acknowledgment Number爲x+1(Sequence Number+1);同時,自己自己還要發送SYN請求信息,將SYN位置爲1,Sequence Number爲y;服務器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態。(服務器端發送相關報文段信息並等待連接)


第三次握手:客戶端收到服務器的SYN+ACK報文段。然後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢以後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。(客戶的接收到服務端信息並實現連接)


  然後,客戶端和服務端就能實現正常的數據傳輸啦!


  4、TCP協議的四次分手
   既然握手都需要頻繁確認,那麼“分手”又怎能馬虎呢?具體過程(狀態)如下(同樣也可以看做掛電話的過程:我說完了,掛?→我也說完了,掛吧?→好,拜拜→bye。簡言之就是確認通信雙方都交流完畢再確認斷開連接):


第一次分手:主機1(可以使客戶端,也可以是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了。(一方數據發送完成)
第二次分手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number爲Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我也沒有數據要發送了,可以進行關閉連接了。(另一方數據發送完成)
第三次分手:主機2向主機1發送FIN報文段,請求關閉連接,同時主機2進入CLOSE_WAIT狀態。(請求關閉連接並等待)
第四次分手:主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連接;此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連接了。(關閉連接)
  現在,我們也應該理解爲什麼TCP協議是面向連接的、可靠的、基於IP協議的“通信控制協議”了。TCP的三次握手保證了數據的可靠性,保證資源不被浪費,而四次分手保證連接的可靠性而不至於隨意斷開連接,但TCP協議也由其可靠性,數據傳輸效率變得較低,而不像UDP那樣進行實時快速傳輸,下面我們就來學習什麼是UDP協議。


六、UDP協議
  1、介紹

  UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。


  與所熟知的TCP(傳輸控制協議)協議一樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考模型,UDP和TCP都屬於傳輸層協議。UDP協議的主要作用是將網絡數據流量壓縮成數據包的形式。一個典型的數據包就是一個二進制數據的傳輸單位。每一個數據包的前8個字節(16*4位)用來包含報頭信息,剩餘字節則用來包含具體的傳輸數據。


  2、UDP報文格式

  與TCP協議不同,UDP協議是非面向連接的不可靠協議,因此沒有了SYN等處理兩端等待或連接的報文段,相比之下,UDP的報文格式更爲簡單,主要由報文頭(由均16位的源端口號、目的端口號、UDP長度和UDP校驗和組成)和具體傳輸數據組成。如圖所示:

UDP長度:UDP報文的整個大小,最小爲8個字節(16*4位)(僅爲首部)。
UDP檢驗和:在進行檢驗和計算時,會添加一個僞首部一起進行運算。僞首部(佔用12個字節)爲:4個字節的源IP地址、4個字節的目的IP地址、1個字節的0、一個字節的數字17、以及佔用2個字節UDP長度。這個僞首部不是報文的真正首部,只是引入爲了計算校驗和。相對於IP協議的只計算首部,UDP檢驗和會把首部和數據一起進行校驗。接收端進行的校驗和與UDP報文中的校驗和相與,如果無差錯應該全爲1。如果有誤,則將報文丟棄或者發給應用層、並附上差錯警告。
  3、UDP特性
(1) UDP是一個無連接協議,傳輸數據之前源端和終端不建立連接,當 UDP想傳送時就簡單地去抓取來自應用程序的數據,並儘可能快地把它扔到網絡上。在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。
(2) 由於傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一臺服務機可同時向多個客戶機傳輸相同的消息。
(3) UDP信息包的標題很短,只有8個字節,相對於TCP的20個字節信息包的額外開銷很小。
(4) 吞吐量不受擁擠控制算法的調節,只受應用軟件生成數據的速率、傳輸帶寬、源端和終端主機性能的限制。
(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的鏈接狀態表(這裏面有許多參數)。
(6)UDP是面向報文的。發送方的UDP對應用程序交下來的報文,在添加首部後就向下交付給IP層。既不拆分,也不合並,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。 雖然UDP是一個不可靠的協議,但它是分發信息的一個理想協議。例如,在屏幕上報告股票市場、在屏幕上顯示航空信息等等。UDP也用在路由信息協議RIP(Routing Information Protocol)中修改路由表。在這些應用場合下,如果有一個消息丟失,在幾秒之後另一個新的消息就會替換它。UDP廣泛用在多媒體應用中,例如,Progressive Networks公司開發的RealAudio軟件,它是在因特網上把預先錄製的或者現場音樂實時傳送給客戶機的一種軟件,該軟件使用的RealAudio audio-on-demand protocol協議就是運行在UDP之上的協議,大多數因特網電話軟件產品也都運行在UDP之上。
  在選擇使用協議的時候,選擇UDP必須要謹慎。在網絡質量令人十分不滿意的環境下,UDP協議數據包丟失會比較嚴重。但是由於UDP的特性:它不屬於連接型協議,因而具有資源消耗小,處理速度快的優點,所以通常音頻、視頻和普通數據在傳送時使用UDP較多,因爲它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。


七、TCP協議和UDP協議的區別
  1、一般區別

TCP是面向連接的,傳輸數據保證可靠性和安全性;TCP協議是非面向連接的,是不可靠但高效率的協議。
TCP佔用資源多而UDP佔用少。
TCP是流模式而TCP是數據報模式。(可以這樣理解:TCP是面向連接的,用打電話的過程來類比,就是通信雙方是互相明確的,所以進行的是“你一句我一句”的交流,TCP整個通信過程間有一個緩存區,由於通信主體明確,因此可以斷斷續續地進行交流,數據好比水流,知道源頭和目的地,因此稱爲流模式。反過來,UDP是非面向連接的,好比寫信的過程,假設我們只要知道佩奇的地址,我們就能寫信給佩奇,而佩奇卻不認識我們。這樣發起通信方的身份是不明確的,每個發送端的信息都不能和別的發送端混淆,不然會造成數據失效,所以UDP要對數據進行“打包”發送,是面向報文的,就像寫信需要用信封套起來,不然只發送數據甚至數據混合會變得毫無意義,就像qq羣的匿名聊天,這不扯皮嗎?)
TCP和UDP的應用場景和編程方式也有很大差別,此處不再贅述。
  2、TCP的粘包和UDP的丟包
   TCP粘包現象:TCP粘包是指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接着前一包數據的尾。

  粘包原因:

發送端:
TCP默認會使用Nagle算法。而Nagle算法主要做兩件事:1)只有上一個分組得到確認,纔會發送下一個分組;2)收集多個小分組,在一個確認到來時一起發送。所以,正是Nagle算法造成了發送方有可能造成粘包現象。
接收端:TCP接收到分組時,並不會立刻送至應用層處理,或者說,應用層並不一定會立即處理;實際上,TCP將收到的分組保存至接收緩存裏,然後應用程序主動從緩存裏讀收到的分組。這樣一來,如果TCP接收分組的速度大於應用程序讀分組的速度,多個包就會被存至緩存,應用程序讀時,就會讀到多個首尾相接粘到一起的包。
  粘包處理:如果黏在一起的包是同一個整體,即同意部分數據分割而來的,那麼就不用進行處理。如果是不同部分的數據粘到一起,就需要進行粘包解決:


發送端導致:使用TCP_NODELAY選項來關閉Nagle算法。
接收端導致:暫無。
統一解決(應用層):可以解決接收方造成的粘包問題,還能解決發送方造成的粘包問題。
解決方法就是循環處理:應用程序在處理從緩存讀來的分組時,讀完一條數據時,就應該循環讀下一條數據,直到所有的數據都被處理;但是如何判斷每條數據的長度呢?
兩種途徑:
  1)格式化數據:每條數據有固定的格式(開始符、結束符),這種方法簡單易行,但選擇開始符和結束符的時候一定要注意每條數據的內部一定不能出現開始符或結束符;
       2)發送長度(推薦):發送每條數據的時候,將數據的長度一併發送,比如可以選擇每條數據的前4位是數據的長度,應用層處理時可以根據長度來判斷每條數據的開始和結束。
  UDP丟包現象:丟包現象即使用UDP發送時,由於不可靠連接方式,收到各種因素影響,數據包可能會在接受過程中丟失一部分,從而導致數據不完整。

  
UDP丟包原因:
發送端:發送的包太大導致send方法無法正常切割爲小包導致丟包、發送的包太大超過緩存設置也會出現對包、發送頻率太快導致接收端未接受或溢出緩衝區而丟包。
接收端:處理時間過長導致丟包。
其他:網絡等問題。
  UDP丟包處理:
UDP的缺陷在於丟包和亂序問題,一般視情況進行處理,而發送的時候也需要注意上述導致丟包的問題。
八、HTTP協議
   1、介紹
  超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲廣泛的一種網絡協議。所有的萬維網WWW(World Wide Web)文件都必須遵守這個標準。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之爲超文本(hypertext),這成爲了HTTP超文本傳輸協議標準架構的發展根基。


  HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。


  HTTP協議工作於客戶端-服務端架構爲上。瀏覽器作爲HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。

 

 

2、HTTP特點
  HTTP是一個客戶端和服務器端請求和應答的標準,通常,由HTTP客戶端發起一個請求,建立一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監聽客戶端發送過來的請求。一旦收到請求,服務器(向客戶端)發回一個狀態行。 HTTP協議的網頁 HTTP協議的網頁 HTTP使用TCP而不是UDP的原因在於(打開)一個網頁必須傳送很多數據,而TCP協議提供傳輸控制,按順序組織數據,和錯誤糾正。


  通過HTTP或者HTTPS協議(HTTP協議+SSL協議)請求的資源由統一資源標示符(Uniform Resource Identifiers)(或者,更準確一些,URLs)來標識。HTTP有以下特點:


簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。


靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
支持B/S及C/S模式。
  3、HTTP的URL地址
  URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息,URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。以下面這個URL爲例,介紹下普通URL的各部分組成:


  http://www.cnblogs.com:8080/fzz9/index.jsp?id=30303&page=2#name


協議部分:一般爲HTTP或Https,後接//作爲分隔符。
域名部分:www.cnblogs.com爲網站域名。
端口號部分:此網址爲8080。跟在域名後面的是端口號,域名和端口之間使用“:”作爲分隔符。端口不是一個URL必須的部分,如果省略端口部分,將採用默認端口。


虛擬目錄部分:從域名後的第一個“/”開始到最後一個“/”爲止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。
參數部分:從“?”開始到“#”爲止之間的部分爲參數部分。本例中的參數部分爲“id=30303&page=2”。不是必要部分。
文件名部分:從域名後的最後一個“/”開始到後面一個“?”爲止,是文件名部分,如果沒有“?”,則是從域名後的最後一個“/”開始到“#”爲止,是文件部分,如果沒有“?”和“#”,那麼從域名後的最後一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.jsp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名。
錨部分:從“#”開始到最後,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分。
  4、HTTP請求之request

  客戶端通過HTTP協議進行請求時遵循一定的格式,請看下面的請求報文格式(由請求行、請求頭、空行、請求體組成):

而各部分組成如下所示:

而請求主要分爲post提交方法和get提交方法,每種選擇各有優缺點,此處不再贅述。目前大多數網站多采用post提交。


  5、Http響應之response

  在客戶端發送請求後服務端進行響應,將信息發送給客戶端,以實現功能服務,報文格式如下(包含狀態行、響應頭、空行、消息體):

響應組成此處也不再贅述,值得注意的是狀態碼,它以清晰明確的數字告訴客戶端本次請求的處理結果。 常見的狀態碼有:

九、Socket編程簡述
  Socket的英文原義是“孔”或“插座”。網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱爲一個socket。


  建立網絡通信連接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口。


  HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。


  網絡層的ip地址可以唯一標識網絡中的主機,而傳輸層的“協議+端口”可以唯一標識主機中的應用程序(進程)。這樣利用三元組(ip地址,協議,端口)就可以標識網絡的進程了,網絡中的進程通信就可以利用這個標誌與其它進程進行交互。 使用TCP/IP協議的應用程序通常採用應用編程接口,即Socket(UNIX  BSD的套接字(socket)和UNIX System V的TLI,已經被淘汰),來實現網絡進程之間的通信。

 

這裏只是簡單介紹哈socket,詳細的以後寫文章描述

參考轉載:http://www.cnblogs.com/fzz9/p/8964513.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章