HTTP(Hyper Text Transfer Protocol超文本傳輸協議)是用于從萬維網服務器傳輸超文本到本地瀏覽器的傳輸協議,它基于TCP/IP協議通信,因此也是基于<客戶端-服務器>模型運作的。HTTP屬于應用層協議,我們可以用它來傳輸服務器的各種資源,如文本、圖片、音頻等,具有簡單、快捷、靈活、無連接、無狀態等優點。
在一次完整的HTTP通信過程中,瀏覽器與服務器之間大致可以分為七個步驟:
01、建立TCP連接
HTTP工作前,瀏覽器首先要通過網絡與服務器建立連接,該連接通過TCP完成。HTTP屬于應用層協議,根據規則只有低層協議建立之后才能進行更深層協議的連接。因此,首先要建立TCP連接,端口號為80。
02、瀏覽器向服務器發送請求命令
TCP連接成功建立后,瀏覽器就會向服務器發送請求命令。例如:GET/sample/hello.jsp HTTP/1.1
03、瀏覽器發送請求頭信息
瀏覽器發送請求命令后,還要以頭信息的形式向服務器發送一些別的信息,之后瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。
04、服務器應答
客戶機向服務器發出請求后,服務器會客戶機回送應答,例如:HTTP/1.1 200 OK
應答的第一部分是協議的版本號和應答狀態碼。
05、服務器發送應答頭信息
正像客戶端會隨同請求發送關于自身的信息一樣,服務器也會隨同應答向用戶發送關于它自己的數據及被請求的文檔。
06、服務器向瀏覽器發送數據
服務器向瀏覽器發送頭信息后,它會發送一個空白行來表示頭信息的發送到此為結束,接著會按照應答頭信息所描述的格式發送用戶所請求的實際數據。
07、服務器關閉TCP連接
一般情況下,一旦服務器完成了數據,就會關閉TCP連接。
在創建工程前我們還需要了解HTTP請求格式,HTTP請求由三部分構成:請求方法URI協議、請求頭、請求正文。
請求方法URI(URL相當于URI的子集)協議
我們使用前文中的例子“GET/sample.jsp HTTP/1.1”?!癎ET“代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協議和協議的版本。
請求頭
請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
請求正文
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文,請求正文中可以包含客戶提交的查詢字符串信息。
實驗使用MB-039開發板,在工程中使用LwIP+FreeRTOS,實驗展示如何實現HTTP服務器,實驗使用到的硬件如下:
如圖是MB-039(完整原理圖可以通過MM32官網下載)的ETH部分。
各個信號引腳對應如下:
我們創建HTTP工程:
static void http_server_netconn_thread(void* arg) { ********************************************************* do { err = netconn_accept(conn, newconn); //(1) if (err == ERR_OK) { http_server_netconn_serve(newconn); //(2) netconn_delete(newconn); } } while(err == ERR_OK); ********************************************************* } static void http_server_netconn_serve(struct netconn* conn) { struct netbuf* inbuf; char* buf; u16_t buflen; err_t err; err = netconn_recv(conn, inbuf); //(3) if (err == ERR_OK) { netbuf_data(inbuf, (void**) buf, buflen); if (buflen >= 5 buf[0] == 'G' buf[1] == 'E' buf[2] == 'T' buf[3] == ' ' buf[4] == '/' ) { //(4) netconn_write(conn, http_html_hdr, sizeof(http_html_hdr) - 1, NETCONN_NOCOPY); //(5) netconn_write(conn, http_index_html, sizeof(http_index_html) - 1, NETCONN_NOCOPY); //(6) } } netconn_close(conn); //(7) netbuf_delete(inbuf); }
01、等待連接請求
02、執行數據發送的主要函數,工程的主要部分
03、接收客戶端(瀏覽器)發送的數據
04、通過前面五個字節判斷是否為請求方法,我們只是為例簡單的功能展示不需要去關注正文部分
05、發送應答頭信息
06、發送網頁信息(html)
07、關閉連接
到這里已經完成了工程的創建,看一下PC的IP地址,設備需要處于同一網段方便測試。打開命令行窗口輸入:ipconfig
PC的地址為:192.168.105.34,在sys_arch.h文件中對DEST_IP_ADDR0 、DEST_IP_ADDR1、DEST_IP_ADDR2、DEST_IP_ADDR3進行修改,DEST_PORT 隨意修改。
#define LOCAL_PORT 2021 #define IP_ADDR0 192 #define IP_ADDR1 168 #define IP_ADDR2 105 #define IP_ADDR3 35
將程序下載入開發板中,打開瀏覽器,輸入設備地址:192.168.105.35
(1)點擊靈動微電子即可跳轉到我們的官網
(2)我們按F12來查看網頁的信息
關注畫圈部分,點擊靈動微電子可以執行跳轉的原因是他的href屬性指向的超鏈接目標的URL為我們的官網地址。同樣,使圖片顯示的方式是類似的,我們先找到一張圖片,將他的地址填入img src中,此時圖片并非存儲在MCU中,是通過網絡訪問讀取的。
我們也可以使用Wireshark進行監視抓取整個過程,選擇IP過濾ip.addr==192.168.105.35。
可以看到整個過程和前文介紹的步驟完全一致。
實驗程序請登錄我們的官網下載MM32F3270 SDK,工程路徑如下:
~MM32F3270_Lib_Samples_V0.90Demo_appEthernet_DemoETH_RTOSFreertos_http
到這里已經完成了以太網專題的介紹,在樣例包中,還提供了其他的樣例工程,如:mqtt_onenet、mqtt_baidu、Freertos_dns、Freertos_dhcp、TFTP等。以太網協議本身非常龐大,需要用戶花費時間去研究。專題通過對六個簡單實驗的介紹,起到拋磚引玉的作用,更大的意義在于使剛接觸以太網的用戶有個著手點,實現更復雜的功能。
來源:靈動MM32MCU
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17324瀏覽量
352655 -
以太網
+關注
關注
40文章
5460瀏覽量
172743 -
服務器
+關注
關注
12文章
9308瀏覽量
86071 -
HTTP
+關注
關注
0文章
511瀏覽量
31519
發布評論請先 登錄
相關推薦
評論