【JAVA今法修真】 第八章 仙道萬維網 聖地元宇宙

您好,我是南橘,萬法仙門的掌門,剛剛從九州世界穿越到地球,因為時空亂流的影響導致我的法力全失,現在不得不通過這個平台向廣大修真天才們借去力量。你們的每一個點贊,每一個關注都是讓我回到九州世界的助力,兄弟萌來為我注入修為吧!關注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。
暫時沒有建立網站打算的李小庚隨著雲小霄一起進入了萬維仙網,在連入的一瞬間,眼前彷彿同時有兩個世界一樣,意識也彷彿一分為二,且並沒有任何不適感。
「同時身處兩個世界的感覺是不是很神奇?」雲小霄拍了拍李小庚的肩膀,感嘆道:「如果有一天你也到了那個境界,或許能創造出更神奇的東西吧,今法與古修最大的區別就是,今法所做的一切都是為了看到更多的風景,所以大家會聯合起來,雖然偶有爭鬥,但是目標卻是一致的。而古修們則全是為了飛升不擇手段之人,他們雖然也有像我們一樣的宗門、師徒的關係紐帶,但是個人利益卻高於一切。」
「那麼現在世界上還有古修嗎?現如今不都是修習今法之人嗎?」
「古修之古不在於功法,而在於內心。」
