網路程式設計—HTTP
4.4 HTTP程式設計
4.4.1 UDP和TCP的區別
UDP是一種資料報模式的協議,TCP是一種流模式的協議。
UDP的傳送端呼叫了幾次sendto,接收端必須用相同次數的recvfrom讀取資料。因為UDP是基於報文的,每次只能讀取一個報文,報文之間不會合並;若接收緩衝區小於報文長度,則多餘部分會被丟棄。
TCP的傳送端呼叫傳送(send)100位元組的資料,但是接收緩衝區只有10位元組,那麼它會分10次來接收recv()。若傳送端傳送10位元組的資料,但是接收緩衝區有100位元組,那麼客戶端可以呼叫10次send來發送資料,伺服器端可以1次性讀取(recv)。TCP的流模式傳輸,使資料之間沒有邊界。
上圖是TCP傳輸的具體流程,當TCP客戶端傳輸資料到socket傳送緩衝區,OS將資料取出來,通過網路傳送到伺服器端socket接收緩衝區,等待recv來讀取。但是需要注意的是當客戶端呼叫send傳送資料後,資料會存放在客戶端socket傳送緩衝區內,至於OS什麼時候會取走資料就不是應用程式可以決定的;當OS取走資料後,不管伺服器端有沒有呼叫recv,都會把資料存放到伺服器端的socket接收緩衝區內;當呼叫recv後,不管緩衝區有多少資料,都會被取走。
為了解決TCP中資料無界的問題,客戶端對資料進行封包後再發送,伺服器端接收資料後解包。常用的資料交換格式有JSON、XML、位元組編碼等。
當使用一問一答的形式來傳輸資料,稱為訊息模式,其常用資料交換格式為JSON。
當進行檔案流、視訊流等大量資料的傳輸,稱為流模式,其常用資料交換格式為位元組編碼。
舉例:FTP的控制部分採用的是訊息模式,資料部分採用的是流模式。
4.4.2 HTTP協議
HTTP是應用層的協議,而在傳輸層中由於UDP只適合於區域網且不能穿越路由,因此傳輸層協議選擇TCP。
HTTP協議全稱是Hyper Text Transfer Protocol,即“超文字傳輸協議”。
HTTP是一個應用層協議,它是基於TCP/IP協議來傳輸資料。當瀏覽器作為HTTP客戶端,通過URL向HTTP伺服器端(即全球資訊網伺服器:World Wide Web,簡稱www)傳送請求,Web伺服器收到請求後,向客戶端傳送響應。
當你使用360瀏覽器時,你會發現訪問的網址頭並不是HTTP,而是HTTPS,那麼HTTPS又是什麼呢?
HTTP協議傳輸的資料都是未加密的,因此使用HTTP協議傳輸隱私資料非常的不安全。於是網景公司設計了SSL協議,用於對HTTP協議傳輸的資料進行加密,從而誕生了HTTPS。即HTTPS = HTTP + SSL,HTTP預設埠號是80,HTTPS預設埠號是443。
4.4.3 URL
URI全稱Uniform Resource Identifiers,即統一資源識別符號。URI的作用是建立連線和傳輸資料,而URL(統一資源定位符:Uniform Resource Locator)是一種特殊的URI,它包含了查詢某個資源的全部資訊。
以下面的URL為例:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
完整的URL包括7部分:
(1)協議部分:該URL的協議部分為”http:”,這代表網頁使用的是HTTP協議,在"HTTP"後面的“//”為分隔符。
(2)域名部分:該URL的域名部分為”www.aspxfans.com”。
(3)埠部分:跟在域名後面的是埠,域名和埠之間使用”:”作為分隔符。埠不是一個URL必須的部分,如果省略埠部分,將採用預設埠。
(4)虛擬目錄部分:從域名後的第一個”/”開始到最後一個”/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分,本例中的虛擬目錄是”/news/”。
(5)檔名部分:從域名後的最後一個”/”開始到”?”為止,是檔名部分。如果沒有”?”,則是從域名後的最後一個”/”開始到”#”為止,是檔案部分;如果沒有”?”和”#”,那麼從域名後的最後一個”/”開始到結束,都是檔名部分。本例中的檔名是“index.asp”。檔名部分也不是一個URL必須的部分,如果省略該部分,則使用預設的檔名。
(6)錨部分:從”#”開始到最後,都是錨部分。本例中的錨部分是”name”。錨部分也不是一個URL必須的部分。
(7)引數部分:從”?”開始到”#”為止之間的部分為引數部分,又稱搜尋部分、查詢部分。本例中的引數部分為“boardID=5&ID=24618&page=1”。引數可以允許有多個引數,引數與引數之間用”&”作為分隔符。
CURL:用URL傳輸資料的命令列工具和庫。
CURL官網:https://curl.haxx.se/
CURL下載URL檔案:https://curl.haxx.se/libcurl/c/
CURL使用示例:https://curl.haxx.se/libcurl/c/example.html
CURL使用GET:https://curl.haxx.se/libcurl/c/simple.html
https://curl.haxx.se/libcurl/c/url2file.html
CURL使用POST:https://curl.haxx.se/libcurl/c/http-post.html
https://curl.haxx.se/libcurl/c/simplepost.html