1. 程式人生 > >讀《網路是怎樣連線的》 第二章總結

讀《網路是怎樣連線的》 第二章總結

回顧第一章的內容

在第一章中,我們用socket 向web伺服器傳送HTTP請求命令,也從web伺服器收到HTTP響應資料,這個過程中,我們把socket想象成一個很厲害的管道,這個管道無視底層(傳輸層、網路層、資料鏈路層、物理層)的實現,直接在程式(瀏覽器)執行過程中就得到了我們想要的東西,並把它渲染成頁面,呈現給我們瀏覽.

現在這一章的內容,就是開啟黑匣子,看看資料在傳輸過程中,都發生了哪些有意思的事情吧!

 

故事,要從這張圖片開始...

還記得我們這張圖嗎?

毫無疑問,這是一串程式碼,嗯 判斷沒錯!!!

該程式碼在記憶體中執行,這裡面進行的域名解析(獲得域名對應的ip地址)和瀏覽器準備好了要在socket中傳送的HTTP請求,都是在應用層發生的事情,而這裡所謂的應用層,就是隻某些軟體啦,比如這裡的瀏覽器,它讓網路裝置幫忙進行了域名解析,然後自己把域名這個東西轉換成了HTTP請求,      嗯,它做的夠多了,讓它休息一下,我們看看之後發生了什麼吧.

 

現在我們看看圖片中的圈1有什麼內涵呢?

之前我們知道,兩 個socket 連線後相當於就又了管道,通過這個管道能自由的收發資料,,這裡圈1建了一個本地的socket,能用本機的ip和埠找到這個socket.

 

圈2?

我們討論tcp協議方式的連線,所以,第一步的話會進行三次握手,保證這個連線的可靠性,(這裡忽略了好多東西,比如相互之間傳送的SYN=1的控制碼、ack的接收確認碼,由於MTU大小而需要分開傳輸而使用的序號,

還有怕:對方緩衝池因為己方傳送速率高於對方應用程式讀取速率而導致的緩衝區溢位、後面傳送的包都無法接收。 而相互發送的視窗大小)

補充:三次握手期間傳送的包 在tcp的傳輸層封裝的時候,並沒有攜帶資料資訊.僅僅是傳送了控制資訊

是了,現在三次握手了,連線可靠安全了.

圈3?

這裡就要開始傳送資料啦,我們要對資料一層一層的封包並增加其首部的控制資訊

1.首先,應用層傳下來的,委託socket傳送的資料是HTTP請求.

        socket可選的傳送資料的方案有tcp、udp兩種,這裡我們就說tcp吧

2.tcp協議會把上層傳下來的東西當成一個黑盒子 ,不管裡面是些什麼東西,都當成是一個數據塊,並在前面增加首部,這個首部就是一些保證穩定連線的控制資訊啦,像之前提到的SYN、序號、埠號(識別該主機的哪一個socket)、視窗大小.

3ip協議會把上層tcp協議傳下來的東西也當成一個黑盒子,並在前面加一些首部控制資訊,這裡的控制資訊也非常多,主要的知道本機(某網絡卡)ip地址和目的ip地址、內部封裝的協議型別(比如tcp)就好了.

4.接下來還有個MAC首部,這個首部有三個東西,本機(某網絡卡)的MAC地址、下一個要到達的MAC地址和內部的協議型別,這個MAC首部封裝的是ip資料包,所以這個型別就寫表示ip型別的那個編碼(0800)就好了

5.然後就到了要把這數字訊號(0和1)轉換成能在乙太網上傳輸的電訊號(網線)和光訊號(光纖).  

 

接收的話就是反過來,    傳送的時候一直加首部、 接收的時候就是去掉首部,取內部的返回資料(比如我們想要的HTTP響應)

 

圈4?

雙方(web伺服器和本地應用程式)會在tcp控制訊號上互發fin,並相互接收對方的確認ACK後,關閉socket連線(就是呼叫了close())的意思

 

補充一些知識:

1.在填寫 目的MAC地址時,我們用了arp協議,這個協議就是在網段上廣播ip地址,如果某裝置是這個ip,它會返回其MAC地址,由此就找到了

2.ip首部填寫了目的IP,資料包要到這個ip地址,需要在網路中不斷的傳播,每個傳播的節點就是路由器,我們可以把這個路由器(路由器裡面的路由表)看成一個路標,對照了我們想去的ip地址,該路標會告訴我們往哪個方向走(我們下一站的路由節點是哪一個).

 

3.MAC首部的作用是什麼呢,在第二點中,我們知道了下一個地方我們要去的路由節點,但是怎麼去呢?  我們的資料包的到達一個路由節點後,知道了 下一個節點在哪,所以我們就再得到該節點的MAC地址,然後寫入到MAC首部,這樣就能去到下一個路由節點了.

 

4.在把MAC首部打包的東西給網絡卡,讓它幫忙轉換成電訊號或光訊號時,   是先把資料複製到緩衝區中,然後把資料先轉變成通用的 數字訊號+時鐘訊號組合的形式,這是因為網線不同,裡面傳播的訊號格式會有些不一樣.所有之後還有一個流程,用PHY把數字訊號+時鐘訊號的 形式轉換成 主機所連網線能傳輸的形式.

 

5.接收到訊號時,網絡卡的PHY都會讀進來並轉換形式,然後又是MAC模組再轉換形式,變成0和1的數字訊號,,然後通過末尾的FCS校驗,確認無誤後再檢查MAC頭部中的接收方地址,如果無誤則存到緩衝區中.如果發現MAC首部中的MAC不是MAC模組中記錄的地址,就會把這個資料丟了.     資料在緩衝區裡了,就會呼叫中斷程式 告訴cpu 這個程式(瀏覽器)等待的響應資料到啦,讓它把網絡卡緩衝區裡的資料讀到記憶體進行後續操作.

 

6. 接 5.    首先,我們先要解開MAC首部,解開的時候我們從首部中的協議型別中知道,後面的包中用的是IP協議,所以我們把MAC首部後面的資料塊給IP協議,讓它(IP協議棧)去解包.   解包後,我們檢視目的ip是不是本機(網絡卡)ip,如果是,進行後續操作,如果不是.就使用ICMP協議,向傳送方告知一下,你發出的包有誤,讓對方意識到出錯了就好了.

7. 接6 ,  ip協議解包後,由於看到了協議頭裡的資料型別是TCP型別,所以把後續的內容交給了TCP協議棧,tcp協議棧解包後,我們知道了埠號 ,加上另外從ip首部得知的ip地址,我們就能定位本機的哪一個Socket,知道是哪一個socket後,我們就能把tcp首部後面的資料交給他,完成整個SOCKet通訊過程.、