【计算机网络】应用层HTTP协议

2023-11-18

一、HTTP协议简介

HTTP协议全称为超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。HTTP 是为 Web 浏览器与 Web 服务器之间的通信而设计的。

HTTP 是一个基于 TCP/IP 通信协议来传递数据的(HTML 文件、图片文件、查询结果等),是一种应用层协议。其中HTTP1.0、HTTP1.1、HTTP2.0均为TCP协议实现,HTTP3.0是基于UDP实现的,现在主要使用的是HTTP1.0和HTTP3.0 。

另外,现在我们访问一些网站时我们可以发现,很多都是使用的HTTPS协议进行通信的,其实 HTTPS 是在 HTTP 的基础之上,利用SSL/TLS来加密数据包,一定程度上保证了数据传输的安全性。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。关于HTTPS的详细内容可见博主的后续文章。

二、HTTP协议的工作原理

HTTP 协议工作与客户端—服务端架构上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即web服务器发送请求,web服务器根据接收到的请求向客户端发送回响信息,从而实现客户端与服务端之间的通信。

HTTP的注意事项:

  • HTTP 的默认端口号是80,但也可以根据自己的意愿改为8080或者其他端口号。
  • HTTP 是无连接的:无连接的含义是限制每一次连接只处理一个请求,服务器处理完客户端的请求并接受客户端的应答后,便断开连接,采用这种连接方式可以节省传输的时间,从而提供传输效率。
  • HTTP 是媒体独立的:即只要客户端和服务器知道如何处理数据的内容,任何类型的数据都可以提供HTTP协议进行发送,客户端和服务器只需要指定适合的 MIME-type 内容类型。
  • HTTP 是无状态的:即HTTP协议对于事务的处理没有记忆能力,那么就意味着如果后续处理需要前面的信息,就必须进行重传,这样可能导致每次连接传输的数据量增大。而另一方面,在服务器不需要先前信息时的应答速度就较快。

下图展示了HTTP协议通信的基本流程:

二、HTTP协议格式

1. 请求格式

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

请求实例:

2. 响应格式

HTTP响应也由四个部分组成,分别是:状态行、响应头部、空行和响应正文。

响应实例:

三、HTTP请求

1. URL

URL 的定义:
URL 其实就是我们所说的”网址“,URL(Uniform Resource Locator),翻译为统一资源定位符。互连网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL 基本格式:

  • URL 的标准格式如下:

协议类型:[服务器地址[:端口号]][资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

  • URL 的完整格式如下:

协议类型:[[访问资源需要的凭证信息@]服务器地址[:端口号]][资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

URL encode 和 URL decode:
/?:等这样的字符,已经被 URL 当做特殊意义理解了,因此这些字符不能随意出现。如果某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义,即 URL encode。
一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成,虽然在 URL 中没有特殊含义,但是仍然需要进行转义,否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号。

转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

例如:
我们使用百度搜索C++,会得到以下的URL:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=C%2B%2B&fenlei=256&oq=%2526lt%253B%252B%252B&rsv_pq=e54ba5da000bec62&rsv_t=356cAxbNy2N%2FqCyjiqiUM%2FegsZGQCgI7yoN0BsJk0FDJ2jKMW8rVEj11dIg&rqlang=cn&rsv_dl=tb&rsv_enter=0&rsv_btype=t&rsv_sug=1

可以发现 query string 的值是 C%2B%2B、,通过使用 URL encode工具 对其进行解码,就知道 C%2B%2B 就是表示 C++。

2. HTTP请求方法

根据 HTTP 标准,HTTP 请求可以使用多种请求方法。其中HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

方法 描述
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

其中最常用的就是GET方法和POST方法。

3. HTTP请求报头

HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。

应答头 说明
Allow 服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding 文档的编码(Encode)方法。
Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
Date 当前的GMT时间。可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires 应该在什么时候认为文档已经过期,从而不再缓存它?
Host 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上。
Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。
Server 服务器名字。
Set-Cookie 设置和页面关联的Cookie。
WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。

四、HTTP的状态码

1. HTTP 状态码的介绍

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。HTTP 状态码的英文为 HTTP Status Code。
常见的 HTTP 状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 302 - 资源(网页等)被暂时转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

2. HTTP 状态码的分类

HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。响应分为五类:信息响应(100 ~ 199) ,成功响应(200 ~ 299) ,重定向(300 ~ 399) ,客户端错误(400~499) 和服务器错误 (500 ~ 599) :

分类 描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

五、简单的HTTP服务器

利用TCP传输协议实现一个只在网页上显示“This is my httpServer!”,的简单HTTP服务器。

封装Server.hpp

#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <cassert>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>

#define CRLF "\r\n"
#define SPACE " "
#define SPACE_LEN strlen(SPACE)
#define HOME_PAGE "index.html"
#define ROOT_PATH "wwwroot"

std::string ReadFile(const std::string &path)
{
    std::ifstream in(path, std::ifstream::binary);
    if (!in.is_open())
    {
        return "404 NOT FOUND";
    }

    std::string content;
    std::string line;
    while (std::getline(in, line))
    {
        content += line;
    }
    in.close();
    return content;
}

std::string GetPath(std::string request)
{
    std::size_t pos = request.find(CRLF);
    if(pos == std::string::npos)
    {
        return nullptr;
    }

    // 获取第一行:GET PATH HTTP/1.1 
    std::string line = request.substr(0, pos);
    std::size_t first_space = line.find(SPACE);
    if(first_space == std::string::npos)
    {
        return nullptr;
    }
    std::size_t second_space = line.rfind(SPACE);
    if(second_space == std::string::npos)
    {
        return nullptr;
    }

    std::string path = line.substr(first_space + SPACE_LEN, second_space - (SPACE_LEN + first_space));
    if(path[0] == '/' && path.size() == 1)
        path += HOME_PAGE;

    return path;
}

void _handlerHttpRequest_(int sock)
{
    char buf[1024 * 10] = {0};
    ssize_t read_size = read(sock, buf, sizeof buf);
    if (read_size > 0)
    {
        std::cout << buf;
    }

    // std::string response = "HTTP/1.1 302 Temporarily Moved\r\n"; // 临时重定向
    std::string response = "HTTP/1.1 301 Permanently Moved\r\n"; // 永久重定向
    response += "Location: https://www.baidu.com/\r\n";
    response += "\r\n";

    // write(sock, response.c_str(), response.size());
    send(sock, response.c_str(), response.size(), 0);
}

void handlerHttpRequest(int sock)
{
    char buf[1024 * 10] = {0};
    ssize_t read_size = read(sock, buf, sizeof buf);
    if (read_size > 0)
    {
        std::cout << buf;
    }

    // 获取请求中的路径
    std::string path = GetPath(buf);

    // 请求的文件路径在请求行中,第二个字段就是要访问的文件
    //  GET PATH HTTP/1.1
    std::string resource = ROOT_PATH;
    resource += path;
    
    //debug
    std::cout << resource << std::endl;

    // 获取文件后缀
    std::size_t pos = resource.find(".");
    std::string suffix = resource.substr(pos);

    // 读取文件内容
    std::string html = ReadFile(resource);

    // 回响
    std::string response;
    response = "HTTP/1.0 200 OK\r\n";
    if (suffix == ".jpg")
        response += "Content-Type: image/jpeg\r\n";
    else
        response += "Content-Type: text/html\r\n";

    response += ("Content-Length: " + std::to_string(html.size()) + "\r\n");
    // 添加cookie
    response += "Set-Cookie: this is my cookie content;\r\n";
    response += "\r\n";
    response += html;
    send(sock, response.c_str(), response.size(), 0);
}

class Server
{
public:
    Server(uint16_t port, const std::string &ip = "")
        : _listenSock(-1), _port(port), _ip(ip), _quit(false)
    {
        signal(SIGCHLD, SIG_IGN);
    }
    ~Server()
    {
        if (_listenSock >= 0)
        {
            close(_listenSock);
        }
    }

public:
    void init()
    {
        // 创建socket
        _listenSock = socket(AF_INET, SOCK_STREAM, 0);
        if (_listenSock < 0)
        {
            std::cerr << "socket error" << std::endl;
            exit(1);
        }

        // 填充信息
        sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = PF_INET;
        addr.sin_port = htons(_port);
        addr.sin_addr.s_addr = _ip.empty() ? htonl(INADDR_ANY) : inet_addr(_ip.c_str());

        // bind

        if (bind(_listenSock, (const sockaddr *)&addr, sizeof(addr)) < 0)
        {
            std::cerr << "bind error" << std::endl;
            exit(2);
        }

        // 监听
        if (listen(_listenSock, 5) < 0)
        {
            std::cerr << "listen error" << std::endl;
            exit(3);
        }
    }

    void loop()
    {
        while (!_quit)
        {
            sockaddr_in peer;
            socklen_t len = sizeof(peer);
            int peer_sock = accept(_listenSock, (sockaddr *)&peer, &len);
            if (peer_sock < 0)
            {
                std::cerr << "accept error" << std::endl;
                exit(4);
            }

            // 多进程版
            pid_t id = fork();
            if (id > 0)
            {
                // 父进程
                close(peer_sock);
            }
            else if (id == 0)
            {
                // 子进程
                close(_listenSock);
                handlerHttpRequest(peer_sock);
                close(peer_sock);
                exit(0);
            }
            else
            {
                std::cerr << "fork error" << std::endl;
                exit(5);
            }
        }
    }

    bool quitServer()
    {
        _quit = true;
        return true;
    }

private:
    int _listenSock; // sock
    uint16_t _port;  // 服务器端口
    std::string _ip; // IP地址
    bool _quit;      // 安全退出的标志
};

实现httpServer

#include <iostream>
#include "Server.hpp"

static void Usage(std::string proc)
{
    std::cerr << "Usage:\n\t" << proc << " port" << std::endl;
    std::cerr << "example:\n\t" << proc << " 8080\n"
              << std::endl;
}

int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        exit(-1);
    }

    uint16_t port = atoi(argv[1]);

    Server server(port);
    server.init();
    server.loop();

    return 0;
}

编写 index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>我的测试</title>
</head>

<body>
    <p> This is my httpServer!</p>
</body>

</html>

运行结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机网络】应用层HTTP协议 的相关文章

  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • 如何在 ASP.NET MVC 中获取参数数组作为 GET / POST?

    如何最好地获取数组 item gt value 对作为 GET POST 参数 在 PHP 中 我可以这样做 网址 这得到的参数为 Array a gt Array one gt 100 two gt 200 有什么方法可以在 ASP NE
  • python中的编码检测库[重复]

    这个问题在这里已经有答案了 这在某种程度上与我的问题有关here https stackoverflow com questions 2305997 unicodedecodeerror problem with mechanize 我处理
  • 通用开源 REST 客户端? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Tomcat 7 停止接收 HTTP 请求

    我有一个Tomcat 7接收大量数据的服务器GET 要求 这种方法在一段时间内效果很好 然后突然停止工作 7 8 小时后 当它停止工作时 我收到此错误 五月 06 2015 12 47 58 AM org apache coyote htt
  • 是否可以阻止在每个 HTTP 请求中发送 cookie?

    我最近发现 这里 每个网络请求都会发送浏览器cookie吗 https stackoverflow com questions 1336126 does every web request send the browser cookies
  • 对于非文本媒体类型,发送带有 Content-Type 标头的字符集参数是否绝对错误?

    我发现了两个软件之间的错误 其中一个正在发出标头 Content Type application x bittorrent charset utf 8 另一个是错误地处理这个问题 但如果删除 charset 参数 则可以正确处理它 我需要
  • HttpGet 401 状态代码后跟 200 状态代码

    我使用 Apachage HttpComponent 访问 Web 服务时遇到奇怪的行为 我可以访问服务器日志 当我尝试连接到服务器并执行 httpGet 命令时 我可以在日志中首先看到 401 状态 http 未经授权 然后看到 200
  • Jsoup http 日志记录

    有没有办法记录http请求和响应 我们假设以下请求 Connection Response res Jsoup connect LOGIN URL HERE data user USER pass PASS method Connectio
  • 从浏览器中删除cookie?

    有什么方法可以指示网络浏览器完全delete一个人的cookie是用PHP设置的吗 我不想expiry或者等待浏览器closed 对于删除 我的意思是实际上不再将其列在 cookie 列表中 尝试这样删除所有 cookie foreach
  • HTTP请求压缩

    一般用例 想象一下一个正在上传大量 JSON 的客户端 内容类型应保留application json因为这描述了实际数据 Accept Encoding 和 Transfer Encoding 似乎是为了告诉服务器应该如何格式化响应 看起
  • 如何通过 HTTP POST 发送充满对象的 NSArray?

    我在 iPhone 端有一个产品 购物清单 由具有名称 product id 等的产品对象组成 我希望将此列表发送到服务器 在那里我将服务器上的列表与 iphone 中的列表进行比较 以合并所做的更改并将合并的列表发送回 iphone 如何
  • 在 Heroku 上获取客户端的真实 IP 地址

    在任何 Heroku 堆栈上 我想获取客户端的 IP 我的第一次尝试可能是 request headers REMOTE ADDR 当然 这是行不通的 因为所有请求都是通过代理传递的 所以替代方法是使用 request headers X
  • 您可以从 AuthorizeAttribute 返回 HTTP 响应而不引发异常吗?

    我在各种控制器上使用 AuthorizeAttribute 可能需要根据请求本身的某些属性返回 403 或 429 请求过多 我完全在自定义 OnAuthorization 实现中实现了它 然后在必要时抛出一个带有适当响应代码的新 Http
  • 在 Flex 中以 HTTP Post 方式上传任意数据

    我们目前有一个 Java 小程序 可以生成大量数据并将其上传到我们的服务器 我们拥有的上传方法之一是使用 HTTP POST 到我们的服务器 其内容只是原始数据 没有多部分编码或任何内容 我正在考虑实现一个具有相同功能的 Flex 应用程序
  • OkHttp如何获取Json字符串?

    Solution 这是我这边的一个错误 正确的方法是响应 body string 以外响应 body toString 我使用 Jetty servlet URL 是http 172 16 10 126 8789 test path jso
  • 外部依赖错误的 HTTP 状态代码

    当服务器与外部 API 通信出现问题时 返回的正确 HTTP 状态代码是什么 假设客户端向我的服务器 A 发送有效请求 然后 A 查询服务器 B 的 API 以便执行某些操作 然而 B 的 API 当前抛出 500 错误或因某种原因无法访问
  • 返回重定向作为对 Ajax(fetch、XHR 等)请求的响应

    如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果服务器发送重定向 又名 302 响应加上 Location 标头 浏览器将自动遵循重定向 对此的回应second请求 假
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 有没有办法使用 ASP.NET 在用户离开页面时始终运行某些服务器端代码?

    我想知道当用户离开 ASP NET 中的页面时是否有任何方法可以始终运行一些服务器端代码 页面卸载事件不好 因为如果有人单击链接 则不会调用该事件 理想情况下 即使用户关闭浏览器 我也希望代码能够运行 我怀疑我所问的问题是不可能的 但问一下

随机推荐

  • Linux运维工程师面试常用知识点总结

    Linux运维工程师面试常用知识点总结 一 Linux基础命令部分 1 查看某进程所打开的所有文件 2 添加一条静态路由 3 打包一个目录下文件 除了该目录下某个文件 4 提取本地网卡ip地址 5 如何在某个文本的每行前面添加 字符 6 c
  • XSS闯关小游戏(level1~13)

    level1 源代码 通过源代码发现此关没有对输入的name值做任何过滤 直接echo出来 寻找输入点和输出点 构造payload level2 源代码
  • Spring Boot的shiro整合(中)

    一 配置 1 MyShiroRealm类 package com wzq shiro config import javax annotation Resource import org apache shiro authc Authent
  • Logistic回归与Sigmoid函数

    一 Logistic回归 1 1 特征 Logistic回归主要是二分类预测 是对概率的估计的一种方法 概率的取值范围在 0 1 当P gt 0 5时 预测为1 当P lt 0 5时 预测为0 这也就和下文的Sigmoid 函数一样 1 2
  • 【电商下载图片插件】一键下载主图详情图的浏览器插件,现已支持京东、京东国际、淘宝、天猫、拼多多,coupang、1688、naver、gmarket、alibaba、兰亭集势等

    gao tu bao 1 介绍 搞图宝 专门获取各大电商平台详情页面主图和详情图的浏览器插件 现已支持京东 京东国际 淘宝 天猫 拼多多 coupang 1688 naver gmarket alibaba 兰亭集势 详细文档地址 http
  • spring中过滤器filter、拦截器interceptor和切面aop的基本工作原理里和执行顺序

    今天查了一下spirng中三种action前处理业务的三种方法过滤器 拦截器和切面的执行顺序记录一下 三者的区别 1 过滤器filter 过滤器是服务端的一个组件 是基于servlet实现从客户端访问服务端web资源的一种拦截机制 对请求r
  • 华为OD机试 - 寻找相同子串(Java )

    题目描述 给你两个字符串t和p 要求从t中找到一个和p相同的连续子串 并输出该子串第一个字符的下标 输入描述 输入文件包括两行 分别表示字符串t和p 保证t的长度不小于p 且t的长度不超过1000000 p的长度不超过10000 输出描述
  • Unity 处理Scene视角容易穿模问题

    问题一般有两个解决方法 1 重新进行Unity布局 右上角哪里重新进行Layout布局 一般可以恢复Scene视角相机的初始化 2 Scene视角顶部信息栏有一个摄像头图标 点开 就是可以进行Scene摄像机的控制 把Field of Vi
  • 台式机配置网站服务器,台式机搭建服务器的配置

    台式机搭建服务器的配置 内容精选 换一换 当您在升级云服务器的配置的同时 还想要将云服务器迁移到其他的AZ或Region时 您可以使用华为云的整机镜像进行迁移 迁移流程如图1所示 这里以迁移HANA数据库为例 登录管理控制台后 选择服务列表
  • fastjson反序列化泛型类

    为了代码通用 你的定义对象可能是一个泛型对象 其中可变的data属性的类型参数化 那么这个泛型类型的对象 反json化时应该注意些什么呢 Response类型 public static class Response
  • 通过paramiko远程执行windows命令出现:paramiko.ssh_exception.SSHException: Channel closed. 的解决方法

    主要问题在于为windows上的ssh的设置 paramiko连接是没有问题的 想法是远程执行windows服务器上的python程序 通过ssh连接 我在windows服务器上通过winsshd软件个windows安装了ssh服务 但是在
  • elasticSearch常见的面试题

    常见的面试问题 描述使用场景 es集群架构3个节点 根据不同的服务创建不同的索引 根据日期和环境 平均每天递增60 2 大约60Gb的数据 调优技巧 原文参考 干货 BAT等一线大厂 Elasticsearch面试题解读 掘金 设计阶段的调
  • Linux 系统与本地 windows 系统相差30s左右问题解决方案

    首先发现问题 在 linux 系统中使用 date 命令发现与本地相差大概 30s左右 通过 hwclock s 命令可将硬件时间同步至系统时间 最后在执行 date 命令发现正常了
  • 字符串常量到底存放在哪个存储区

    转 字符串常量到底存放在哪个存储区 2013年02月23日 16 57 57 若水三千你是一千 阅读数 40499更多 分类专栏 c语言 字符串常量 放在哪个存储区呢 是 自动存储区 还是 静态存储区 中 比如 char pstr hell
  • 【网络自定向下学习】——TCP报文段的详细解析

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 目录 一 Tcp报文段的结构 二 首部长度 三 窗口大小 四 序列号和确认序
  • 接口测试的测试用例该怎么写呢

    接口测试是软件测试中非常重要的一部分 因为接口的稳定性和可靠性对于整个系统的质量和用户体验都有很大的影响 在接口测试中 编写有效的测试用例是非常关键的一步 本文将介绍如何编写接口测试的测试用例 包括测试用例的设计和编写方法 并提供一些具体的
  • import tensorflow as tf报错ModuleNotFoundError: No module named 'tensorflow'

    在安装tenserflow和keras的时候 安装完毕进行验证的时候会报错 解决方法就是需要安装tf nightly 安装完毕错误就不再报了 pip install tf nightly
  • AWS平台之DDoS攻击防范

    AWS平台之DDoS攻击防范 互联网上的DDoS攻击无处不在 游戏 互联网等大部分行业的客户也往往深受其害 本文主要介绍DDoS攻击的主要方式 AWS的基础设施和服务的介绍 以及如何利用AWS资源防范DDoS攻击 保护用户系统的安全 什么是
  • cesium加载三维模型3dtiles

    1 将数据和代码放到一个目录下 目的 为避免跨域 输入cmd命令 python3 m http server 5500 2 三维服务地址 http 127 0 0 1 5500 data mars3d max shihua 3dtiles
  • 【计算机网络】应用层HTTP协议

    文章目录 一 HTTP协议简介 二 HTTP协议的工作原理 二 HTTP协议格式 1 请求格式 2 响应格式 三 HTTP请求 1 URL 2 HTTP请求方法 3 HTTP请求报头 四 HTTP的状态码 1 HTTP 状态码的介绍 2 H