1. 程式人生 > >27 網絡通信協議簡單闡述

27 網絡通信協議簡單闡述

部分 屬於 寫入內容 image 屏蔽 三次 即使 time 電話

一 前言

  在日常上網過程中,我們在網址欄中輸入網頁地址技術分享圖片

網絡傳輸都是電信號傳輸的,那我們怎麽把輸入的內容變成電信號呢?然後發送給百度讓他們知道我需要訪問他,那是不是發送的消息應該有一些固定的格式呢?讓所有電腦都能識別的消息格式,他就像英語成為世界上所有人通用語言一樣,如果把計算機看成分布於世界各地的人,那麽連接兩臺計算機之間的internet實際上就是一系列統一的標準,這些標準稱之為互聯網協議,互聯網的本質就是一系列的協議,總稱為‘互聯網協議’(Internet Protocol Suite)。

互聯網協議的功能:定義計算機如何接入internet,以及接入internet的計算機通信的標準。

二 osi七層協議

  互聯網協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層

  技術分享圖片

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

2. 數據鏈層:單純的電信號0和1沒有任何意義,必須規定電信號多少位一組,每組什麽意思,所以就有了數據鏈層來定義數據定義電信號的的分組方式。

這一層有一個重要的以太網協議ethernet

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

head date

head包含(18個字節)

發送者/源地址,6個字節(mac地址)

接收者/目標地址,6個字節

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

數據包具體內容:

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

mac地址

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

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

3 網絡層:

  網絡層由來:有了ethernet、mac地址、廣播的發送方式,世界上的計算機就可以彼此通信了,問題是世界範圍的互聯網是由一個個彼此隔離的小的局域網組成的,那麽如果所有的通信都采用以太網的廣播方式,那麽一臺機器發送的包全世界都會收到,不僅僅效率低,也不科學。

技術分享圖片

上圖結論:必須找出一種方法來區分哪些計算機屬於同一廣播域,哪些不是。如果是就采用廣播的方式發送,如果不是,就采用路由的方式(向不同廣播域/子網分發數據包),mac地址是無法區分的,它只跟廠商有關。。。網絡層功能:引入一套新的地址用來區分不同的廣播域/子網,這套地址即網絡地址

IP協議:

  • 規定網絡地址的協議叫ip協議,它定義的地址稱之為ip地址,廣泛采用的v4版本即ipv4,它規定網絡地址由32位2進制表示
  • 範圍0.0.0.0-255.255.255.255 (4個點分十進制,也就是4個8位二進制數)

  • ipv6,通過上面可以看出,ip緊缺,所以為了滿足更多ip需要,出現了ipv6協議:6個冒號分割的16進制數表示,這個應該是將來的趨勢,但是ipv4還是用的最多的,因為我們一般一個公司就一個對外的IP地址,我們所有的機器上網都走這一個IP出口。

技術分享圖片
每個以太網設備在出廠時都有一個唯一的MAC地址,為什麽還需要為每臺主機再分配一個IP地址?每臺主機都分配唯一的IP地址,為什麽還要在網絡設備(如網卡,集線器,路由器等)生產時內嵌一個唯一的MAC地址呢?

唯一的MAC地址

    MAC(Media Access Control或者Medium Access Control)地址,意譯為媒體訪問控制,或稱為物理地址、硬件地址,用來定義網絡設備的位置。在OSI模型中,第三層網絡層負責 IP地址,第二層數據鏈路層則負責 MAC地址。因此一個主機會有一個MAC地址,而每個網絡位置會有一個專屬於它的IP地址。 MAC地址是網卡決定的,是固定的。

    MAC地址,長度是48比特(6字節),由16進制的數字組成,分為前24位和後24位:

    前24位叫做組織唯一標誌符(Organizationally Unique Identifier,即    OUI),是由IEEE的註冊管理機構給不同廠家分配的代碼,區分了不同的廠家。

    後24位是由廠家自己分配的,稱為擴展標識符。同一個廠家生產的網卡中MAC地址後24位是不同的。

    每個以太網設備在出廠時都有一個唯一的MAC地址。

一個局域網內唯一的IP地址

    IP地址是指互聯網協議地址(英語:Internet Protocol Address,又譯為網際協議地址),是IP Address的縮寫。IP地址是IP協議提供的一種統一的地址格式,它為互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。

    IP地址被用來給Internet上的電腦一個編號。日常見到的情況是每臺聯網的PC上都需要有IP地址,才能正常通信。

    我們可以把“個人電腦”比作“一臺電話”,那麽“IP地址”就相當於“電話號碼”,而Internet中的路由器,就相當於電信局的“程控式交換機”。

    IP地址是一個32位的二進制數,通常被分割為4個“8位二進制數”(也就是4個字節)。IP地址通常用“點分十進制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進制整數。例:點分十進IP地址(100.4.5.6),實際上是32位二進制數(01100100.00000100.00000101.00000110)。

每臺主機都分配唯一的IP地址,為什麽還要一個唯一的MAC地址呢


    建立osi七層模型的主要目的是為解決異種網絡互連時所遇到的兼容性問題。它的最大優點是將服務、接口和協議這三個概念明確地區分開來:服務說明某一層為上一層提供一些什麽功能,接口說明上一層如何使用下層的服務,而協議涉及如何實現本層的服務;這樣各層之間具有很強的獨立性,互連網絡中各實體采用什麽樣的協議是沒有限制的,只要向上提供相同的服務並且不改變相鄰層的接口就可以了。網絡七層的劃分也是為了使網絡的不同功能模塊(不同層次)分擔起不同的職責,從而帶來如下好處:

    減輕問題的復雜程度,一旦網絡發生故障,可迅速定位故障所處層次,便於查找和糾錯;在各層分別定義標準接口,使具備相同對等層的不同網絡設備能實現互操作,各層之間則相對獨立,一種高層協議可放在多種低層協議上運行;能有效刺激網絡技術革新,因為每次更新都可以在小範圍內進行,不需對整個網絡動大手術。

從上可知:

    MAC用於第二層傳輸,IP用於第三層傳輸。分為兩層,用兩個地址,一個原因就是為了兼容性,能讓異構網互聯,即讓兩個不同架構之間的網絡也能通信,傳輸過程中Mac會變,IP不變。

    IP地址的作用很重要的一部分就是屏蔽底下鏈路層的差異,因為它是一個邏輯地址,所以可以適應於多種鏈路;以太網這種鏈路層組網方式中,要通過mac地址來通信,其實ip協議完全可以運行於串口(通常運行slip或ppp等鏈路層協議)等其他形式的鏈路之上,這時並不需要一個mac地址;在局域網中兩臺電腦之間傳輸數據包用MAC地址即可識別,而通過路由器訪問互聯網 ,傳輸數據包中的MAC地址就轉成路由器的MAC地址。此時就要靠IP來識別,當我要換了一臺路由器時候,只要我的IP地址不變,要跟我們傳輸數據的對象只要記住IP地址即可與我們通信而不需記住我們的mac地址。

IP地址和mac地址
ip與mac

以太網頭 ip 頭 ip數據

網絡層加工後的數據

4 傳輸層

  傳輸層的由來:網絡層的ip幫我們區分子網,以太網層的mac幫我們找到主機嗎,但是只找到主機有用嗎,是不是程序之間進行的溝通啊像QQ、瀏覽器和京東服務器,然後大家使用的都是應用程序,你的電腦上可能同時開啟qq,暴風影音,等多個應用程序,

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

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

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

  tcp協議:(TCP把連接作為最基本的對象,每一條TCP連接都有兩個端點,這種端點我們叫作套接字(socket),它的定義為端口號拼接到IP地址即構成了套接字,例如,若IP地址為192.3.4.16 而端口號為80,那麽得到的套接字為192.3.4.16:80。)

  當應用程序希望通過 TCP 與另一個應用程序通信時,它會發送一個通信請求。這個請求必須被送到一個確切的地址。在雙方“握手”之後,TCP 將在兩個應用程序之間建立一個全雙工 (full-duplex,雙方都可以收發消息) 的通信。

  這個全雙工的通信將占用兩個計算機之間的通信線路,直到它被一方或雙方關閉為止。它是可靠傳輸,TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。

以太網頭 ip 頭 tcp頭 數據

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

以太網頭 ip頭 udp頭 數據

技術分享圖片TCP 與 UDP對比

tcp三次握手和四次揮手

    我們知道網絡層,可以實現兩個主機之間的通信。但是這並不具體,因為,真正進行通信的實體是在主機中的進程,是一個主機中的一個進程與另外一個主機中的一個進程在交換數據。IP協議雖然能把數據報文送到目的主機,但是並沒有交付給主機的具體應用進程。而端到端的通信才應該是應用進程之間的通信。

    UDP,在傳送數據前不需要先建立連接,遠地的主機在收到UDP報文後也不需要給出任何確認。雖然UDP不提供可靠交付,但是正是因為這樣,省去和很多的開銷,使得它的速度比較快,比如一些對實時性要求較高的服務,就常常使用的是UDP。對應的應用層的協議主要有 DNS,TFTP,DHCP,SNMP,NFS 等。

    TCP,提供面向連接的服務,在傳送數據之前必須先建立連接,數據傳送完成後要釋放連接。因此TCP是一種可靠的的運輸服務,但是正因為這樣,不可避免的增加了許多的開銷,比如確認,流量控制等。對應的應用層的協議主要有 SMTP,TELNET,HTTP,FTP 等。

技術分享圖片

技術分享圖片
三次握手:

TCP服務器進程先創建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態;
TCP客戶進程也是先創建傳輸控制塊TCB,然後向服務器發出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。
TCP服務器收到請求報文後,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是同樣要消耗一個序號。
TCP客戶進程收到確認後,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。
當服務器收到客戶端的確認後也進入ESTABLISHED狀態,此後雙方就可以開始通信了。
三次握手 技術分享圖片
一句話,主要防止已經失效的連接請求報文突然又傳送到了服務器,從而產生錯誤。

如果使用的是兩次握手建立連接,假設有這樣一種場景,客戶端發送了第一個請求連接並且沒有丟失,只是因為在網絡結點中滯留的時間太長了,由於TCP的客戶端遲遲沒有收到確認報文,以為服務器沒有收到,此時重新向服務器發送這條報文,此後客戶端和服務器經過兩次握手完成連接,傳輸數據,然後關閉連接。此時此前滯留的那一次請求連接,網絡通暢了到達了服務器,這個報文本該是失效的,但是,兩次握手的機制將會讓客戶端和服務器再次建立連接,這將導致不必要的錯誤和資源的浪費。

如果采用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文並且回復了確認報文,但是客戶端不會再次發出確認。由於服務器收不到確認,就知道客戶端並沒有請求連接。
為什麽還要最後確定一次 技術分享圖片
數據傳輸完畢後,雙方都可釋放連接。最開始的時候,客戶端和服務器都是處於ESTABLISHED狀態,然後客戶端主動關閉,服務器被動關閉。服務端也可以主動關閉,一個流程。

客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。
服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最後的數據)。
服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
客戶端收到服務器的連接釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。註意此時TCP連接還沒有釋放,必須經過2??MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。
四次揮手

5 應用層

    應用層由來:用戶使用的都是應用程序,均工作於應用層,互聯網是開發的,大家都可以開發自己的應用程序,數據多種多樣,必須規定好數據的組織形式

    應用層功能:規定應用程序的數據格式。

    例:TCP協議可以為各種各樣的程序傳遞數據,比如Email、WWW、FTP等等。那麽,必須有不同協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了”應用層”。

技術分享圖片

技術分享圖片

6 socket

    我們知道兩個進程如果需要進行通訊最基本的一個前提能能夠唯一的標示一個進程,在本地進程通訊中我們可以使用PID來唯一標示一個進程,但PID只在本地唯一,網絡中的兩個進程PID沖突幾率很大,這時候我們需要另辟它徑了,我們知道IP層的ip地址可以唯一標示主機,而TCP層協議和端口號可以唯一標示主機的一個進程,這樣我們可以利用ip地址+協議+端口號唯一標示網絡中的一個進程。

    能夠唯一標示網絡中的進程後,它們就可以利用socket進行通信了,什麽是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。

技術分享圖片

  socket起源於UNIX,在Unix一切皆文件哲學的思想下,socket是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在建立連接打開後,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。

大神寫的:

  http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html?tdsourcetag=s_pcqq_aiomsg

27 網絡通信協議簡單闡述