南通市经济开发区建设局网站,短视频拍摄剪辑培训班,网站 内页,电子商务平台内的自然人一、认识HTTPHTTP#xff08;超文本传输协议#xff09;是互联网通信的基石。它定义了客户端#xff08;浏览器#xff09;和服务器之间如何交换数据#xff08;HTML、图片、视频等#xff09;。核心特点#xff1a;应用层协议#xff1a;基于 传输层/网络层协议 传输 …一、认识HTTPHTTP超文本传输协议是互联网通信的基石。它定义了客户端浏览器和服务器之间如何交换数据HTML、图片、视频等。核心特点应用层协议基于 传输层/网络层协议 传输 。无连接虽然HTTP/1.1默认开启长连接Keep-Alive但在早期设计中每次请求都需要重新建立连接 。无状态服务器默认不保存客户端的任何上下文信息这也是为什么我们需要Cookie和Session的原因。URL统一资源定位符平时我们说的“网址”在技术上称为URL。一个标准的URL包含以下部分协议方案名如http或https。登录信息user:pass。服务器地址域名或IP地址 。端口号HTTP默认80HTTPS默认443 。文件路径带层次的资源路径 。查询字符串keyvalue形式用分隔 。片段标识符#后面部分用于页面内部跳转 。urlencode和urldecode像/,?,:等字符在URL中有特殊含义。如果参数本身包含这些字符就必须转义。规则将字符转为16进制每2位前加%。例如C会被转义为C%2B%2B被转义为%2B。二、HTTP协议格式HTTP是基于文本的协议格式非常规整主要分为请求和响应。HTTP请求请求报文由四部分组成请求行方法 URL 版本(例如:GET /index.html HTTP/1.1) 。请求头Key: Value格式每行一个以\r\n结尾 。空行\r\n非常重要用于区分报头和正文 。请求正文POST方法常用GET通常为空。如果有正文请求头中必须有Content-Length示例HTTP响应响应报文也由四部分组成状态行版本 状态码 状态描述(例如:HTTP/1.1 200 OK) 。响应头同请求头 。空行\r\n。响应正文服务器返回的数据HTML、JSON等 。示例三、HTTP常用方法虽然HTTP定义了很多方法但我们最常用的主要是GET和POST。方法说明区别与应用场景GET获取资源参数在URL中不安全有长度限制。常用于请求页面。POST传输实体主体参数在正文中相对安全支持大数据量。常用于提交表单、登录。PUT传输文件向服务器上传文件。DELETE删除文件删除资源。HEAD获得报头类似GET但只返回报头不返回正文。用于测试连接或检查资源修改时间 。OPTIONS询问支持方法检查服务器支持哪些方法。GET 请求可以用来上传文件/资源吗技术实现上讲是可以的但在传输文件二进制流时极其受限。首先就是1.Body 的缺失在 HTTP 规范中GET 请求通常不包含请求正文这意味着如果你想用 GET 传数据只能把数据塞到 URL 的查询字符串里即?keyvalue后面。于是有了第2个问题2.URL 长度限制上传文件通常意味着大数据量。虽然 HTTP 协议没限制 URL 长度但浏览器和服务器有限制IE 浏览器可能限制 2KB。Chrome 可能限制 8KB 左右。Nginx 默认配置也有限制。试想一下把一张 5MB 的图片塞进 URL 里直接就报错了3.二进制数据的编码文件图片、视频、压缩包都是二进制数据而URL 中只能包含 ASCII 字符。把文件内容放在 URL 里必须进行URL 编码这意味着原本 1MB 的文件经过编码后体积会变得更大而且编解码过程非常消耗 CPU 资源。最关键的点是GET 请求的参数会明文显示在浏览器的地址栏中也会被保存在浏览器历史记录、代理服务器日志和服务器访问日志中。如果你上传的是私密文件或敏感信息会出安全问题。PUT 和 POST 的区别这是两者在技术实现上最本质的区别是幂等性。那么什么是幂等性一个操作执行一次和执行多次对服务器状态产生的影响是一样的。PUT 是幂等的如果你发送PUT /articles/1更新文章内容无论你发送一次还是十次服务器上的文章内容最终都是你发的那个版本。第 2 到 10 次的请求不会产生额外的副作用。POST 不是幂等的如果你发送POST /articles创建文章发送一次服务器创建一篇文章。如果你不小心发了两次服务器就会创建两篇内容相同但 ID 不同的文章。四、HTTP状态码状态码由三位数字组成分为五大类我们讲讲最常见的状态码比如 200(OK)404(Not Found)403(Forbidden)302(Redirect重定向)504(Bad Gateway)。200 OK —— 一切正常含义这是最希望看到的状态码表示客户端的请求被服务器成功接收、理解并处理 。场景访问百度首页服务器返回网页 HTML 内容。Linux 验证404 Not Found —— 查无此人含义服务器上没有找到你请求的资源 。常见原因URL 输错了。资源被删除了。Linux 服务器的文件路径配置错误。排查检查 URL拼写或者去服务器上ls看看文件还在不在。403 Forbidden —— 禁止入内含义服务器收到了请求但是拒绝提供服务 。关键点这和 401 不同。401 是不认识你403 是我认识你但你没权限。常见原因文件权限问题例如 Linux 下文件权限是 600Web 服务器用户读不到。IP 白名单限制。尝试访问目录列表。302 Redirect —— 临时重定向核心机制Location 头 无论是 301 还是 302服务器都会在响应头里加一个Location字段告诉浏览器“你去这个新地址找它” 。301、302 的区别301 搜索引擎会更新索引浏览器会缓存这个跳转下次直接去新地址不问旧地址了。HTTP/1.1 301 Moved Permanently\r\n Location: https://www.new-url.com\r\n302 搜索引擎不会更新索引浏览器也不会缓存下次还是先访问旧地址看服务器怎么说。HTTP/1.1 302 Found\r\n Location: https://www.new-url.com\r\n场景用户登录成功后从“登录页” 302 跳转到“个人主页” 。504 Gateway Timeout / 502 Bad Gateway502 Bad Gateway作为网关或代理服务器从上游服务器收到了无效的响应 。504 Gateway Timeout通常表示网关超时。即 Nginx 转发请求给后端应用但后端处理太慢超过了 Nginx 等待的时间。五、HTTP常见HeaderHeader是HTTP灵活性的体现以下是必须要掌握的字段名 (Header)核心含义详细说明与应用场景Content-Type数据类型告诉接收端正文里是什么数据。例如text/html(网页)、application/json(JSON数据)、multipart/form-data(文件上传) 。Content-LengthBody 长度单位是字节。非常重要因为 HTTP 是流式传输接收端必须依靠这个长度才知道 Body 读到哪里结束 。Host主机域名客户端告知服务器它请求的是哪个域名。这是虚拟主机技术的基础允许一个 IP 地址部署多个网站服务器靠 Host 区分。User-Agent用户代理声明客户端的身份包含操作系统、浏览器版本等信息。服务器可据此返回适配手机或电脑的页面 。Referer来源页面记录当前请求是从哪个页面跳转过来的。常用于防盗链。Location重定向地址搭配 3xx 状态码使用。进行重定向。Cookie会话信息用于在客户端存储少量状态信息。通常用于携带 Session ID实现用户登录状态保持。Connection连接控制控制 TCP 连接的状态•keep-alive长连接HTTP/1.1 默认复用 TCP 连接减少握手开销。•close短连接HTTP/1.0 默认请求结束后立即关闭 TCP 连接。六、实战手写一个最简单的HTTP服务器原理很简单创建一个TCP Server接收到连接后不管客户端发什么请求我们都按照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(usage: ./server [ip] [port]\n); } int main(int argc, char* argv[]) { if (argc ! 3) { Usage(); return 1; } // 1. 创建套接字 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])); // 2. 绑定端口 int ret bind(fd, (struct sockaddr*)addr, sizeof(addr)); if (ret 0) { perror(bind); return 1; } // 3. 监听 ret listen(fd, 10); if (ret 0) { perror(listen); return 1; } for (;;) { struct sockaddr_in client_addr; socklen_t len sizeof(client_addr); // 4. 接受连接 int client_fd accept(fd, (struct sockaddr*)client_addr, len); if (client_fd 0) { perror(accept); continue; } // 5. 读取请求 char input_buf[10240] {0}; ssize_t read_size read(client_fd, input_buf, sizeof(input_buf) - 1); if (read_size 0) { return 1; } printf([Request] %s\n, input_buf); // 打印浏览器发来的请求内容 // 6. 构造HTTP响应 char buf[1024] {0}; const char* hello h1hello world/h1; // 注意格式状态行 Header 空行 Body sprintf(buf, HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s, strlen(hello), hello); // 7. 发送响应 write(client_fd, buf, strlen(buf)); // 8. 关闭连接 (HTTP/1.0 默认短连接) close(client_fd); } return 0; }运行测试编译g server.c -o server运行./server 0 9090浏览器访问http://[你的IP]:9090你会看到页面显示大大的 hello world。如果不加HTTP/1.0 200 OK\n...这些协议头直接发送 hello world 会怎样浏览器可能无法识别或者认为是无效响应这就说明协议就是双方都要遵守的约定。