后台開發
核心技術與應用實踐
.
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命令參數:
.
- 內存訪問越界的原因:
- 搜索字符串時,沒有正常的使用結束符。
- 數組訪問越界。
- 字符串操作函數,讀寫越界。
- 多線程使用了線程不安全的函數。
- 多線程讀寫的數據未加鎖保護。
- 非法指針,包括使用空指針或隨意使用指針轉換。
- 堆棧溢出。
- 內存訪問越界的原因:
TCP協議
- ISO七層協議:
.
- 越到底層數據報越大。
- 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的大小,然后執行擁塞避免算法。
- 慢開始(slow start);
- 擁塞窗口的大小取決於網絡的擁塞成都,並且動態地變化。
- 發送方讓自己的發送窗口等於擁塞窗口,考慮接收方的接收能力,發送串口可能小於擁塞窗口。
- 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操作發生時,會經歷兩個階段:
- 等待數據准備;
- 將數據從內核拷貝到進程中。
- 當一個read操作發生時,會經歷兩個階段:
- 4種網絡IO模型:
- 阻塞IO模型;
- 阻塞是指IO操作需要徹底完成后才返回到用戶空間;
.
- 阻塞是指IO操作需要徹底完成后才返回到用戶空間;
- 非阻塞IO模型;
- 非阻塞是指IO操作被調用后立即返回給用戶一個狀態值,不需要等到IO操作徹底完成.
.
- 多路IO復用模型;
- 事件驅動IO,有個函數(select,poll,epoll)不斷輪詢所負責的所有socket,當某個socket有數據到達了,就通知用戶進程。
.
- 異步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默認端口號是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算法。
- 一般使用非對稱加密算法得出密鑰,再用對稱加密算法對消息內容進行加密,然后進行傳輸。
- 對稱加密: 加密的密鑰和解密的密鑰是一樣的,通常使用AES和TEA算法。
- 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數據交換格式。
