HTTP工作原理及HTTP请求、响应报文解读

简介: 本文是HTTP工作原理及HTTP请求、响应报文解读。

一、HTTP原理

1.HTTP工作原理(实例分析):

<1> http客户端与http服务器建立TCP连接;

image.png

<2> http客户端通过浏览器向http服务器80端口发送HTTP连接请求;

image.png

<3>如果http服务器允许访问,则返回连接确认,双方建立HTTP连接;

<4>. http客户端发送HTTP页面请求(Http Analyzer V5分析结果)

image.png

<5>. http服务器寻找该HTTP文件,如果找到则返回该文件的超文本。http客户端的浏览器对接收到的超文本进行解析,翻译成格式化的页面,显示给用户;

(Http服务器模拟返回)

image.png

image.png

<6>. http服务器发送完HTTP内容后,断开HTTP连接;

<7>. 双方断开TCP连接;

/*-----------------------------------------------
-------------HTTPServer---------------------
------------------------------------------------*/
#include <winsock2.h>
#include <stdio.h>
 
int main(void) 
{
    //----------------------
    // Initialize ......
    int len = 0;
    char buff[4096];
    char msgret[4096];
    memset( msgret, 0x00, sizeof(msgret) );
 
    
    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) {
        printf("Error at WSAStartup()\n");
        return 1;
    }
 
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("10.166.178.225");
    service.sin_port = htons(80);
    
    if (bind( ListenSocket, 
        (SOCKADDR*) &service, 
        sizeof(service)) == SOCKET_ERROR) {
        printf("bind() failed.\n");
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen( ListenSocket, 1 ) == SOCKET_ERROR) 
    {
        printf("Error listening on socket.\n");
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
 
    //----------------------
    // Accept the connection.
    SOCKET AcceptSocket;
    printf("Waiting for client to connect...\n");
 
    while(1)
    {
        AcceptSocket = accept( ListenSocket, NULL, NULL );        
        if (AcceptSocket == INVALID_SOCKET)
        {
            printf("accept failed: %d\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        } 
        else 
        {
            printf("Client connected.\n");
            memset( buff, 0x00, sizeof(buff) );
            len = recv(AcceptSocket, buff, 4096, 0);
            printf( "msg recv:\n%s\n", buff );
 
            sprintf( msgret, "HTTP/1.1 200 OK\n"
                "Date: Fri, 02 Mar 2012 01:59:03 GMT\n"
                "Server: Apache"
                "Location: http://www.sina.com.cn/\n"
                "Cache-Control: max-age=60\n"
                "Expires: Fri, 02 Mar 2012 02:00:03 GMT\n"
                "Vary: Accept-Encoding\n"
                "Content-Length: 231\n"
                "Content-Type: text/html; charset=iso-8859-1\n"
                "X-Cache: MISS from xd33-82.HP08040021.sina.com.cn\n"
                "Connection: close\n\n"
                "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
                "<html><head>\n"
                "<title>title test</title>\n"
                "</head><body>\n"
                "<h1>test body</h1>\n"
                "<h2>test sub body</h2>\n"
                "<p>My First Test!</p>\n"
                "</body></html>" );
                len = send( AcceptSocket, msgret, sizeof(msgret), 0 );
                if( len <= 0 )
                {
                    printf( "send failed\n" );
                }
        }//end else
    }//end while
 
    
    // No longer need server socket
    closesocket(ListenSocket);    
    WSACleanup();
    return 0;
}

服务器端的显示结果…

image.png

2.HTTP请求(request)&响应(response)报文解读(Http Analyzer V5分析结果)

2.1 HTTP请求报文(Header部分)

image.png

GET请求:是以实体的方式得到由请求URL所指定资源的信息,如果请求URL只是一个数据产生过程,那么最终要在响应实体中的是处理过程的结果所指向的资源,而不是处理过程的描述。GET是向服务器发索取数据的一种请求。

[1]GET /HTTP/1.1

[2]Accept:image/gif, Image/x-xbitmap, image/jpeg, Image/pjpeg,  application/x-shockwave

-flash, application/x-silverlight,application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword,  /  //客户端可识别的内容类型列表。

[3]Accept-Language:zh-cn 客户端所能解释的语言:简体中文

[4]UA-CPU: x86(上面未体现出来)

[5]Accept-Encoding:gzip, deflate  //客户端可以解释的类型

[6]User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.3; .NET CLR2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET 4.0C; .NET4.0E)

 //客户端浏览器型号(同下)

image.png

[7]Host: 10.166.178.225提交请求页面(用本地机器测试,即为本地IP地址;此处可以是网站域名如:www.dlut.edu.cn)。

[8]Connection:Keep-Alive TCP连接保持打开

 

2.2 HTTP响应报文(Header部分)

image.png

1HTTP/1.1 200 OK

[2]Date: Fri, 02Mar 2012 01:59:03 GMT

[3]Server:ApacheLocation:http://www.sina.com.cn

[4]Cache-Control:max-age=60

[5]Expires: Fri,02 Mar 2012 02:00:03 GMT

[6]Vary: Accept-Encoding

[7]Content-Type:text/html; charset=iso-8859-1

[8]X-Cache:MISS from xd33-82.HP08040021.sina.com.cn

[9]Connectionclose

该响应信息也以对应的4部分组成:

协议状态描述,HTTP/1.1表示协议版本,200 OK表示服务器已经成功处理了客户端发出的请求。200表示HTTP的应答码成功。HTTP应答码由3位数字构成,其中首位数字定义了应答码的类型:

1XX-信息类(Information),表示收到Web浏览器请求,正在进一步的处理中

2XX-成功类(Successful),表示用户请求被正确接收,理解和处理例如:200 OK

3XX-重定向类(Redirection),表示请求没有成功,客户必须采取进一步的动作。

4XX-客户端错误(Client Error),表示客户端提交的请求有错误 例如:404 NOT Found,意味着请求中所引用的文档不存在。

5XX-服务器错误(Server Error)表示服务器不能完成对请求的处理:如 500

响应报头:跟请求报头一样,它指出服务器的功能,标识出响应数据的细节。

空行:也是属于响应报头和响应正文之间必须存在的一个空行,表示响应报头结束,接下来是响应正文

响应正文:也就是服务器返回的网页内容。

image.png

 

作者:铭毅天下
原文:https://blog.csdn.net/laoyang360/article/details/8280478
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
15天前
|
Java
java原生发送http请求
java原生发送http请求
|
22天前
|
网络协议 Linux iOS开发
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
48 1
|
1月前
|
缓存 前端开发
HTTP协议基本原理简介(三)
HTTP协议基本原理简介(三)
15 1
|
4天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
20 8
|
3天前
|
XML Java 数据格式
Servlet 教程 之 Servlet 服务器 HTTP 响应 3
`Servlet`教程示例展示了如何创建一个HTTP响应,使用`@WebServlet(&quot;/Refresh&quot;)`的`Refresh`类继承`HttpServlet`。在`doGet`方法中,设置了`Refresh`头以每5秒自动刷新,并用`setContentType(&quot;text/html;charset=UTF-8&quot;)`设定内容类型。还使用`Calendar`和`SimpleDateFormat`获取并格式化当前时间显示。相应的`web.xml`配置指定了Servlet路径。当访问此Servlet时,页面将每5秒更新一次显示的系统时间。
14 4
|
8天前
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
24 1
|
12天前
|
存储 JSON 前端开发
网络原理(4)HTTP协议(下)
网络原理(4)HTTP协议
25 0
|
1月前
|
JSON 前端开发 数据格式
糊涂工具类真是场景下请求http接口的案例
糊涂工具类真是场景下请求http接口的案例
21 0
|
1月前
|
数据采集 缓存 前端开发
http和https请求服务器的时候在请求头部分都带什么到服务器呢?
HTTP和HTTPS请求头基本结构相似,HTTPS多了一层SSL/TLS加密。常见请求头如Accept(指定内容类型)、Authorization(身份验证)、Cookie(会话跟踪)、User-Agent(标识用户代理)等。HTTPS特有的头包括Upgrade-Insecure-Requests(升级到HTTPS)、Strict-Transport-Security(强制使用HTTPS)、Sec-Fetch-*(安全策略)和X-Content-Type-Options、X-Frame-Options等(增强安全性)。实际应用中,请求头会根据需求和安全策略变化。
20 0
|
1月前
|
网络协议 网络安全 API
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
48 1