之前不少不一樣的廠家生產各自的計算機,有着不一樣的操做系統,只有一樣的操做系統的計算機才能通訊,但TCP/IP容許這些不一樣的操做系統的計算機互相進行通訊,他們都準守則一些協議在網絡中進行傳輸,這些守則被稱之爲TCP/IP協議。 html
網絡分層 python
因爲TCP/IP協議比較複雜,因此咱們通常把TCP/IP協議經過分層來進行討論,每一層負責不一樣的通訊功能,每一層的開發都是獨立的,無需關心另一層,TCP/IP一般分爲四層,OSI把網絡一般分爲7層,本質上是同樣的,只是OSI七層模型分的更細而已。 瀏覽器
TCP/IP四層 服務器
應用層:負責特定的應用程序細節,如FTP, HTTP, TELNET 等 網絡 |
運輸層:爲應用程序提供端到端的通訊,TCP, UDP傳輸 架構 |
網絡層:IP選路,IP包,ICMP, IGMP及路由器相關 併發 |
鏈路層:設備驅動程序和網卡及以太網,交換機相關 tcp |
通常來講頂層應用層關心的是程序的細節,如FTP的login/dir/mget/等,不會關心下三層這個數據如何在網絡中傳輸,用TCP仍是UDP,如何在路由器中選路,如何獲取接收端的MAC地址從而正確無誤的傳達到目的端,這些在應用層是不關心的,同理下三層主要關心的是數據在網絡中的傳輸過程,如何可靠,如何快速到達等細節,而對應用程序卻一無所知,下三層不關心你是HTTP仍是FTP,它都把這些當作是數據封裝在數據裏,下三層考慮的是如何增長數據頭,以使得他們在網絡中進行正確的傳輸。互聯網的目的之一就是在應用程序中隱藏掉全部的物理細節,應用層不會關心也不能關心是在以太網中傳輸仍是在令牌環上傳輸,這樣應用開發人員只要開發好的應用,而網絡工程師則設計最好的,最快的,最適合的網絡 大數據
應用層:應用程序細節 加密 |
表示層:數據的表示,如jpeg, ascII, 加密格式 |
會話層:創建,管理,終止會話 |
傳輸層:定義端口,及流控,TCP/UDP |
網絡層: IP選路,邏輯尋址 |
鏈路層:硬件地址選址,差錯檢驗 |
物理層:物理電纜,光纖等傳輸媒介 |
數據封裝
以前說過,數據在網絡中傳輸須要通過數據鏈路層,網絡層,傳輸層,這實際上是一個封裝的過程,一個應用程序加上應用程序頭,如咱們瀏覽一個html網頁,看到了新浪首頁,裏面有圖片,有文字,咱們統稱爲數據,在這些數據前面加上Http頭,如版本信息等,應用層數據被分紅TCP分段,各分段被打上標籤,在傳輸層傳輸,傳輸層把http_head+data看做一個總體,統一加上tcp_head,TCP分段發送到網絡層,網絡層把tcp_head+http_head+data看做一個總體,統一加上ip_head封裝成IP數據報文,以後發送到接入層,把ip_head+tcp_head+http_head+data看做一個總體,統一加上ethernet_head成爲以太網幀,最後經過網線或光纖到達接收主機,這個封裝過程咱們通常把應用程序稱之爲數據,爲了可以更好的傳輸,咱們一般會把大數據進行分片,提升傳輸的可靠性,即便有一些片段丟失了,只須要重傳這一部分就好,而無需所有重傳,這個分段發生在傳輸層,稱之爲segment, TCP分段後在IP層進行傳輸,咱們稱之爲IP數據報,最後增長以太網首部後,整個數據咱們稱之爲以太網幀,以下圖
解封裝
接收主機以相反的方式進行解封裝,接收端收到的是ethernet_head+ip_head+tcp_head+http_head+data,把頭部一層一層的剝去,最終留下data給瀏覽器展示在客戶面前的是新浪的首頁
C/S模型
網絡中最經典的模型就是客戶端服務器模式,目的是使服務器爲客戶端提供一些特定的服務,紙上得來終覺淺,覺知此事需躬行,最後以一個經典的http案例來解釋網絡傳輸的過程,因爲只是綜述,並不打算展開細講,因此直接取局域網內的兩臺PC做實驗,免去IP路由這一塊。
Web Server:
IP: 192.168.2.111:8000
MAC: b4:6d:83:92:63:69
Web Client:
IP: 192.168.2.101
MAC: 00:26:c6:c9:ad:74(IntelCor_c9:ad:74)
Step1 找人:
Web Client想與 Web Server進行通訊,首先他得找到Web Server,這是一個經過IP地址尋找MAC地址的過程,client知道網址http://192.168.2.111:8000/blog,但它並不知道是哪臺服務器,此時它首先產生一個ARP的過程,經過IP尋找MAC的過程
Client首先廣播一個數據幀詢問本網誰的IP地址是192.168.2.111
Server接到該廣播後發現找的是本身,因而單播回給client,你要找的是我,並把本身的MAC地址告訴client,這樣client就能夠與server進行通訊了,ARP工做在二層,因此目前只有一個以太網頭,沒有IP頭
Step2 創建連繫
Client與Server經過三次握手創建鏈接,協商TCP分段大小,確認對端可靠,TCP的三次鏈接指的是client發一個sync給Server並帶上本身的client_seq值
Server收到sync後,回一個ack, ack=client_seq+1,併發送sync給client附上server_seq值,以指望獲得client的確認
Clinet收到Server的sync後,回一個ack=server_seq+1進行確認
TCP三次鏈接此時數據封裝在tcp層, Ethernet_head+ip_head+tcp_head+data(tcp_segment)
Step3 獲取頁面
Client發出一個get信息想獲取blog主頁,這個信息的tcp_len=363
Server接收到Client的消息後進行ack確認,ack=client_seq+tcp_len=1+363=364
Server回一個http 200表示http過程OK
Server開始傳送主頁的數據,因爲主頁html數據太大,須要進行分段傳輸,Server首先發了一個分段數據,Client確認後,Server繼續發送,直到數據發完後,進行結束確認
前面介紹的是數據包,能夠看到的都是封裝後的包,而如何封裝,如何解封裝在抓包中是看不到的,但在邏輯層面是存在分層,是經過主機或者設備的協議棧中進行封裝的,封裝的過程說白了就是對數據加頭部和尾部的過程,整個頭部和數據,尾部一塊兒統稱爲協議數據單元(PDU)發送的過程就是沿着OSI參考模型向下流動,不斷的加數據頭,PDU逐漸變長,各層協議均將其頭部信息添加進去,直到物理層進行傳輸,發送給目標主機,而接收端經過協議棧不斷的剝去協議頭部,最終只剩下原始的數據,這就是解封裝的過程
Client在計算機上瀏覽http://192.168.2.111:8000/blog Client須要從服務器上下載一個index.html的文件 Client把請求的數據沿着協議棧傳給傳輸層,因爲HTTP是基於TCP的,所以在傳輸層將建立TCP頭部來封裝HTTP數據 TCP是架構在IP之上的,爲了可以在網絡中傳輸,協議棧又把TCP看做一個總體,建立IP頭部進行封裝,以明確目的IP,進行邏輯尋址,發送數據到以太網上 以太網給IP數據建立以太網頭部,明確發送的接收主機是誰 當數據已經徹底封裝好後,傳遞給物理層,此時數據包變成0,1信號經過網絡進行傳輸 封裝好的數據經過網線到達服務器,服務器開始讀取數據,從下往上,先讀以太網數據幀,確認以太網頭部發的是否是本身,處理好後,剝去,再讀取IP頭部,確認數據包正確轉發,處理好後剝去,再確認TCP頭部,確保數據按序到達,隨後剝去,留下原始HTTP數據,分析應用層中的內容,返回HTTP 200代表OK,發送端等待服務器發送index.html頁面數據
總結:
這篇文章主要講的是網絡分層,數據封裝,這些都是在實際抓包過程當中看不到,可是倒是咱們分析數據的基礎,最後以一個經典的C/S,client取server頁面的實驗來討論封裝,來討論取數據的過程,但如IP,TCP的頭部細節等並不在本文討論範圍
參考:
TCP/IP協議卷一 https://community.emc.com/go/chinese