您好,我是南橘,萬法仙門的掌門,剛剛從九州世界穿越到地球,因為時空亂流的影響導致我的法力全失,現在不得不通過這個平臺向廣大修真天才們借去力量。你們的每一個點贊,每一個關注都是讓我回到九州世界的助力,兄弟萌來為我注入修為吧!關注WX號:南橘ryc 。在公眾號上,除了可以看到雲小霄的照片,李小庚的畫像也很快出爐哦。
等我回去以後,大家都是萬法仙門的長老,我會給大家數不盡的天材地寶,人人如龍,全民飛昇。
“雲小霄,你的神經中樞是不是有問題。”
在第一百二十八次看到雲小霄在沒有任何外物的情況下趴在榻榻米上,像一個蛆一樣的扭動的時候,李小庚終於忍不住開口了。
“沒大沒小的,你才有問題!你全家都有問題!”雲小霄隨手撿起榻榻米上的零食砸向李小庚,然後繼續發出陣陣傻笑。
“那你怎麼現在扭的像個蛆一樣?以前每天趴在地上拿著平板打遊戲也就算了,這段時間天天看你對著空氣傻笑,是不是腦子壞掉了?”
“呸!你才腦子壞掉了,怎麼來萬法仙門兩年了還這麼純純的?有空記得看看新聞,萬維仙網這段時間新推出了雲遊戲雲電影模式,只需要達成連線,就可以通過雲服務直接訪問網路服務哦,甚至連客戶端都不需要了。”雲小霄看白痴一樣看著李小庚。
李小庚一臉哀怨的望著雲小霄:“你不是說結丹之前不讓我上網嗎,別的師兄師弟天天在網上打遊戲聊天,只有我連領個文具都得線下排隊。”
“我還不是為了你好?”雲小霄雙手叉腰:“行吧行吧,反正你的基礎也打得差不多了,今天我就教你今法修士的必修課--網路程式設計。”
一、socket和TCP/IP協議
1、1什麼是socket
學習網路程式設計,我們首先就是要理解計算機之間是如何進行通訊。
socket是計算機之間進行通訊的一種約定或一種方式。通過 socket 這種約定,一臺計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。
要理解socket,就需要理解TCP/IP協議,兩者之間的關係,就如同驛站和和馳道一般。
1、2TCP/IP協議
OSI模型:
目前實際使用的網路模型是 TCP/IP 模型,它對 OSI 模型進行了簡化。它把所有的TCP/IP系列協議歸類到四個抽象層中
應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
傳輸層:TCP,UDP
網路層:IP,ICMP,OSPF,EIGRP,IGMP
資料鏈路層:SLIP,CSLIP,PPP,MTU
每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的
1、3socket原理
我們平常使用網路傳輸資訊,是將程式產生的資料一層層地往下傳輸,最後傳輸到網際網路中。資料每向下一層,就會通過這一層的協議進行包裝,等程式傳送到網上,已經像俄羅斯套娃一般多了四層包裝。
而其他的使用者接收資料包的時候,也會從網路結構層一層一層的向上傳輸,同時也一層一層地拆開包裝,最後回到應用層,就得到了程式鎖需要的資料。
給資料加包裝的過程,實際上就是在資料的頭部增加一個標誌(一個資料塊),表示資料經過了這一層,我已經處理過了。給資料拆包裝的過程正好相反,就是去掉資料頭部的標誌,讓它逐漸現出原形。
兩臺計算機進行通訊時,必須遵守以下原則:
- 必須是同一層次進行通訊,比如,A計算機的應用層和B計算機的傳輸層就不能通訊,因為它們不在一個層次,資料的拆包會遇到問題。
- 每一層的功能都必須相同,也就是擁有完全相同的網路模型。如果網路模型都不同,那不就亂套了,誰都不認識誰。
- 資料只能逐層傳輸,不能躍層。
- 每一層可以使用下層提供的服務,並向上層提供服務。
我們所說的Socket在應用層與傳輸層之間,傳輸層將底層的服務提供給socket抽象層,socket抽象層再提供給應用層,通過這個辦法來進行資料傳遞。
“師父,這麼多層級協議我們都要掌握嗎?”李小庚頭皮有點麻,上個網原來這麼麻煩嗎?
“大多數時候你的確不需要明白。但是有的時候,當你在實戰中遇到由於TCP演算法引起的bug時,懂點相關知識就變得非常重要了。”
“明白了。”
“那好,我繼續給你講講網路連線的過程。”
二、TCP/IP結構與三次握手、四次揮手
2、1TCP資料包結構:
序號:Seq(Sequence Number)序號佔32位,用來標識從計算機A傳送到計算機B的資料包的序號,計算機傳送資料時對此進行標記。
確認號:Ack(Acknowledge Number)確認號佔32位,客戶端和伺服器端都可以傳送,Ack = Seq + 1。
標誌位:每個標誌位佔用1Bit,共有6個,分別為URG、ACK、PSH、RST、SYN、FIN,具體含義如下:
- URG:緊急指標(urgent pointer)有效。
- ACK:確認序號有效。
- PSH:接收方應該儘快將這個報文交給應用層。
- RST:重置連線。
- SYN:建立一個新連線。
- FIN:斷開一個連線。
2、2連線的建立(三次握手)
使用 connect() 建立連線時,客戶端和伺服器端會相互傳送三個資料包
客戶端呼叫socket() 函式建立套接字後,因為沒有建立連線,所以套接字處於CLOSED狀態;伺服器端呼叫 listen()函式後,套接字進入LISTEN狀態,開始監聽客戶端請求。
這個時候,客戶端開始發起請求:
- 當客戶端呼叫 connect() 函式後,TCP協議會組建一個資料包,並設定 SYN 標誌位,表示該資料包是用來建立同步連線的。同時生成一個隨機數字 1000,填充“序號(Seq)”欄位,表示該資料包的序號。完成這些工作,開始向伺服器端傳送資料包,客戶端就進入了SYN-SEND狀態。
伺服器端收到資料包,檢測到已經設定了 SYN 標誌位,就知道這是客戶端發來的建立連線的“請求包”。伺服器端也會組建一個資料包,並設定 SYN 和 ACK 標誌位,SYN 表示該資料包用來建立連線,ACK 用來確認收到了剛才客戶端傳送的資料包。
伺服器生成一個隨機數 2000,填充“序號(Seq)”欄位。2000 和客戶端資料包沒有關係。
伺服器將客戶端資料包序號1000+1,得到1001,並用這個數字填充“確認號(Ack)”欄位。
伺服器將資料包發出,進入SYN-RECV狀態。
客戶端收到資料包,檢測到已經設定了 SYN 和 ACK 標誌位,就知道這是伺服器發來的“確認包”。客戶端會檢測“確認號(Ack)”欄位,看它的值是否為 1000+1,如果是就說明連線建立成功。
接下來,客戶端會繼續組建資料包,並設定 ACK標誌位,表示客戶端正確接收了伺服器發來的“確認包”。同時,將剛才伺服器發來的資料包
序號2000+1,得到 2001,並用這個數字來填充“確認號(Ack)”欄位。客戶端將資料包發出,進入ESTABLISED狀態,表示連線已經成功建立。
伺服器端收到資料包,檢測到已經設定了 ACK 標誌位,就知道這是客戶端發來的“確認包”。伺服器會檢測“確認號(Ack)”欄位,看它的值是否為 2000+1,如果是就說明連線建立成功,伺服器進入ESTABLISED狀態。
至此,客戶端和伺服器都進入了ESTABLISED狀態,連線建立成功,接下來就可以收發資料了。
三次握手的關鍵是要確認對方收到了自己的資料包,這個目標就是通過“確認號(Ack)”欄位實現的。計算機會記錄下自己傳送的資料包序號 Seq,待收到對方的資料包後,檢測“確認號(Ack)”欄位,看Ack = Seq + 1是否成立,如果成立說明對方正確收到了自己的資料包。
2、3連線的斷開(四次揮手)
建立連線後,客戶端和伺服器都處於ESTABLISED狀態。這時,客戶端發起斷開連線的請求:
- 客戶端呼叫close() 函式後,向伺服器傳送 FIN 資料包,進入FIN_WAIT_1狀態。FIN 是 Finish 的縮寫,表示完成任務需要斷開連線。
- 伺服器收到資料包後,檢測到設定了 FIN 標誌位,知道要斷開連線,於是向客戶端傳送“確認包”,進入CLOSE_WAIT狀態。
注意:伺服器收到請求後並不是立即斷開連線,而是先向客戶端傳送“確認包”,告訴它我知道了,我需要準備一下才能斷開連線。
- 客戶端收到“確認包”後進入FIN_WAIT_2狀態,等待伺服器準備完畢後再次傳送資料包。
- 等待片刻後,伺服器準備完畢,可以斷開連線,於是再主動向客戶端傳送 FIN 包,告訴它我準備好了,斷開連線吧。然後進入LAST_ACK狀態。
- 客戶端收到伺服器的 FIN 包後,再向伺服器傳送 ACK 包,告訴它你斷開連線吧。然後進入TIME_WAIT狀態。
- 伺服器收到客戶端的 ACK 包後,就斷開連線,關閉套接字,進入CLOSED狀態。
客戶端最後一次傳送 ACK包後進入 TIME_WAIT 狀態,而不是直接進入 CLOSED 狀態關閉連線,這是為什麼呢?
TCP 是面向連線的傳輸方式,必須保證資料能夠正確到達目標機器,不能丟失或出錯,而網路是不穩定的,隨時可能會毀壞資料,所以機器A每次向機器B傳送資料包後,都要求機器B”確認“,回傳ACK包,告訴機器A我收到了,這樣機器A才能知道資料傳送成功了。如果機器B沒有回傳ACK包,機器A會重新傳送,直到機器B回傳ACK包。
客戶端最後一次向伺服器回傳ACK包時,有可能會因為網路問題導致伺服器收不到,伺服器會再次傳送 FIN 包,如果這時客戶端完全關閉了連線,那麼伺服器無論如何也收不到ACK包了,所以客戶端需要等待片刻、確認對方收到ACK包後才能進入CLOSED狀態。
“怎麼樣,要不是試著接觸一下不一樣的世界?”雲小霄的聲音,就像是古神的低語一般,不斷地刺激著李小庚的神經。穿越前作為一個宅男,李小庚又如何不想連上這個聽起來就是完全體元宇宙的東西呢?
李小庚深吸了一口氣,按照雲小霄的指引,緩慢的運轉法力在體內構建出TCP/IP系列的四層架構並且嘗試與已經被拓印在整個世界之上的萬維仙網進行握手。在萬維仙網建立之初,萬法仙門的歷代先賢就已經將架構的具體引數記錄在了《Java真經》內,所以李小庚很順利的就連線成功。
“萬維仙網主要分為兩部分,供給給所有人的全球資訊網,與每個宗門、個人自己搭建的內網,此外還有遊離在兩者之間的暗網。目前你還沒有繳網費,所以還無法連線到全球資訊網,不過我們萬法仙門的內網也不差,還有綠B孃的守護,就算你這種小白也不會因為瀏覽不良網頁而受到邪修的侵害”說道不良網頁的時候,雲小霄突然嘿嘿嘿的笑了起來,一看就是長期從事鑑別工作的大能。
“師父,那我也可以在萬維仙網建立自己的空間嗎?”
“當然,你可以用自己的雲中洞天作為伺服器搭建網站,不過嘛,這樣的私人網站是不被萬維仙網認可的。”
“那怎麼樣才能被認可呢?”
雲小霄狡黠的笑了笑,右手做了一個搓手指的動作:“你懂得,當然是交錢啦!你要找萬維仙網的各大理事宗門交一筆贊助費,然後就能獲得唯一的SSL證照認證,這個時候,你的網站就是一個安全的網站了。”
三、HTTPS和HTTP
3、1介紹
超文字傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊,HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者擷取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊。
安全套接字層超文字傳輸協議HTTPS,為了資料傳輸的安全,HTTPS在HTTP的基礎上加入了SSL/TLS協議,SSL/TLS依靠證照來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。
HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全。
HTTPS協議的主要作用可以分為兩種:
- 一種是建立一個資訊保安通道,來保證資料傳輸的安全;
- 另一種就是確認網站的真實性。
3、2HTTPS和HTTP的主要區別
1、https協議需要到CA申請證照,一般免費證照較少,因而需要一定費用。
2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl/tls加密傳輸協議。
3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
3、3HTTP方式與Web伺服器通訊
第一步:建立TCP/IP連線,客戶端與伺服器通過Socket三次握手進行連線
第二步:客戶端向服務端發起HTTP請求(例如:POST/login.html http/1.1)
第三步:客戶端傳送請求頭資訊,請求內容,最後會傳送一空白行,表示客戶端請求完畢
第四步:伺服器做出應答,表示對於客戶端請求的應答,例如:HTTP/1.1 200 OK
第五步:伺服器向客戶端傳送應答頭資訊
第六步:伺服器向客戶端傳送請求頭資訊後,也會傳送一空白行,表示應答頭資訊傳送完畢,接著就以Content-type要求的資料格式傳送資料給客戶端
第七步:服務端關閉TCP連線,如果伺服器或者客戶端增Connection:keep-alive就表示客戶端與伺服器端繼續儲存連線,在下次請求時可以繼續使用這次的連線
3、4HTTPS方式與Web伺服器通訊
第一步:客戶使用https的URL訪問Web伺服器,要求與Web伺服器建立SSL連線。
第二步:Web伺服器收到客戶端請求後,會將網站的證照資訊(證照中包含公鑰)傳送一份給客戶端。
第三步:客戶端的瀏覽器與Web伺服器開始協商SSL/TLS連線的安全等級,也就是資訊加密的等級。
第四步:客戶端的瀏覽器根據雙方同意的安全等級,建立會話金鑰,然後利用網站的公鑰將會話金鑰加密,並傳送給網站。
第五步:Web伺服器利用自己的私鑰解密出會話金鑰。
第六步:Web伺服器利用會話金鑰加密與客戶端之間的通訊。
四、TCP與UDP
講了HTTP和HTTPS,順便再和大家一起回憶一下TCP與UDP。
TCP 是面向連線的傳輸協議,建立連線時要經過三次握手,斷開連線時要經過四次握手,中間傳輸資料時也要回復 ACK 包確認,多種機制保證了資料能夠正確到達,不會丟失或出錯。
UDP 是非連線的傳輸協議,沒有建立連線和斷開連線的過程,它只是簡單地把資料丟到網路中,也不需要 ACK 包確認。
如果只考慮可靠性,TCP 的確比 UDP 好。
但 UDP 在結構上比 TCP 更加簡潔,不會傳送 ACK 的應答訊息,也不會給資料包分配 Seq 序號,所以 UDP 的傳輸效率有時會比 TCP 高出很多,程式設計中實現 UDP 也比 TCP 簡單。
UDP 的可靠性雖然比不上TCP,但也不會像想象中那麼頻繁地發生資料損毀,在更加重視傳輸效率而非可靠性的情況下,UDP 是一種很好的選擇。比如視訊通訊或音訊通訊,就非常適合採用 UDP 協議。通訊時資料必須高效傳輸才不會產生“卡頓”現象,使用者體驗才更加流暢,如果丟失幾個資料包,視訊畫面可能會出現“雪花”,音訊可能會夾帶一些雜音,這些都是無妨的。
與 UDP 相比,TCP 的生命在於流控制,這保證了資料傳輸的正確性。
TCP 的速度無法超越 UDP,但在收發某些型別的資料時有可能接近 UDP。例如,每次交換的資料量越大,TCP 的傳輸速率就越接近於 UDP。
暫時沒有建立網站打算的李小庚隨著雲小霄一起進入了萬維仙網,在連入的一瞬間,眼前彷彿同時有兩個世界一樣,意識也彷彿一分為二,且並沒有任何不適感。
“同時身處兩個世界的感覺是不是很神奇?”雲小霄拍了拍李小庚的肩膀,感嘆道:“如果有一天你也到了那個境界,或許能創造出更神奇的東西吧,今法與古修最大的區別就是,今法所做的一切都是為了看到更多的風景,所以大家會聯合起來,雖然偶有爭鬥,但是目標卻是一致的。而古修們則全是為了飛昇不擇手段之人,他們雖然也有像我們一樣的宗門、師徒的關係紐帶,但是個人利益卻高於一切。”
“那麼現在世界上還有古修嗎?現如今不都是修習今法之人嗎?”
“古修之古不在於功法,而在於內心。”