後臺開發 -- 核心技術與應用實踐

self發表於2019-05-15

後臺開發

核心技術與應用實踐

  • 後臺開發.

C++程式設計常用技術

  • 最好不要在標頭檔案中使用名稱空間,很容易造成命名衝突。
  • strlen與sizeof的區別:
    • strlen是函式,在執行時才能計算,傳入引數是char*指標,返回字串長度。
    • sizeof()是運算子,而不是一個函式,在編譯時就計算好了,用於計算資料空間的位元組數。
      • sizeof常用於返回型別和靜態分配的物件、結構或陣列所佔用的空間,返回值跟內容無關。
  • 在C++中,臨時物件都是const型別的。
  • 可以使用union(聯合)判斷系統是大端(big endian)還是little endian(小端)。
    • 幾乎所有網路協議都是採用大端(big endian)的方式來傳輸資料的。
  • 只能把列舉賦值列舉變數,不能把元素的數值直接賦值列舉變數。
  • 共用體以最長的位元組為準,考慮記憶體對齊。
  • 結構體以內建型別的最小公倍數對齊。

物件導向的C++

  • struct預設是public, class預設的是private的。
  • 當一個函式宣告為虛擬函式後,其派生類中的同名函式都自動成為虛擬函式。
  • 每個目標檔案提供了三個表: 未解決符號表,匯出符號表,地址重定向表。
    • 未解決符號表提供了多有在編譯單元裡引用但是定義並不是在本編譯單元的符號以及其出現的地址。
    • 匯出符號表提供了本編譯單元具有定義,並且願意提供給其它單元使用的符號及其地址。
    • 地址重定向表提供了本編譯單元所有對自身地址的引用的記錄。
    • 編譯器將extern宣告的變數置入未解決符號表,extern是外部連結。
    • 編譯器將static宣告的全域性變數不置入未解決符號表,也不置入匯出符號表,屬於內部連結。
  • 編譯階段: g++會呼叫gcc, 通過G++來完成連結。
  • Makefile有3個內部變數:
    • $@ 擴充套件成當前規則的目標檔名。
    • $< 擴充套件成依靠列表中的第一個依靠檔案。
    • $^ 擴充套件成整個依靠的列表(除了所有重複的檔名)。

除錯

  • strace系統呼叫:
    • strace是通過跟蹤系統呼叫來讓開發者直到一個程式在後臺所做事情的工具。
    • strace首先呼叫fork或clone函式新建一個子程式,然後在子程式中呼叫exec載入需要執行的程式。
  • gdb命令引數:
    gdb命令.
    • 記憶體訪問越界的原因:
      • 搜尋字串時,沒有正常的使用結束符。
      • 陣列訪問越界。
      • 字串操作函式,讀寫越界。
    • 多執行緒使用了執行緒不安全的函式。
    • 多執行緒讀寫的資料未加鎖保護。
    • 非法指標,包括使用空指標或隨意使用指標轉換。
    • 堆疊溢位。

TCP協議

  • ISO七層協議:
    七層模型.
    • 越到底層資料包越大。
  • TCP狀態圖:
    TCP狀態圖.
  • 當出現資料包中途丟失、ACK報文中途丟失、對端異常未響應ACK或被對段丟棄,TCP會超時重傳。
    • telnet和tcpdump工具可以用來診斷。
  • TCP的滑動視窗主要有兩個作用:
    • 一是提供TCP的可靠性。
    • 二是體從TCP的流量控制特性。
    • 滑動視窗機制還體現了TCP面向位元組流的設計思路。
  • 任何時候在其傳送快取內的資料都可以分為4類:
    • 已經傳送並得到對端ACK;
    • 已經傳送但還未收到對端ACK;
    • 未傳送但對端允許傳送;
    • 未傳送且對端不允許傳送。
  • '已經傳送但未收到對端ACK的'和'未傳送但對端允許傳送的'這兩部分資料稱之為傳送視窗。
    滑動視窗
    • 滑動視窗實現面向流的可靠性來源於“確認重傳”機制.
    • TCP的滑動視窗是動態的。
  • TCP擁塞控制:
    • 網路中的頻寬,交換結點中的快取和處理機等,都是網路的資源。
    • 擁塞控制是防止過多的資料注入網路中,可以使網路中的路由器或鏈路不過載。
    • 擁塞控制是一個全域性性的過程,與流量控制不同,流量控制指點到點的控制。
    • 擁塞控制由4個核心演算法組成:
      • 慢開始(slow start);
        • 慢開始的思路是一開始不要傳送大量的資料,先探測一下網路的擁塞程度,由小到大逐漸增加擁塞視窗的大小。
      • 擁塞避免(Congession Voidance);
        • 擁塞避免是讓擁塞視窗緩慢增長,即每經過一個往返時間RRT就把傳送方的擁塞串列埠cwnd加1,而不是加倍。
      • 快速重傳(Fast Restransmit);
        • 快速重傳要求接收方在收到一個失序報文後就立即發出重複確認,而不要等到自己傳送資料時捎帶確認。
        • 傳送方連續收到三個重傳確認時,就執行乘法減小演算法,把ssthresh門限減半(但是不會執行慢開始)。
      • 快速恢復(Fast Recovery).
        • 不執行慢開始,而是將cwnd設定為ssthresh的大小,然後執行擁塞避免演算法。
    • 擁塞視窗的大小取決於網路的擁塞成都,並且動態地變化。
    • 傳送方讓自己的傳送視窗等於擁塞視窗,考慮接收方的接收能力,傳送串列埠可能小於擁塞視窗。
  • TCP中的Nagle演算法預設是啟用的,但它並不適合任何情況。
  • TCP是個流協議,就是沒有界限的一串資料(沒有分界線)。
  • 連續呼叫send分別傳送兩段資料data1和data2:
    • 先接收到data1, 然後接收到data2; --- 正常
    • 先接收到data1的部分資料,然後接收到data1餘下的部分以及data2的全部。 --- 粘包
      • 接收端接收不及時造成的接收段粘包。
    • 先接收到data1的全部資料和data2的部分資料, 然後接收到data2的餘下資料。 --- 粘包
      • nagle演算法等待導致。
      • 兩個send之間呼叫sleep來休眠一段時間。
    • 一次性接收到了data1和data2的全部資料。 --- 粘包
      • 封包是給資料加上包頭。--- 包頭給定一個資料包的長度。
      • nagle演算法等待導致。
      • 迴圈不停地接收報頭給出的資料,直到收夠為止。
      • 在傳送內容前,加上傳送內容的長度,接收方會先接收4位元組,解析要接受的長度再進行收包。
  • 一般來說,一個埠釋放後要等待兩分鐘左右後才能再被使用,而SO_REUSEADDR則可以讓埠釋放後立即就可以再被使用。
  • TCP_DEFER_ACCEPT可以用來預防空連線攻擊(只是建立連線,但是不傳送任何資料).
  • SO_LINGER, linger是延遲的意思。
  • SO_RCVBUF和SO——SNDBUF這兩個介面選項可以改變預設換從去大小。

網路I/O模型

  • 當網路I/O發生時,會設計兩個系統物件,一個是呼叫這個IO的程式,另一個是系統核心。
    • 當一個read操作發生時,會經歷兩個階段:
      • 等待資料準備;
      • 將資料從核心拷貝到程式中。
  • 4種網路IO模型:
    • 阻塞IO模型;
      • 阻塞是指IO操作需要徹底完成後才返回到使用者空間;
        阻塞IO模型.
    • 非阻塞IO模型;
      • 非阻塞是指IO操作被呼叫後立即返回給使用者一個狀態值,不需要等到IO操作徹底完成.
      • 非阻塞IO模型.
    • 多路IO複用模型;
      • 事件驅動IO,有個函式(select,poll,epoll)不斷輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程式。
      • 多路IO複用模型.
    • 非同步IO模型。
      • 非同步IO,當程式發起IO操作之後,就直接返回,直到核心傳送一個訊號,告訴程式IO已完成,則在這個過程中,程式完全沒有被阻塞。
      • 非同步IO模型.

網路分析工具

  • ping命令可以檢查網路是否連通,幫助分析和判定網路故障。
    • ping傳送一個ICMP(Internet Control Messages Protocol, 因特網信報控制協議), 檢查網路是否暢通或者網路連線速度的命令。
  • tcpdump根據使用者的定義對網路上的資料包進行擷取和分析。
    • -i,指定tcpdump監聽的網路介面。
    • -c, 指定要監聽的資料包數量。
    • -w, 指定將監聽的資料包寫入檔案儲存。
  • netstat命令用於顯示與IP, TCP, UDP, IMCP相關的統計資料,一般用於檢驗本機各埠的網路連線情況。
  • lsof(list open file)是一個列出當前系統開啟檔案的工具。
    • linux中,通過檔案不僅可以訪問資料,還可以範文網路連線和硬體。
    • 檔案描述符為應用程式與基礎作業系統之間的互動提供了通用的介面。
    • lsof | more --- 是一部分一部分地顯示。

多執行緒

  • 多執行緒就是允許一個程式記憶體擁有多個控制權,以便讓多個函式同時處於啟用(active)狀態, 從而讓多個函式的操作同時執行。
  • 對於多執行緒來說,由於同一個程式空間中存在多個棧,任何一個空白區域被填滿都會導致棧溢位。

程式

  • 一般程式轉換為程式需要幾個步驟:
    • 核心將程式讀入記憶體,為程式分配記憶體空間。
    • 核心為該程式分配程式分配識別符號(PID)和其他所需資源。
    • 核心為程式儲存PID及相應的狀態資訊,把程式放到執行佇列中等待執行,程式轉換為程式後就可以被作業系統的排程程式排程執行。
  • 所謂程式就是可執行的二進位制檔案,把這種檔案載入到記憶體中執行就二道了一個程式。
    • 同一個程式檔案可以被載入多次成為不同的程式。
  • 守護程式:
    • 在Linux或者Unix作業系統中在系統的引導的時候會開啟很多服務,這些服務叫做守護程式。
    • 守護程式是脫離於終端並且在後臺執行的程式。
    • 守護程式是一個生存期較長的程式,通常獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。
    • 守護程式通常在系統引導裝入的時候啟動,系統關閉時終止。
    • 作業規劃程式crond,列印程式lqd(字尾d表示Daemon的意思)。
  • 建立一個守護程式的簡單步驟:
    • 建立子程式,父程式退出。
    • 在子程式中建立新會話(setsid系統呼叫,最重要的一步)。
    • 改變當前目錄為根目錄。
    • 重設定檔案許可權。
    • 重設檔案許可權掩碼。
    • 關閉檔案描述符。
  • ipcs命令:
    • ipcs命令用於報告系統的訊息佇列、訊號量、共享記憶體等。

HTTP協議

  • HTTP(Hypertext Transfer Protocol, 超文字傳輸協議)是一種詳細規定了瀏覽器和全球資訊網(world wide web,WWW)伺服器之間互相通訊的規則,通過因特網傳送全球資訊網文件的資料傳送協議。
  • HTTP實在應用層,基於TCP協議,而HTTPS協議,也是處於應用層,但是是基於TLS,SSL協議層之上的協議。
    HTTP協議與HTTPS協議的對比.
    • HTTP預設埠號是80,HTTPS預設埠好為443。
  • 一次HTTP操作稱為一個事務,其工作可分為4步:
    • 客戶機與伺服器需要建立連線。
    • 建立連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:
      • 統一資源識別符號(URL);
      • 協議版本號;
      • MIME資訊(包括伺服器資訊,實體資訊和可能的內容)。
    • 伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行:
      • 資訊的版本協議號;
      • 一個成功或者錯誤的程式碼號;
      • MIME資訊(包括伺服器資訊,實體資訊和可能的內容)。
    • 客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的螢幕上,然後客戶機與伺服器斷開連線。
  • HTTP永遠是客戶機發起請求,伺服器惠東響應,伺服器無法將訊息推送給客戶端。
  • HTTP協議結構,無論是請求報文還是回應報文,都分為四個部分:
    • 報文頭(initial line);
    • 0個或多個請求頭(header line);
    • 空行(作為header lines的結束)。
  • HTTP是基於行的協議,每一行以\r\n作為分隔符。
  • wireshark是一個抓包的好工具,它能夠記錄計算機和網際網路之間的通訊內容。
  • HTTP請求方法:
    • OPTONS:返回伺服器針對特定資源所支援的HTTP請求方法;也可以利用想Web伺服器傳送"*"的請求來測試伺服器的功能性。
    • HEAD: 向伺服器索要與GET請求相一致的響應,只不過響應體不會被返回。
      • 測試超連結的有效性,是否可以訪問,以及最近是否更新等資訊。
    • GET: 向特定的資源發出請求,GET可能會被網路爬蟲隨意訪問。
    • POST: 向指定資源提交資料進行處理請求(提交表單或者上傳檔案)。
      • POST請求可能會導致新的資源的建立或對已有資源的修改。
    • PUT: 向指定資源位置上傳其最新的內容。
    • DELETE: 請求伺服器刪除Request-URI所標識的資源。
    • TRACE: 回顯伺服器收到的請求,主要用於測試或診斷。
    • CONNECT: 協議中預留給能夠將連線更改為管道方式的代理伺服器。
    • PATCH: 用來將區域性修改應用與某以資源。
  • 當某個請求所針對的資源不支援對應的請求方法時,伺服器應當返回狀態碼405(Method Not Allowed).
  • 當伺服器不認識或者不支援對應的請求方法時,應當返回狀態碼501(Not Implemented).
  • HTTP伺服器至少要實現GET和HEAD方法。

HTTPS協議

  • 公開程式碼、演算法、協議,通過金鑰的私密性來保護資料傳輸的安全性。
    • 對稱加密: 加密的金鑰和解密的金鑰是一樣的,通常使用AES和TEA演算法。
      • 計算量小,又有一定的破解門檻。
    • 非對稱加密: 加密的金鑰和解密的金鑰是不一樣的,金鑰成對出現(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密)。
      • 計算量大,常用RSA和ECC演算法。
      • 一般使用非對稱加密演算法得出金鑰,再用對稱加密演算法對訊息內容進行加密,然後進行傳輸。
  • HTTP協議可以輕鬆抓包並獲得其中的內容,是一個不安全的協議,而HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)則是以安全為目標的HTTP通道,可以簡單的理解為HTTP的安全版。
  • HTTPS是一個URI scheme(抽象識別符號體系),句法類同HTTP體系,用於安全的HTTP資料傳輸。
  • 但HTTPS的存在不同於HTTP的預設埠及一個加密/身份驗證層(在HTTP與TCP之間)。
  • 高層的應用協議能透明地建立於TLS協議之上。
    • TLS協議在應用層之前就已經完成了加密演算法,通訊金鑰的協商以及伺服器的認證工作。
    • TLS協議使用通訊雙方的客戶證照以及CA根證照,允許客戶端、伺服器端以一種不能被偷聽的方式通訊,在通訊雙方建立起一條安全的、可信任的通訊通道。
  • HTTP和HTTPS的區別:
    • HTTPS協議需要到CA申請證照,一般免費證照很少,需要交費。
    • HTTP是超文字傳輸協議,資訊是明文傳輸,HTTPS則是具有安全性的ssl加密傳輸協議。
    • HTTP和HTTPS使用的是完全不同的連線方式,用的埠也不一樣,HTTP使用的是80埠號,HTTPS使用的埠號是443.
    • HTTPS的應用比HTTP要少,因為HTTPS比較耗效能,對於安全性沒有那麼高要求的應用來說,用HTTP就已經足夠了。

CGI

  • CGI(Common Gateway Interface, 通用閘道器介面)是HTTP協議中最重要的技術之一,有著不可替代的重要地位。
  • CGI是一個Web伺服器提供資訊服務的標準介面。
    • 通過CGI介面,Web伺服器就能夠獲取客戶端提交的資訊,轉交給伺服器段的CGI程式進行處理,最後返回結果給客戶端。
    • CGI通訊系統由兩個部分組成:
      • 一部分是HTML頁面;
      • 執行在伺服器上的CGI程式。
      • CGI.

常用類庫

  • JSON(JavaScript Object Notation, JavaScript物件表示法)是一種輕量級的資料交換格式,易於閱讀和編寫,同時也易於機器解析和生成。
    • key-value對的集合。
    • 值的有序列表。
  • Protobuf:
    • Protobuf的序列化和反序列化的速度更快,而且傳輸的資料會先壓縮,使得傳輸的效率更改些。
    • Ptotobuf, 全稱Protobuf Buffer,是Google公司內部的混合語言資料標準,是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化(序列化)。
    • 適合做資料儲存或RPC資料交換格式。

相關文章