1. 程式人生 > >【linux】http協議

【linux】http協議

HTTP(超文字傳輸協議)是Web瀏覽器和伺服器之間交換請求和應答報文的通訊協議,是在應用層上面的一種協議。首先來了解一下HTTP協議的一些特性。
HTTP一共有兩個特性:
(1)無狀態性
HTTP協議在傳輸層使用的是TCP協議,為了提高Web瀏覽器的併發處理能力,協議的設定者規定Web伺服器在接收到瀏覽器HTTP請求報文,返回應答報文之後不儲存先關Web瀏覽器的任何資訊。。因此,HTTP屬於一種無狀態的協議。(瀏覽器可以用cookie或者session來儲存Web瀏覽器的資訊)
(2)非持續性和持續性
首先來了解一下什麼是非持續性和持續性?
非持續性就是當客戶向伺服器傳送多個服務請求報文,伺服器需要對每一個請求報文進行應答,併為每一個應答過程建立一個TCP連線的工作過程叫做非持續性連線。
持續性連線指的是多個客戶與伺服器之間的請求報文和應答報文可以通過一個TCP連線來完成。
下面來了解幾個基本概念:
URL:
我們常說的網址就是url
這裡寫圖片描述


這就是一個普通url的結構。
urlencode和urldecode
像/?這樣的字元,已經被url當做特殊意義理解了,因此這種字元不能隨意出現,比如某個引數中需要帶有這些特殊字元,就必須先對特殊字元進行轉義
轉義的規則如下:
將需要轉碼的字元轉到十六進位制,然後從右到左,取4位(不足4位直接處理),每兩位作為一位,前面加上%,編碼成%XY格式。
例如:
這裡寫圖片描述
“+”被轉成了“%2B”
urldecode就是urlencode的逆過程
HTTP協議格式:
HTTP請求:
這裡寫圖片描述
上面就是:一次HTTP請求的內容:
以空行為分界線上面的就是報頭資訊,下面的是資料資訊
下面來大概介紹一下各欄位分別代表什麼含義:
第一行:[方法]+[url]+[版本]
Header:請求的屬性,,冒號分割的鍵值對;每組屬性之間用\n分隔,遇到空行代表頭部結束
Body:空行後面的內容都是資料,資料資訊允許為空,如果資料資訊不為空,則在頭部資訊中會有一個欄位Content-length屬性來表示資料資訊的長度
HTTP響應報文:
這裡寫圖片描述

第一行:[版本號]+[狀態碼]+[狀態碼解釋]
Header(頭部):請求屬性,冒號分割的鍵值對,每組屬性之間使用\n分隔,遇到空行,表示頭部結束
Body:空行後面都是資料資訊,資料資訊允許為空字串,如果資料資訊不為空,那麼頭部資訊會出現一個Content-length欄位,用來表示資料資訊的長度,如果伺服器返回一個html頁面,那麼html頁面內容就是在資料資訊中
HTTP的方法:
這裡寫圖片描述
其中最常見的就是GET和POST方法:
HTTP的狀態碼:
這裡寫圖片描述
最常見的狀態碼有:
200(OK),404(Not Found),403(Forbidden),302(Redirect,重定向),504(Bad Gateway)
HTTP常見頭部選項:
Content-Type:資料選項(text/html等)
Conteht-Length:資料資訊的長度
Host:客戶端告知伺服器,所請求的資源是在哪個主機的哪個埠上
User-Agent:宣告使用者的作業系統和瀏覽器版本資訊
referer:當前頁面是從哪個頁面跳轉過來的
location:搭配3xx狀態碼使用,告訴客戶端下面該去哪裡訪問
Cookie:用於客戶端儲存少量資訊,通常用於實現Session的功能
簡單實現一個http伺服器,該伺服器的功能是在網頁上顯示一個hello world
程式碼如下:

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void usage()
{
    printf("./server[ip][port]");

}
int main(int argc, char* argv[])
{
    if(argc != 3)
    {
        usage();
        return;
    }
    int fd = socket(AF_INET,SOCK_STREAM,0);
    if(fd<0)
    {
        perror("socket");
        return 1;
    }
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(argv[1]);
    addr.sin_port = htons(atoi(argv[2]));

    int ret = bind(fd,(struct sockaddr*)&addr, sizeof(addr));
    if(ret<0)
    {
        perror("bind");
        return 1;
    }
    ret = listen(fd,10);
    if(ret<0)
    {
        perror("listen");
        return 1;
    }
    for(;;)
    {
        struct sockaddr_in client_addr;
        socklen_t len;
        int client_fd = accept(fd,(struct sockaddr*)&client_addr,&len);
        if(client_fd<0)
        {
            perror("accept");
            continue;
        }
        char input_buf[1024*10] = {0};
        ssize_t read_size = read(client_fd, input_buf,sizeof(input_buf)-1);
        if(read_size < 0)
        {
            return 1;
        }
        printf("[Request]%s",input_buf);
        char buf[1024] = {0};
        const char* hello = "<h1>hello world</h1>";
        sprintf(buf,"HTTP/1.0 200 OK\n\
                Content-Length:%lu\n\n%s",strlen(hello),hello);
        write(client_fd,buf,strlen(buf));
    }
    return 0;
}

編譯並執行伺服器:
這裡寫圖片描述
使用網頁連線伺服器:
這裡寫圖片描述
網頁上能正常顯示hello world
再看伺服器的現象可得:
這裡寫圖片描述
注意:我們常說http伺服器埠號是80,但這只是常見用法,並不是不能使用其它埠號,經試驗驗證9999也是可以的嘛。

相關推薦

linuxhttp協議

HTTP(超文字傳輸協議)是Web瀏覽器和伺服器之間交換請求和應答報文的通訊協議,是在應用層上面的一種協議。首先來了解一下HTTP協議的一些特性。 HTTP一共有兩個特性: (1)無狀態性 HTTP協議在傳輸層使用的是TCP協議,為了提高Web瀏覽器的併發

linux---sftp協議將windows檔案拷貝到linux

1.通過sftp協議,安全連線到遠端伺服器,建議使用xshell的連線, 也可以使用sftp  使用者名稱@主機名 實現linux機器與linux機器之間檔案的上傳操作 2.上傳檔案 可以上傳到指定目錄 sftp> cd /home/  sftp>

分類 - HTTP協議相關

個人簡介 如果對測試比較感興趣的可以加QQ群:320542475! 如果你願意,我們可以聊聊測試的那點事,相互學習、互相成長,我相信只要不斷吸取自己所需營養,即使出生不那麼光彩,在未來依然會光芒萬丈,只是在前進的路上荊棘多了一點而已、、、

大前端學習筆記整理HTTP協議以及http與https的區別

前言 還是老樣子,新部落格開始前總是想先囉嗦幾句...HTTP協議其實在當初學習java時老師就有提過...但是...反正就那麼過去了... 這段時間公司的專案正好要求做https的轉換和遷移,然後自己思考了一下,好像自己對於http連一知半解都算不上...更不提http與https的區別...想想作為一個未

java 網路程式設計10 HTTP協議詳解

【1】http協議概念,http1.0與http1.1 區別: 1.http(Hypertext Transfer Protocol)超文字轉出協議,從1990年開始就在www上廣泛應用。HTTP是一個屬於應用層的面向物件的協議,由於其簡捷、快速的方式,適用於分散式超媒體資

網路HTTP協議中的長連線和短連線(keep-alive狀態)

 HTTP1.1規定了預設保持長連線(HTTP persistent connection ,也有翻譯為持久連線),資料傳輸完成了保持TCP連線不斷開(不發RST包、不四次握手),等待在同域名下繼續用這個通道傳輸資料;相反的就是短連線。  HTTP首部的Connection: Keep-alive是HT

Linux深入理解HTTP協議

本文參考自: 原文地址 基本概念及作用 首先HTTP協議屬於應用層協議,應用層協議就是我們程式設計師自己定協議,但如果每次都自己定麻煩並且很容易出錯,所以有了一些現成的(HTTP,DNS)等,所以大多是直接拿來用就行,而應用層的作用就是雙方達成某種約定,一段按照約

安全牛學習筆記HTTP協議

信息安全 http security+ 互聯網 http協議基礎 1. HTTP概述眾所周知,Internet的基本協議是TCP/IP協議,目前廣泛采用的FTP、Archie Gopher等是建立在 TCP/IP協議之上的應用層協議,不同的協議

HTTP學習---TCP和UDP協議的區別與應用

用戶數 prot 發送 smi 處理 層次 實時性 oot user 【原文】https://www.toutiao.com/i6592813624689951239/ 概述 ⊙TCP/IP是個協議組,可分為三個層次:網絡層、傳輸層和應用層。 在網絡層有IP協議、ICMP

網路協議-2Http協議

原文連線:https://www.jianshu.com/p/8fe93a14754c HTTP連線最顯著的特點是客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線 HTTP使用統一資源識別符號(URI)來傳輸資料和建立連線

電腦基礎知識http協議狀態碼記錄

HTTP狀態碼(HTTP Status Code) 一些常見的狀態碼為: 200 - 伺服器成功返回網頁 404 - 請求的網頁不存在 503 - 服務不可用 所有狀態解釋:點選檢視 1xx(臨時響應) 表示臨時響應並需要請求者繼續執行操作的狀態程式碼。 程式碼

Linux應用層協議

netstat常用選項     # netstat -a      # 列出所有埠     # netstat -at     # 列出所有TCP埠     # netstat -au     # 列出所有UDP埠     # netstat -l         # 只顯示

基礎原理HTTP協議

【前言】        最近被調到了測試組工作,再熟悉了Jmeter的使用之後,發現Jmeter返回的測試報告中多數是http的報文,或者狀態碼。 趁著這次機會也把原來欠的知識都補上,http協議這塊

Http協議Http協議簡介

HTTP簡介 HTTP協議是Hyper Text Transfer Protocol(超文字傳輸協議)的縮寫,是用於從全球資訊網(WWW:World Wide Web )伺服器傳輸超文字到本地瀏覽器的傳送協議。 HTTP是一個基於TCP/IP通訊協議來傳遞資料(HTML

linux記一次httpd服務正常,http不能訪問的慘痛教訓

記一次httpd服務啟動正常,http服務死活不能訪問的問題記錄。 1.在linux下,使用ps和grep檢視httpd服務 # ps aux | grep httpd root 7579 0.0 0.0 3872 656 pts/1

Linux 核心網路協議棧原始碼剖析socket.c——BSD Socket層(1)

寫在前面:本系列文章先把各個層對應的檔案原始碼剖析一遍,最後再穿插起來,理清整個協議棧網路資料包的上下傳送通道,從整體實現上進行把握。         圖片來源於《Linux 核心網路棧原始碼情景分析》 更上層函式:tcp socket函式介紹。本篇則是介紹BSD Sock

Web開發原理HTTP協議詳解

一、概念 協議是指計算機通訊網路中兩臺計算機之間進行通訊所必須共同遵守的規定或規則,超文字傳輸協議(HTTP)是一種通訊協議,它允許將超文字標記語言(HTML)文件從Web伺服器傳送到客戶端的瀏覽器。 HTTP協議,即超文字傳輸協議(Hypertext transfe

筆試必備HTTP協議各種狀態程式碼

當瀏覽器向Web伺服器請求服務時,有時會有錯誤產生,這是筆試經常會有的,記住了就簡單,沒記住就傻逼吧。以下列表給出了產生錯誤時返回的HTTP狀態程式碼: 1xx:資訊 狀態程式碼: 描述: 100 Continue 伺服器收到的請求不完整,但伺服器沒有拒絕請求,

Linux 核心網路協議棧原始碼剖析bind 函式剖析

socket 函式並沒有為套接字繫結本地地址和埠號,對於伺服器端則必須顯性繫結地址和埠號。bind 函式主要是伺服器端使用,把一個本地協議地址賦予套接字。 1、應用層——bind 函式 #include <sys/socket.h> int bind(int

運維安全-HTTP協議

src 推薦 詳情 ima 如果 image des baidu www. 如果想深入了解,推薦《圖解HTTP》,網上有PDF版。 兩個命令: curl curl www.baidu.com 可以看到網頁信息 curl www.baidu.com -I