網路層是程式設計師接觸最多的乙個層級,應用層是層級體系中的最上層的一級,是我們做邏輯處理最多的。
應用層的功能
是程式設計師寫的乙個乙個解決的實際的問題都是在應用層,是做邏輯運算和業務處理的地點。
什麼是url
比如上面的乙個**就是乙個url。
https:協議名稱
bolg.csdn.net:就是網域名稱,對應的就是ip位址
boke_fengwei:資源路徑。
在上面的url中是包含一些特殊字元的,此時需要做出特殊的處理,採用編和解碼。這是為了防止資料的二義性。
採用urlencode編碼
轉移規則:將資料轉為16進製制,然後從右到左,取4位(不足四位的時候直接處理),沒兩位作以為,前面加上%,編碼成%xy的形式即可。%就是標識這是乙個轉義的url,在對端的時候就可以進行解碼。
有興趣的童鞋可以看看urlencode和urldecode的實現函式
http協議
http的請求格式
請求行:
http1.1預設使用長連線,可有效減少tcp的三次握手開銷。 http請求頭http的響應格式1.1支援只傳送header資訊(不帶任何body資訊),如果伺服器認為客戶端有許可權請求伺服器,則返回100,否則返回401。客戶端如果接受到100,才開始把請求body傳送到伺服器。這樣當伺服器返回401的時候,客戶端就可以不用傳送請求body了,節約了頻寬。另外http還支援傳送內容的一部分。這樣當客戶端已經有一部分的資源後,只需要跟伺服器請求另外的部分資源即可。這是支援檔案斷點續傳的基礎。
http1.0是沒有host域的,http1.1才支援這個引數。
http2.0使用多路復用技術(multiplexing),多路復用允許同時通過單一的 http/2 連線發起多重的請求-響應訊息。
「http1.1在同一時間對於同乙個網域名稱的請求數量有限制,超過限制就會阻塞請求」。多路復用底層採用"增加二進位制分幀層"的方法,使得不改變原來的語義、首部欄位的情況下提高傳輸效能,降低延遲。
二進位制分幀將所有傳輸資訊分割為更小的幀,用二進位制進行編碼,多個請求都在同乙個tcp連線上完成,可以承載任意數量的雙向資料流。http/2更有效的使用tcp連線,得到效能上的提公升。
響應行
響應頭:和請求資訊中是相似的
空行:空行的作用也是標誌響應頭的結束,區分響應頭和響應體
響應體:響應之後返回的內容。
實現乙個簡單的http的伺服器。就是在在訪問我們的ip位址的時候顯示乙個hello word的語句。
連線上我們之前實現的tcp的c++標頭檔案
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10
11 #define check_ret(q) if((q) == false)
12 13 typedef struct calculator_info_tcalculator_info;
18 19 class tcpsocket
20 24 void setsockfd(int fd)
27 int getsockfd()
30 bool socket()
36 return true;
37 }
38 bool bind(std::string &ip, uint16_t port)
50 return true;
51 }
52 bool listen(int backlog = 10)
60 return true;
61 }
62 bool connect(std::string &ip, uint16_t port)
76 return true;
77 }
78 bool accept(tcpsocket &csock, struct sockaddr_in *addr = null)
91 if (addr != null)
94 csock.setsockfd(newfd);
95 //_sockfd--僅用於接收新客戶端連線請求
96 //newfd----專門用於與客戶端進行通訊
97 return true;
98 }
99 bool recv(std::string &buf) ;
101 //ssize_t recv(int sockfd, void *buf, size_t len, int flags)
102 //flags:0-預設阻塞接收 msg_peek-獲取資料但是不從緩衝區移除
103 //返回值:實際接收的資料長度 失敗:-1 連線斷開:0
104 int ret = recv(_sockfd, tmp, 4096, 0);
105 if (ret < 0) else if (ret == 0)
112 buf.assign(tmp, ret);
113 return true;
114 }
115 bool send(std::string &buf)
122 return true;
123 }
124 bool close()
128 private:
129 int _sockfd;
130 };
實現cpp檔案
1 #include "tcpsocket.hpp"
2 #include 3 #include 4 int main(int argc,char* ar**)
45 sock.close();
46 return 0;
47 }
計算機網路 應用層 HTTP
狀態碼request請求頭 response請求頭 參考 啞服務 連線上時不會回顯,要有其他行為時 url 協議 hosts 主機 埠 uri 路徑 1.0 時每乙個http都要建立一次tcp,1.0後可設定connection keep alive來讓tcp持續 客戶端傳送request,服務端回...
計算機網路 應用層 HTTP協議
是七層osi模型的第七層。應用層直接和應用程式介面並提供常見的網路應用服務。應用層也向表示層發出請求。應用層是開放系統的最高層,是直接為應用程序提供服務的。其作用是在實現多個系統應用程序相互通訊的同時,完成一系列業務處理所需的服務。超文字傳輸協議,是乙個屬於應用層的物件導向的協議,由於其簡捷 快速的...
計算機網路 應用層 HTTP協議
1.http概況 web的應用層協議是超文字傳輸協議 http 它是web的核心。http由兩部分程式實現 乙個客戶機程式和乙個伺服器程式,它們執行在不同的端系統中,通過交換http報文進行對話。http定義了這些報文的格式以及客戶機和伺服器是如何進行報文交換的。下圖是其基本思想 當使用者請求乙個w...