黏包现象和HTTP协议

2023-05-16

黏包现象和HTTP协议

    • 黏包现象
      • 什么是黏包
      • 解决方案
    • HTTP协议
      • HTTP协议概念
      • URL的概念
      • 查看HTTP通信过程
      • HTTP请求报文分析
      • HTTP响应报文分析
    • 静态web服务器
      • 什么是静态web服务器
      • 搭建python自带的静态web服务器
      • 搭建自己的静态web服务器

黏包现象

什么是黏包

  • 当发送网络数据时,tcp协议会根据Nagle算法将时间间隔短,数据量小的多个数据包打包成一个数据包,先发送到自己操作系统的缓存中,然后操作系统将数据包发送到目标程序所对应操作系统的缓存中,最后将目标程序从缓存中取出,而第一个数据包的长度,应用程序并不知道,所以会直接取出数据或者取出部分数据,留部分数据在缓存中,取出的数据可能第一个数据包和第二个数据包粘到一起
  • 下面通过代码来说明黏包现象在这里插入图片描述在这里插入图片描述
  • 通过结果我们可以看到,客户端其实是发了两条信息,而服务端将这两条信息合并为了一条信息,这就是黏包现象,因为应用程序并不知道第一个数据的长度,是从缓存中直接抽取一部分数据,所以可能会出现这种,两次的信息黏在一起的现象。

解决方案

  • 接下来讨论上述黏包现象的解决方案,在这之前先引入一个模块,叫做struct模块,struct模块中最重要的两个函数为pack和unpack
  • pack函数:作用是将数据以一定的方式打包成二进制格式。
  • unpack函数:作用是从写好的二进制文件中读出文件。
  • 引入struct模块以后,我们解决黏包的思路就有了,因为黏包现象是因为不知道第一个数据的长度引起的,故而我们可以在发送真正的数据之前,先发送第一个数据的长度给服务端,而pack函数固定将数据打包成4个长度的二进制文件使得我们可以将第一次接收的长度设为固定的4,从而很好的阻止接收长度时出现黏包现象,有了长度之后不但可以解决黏包现象,还可以解决由于数据过大,超过接收的最大值导致数据一次不能接收完成的问题。
  • 具体的代码如下:
  • 客户端
import socket
import struct


def main():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    client.connect(('127.0.0.1', 7890))

    # 1.先接收报头
    header = client.recv(4)
    # 2.从报头中解析出数据长度
    data_size = struct.unpack('i', header)[0]

    # 3.接收真实的数据
    recv_size = 0
    total_data = b''
    while recv_size < data_size:
        data_recv = client.recv(1024)
        total_data += data_recv
        recv_size += len(data_recv)

    print(total_data.decode('utf-8'))


if __name__ == '__main__':
    main()


  • 服务端:
import socket
import struct

def main():
    # 创建套接字
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    server.bind(('127.0.0.1', 7890))

    server.listen(128)

    new_socket, addr = server.accept()

    content = """
    Windows IP 配置
    """

    res = struct.pack('i', len(content))
    new_socket.send(res)

    new_socket.send(content.encode('utf-8'))


if __name__ == '__main__':
    main()

HTTP协议

HTTP协议概念

  • HTTP 协议的全称是(HyperText Transfer Protocol),翻译过来就是超文本传输协议。
    超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片、音乐、视频、超链接等等都属于超文本。HTTP 协议的制作者是蒂姆·伯纳斯-李,1991年设计出来的,HTTP 协议设计之前目的是传输网页数据的,现在允许传输任意类型的数据。传输 HTTP 协议格式的数据是基于 TCP 传输协议的,发送数据之前需要先建立连接。
  • 作用:它规定了浏览器和 Web 服务器通信数据的格式,也就是说浏览器和web服务器通信需要使用http协议。

URL的概念

  • URL的英文全拼是(Uniform Resoure Locator),表达的意思是统一资源定位符,通俗理解就是网络资源地址,也就是我们常说的网址。
  • URL的组成
    URL的样子:https://news.163.com/18/1122/10/E178J2O4000189FH.html
  • URL的组成部分:
    • 协议部分: https://、http://、ftp://
    • 域名部分: news.163.com
    • 资源路径部分: /18/1122/10/E178J2O4000189FH.html
  • 域名:
    域名就是IP地址的别名,它是用点进行分割使用英文字母和数字组成的名字,使用域名目的就是方便的记住某台主机IP地址。
  • URL的扩展:
    https://news.163.com/hello.html?page=1&count=10
  • 查询参数部分: ?page=1&count=10
    • 参数说明:
      • ? 后面的 page 表示第一个参数,后面的参数都使用 & 进行连接

查看HTTP通信过程

  • 首先需要安装Google Chrome浏览器,然后Windows和Linux平台按F12调出开发者工具, mac OS选择 视图 -> 开发者 -> 开发者工具或者直接使用 alt+command+i 这个快捷键,还有一个多平台通用的操作就是在网页右击选择检查。在这里插入图片描述

  • 开发者工具的标签选项说明:

    • 元素(Elements):用于查看或修改HTML标签
    • 控制台(Console):执行js代码
    • 源代码(Sources):查看静态资源文件,断点调试JS代码
    • 网络(Network):查看http协议的通信过程
  • 开发者工具的使用说明:

    • 点击Network标签选项
    • 在浏览器的地址栏输入百度的网址,就能看到请求百度首页的http的通信过程
    • 这里的每项记录都是请求+响应的一次过程
  • 主要信息 在这里插入图片描述

  • 请求头信息在这里插入图片描述

  • 响应头信息在这里插入图片描述

  • 响应体信息在这里插入图片描述

HTTP请求报文分析

  • HTTP请求报文是浏览器发送给服务器的数据
  • 最常见的请求报文分两种:
    • get方式的请求报文
    • post方式的请求报文
  • 说明:
    • get:获取服务器数据
    • post:向服务器提交数据
  • get请求报文说明:
GET / HTTP/1.1  # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.baidu.com  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36  # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识

---- 空行 ----
  • get请求原始报文说明:
Host: www.baidu.com\r\n  
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n
\r\n  (请求头信息后面还有一个单独的’\r\n’不能省略)
  • 概括来说,请求报文所有行后面加上\r\n就是原始请求报文
  • post 请求报文说明:
POST /xmweb?host=mail.baidu.cn&_t=1542884567319 HTTP/1.1 # POST请求方式 请求资源路径 HTTP协议版本
---- 请求头 ----
Host: mail.itcast.cn # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Content-Type: application/x-www-form-urlencoded  # 告诉服务端请求的数据类型
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客户端的名称
---- 空行 ----
---- 请求体 ----
username=hello&pass=hello # 请求参数
  • 对比总结
    • 一个HTTP请求报文可以由请求行、请求头、空行和请求体4个部分组成。
    • 请求行是由三部分组成:
      • 请求方式
      • 请求资源路径
      • HTTP协议版本
    • GET方式的请求报文没有请求体,只有请求行、请求头、空行组成。
    • POST方式的请求报文可以有请求行、请求头、空行、请求体四部分组成,注意:POST方式可以允许没有请求体,但是这种格式很少见。

HTTP响应报文分析

  • 响应报文即是服务器向浏览器发送的数据
  • 响应报文说明:
HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---
--- 响应体 ---
<!DOCTYPE html><html lang=“en”> …</html> # 响应给客户端的数据
  • HTTP状态码介绍
状态码说明
200请求成功
307重定向
400错误的请求,请求地址或者参数有误
404请求资源在服务器不存在
500服务器内部源代码出现错误

静态web服务器

什么是静态web服务器

  • 可以为发出请求的浏览器提供静态文档的程序。平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。

搭建python自带的静态web服务器

  • 搭建Python自带的静态Web服务器使用 python -m http.server 端口号在这里插入图片描述
  • 通过浏览器访问搭建的静态服务器在这里插入图片描述
  • 它显示的目录,即为我们执行命令的当前文件夹下的文件目录
  • 我们也可以将目录设定在python的文件夹下,使用python创建html文件,然后通过静态服务器来访问在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

搭建自己的静态web服务器

  • HTTP协议是基于TCP协议的,所以第一步要搭建一个TCP协议的服务器,然后接受请求报文并返回响应报文给浏览器,接下来是实现的具体过程。
import socket

def main():
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    tcp_server.bind(('192.168.0.104',8080))

    tcp_server.listen(128)

    new_socket,addr = tcp_server.accept()

    recv_request = new_socket.recv(1024).decode('utf-8')

    with open('index.html','r') as f:
        response_body = f.read()
    response_line = 'HTTP/1.1 200 OK\r\n'
    response_header = "Server: PWS/1.1\r\n"
    response_data = response_line + response_header + '\r\n' + str(response_body)

    new_socket.send(response_data.encode('utf-8'))

运行程序,并通过浏览器对自定义的服务器进行访问,可以得到如下结果:在这里插入图片描述

  • 上述程序是自定义一个静态web服务器,返回一个固定页面,我们可以对代码进行一些优化,让其返回我们指定的页面,而当访问的页面不存在时,返回404,优化代码如下:
import socket

def main():
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    tcp_server.bind(('192.168.0.104',8080))

    tcp_server.listen(128)

    while True:
        new_socket, addr = tcp_server.accept()

        recv_request = new_socket.recv(4096).decode('utf-8')
        print('recv_request:',recv_request)

        recv_request1 = recv_request.split(" ")
        print('split:',recv_request1)

        request_path = recv_request1[1]
        print('path:',request_path)

        try:
            with open('static'+request_path,'r',encoding='utf-8') as f:
                response_body = f.read()
        except Exception as e:
            print(e)
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            response_header = "Server: PWS/1.1\r\n"
            with open('static/404.html','r',encoding='utf-8') as b:
                response_body = b.read()
            response_data = response_line + response_header + '\r\n' + response_body
            new_socket.send(response_data.encode('utf-8'))
        else:
            response_line = 'HTTP/1.1 200 OK\r\n'
            response_header = "Server: PWS/1.1\r\n"
            response_data = response_line + response_header + '\r\n' + str(response_body)

            new_socket.send(response_data.encode('utf-8'))
        finally:

            new_socket.close()

if __name__ == '__main__':
    main()


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

黏包现象和HTTP协议 的相关文章

  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • python 2.7 中的 HTTP 2 请求

    在 python 中向 HTTP 1 和 HTTP 2 发出请求有什么区别吗 我可以像这样在 python 中进行 HTTP 1 x 调用 url http someURL values param1 key param2 key2 dat
  • AJAX 发送数据到 Node.js 服务器

    我尝试使用 AJAX 将数据发送到 Node js 服务器 但不断遇到同样的问题 即接收问题 这是客户端 JavaScript AJAX 代码 var objects function return new XMLHttpRequest f
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • UNIX/MacOS 上静态文件的“临时 Web 服务器”?

    是否有一个像小型网络服务器这样的东西 我可以从命令行调用它 只从本地文件系统获取文件并通过特定端口上的 HTTP 为它们提供服务 我希望能够做这样的事情 cd Sites mysite serve 10 0 1 1 8080 这应该会启动一
  • HTTP Header Key 可以重复吗?

    在 JAVA HttpUrlConnection 中 请求 Header 设置的主要逻辑代码如下 public synchronized void set String k String v for int i nkeys i gt 0 i
  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • 用 C++ 解析 HTTP 标头

    我正在使用curl 与服务器通信 当我发出数据请求时 我收到 HTTP 标头 后跟由边界分隔的 jpeg 数据 如下所示 我需要解析出 边界字符串 内容长度 我已将传入数据复制到 char 数组 如下所示 static size t OnR
  • 如何记录进入 IIS 的 HTTP 请求

    我在我的开发机器上运行 IIS 5 我有一个 asp net 3 5 Web 服务在其上运行 我从同一服务器上运行的不同 Web 应用程序调用该服务 我的服务返回错误 500 内部服务器错误 我正在对其进行故障排除 我的请求是通过Syste
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m
  • 是否可以检测 http git 远程是智能还是愚蠢?

    我正在我的应用程序中实现一个选项来使用 depth 1制作 git repo 的最小功能克隆 我刚刚意识到愚蠢的 http 传输不支持 depth 我想自动检测 http 远程是愚蠢的还是聪明的 这样我就可以省略 depth与哑 http
  • ASP.NET HTTP 请求是否会转换为 1 个线程?

    可以安全地假设当用户通过 HTTP 请求 aspx 页面时 ASP NET 至少为其创建 1 个线程吗 如果是这样 持续多久 如果 1000 人向同一个 aspx 页面发出 HTTP 请求 是否会涉及一些线程回收 因此不会产生不同的 100
  • Zoopla 沙箱出现 cURL http 标头错误

    我正在为房地产经纪人开发代码 以通过他们的数据源将房产上传到 Zoopla 我在将所需的配置文件添加到所需的 http 标头时遇到问题 文档中唯一的示例是来自 Linux 的测试 echo branch reference test cur
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • Apache HttpClient TCP Keep-Alive(套接字保持活动)

    我的 http 请求需要太多时间才能被服务器处理 大约 5 分钟 由于连接闲置 5 分钟 代理服务器将关闭连接 我正在尝试在 Apache DefaultHttpClient 中使用 TCP Keep Alive 来使连接长时间处于活动状态
  • 使用 Angularjs,$http 在 Microsoft Edge 中发布返回响应错误

    好吧 当我开发一个管理页面进行测试时 Microsoft Edge 中出现了一个奇怪的问题 这是从loginCtrl js服务器获取响应的部分源代码 http method POST url Define apiUrl admin logi
  • 不加载隐藏图像

    我的网站上有一堆隐藏图像 它们的容器 DIV 具有 style display none 根据用户的操作 某些图像可能会通过 JavaScript 显示 问题是我的所有图像都是在打开页面时加载的 我想通过仅加载最终可见的图像来减轻服务器的压
  • Node.js:在检索 http 请求正文之前断开 http 请求连接

    我正在用 Node js 编写一个 http 服务器 我有一个客户端通过 HTTP POST 多部分 数据 将大文件上传到该服务器 我想接受唯一使用有效文件名上传文件的连接 我有一些条件 在服务器检索数据之前应断开无效文件名连接 我不知道如
  • 防止表单重新提交

    第一页包含一个 HTML 表单 第二页 处理提交的数据的代码 第一页中的表格已提交 浏览器被重定向到第二页 第二页处理提交的数据 此时 如果刷新第二页 则会弹出 确认表单重新提交 警报 这可以预防吗 人们过去常采取两种方法 方法一 使用 A

随机推荐

  • 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图

    文章目录 前言一 ROS分布式通信 xff08 配置多机通信 xff09 1 简介2 步骤2 1 准备2 2 修改配置文件2 3配置主机IP2 4配置从机IP 二 RPlidar的使用教程1 创建环境2 下载激光雷达的功能包3 编译4 启动
  • TCP连接建立的步骤

    TCP连接建立的步骤 一 客户端向服务器端发送连接请求后 xff0c 就被动地等待服务器的响应 典型的TCP客户端要经过下面三步操作 xff1a 1 创建一个Socket实例 xff1a 构造函数向指定的远程主机和端口建立一个TCP连接 x
  • 能否在头文件中放置函数定义?

    语法上是可以这样做的 xff0c 但是在编程规范中并不鼓励这样做 成员函数一般是不可以在头文件中定义的 xff0c 只能在头文件中声明 因为函数只能有一次定义 xff0c 而可以有多次声明 xff0c 当头文件被多次包含的时候 xff0c
  • 万能的sprintf

    0 前言 先推荐一本书 xff0c 政治书籍 政治的人生 xff0c 算是一本日记题材 是现任 xff0c 作者大家百度一下就知道了 xff0c 这里不宜过多说明 从这本书里 xff0c 可以看出来现在的社会 这本书是30年前的 大佬就是大
  • 串口通讯UART/RS232/RS485/RS-422笔记

    串口通讯详解笔记 串口通讯概述串口通讯传输数据帧的结构UARTRS232RS485RS 422RS 232 RS 422和RS 485的主要区别 xff08 重要 xff09 串口通讯概述 串口通讯是指数据按位 xff08 bit xff0
  • Stm32 hal库 usart2与hc-08透传模块通讯

    Stm32 hal库 usart2与hc 08透传模块通讯 xff08 附数据解析 xff09 一 stm32cubeMX配置 1 配置RCC为外部晶振 2 配置时钟树 3 配置usart1 usart2 xff0c 其中usart1将作为
  • darknet分类网络,训练,C++调用分类器

    Darknet 分类器 出于对Darknet框架下YOLO结构的火热 xff0c 网络上一堆关于目标检测的C 43 43 调用形式和模板 xff0c 但是未曾存在C 43 43 调用分类器的模板 xff0c 故采用如下形式 xff0c 展开
  • zed2 win10 采集数据

    环境 xff1a win10 cuda10 2 zed2相机 zed sdk 3 7 python3 7 1 标定 参考的博客 2 配置环境 1 xff09 win10安装cuda cudnn 如何查看windows的cuda版本 win1
  • 链表指针赋值

    总结来说 xff0c 就是等号赋值右边的指针 xff08 节点地址 xff09 不变 xff0c 左边的地址变成右边的 即左边的指针移到右边指针的位置 xff08 PS 指针命名时不要用next xff0c 会搞混 xff09 span c
  • 网络基础知识和常用数据帧格式

    网络基础知识和常用数据帧格式 1 IP路由相关1 1 网络分层1 2 网络分段1 3 子网掩码1 4 网关功能1 5 数据路由 2 常用帧格式2 1 ARP帧格式2 2 ICMP帧格式2 3 UDP帧格式2 4 TCP帧格式 本文主要介绍网
  • 解决github上的图片无法显示的问题

    把本地图片上传到 github 上后 xff0c 无法打开图片 xff0c 报如下图片 xff1a 百度了一下 xff0c 说什么DNS污染 xff0c 解决办法如下 xff1a 首先 xff0c 打开域名解析网站 xff1a https
  • ROS的ros_canopen调试

    Ros canopen是ros支持can通信的package 链接 xff1a http wiki ros org ros canopen distro 61 indigo Ros canopen包结构如下 SocketCAN是一组开源的C
  • HTTP请求携带用户密码验证

    在java操作es时 xff0c 可以使用HTTP请求的方式来连接es xff0c 一般es是没有密码限制的 但当es设置了用户名密码限制的时候我们需要在HTTP请求中携带用户名和密码 xff0c 如何在HTTP请求中携带用户名密码 xff
  • Java 使用Httpclient构建带有用户名与密码验证的get请求

    构造普通http请求 对于不需要用户名与密码认证的连接 xff0c 一般只需要构造好URIBuilder随后发起get请求即可获得返回信息 xff0c 具体代码如下 span class token class name Closeable
  • 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

    全局变量和局部变量有什么区别 xff1f 是怎么实现的 xff1f 操作系统和编译器是怎么知道的 xff1f
  • 推荐几本学习C#的书籍

    1 C 5 0 in a Nutshell 权威的参考书 学习C 的最佳书籍之一 如果你想要获取最新的信息以增长有关C 语言编程的知识 xff0c 这是最好的选择之一 该书深入浅出地探讨了有关C 语言的知识 不过要想能够充分吸收消化 xff
  • C++的类和C里面的struct有什么区别?

    C 43 43 的类和C里面的struct有什么区别 xff1f
  • linux使用curl进行接口传参

    curl 的命令是非常强大的 xff0c 这里主要介绍curl 43 post get相关的使用方式 1 PSOT 请求 引用文件 如果入参很长 xff0c 为了便于修改调整 xff0c 可以使用这种方式 xff1a span class
  • vscode 利用.clang-format 格式化C代码--连续宏定义和条件编译格式对齐

    最近在做项目时碰到一个需求 xff0c 将多个板子的头文件定义合并 xff0c 并整理其格式 xff0c 大概内容像下面这样 xff1a span class token macro property span class token di
  • 黏包现象和HTTP协议

    黏包现象和HTTP协议 黏包现象什么是黏包解决方案 HTTP协议HTTP协议概念URL的概念查看HTTP通信过程HTTP请求报文分析HTTP响应报文分析 静态web服务器什么是静态web服务器搭建python自带的静态web服务器搭建自己的