網絡基礎 2-1(應用層,HTTP三點注意,HTTP協議格式, 最簡單的HTTP服務器)

應用層

應用層

負責應用程序之間的數據溝通-----協議都是用戶自己定的

自定制協議:

結構化數據傳輸

序列化:

將數據對象以指定的協議(數據格式)進行可用于持久化存儲或者數據傳輸時的數據組織
例如在分布式的系統中,需要把對象從網絡的一端傳輸到另外一端;而網絡中數據是以二進制流的方式來傳遞的 ;此時對象的序列化就是完成把對象轉化成對應二進制流的方式;反序列化則是把二進制流轉化為對象數據的方式。

反序列化:

將二進制數據串按照指定的協議進行解析獲取到各個數據對象

序列化的方式:
  1. Json:JavaScript Object Notation, 是一種輕量級的數據交換格式,把對象的狀態序列化成為字符串 {屬性名:值}格式的字符串,移動端通訊常用數據格式。
  2. protobuf是Google開發的開源項目。protobuf是一種串行化的數據結構信息,類似xml。主要用于消息傳輸中消息格式規范,數據存儲。與xml相比,protobuf更小、更快、更簡單、更少歧義、方便生成消息存取類。

知名協議

HTTP-----超文本傳輸協議

URL:統一資源定位符(網址)

URL格式:

協議名稱://用戶名:密碼@服務器地址:端口/資源路徑?查詢字符串#片段標識符

查詢字符串(用戶提交的數據)中若包含特殊字符則需要進行URL編碼,因為在URL中特殊字符具有特殊含義。用戶提交的數據中若有特殊字符要避免這種二義性
urlencode:將特殊字符每一個字節轉換成為16進制數字的字符串,并且在前邊加上%
在這里插入圖片描述
在這里插入圖片描述
urldecode%2 -('2'-'0')<<4+b-'0'

HTTP協議

HTTP三點注意事項

  1. HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
  2. HTTP是媒體獨立的:這意味著,只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
  3. HTTP是無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

HTTP協議格式

在這里插入圖片描述

1.首行:

以空格進行間隔,分了三個部分

1-1請求首行:

  1. 請求方法
  2. URL
  3. 協議版本
    請求方法
    HTTP1.0定義了三種請求方法:GET: 獲取資源,提交數據在URL中存放,沒有正,POST:傳輸實體主體,提交數據在正文中出現,有正文,HEAD(獲得報文頭部,文件有多長)等其他方法。
    協議版本
    0.9/1.0/1.1/1.2-------各個版本之間的新特性
1-2響應首行
  1. 協議版本
  2. 響應狀態碼
  3. 狀態碼描述信息
    常見的狀態碼, 比如 200(OK), 404(Not Found), 403(Forbidden,認證失敗), 302(Redirect, 重定向), 502(Bad Gateway,壞的網關) 在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

2. 頭部

都是一個個以冒號空格形式組成的鍵值對,這些鍵值對之間以\r\n進行間隔
Conter-Length(標志正文有多長,解決粘包問題)/Content-Type(正文類型)/Referer(跳轉位置)/Cookie/Set-Cookie/Location(重定向位置)/Transfer-Encoding(是否進行分塊傳輸)

HTTP響應頭消息

在這里插入圖片描述
在這里插入圖片描述

3. 空行

\r\n間隔頭部與正文

4. 正文

http協議是一個在傳輸層基于tcp協議實現的應用層協議,在傳輸層默認使用80端口,使用字符串明文傳輸

HTTP 協議的 8 種請求類型介紹

HTTP 協議中共定義了八種方法或者叫“動作”來表明對 Request-URI 指定的資源的不同操作方式,具體介紹如下:

  1. OPTIONS:返回服務器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務器發送’*'的請求來測試服務器的功能性。
  2. HEAD:向服務器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法可以在不必傳輸整個響應內容的情況下,就可以獲取包含在響應消息頭中的元信息。
  3. GET:向特定的資源發出請求。
  4. POST:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的創建和/或已有資源的修改。
  5. PUT:向指定資源位置上傳其最新內容。
  6. DELETE:請求服務器刪除 Request-URI 所標識的資源。
  7. TRACE:回顯服務器收到的請求,主要用于測試或診斷。
  8. CONNECT:HTTP/1.1 協議中預留給能夠將連接改為管道方式的代理服務器。
    雖然 HTTP 的請求方式有 8 種,但是我們在實際應用中常用的也就是 get 和 post,其他請求方式也都可以通過這兩種方式間接的來實現。

最簡單的HTTP服務器

/*                                                                                                                                                                                                               *實現最簡單的http服務器1.http實際是一個tcp服務器,不過應用數據的處理是http協議格式2.處理數據的時候:1. 獲取http頭部(首行+頭部)2.獲取數據3.根據頭部中的請求處理數據3.接受到瀏覽器的請求之后,打印一下請求的數據,并且響應<html><body><h1>Hello World</h1></body></html>*/
#include<sstream>
#include"tcpsocket.hpp"
int main()
{TcpSocket sock;CHECK_RET(sock.Socket());CHECK_RET(sock.Bind("0.0.0.0",2502));CHECK_RET(sock.Listen());while(1){TcpSocket clisock;std::string cliip;uint16_t cliport;bool ret =sock.Accept(clisock,cliip,cliport);if(ret == false){continue;}std::string buf;clisock.Recv(buf);std::cout<<"req:["<<buf<<"]\n";std::string body;body = "<html><body><h1>Hello World</h1></body></html>";//正文std::string first_line = "HTTP/1.1 200 OK \r\n";//頭部std::stringstream header;header << "Content-Length:" << body.size() << "\r\n";//正文長度header << "Content-Type:" << "text/html\r\n";//正文類型std::string blank ="\r\n";//空行clisock.Send(first_line);clisock.Send(header.str());clisock.Send(blank);clisock.Send(body);clisock.Send(body);clisock.Close();}return 0;
}  

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383196.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

正則表達式 學習

http://regexr.com/ 在線匹配 http://c.biancheng.net/cpp/html/1434.html 查詢網址

網絡基礎2-2(傳輸層,端口,詳談UDP)

傳輸層 負責數據能夠從發送端傳輸接收端. 端口號 端口號(Port)標識了一個主機上進行通信的不同的應用程序;在TCP/IP協議中, 用 “源IP”, “源端口號”, “目的IP”, “目的端口號”, “協議號” 這樣一個五元組來標識一個通信(可以通過 netstat -n查看);一個端口只能被一個…

中文rfc文檔路徑

http://man.chinaunix.net/develop/rfc/default.htm

網絡基礎2-3(TCP協議,三次握手,四次揮手,TIME_WAIT狀態的作用,TCP如何保證可靠傳輸,TCP連接中狀態轉化,滑動窗口,流量控制,快速重傳,擁塞窗口,延遲應答,捎帶應答,粘包問題)

TCP協議 TCP協議概念 TCP全稱為 “傳輸控制協議(Transmission Control Protocol”). 人如其名, 要對數據的傳輸進行一個詳細的控制 TCP協議格式 1. 源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去; 2. 32位序號/32位確認號: 后面詳細講; 3. 4位TCP報頭長度: 表示該…

超時設置

//read操作加上超時時間。1 int read_timeout(int fd, void *buf, uint32_t count, int time)2 {3 if(time > 0) {4 fd_set rSet;5 FD_ZERO(&rSet);6 FD_SET(fd, &rSet);7 8 struct timeval timeout;9 memset(&tim…

字符串題目 1 --------判斷兩個字符串是否為旋轉詞

題目描述 如果一個字符串為str&#xff0c;把字符串的前面任意部分挪到后面形成的字符串交str的旋轉詞。比如str“12345”&#xff0c;str的旋轉串有“12345”、“45123”等等。給定兩個字符串&#xff0c;判斷是否為旋轉詞。 輸入描述: 輸出包含三行&#xff0c;第一個兩個…

2021-03-04

為什么nginx轉發后端默認使用1.0而不是1.1 在 Nginx 的官網文檔中&#xff0c;有這樣一個指令&#xff1a; Syntax: gzip_http_version 1.0 | 1.1; Default: gzip_http_version 1.1; Context: http, server, location Sets the minimum HTTP version of a request required to…

字符串題目---2判斷兩個字符串是否為變形詞

題目描述 給定兩個字符串str1和str2&#xff0c;如果str1和str2中出現的字符種類出現的一樣且每種字符出現的次數也一樣&#xff0c;那么str1和str2互為變形詞。請判斷str1和str2是否為變形詞 輸入描述: 輸入包括3行&#xff0c;第一行包含兩個整數n&#xff0c;m(1 \leq n,…

設計模式7----代理模式

代理模式 概念 Proxy 模式又叫做代理模式&#xff0c;是結構型的設計模式之一&#xff0c;它可以為其他對象提供一 種代理&#xff08;Proxy&#xff09;以控制對這個對象的訪問。 所謂代理&#xff0c;是指具有與代理元&#xff08;被代理的對象&#xff09;具有相同的接口的…

網絡基礎3-1(細談IP協議頭, 網絡層,子網劃分,路由選擇,數據鏈路層,以太網幀格式,MAC地址,再談ARP協議)

IP協議 IP協議頭格式 4位版本號(version): 指定IP協議的版本, 對于IPv4來說, 就是44位頭部長度(header length): IP頭部的長度是多少個。32bit, 也就是 length * 4 的字節數. 4bit表示大 的數字是15, 因此IP頭部大長度是60字節8位服務類型(Type Of Service): 3位優先權字段(已…

c++常見并且必須記住的問題

一、基礎知識 基本語言 1、說一下static關鍵字的作用 ?2、說一下C和C的區別 3、說一說c中四種cast轉換 4、請說一下C/C 中指針和引用的區別&#xff1f; 5、給定三角形ABC和一點P(x,y,z)&#xff0c;判斷點P是否在ABC內&#xff0c;給出思路并手寫代碼 6、怎么判斷一個…

網絡中典型協議--(DNS,輸入url后, 發生的事情. ,ICMP,NAT)

DNS&#xff08;Domain Name System&#xff09; DNS是一整套從域名映射到IP的系統 域名服務器發展背景 TCP/IP中使用IP地址和端口號來確定網絡上的一臺主機的一個程序. 但是IP地址不方便記憶. 于是人們發明了一種叫主機名的東西, 是一個字符串, 并且使用hosts文件來描述主機…

高級IO--1 ---(五種典型IO,阻塞IO,非阻塞IO,信號驅動IO,異步IO, IO多路轉接)

高級IO&#xff1a; 五種典型IO&#xff1a; 阻塞IO/非阻塞IO/信號驅動IO/異步IO/IO多路轉接 IO多路轉接模型&#xff1a;select/poll/epoll 五種典型IO 阻塞IO IO操作的流程&#xff1a;等待IO操作條件具備&#xff0c;然后進行數據拷貝 為了完成IO操作發起調用&#xff…

IO多路轉接模型----(select的模型,select的優缺點,poll的模型,poll的優缺點)

IO多路轉接模型&#xff1a;select/poll/epoll 對大量描述符進行事件監控(可讀/可寫/異常) select模型 用戶定義描述符的事件監控集合 fd_set&#xff08;這是一個位圖&#xff0c;用于存儲要監控的描述符&#xff09;; 用戶將需要監控的描述符添加到集合中&#xff0c;這個描…

IO多路轉接模型-----epoll

epoll&#xff1a; Linux下性能最高的多路轉接模型 epoll 有3個相關的系統調用. epoll_create 功能&#xff1a;創建epoll&#xff0c;在內核中創建eventpoll結構體&#xff0c;size決定了epoll最多監控多少個描述符&#xff0c;在Linux2.6.8之后被忽略&#xff0c;但是必須…

再寫順序表(c語言實現,外加冒泡排序,二分查找)

概念 順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構&#xff0c;一般情況下采用數組存儲。在數組 上完成數據的增刪查改。 順序表一般可以分為&#xff1a; 靜態順序表&#xff1a;使用定長數組存儲。動態順序表&#xff1a;使用動態開辟的數組存儲。 頭…

再寫單鏈表(不帶頭單鏈表)

單鏈表 實際中鏈表的結構非常多樣&#xff0c;以下情況組合起來就有8種鏈表結構&#xff1a; 單向、雙向帶頭、不帶頭循環、非循環 雖然有這么多的鏈表的結構&#xff0c;但是我們實際中最常用還是兩種結構&#xff1a; 無頭單向非循環鏈表&#xff1a;結構簡單&#xff0…

再寫雙向循環鏈表

#pragma once #include<assert.h> #include<malloc.h> #include<stdio.h> typedef int DLDataType;//定義鏈表結點結構 typedef struct DListNode{DLDataType value;struct DListNode *prev; //指向前一個結點struct DListNode *next; //指向后一個結點 } DL…

鏈表題目--1 刪除鏈表中所有等于val的值

注意事項 要刪除的結點相鄰第一個結點就是要刪除的結點 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val){if(headNULL){return NULL;}struct …

鏈表題目--2 求鏈表的中間結點 和 求鏈表中倒數第k個結點

求鏈表的中間結點 思路 一個走兩步&#xff0c;一個走一步。一個走到尾&#xff0c;另外一個就走到了中間 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head…