1. 程式人生 > >報文、前後端分離、express中間件、TCP協議

報文、前後端分離、express中間件、TCP協議

網絡傳輸 操作 構圖 aik expressjs 二次 不一致 image 中斷

1.報文

報文,是網絡中交換和傳輸的數據單元,即站點一次性要發送的數據塊。報文包含了將要發送的完整的數據信息,其長短很不一致,長度不限且可變。報文也是網絡傳輸的單位,傳輸過程中會不斷的封裝成分組、包、幀來傳輸,封裝的方式就是添加一些信息段,那些就是報文頭以一定格式組織起來的數據。

HTTP報文是由一行一行簡單的字符串組成的。HTTP報文都是純文本,不是二進制代碼,所以人們可以很方便地對其進行讀寫。如果說HTTP是因特網的信使,那麽HTTP報文就是它用來搬東西的包裹了。

報文由三部分組成:對報文進行描述的起始行,包含屬性的首部塊,以及可選的、包含數據的主題部分。

http報文是簡單的格式化文本。所有的HTTP報文都可以分為兩類:請求報文和響應報文

2.前後端分離

未分離時期:

技術分享圖片

半分離時期:

前後端半分離,前端負責開發頁面,通過接口(Ajax)獲取數據,采用dom操作對頁面進行數據綁定,最終是由前端把頁面渲染出來。這也就是其他博客裏說的,Ajax與SPA應用(單頁應用)結合的方式。其結構圖如下

技術分享圖片

分離時期:

技術分享圖片

前後端分離:

前端:整個頁面顯示以及頁面的交互邏輯。用ajax和node作為交互。其中node作為中間層。

後端:提供api接口,利用redis保存session,與數據庫交互。

流程:

客戶端(瀏覽器)向node請求頁面交互。

node向後端(這裏用java)轉發請求。java在發送請求到數據庫。

java返回結果給node。node返回頁面,提供數據。

前後端分離前端:

前端可以不依賴後端,前端自己起一個服務,如果前端頁面處理好,後端的API還沒有提供,那麽,前端可以用mock模擬數據。

這裏出現一個問題,如果沒有服務,單頁面是不可以ajax請求數據,會出現跨域的問題。要麽瀏覽器做跨域。所以這裏用到node。

我們利用node的express開啟一個本地服務器

node:

node主要是為了分層開發,前端不需要知道後端是怎麽提供數據,怎麽操作。後端也不需要知道node是怎麽操作,前端是怎麽部署。前端可以利用node自己作處理。

node本身有著異步,非阻塞I/o。在處理並發量比較大的數據請求上有很大的優勢。

增加node.js作為中間層,具體有哪些好處呢

適配性提升

響應速度提升

性能得到提升

  1. Express的中間件

Express是一種路由和中間件Web框架,它具有自己的最小功能:Express應用程序本質上是一系列中間件函數調用。

中間件函數是可以訪問請求對象 (req),響應對象(res)以及應用程序的請求 - 響應周期中的下一個中間件函數的函數。下一個中間件函數通常由名為的變量表示next。

中間件功能可以執行以下任務:

執行任何代碼。

更改請求和響應對象。

結束請求 - 響應周期。

調用堆棧中的下一個中間件函數。

如果當前的中間件函數沒有結束請求 - 響應周期,則必須調用next()以將控制傳遞給下一個中間件函數。否則,請求將被掛起。

  1. 說說TCP傳輸的三次握手四次揮手策略

為了準確無誤的把數據送達目標處,TCP協議采用了三次握手策略。用TCP協議把數據包送出去後,TCP不會對傳輸後的情況置之不理,它一定會向對方確認是否送達,握手過程中使用了TCP的標誌:SYN和ACK.

發送方首先發送一個帶SYN標誌的數據包給對方。接收端收到後,回傳一個帶有SYN/ACK標誌的數據包以示傳達確認信息。

最後,發送端再回傳一個帶有ACK標誌的數據包,以示握手結束。

若在握手過程中,某個階段莫名中斷,TCP協議會再次以相同的順序發送相同的數據包。

單開一個TCP連接則需要“四次揮手”。

第一次揮手:主動關閉方發送一個FIN,用來關閉主動方到被動主動方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會在給你發送數據了(當然,在FIN包之前發送出去的數據,如果沒有收到對應的ACK確認報文,主動關閉方依然會重發這些數據。)

第二次揮手:被動關閉方收到FIN包後,發送一個ACK給對方,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號)。

第三次揮手:被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,我的數據也發送完了,不會再給你發數據。

第四次揮手:主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號為收到序號+1,至此,完成四次揮手。

報文、前後端分離、express中間件、TCP協議