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

发布于:2025-09-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

一、引言

二、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)。