当前位置: 首页 > news >正文

【计算机网络】HTTP协议(一)——超文本传输协议

目录

一、引言

二、HTTP 概述

关键头字段

三、HTTP 与 HTTPS

四、HTTP 工作原理

五、HTTP 请求方法

六、HTTP 状态码

七、HTTP 版本演进

八、示例代码(HTTP请求)

九、具体过程描述——连接方式

十、HTTP应答

附:性能优化建议


一、引言

OSI模型分层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;

TCP/IP模型分层:应用层、传输层(运输层)、网络层、数据链路层。

二、HTTP 概述

HTTP(HyperText Transfer Protocol)是一种用于传输超文本(如HTML)的应用层协议,是万维网(WWW)的数据通信基础。它基于客户端-服务器模型,通过请求-响应机制实现数据交换。

关键头字段

  • Host:指定服务器域名。
  • User-Agent:客户端标识。
  • Content-Type:请求体类型(如application/json)。
  • Cache-Control:缓存策略。

三、HTTP 与 HTTPS

HTTPS是HTTP的安全版本,通过TLS/SSL加密数据。区别如下:

  • 端口:HTTP默认80,HTTPS默认443。
  • 安全性:HTTPS防止窃听、篡改和中间人攻击。

四、HTTP 工作原理

  1. 客户端发起请求:客户端(如浏览器)向服务器发送HTTP请求,请求中包含方法(如GET、POST)、资源路径、协议版本等信息。
  2. 服务器处理请求:服务器解析请求并返回响应,响应中包含状态码(如200、404)、响应头和响应体(如HTML内容)。
  3. 连接关闭或保持:默认情况下,HTTP/1.1支持持久连接(Keep-Alive),而HTTP/2进一步优化了多路复用。

五、HTTP 请求方法

  • GET:申请获取资源,而不对服务器产生任何其他影响。(参数通过URL传递)。
  • POST:客户端向服务器提交数据的方法,这种方法会影响服务器;服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源。(参数在请求体中)。
  • PUT:更新服务器上的资源。
  • DELETE:删除指定资源。
  • HEAD:类似GET,不过仅要求服务器返回头部信息,而不需要传输任何实际内容。
  • TRACE:要求目标服务器返回原始HTTP请求的内容。可用来查看中间服务器(比如代理服务器)对HTTP请求的影响。
  • OPTIONS:查看服务器对某个特定URL都支持哪些请求方法,也可以把URL设置为*,从而获得服务器支持的所有请求方法。
  • CONNECT:用于某些代理服务器,能够把请求的链接转化为一个安全隧道。
  • PATCH:对某个资源做部分修改。

六、HTTP 状态码

  • 1xx(信息性):请求已接收,继续处理。(如:100Continue,服务器收到客户端的请求和头部信息,告诉客户端继续发送数据部分。客户端通常要先发送Expect:100-continue 头部告诉服务器自己还有数据要送达)
  • 2xx(成功):请求成功处理,如200(OK,请求成功)。
  • 3xx(重定向):需进一步操作,如301 Moved Permanently(永久重定向,资源被转移了,请求将被重定向)、302 Found(通知客户端资源能够在其他地方找到,但需要使用GET方法获取)、304、307等。
  • 4xx(客户端错误):请求有误,如400(通用客户请求错误),401(请求需要认证信息),403,404(资源未找到)等。
  • 5xx(服务器错误):服务器处理失败,如500(内部错误),503(暂时无法访问服务器)。

七、HTTP 版本演进

  • HTTP/1.0:每个请求需单独建立连接。
  • HTTP/1.1:引入持久连接和管道化。
  • HTTP/2:二进制分帧、多路复用、头部压缩。
  • HTTP/3:基于QUIC协议,减少延迟。

八、示例代码(HTTP请求)

HTTP协议是介于浏览器和服务器之间的通信,在应用层,但在传输层应用的是TCP协议。因此应用浏览器当作客户端连接服务器端。TCP的服务器端接收浏览器发过来的数据。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(){//创建套接字,返回值:文件描述符,参数:收到,流式服务int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd==-1){exit(1);//退出}struct sockaddr_in saddr,caddr;//saddr代表服务器的,caddr代表客户端即浏览器memset(&saddr,0,sizeof(saddr));//先清空套接字地址,在进行填充saddr.sin_family =AF_INET;saddr.sin_port =htons(80);saddr.sin_addr.s_addr =inet_addr("127.0.0.1");//绑定ip和端口int res =bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(res==-1){printf("bind err\n");//绑定失败打印错误信息exit(1);}//创建监听队列res =listen(sockfd,5);if(res==-1){exit(1);}while(1){//接收客户端连接int len=sizeof(caddr);int c=accept(sockfd,(struct sockaddr*)&caddr,&len);//如果客户端不连接则会阻塞if(c<0){continue;}printf("accept c=%d\n",c);//c就是描述符,通过描述符和客户端进行沟通char buff[1024]={0};int n=recv(c,buff,1023,0);//这时从c上接收数据,把数据存入buff中printf("buff=%s\n",buff);//给客户端回复数据send(c,"ok",2,0);close(c);}
}

注意:此时应切换到管理员账户下,才有权限访问,如下:

九、具体过程描述——连接方式

  • 长连接:keep 连接建立之后发送请求回复应答之后不关闭,继续发送请求(两次及两次以上)。即复用同一个TCP连接。
  • 短连接:close 请求一次应答一次。

当在浏览器中输入www.baidu.com会发生什么事情?

首先www.baidu.com是一个域名,不是一个IP,因此需要通过DNS解析去查看IP和端口(DNS如何去查后续补充)。获取I和端口之后,浏览器会跟服务器进行三次握手建立连接TCP。然后浏览器向服务器发送数据,发送HTTP的请求报文(buff=....)。服务器收到请求报文后,回复应答报文。

十、HTTP应答

//给客户端回复数据//头部int size=5;char head[256]="HTTP/1.1 200 ok\r\n";strcat(head,"Server:myhttp\r\n");sprintf(head+strlen(head),"Content=Length:%d\r\n",size);//数据部分和头部之间有一个空格请求,标识头部字段结束strcat(head,"\r\n");//空行//数据部分strcat(head,"hello");send(c,head,strlen(head),0);printf("head:\n%s\n",head);

    附:性能优化建议

    • 使用HTTP/2或HTTP/3降低延迟。
    • 启用压缩(如gzip)减少传输体积。
    • 合理设置缓存头(如Cache-Control: max-age=3600)。

    文章转载自:

    http://ev6B4ug5.zwhtr.cn
    http://1TIWktJX.zwhtr.cn
    http://y2HMSZ6c.zwhtr.cn
    http://p8sCT6sv.zwhtr.cn
    http://KJC6lqNc.zwhtr.cn
    http://38WSbSI1.zwhtr.cn
    http://6G4udVi8.zwhtr.cn
    http://HxznIWZ1.zwhtr.cn
    http://zCBpJrYh.zwhtr.cn
    http://WEm7YMQk.zwhtr.cn
    http://ihxbsTXZ.zwhtr.cn
    http://xX4B2uum.zwhtr.cn
    http://fRnEr6qC.zwhtr.cn
    http://yNfKY0Yx.zwhtr.cn
    http://SGOgjKy1.zwhtr.cn
    http://oeSukysp.zwhtr.cn
    http://uOy2RP4n.zwhtr.cn
    http://iZn18qtd.zwhtr.cn
    http://K447yu8Y.zwhtr.cn
    http://NG81vzbE.zwhtr.cn
    http://ELWkypWx.zwhtr.cn
    http://aegxTshU.zwhtr.cn
    http://4O1JziVi.zwhtr.cn
    http://LTRHm6xV.zwhtr.cn
    http://c0ZG58W1.zwhtr.cn
    http://HtS78px8.zwhtr.cn
    http://nODrrmxM.zwhtr.cn
    http://QvzejkMw.zwhtr.cn
    http://nKfD7Eoe.zwhtr.cn
    http://d3hqi1SD.zwhtr.cn
    http://www.dtcms.com/a/380115.html

    相关文章:

  • 【国内电子数据取证厂商龙信科技】被格式化的手机如何恢复数据
  • 【项目】 :C++ - 仿mudou库one thread one loop式并发服务器实现(模块划分)
  • 采集集群外的k8s(prometheus监控)
  • AI 玩转网页自动化无压力:基于函数计算 FC 构建 Browser Tool Sandbox
  • Redisson原理与面试问题解析
  • ICCV 2025 | 首次引入Flash Attention,轻量SR窗口扩至32×32还不卡!
  • 关于线性子空间(Linear Subspace)的数学定义
  • OpenHarmony AVSession深度解析(二):从本地会话到分布式跨设备协同的完整生命周期管理
  • 12.NModbus4在C#上的部署与使用 C#例子 WPF例子
  • 迅为RK3568开发板Linux_NVR_SDK 系统开发-扩展根文件系统
  • OpenCV:特征提取
  • Zynq开发实践(FPGA之第一个vivado工程)
  • 数字人技术如何与数字孪生深度融合?
  • 如何生成 GitHub Token(用于 Hexo 部署):保姆级教程+避坑指南
  • Python uv常用命令及使用详解
  • MySQL主从同步参数调优案例
  • Python的uv包管理工具使用
  • 构建python3.11+uv+openssh环境的docker镜像
  • RabbitMQ的核心使用示例
  • 大数据电商流量分析项目实战:Hive 数据仓库(三)
  • 【Kubernetes】Tomcat 启用 Prometheus 监控指标
  • 数字人分身 + 矩阵系统聚合的源码搭建与定制开发
  • 如何使用 OCR 提取扫描件 PDF 的文本(Python 实现)
  • 并发:使用volatile和不可变性实现线程安全
  • 【qml入门】在qml项目上加入用户登录qml页面(包含源码)
  • 通义灵码产品演示: 数据库设计与数据分析
  • 大疆图传十公里原理:无人机图传技术解析
  • 【论文阅读】小模型是智能体的未来
  • 空间智能 × 无人机丨考拉悠然携 AI+应急创新产品亮相东盟博览会
  • 【C++】list容器的模拟实现