首页 > 其他分享 >http协议

http协议

时间:2024-12-25 21:57:52浏览次数:5  
标签:协议 存储 HTTP 用户 Session Cookie 服务器 http

目录

本文核心:

认识URL

结构

HTTP协议格式

HTTP请求

http版本

HTTP响应

HTTP的方法

HTTP的状态码

HTTP常见Header

最简单的HTTP服务器

Cookie与session

Cookie 功能介绍

Session 功能介绍

区别与联系


本文核心:

针对特定应用的协议,一般为应用层协议,本文将着重介绍HTTP协议。

虽然我们说 , 应用层协议是我们程序猿自己定的。但实际上 , 已经有大佬们定义了一些现成的 , 又非常好用的应用层协议 , 供我们直接参考使用 . HTTP(超文本传输协议) 就是其中之一

HTTP初识:http是应用层协议,它的作用是将数据进行一次封装,添加合理的报头。

我们之前学习的套接字编程,如端口号(特别强调,端口号是传输层的概念),bind接口,都是在传输层的概念,这已经在OS内核中。

认识URL

平时我们俗称的 " 网址 " 其实就是说的 URL

URL(Uniform Resource Locator,统一资源定位符)是因特网上标准的资源的地址(Address)。它用于定位网络上的资源,如网页、文件、图片等。以下是URL的一些基本组成部分:

结构

一个典型的URL由以下几个部分组成:

  • 协议/方案(Scheme):定义了访问资源所使用的协议类型,如HTTP(Hypertext Transfer Protocol,超文本传输协议)、HTTPS(HTTP Secure,安全超文本传输协议)、FTP(File Transfer Protocol,文件传输协议)等。

  • 域名(Host):标识了资源所在的网络地址,通常是服务器的IP地址或者更易读的域名。

  • 端口(Port):网络服务的接入点,HTTP默认端口是80,HTTPS默认端口是443,但也可以是其他值。

  • 路径(Path):指向资源在服务器上的具体位置。

  • 查询参数(Query):以键值对形式存在,通常用于提交数据或精确定位资源。

  • 片段标识符(Fragment):用于直接定位页面中的某个位置

https://www.example.com:443/path/to/resource?name=value#fragment

  • 协议https
  • 域名www.example.com
  • 端口443
  • 路径/path/to/resource
  • 查询参数name=value
  • 片段标识符fragment
urlencode urldecode 像 / ? : 等这样的字符 , 已经被 url 当做特殊意义理解了 . 因此这些字符不能随意出现。 比如 , 某个参数中需要带有这些特殊字符 , 就必须先对特殊字符进行转义。 转义的规则如下 : 将需要转码的字符转为 16 进制,然后从右到左,取 4 位 ( 不足 4 位直接处理 ) ,每 2 位做一位,前面加上 % ,编码成%XY格式。 "+" 被转义成了 "%2B" urldecode 就是 urlencode 的逆过程

HTTP协议格式

HTTP请求

格式: 首行: [方法] + [url] + [版本] Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束。 Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度;

http版本

HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于从服务器传输超文本到本地浏览器的传输协议。自1991年发布以来,HTTP已经经历了多个版本号的更新,下面是各个版本号的简介:
### HTTP/0.9
- **发布时间**:1991年
- **特点**:非常简单,只支持GET请求,服务器响应后即关闭连接,没有状态码或头信息,只支持文本内容。
### HTTP/1.0
- **发布时间**:1996年
- **特点**:引入了更多的请求方法(如POST和HEAD),增加了状态码、头信息和多类型内容支持。每次请求/响应后,通常会关闭连接,但也可以通过Connection: Keep-Alive头信息保持连接。
### HTTP/1.1
- **发布时间**:1997年
- **特点**:默认采用持久连接,允许在同一连接中传输多个请求/响应。引入了管道化请求(pipelining),但并不是所有浏览器都支持。增加了更多的缓存机制和控制,以及更丰富的错误处理。
### HTTP/2
- **发布时间**:2015年
- **特点**:基于SPDY协议,引入了二进制分帧层,允许多个请求和响应消息在同一个连接中交错发送,从而减少了延迟。支持服务器推送(Server Push),头部压缩(Header Compression)等特性。
### HTTP/3
- **发布时间**:2022年(标准化)
- **特点**:基于QUIC协议,使用UDP而不是TCP作为传输层协议。提供了更好的拥塞控制和丢包恢复机制,进一步减少了延迟,提高了连接的稳定性和安全性。
每个HTTP版本号的更新都是为了解决前一版本的性能问题、安全性问题或功能限制。HTTP/3是目前最新的版本,但HTTP/1.1仍然是最广泛使用的版本,因为它的兼容性最好。随着网络技术的发展,未来可能会有更多的HTTP版本出现。


HTTP响应

首行: [版本号] + [状态码] + [状态码解释] Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束 Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中

HTTP的方法

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

HTTP的状态码

最常见的状态码 , 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向 ), 504(Bad Gateway)

HTTP常见Header

Content-Type: 数据类型(text/html等) Content-Length: Body的长度 Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上; User-Agent: 声明用户的操作系统和浏览器版本信息; referer: 当前页面是从哪个页面跳转过来的; location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问; Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能

最简单的HTTP服务器

实现一个最简单的 HTTP 服务器 , 只在网页上输出 "hello world"; 只要我们按照 HTTP 协议的要求构造数据 , 就很容易能做到 ;
#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;}
 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]));
 int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
 if (ret < 0) {
 perror("bind");
 return 1;
 }
 ret = listen(fd, 10);
 if (ret < 0) {
 perror("listen");
 return 1;
 } 
 for (;;) {
 struct sockaddr_in client_addr;
 socklen_t len;
 int client_fd = accept(fd, (struct sockaddr*)&client_addr, &len);
 if (client_fd < 0) {
 perror("accept");
 continue;
 }
 char input_buf[1024 * 10] = {0}; // 用一个足够大的缓冲区直接把数据读完.
 ssize_t read_size = read(client_fd, input_buf, sizeof(input_buf) - 1);
 if (read_size < 0) {
 return 1;
 }
 printf("[Request] %s", input_buf);
 char buf[1024] = {0};
 const char* hello = "<h1>hello world</h1>";
 sprintf(buf, "HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s", strlen(hello), hello);
 write(client_fd, buf, strlen(buf));
 }
 return 0;
}
编译 , 启动服务 . 在浏览器中输入 http://[ip]:[port], 就能看到显示的结果 "Hello World"。 此处我们使用 9090 端口号启动了HTTP服务器. 虽然HTTP服务器一般使用80端口, 但这只是一个通用的习惯. 并不是说HTTP服务器就不能使用其他的端口号. 使用chrome测试我们的服务器时, 可以看到服务器打出的请求中还有一个 GET /favicon.ico HTTP/1.1 这样的请求.

Cookie与session

Cookie 功能介绍

Cookie 是一种网络技术,用于网站记住用户的信息和浏览历史。以下是 Cookie 的一些主要功能:

  1. 用户识别:Cookie 可以存储用户的登录信息,使得用户在下次访问网站时无需重新登录。
  2. 个性化体验:网站可以根据用户的历史行为和偏好设置来定制内容,提供个性化的体验。
  3. 购物车功能:在电子商务网站上,Cookie 用于记录用户添加到购物车的商品。
  4. 跟踪用户行为:网站可以通过 Cookie 跟踪用户的浏览行为,分析用户习惯,用于改善网站设计和内容。
  5. 保存设置:用户对网站的某些设置(如语言、主题等)可以保存在 Cookie 中,下次访问时自动应用。

Session 功能介绍

Session 是一种服务器端的技术,用于存储用户会话期间的特定数据。以下是 Session 的一些主要功能:

  1. 用户状态保持:Session 用于在用户浏览网站时保持其状态,即使是在多个页面之间跳转。
  2. 数据存储:Session 可以存储用户的信息,如用户身份、购物车内容等。
  3. 安全性:Session 数据存储在服务器端,相比存储在客户端的 Cookie,更安全。
  4. 会话管理:服务器可以通过 Session 管理用户的会话,例如限制未登录用户访问某些页面。

区别与联系

区别:

  1. 存储位置

    • Cookie 存储在客户端(用户的浏览器)。
    • Session 存储在服务器端。
  2. 安全性

    • Cookie 存储在客户端,可能被窃取或篡改。
    • Session 存储在服务器端,相对更安全。
  3. 数据大小

    • Cookie 有大小限制(通常为4KB),且每个域名下能存储的 Cookie 数量有限。
    • Session 通常没有大小限制,取决于服务器配置。
  4. 生命周期

    • Cookie 可以设置过期时间,可以是会话结束时(关闭浏览器)或者持久化存储。
    • Session 通常在用户会话结束时(如关闭浏览器或超时)销毁。

联系:

  1. 用户跟踪

    • Cookie 和 Session 常常一起使用,Cookie 可以存储一个唯一的 Session ID,用于识别用户的 Session。
  2. 互补使用

    • Cookie 可以用于存储一些不敏感的信息,如用户偏好设置。
    • Session 用于存储敏感信息,如用户身份验证状态。
  3. 用户体验

    • Cookie 和 Session 都用于提升用户体验,通过记住用户信息和状态,减少重复操作。

总结来说,Cookie 和 Session 都是网络技术,用于管理用户会话和状态,但它们在存储位置、安全性、数据大小和生命周期等方面存在差异,并且常常结合使用以提供更好的用户体验。

Cookie 和 Session 都用于存储信息,但它们的工作方式和存储位置有所不同。
  ### Cookie
- **存储位置**:Cookie 是存储在用户浏览器中的小型文本文件。每当用户访问一个网站时,网站的服务器可以向用户的浏览器发送一个 Cookie,浏览器将其存储在本地计算机上。
- **内容**:Cookie 通常包含网站的名称、唯一识别码(即 Cookie 的名称)、一段文本内容以及到期时间等信息。
- **生命周期**:Cookie 可以被设置为在浏览器关闭后过期,也可以持续一段特定的时间。 ### Session
- **存储位置**:Session 的信息存储在服务器上,而不是用户的浏览器中。当用户访问网站时,服务器会为用户创建一个唯一的会话标识(通常称为 Session ID),并在服务器上存储与该会话相关的数据。
- **内容**:Session 可以存储任何类型的数据,这些数据与用户的会话相关,如用户状态、购物车内容等。
- **生命周期**:Session 通常在用户关闭浏览器后结束,但也可以根据需要设置更长的有效期,或者直到用户明确地登出。
总结来说,Cookie 是存储在用户端的小型文件,而 Session 是存储在 服务器端的数据结构。两者都用于跟踪用户的状态和偏好,但它们存储信息的方式和位置不同。 (多说一句,在CSDN写博客的时候,如果你写很多字,就能明显感觉得你的计算机变的卡卡的,因为csdn需要过一段时间就帮我们保存一个写的文章的版本,这个版本或许就是本地的cookie文件,并且这个cookie是内存级别的,这就是为什么16G的内存可以畅玩LOL,但是写CSDN很卡的原因之一)
 

标签:协议,存储,HTTP,用户,Session,Cookie,服务器,http
From: https://blog.csdn.net/2302_80190394/article/details/144701252

相关文章

  • CS61B srping 2018 lab03 https://sp18.datastructur.es/
    UnitTestingwithJUnit,Debugging准备装好CS61B插件(emmmmm,不装也没事)把lab2的IntList.java复制到lab3/IntList文件夹.看看关于测试的课程视频介绍啊?JUnit是java测试框架,现在要用JUnit进行单元测试,单元Unit就是把程序分成小块的单元,一个单元的功能尽量少,单独测试,......
  • ISUP协议视频平台EasyCVR安防知识:如何评估监控系统升级的必要性?
    在当今这个信息爆炸、技术日新月异的时代,监控系统作为保障安全的重要工具,其升级和优化显得尤为重要。随着技术的不断进步和业务需求的不断变化,对监控系统进行升级不仅是提高安全性的需要,也是适应新挑战的必要措施。以下是对监控系统升级必要性的全面评估,我们将从技术评估与规划、......
  • 苹果iMessage群发协议,苹果iMessage短信,苹果iMessage推信,iMessage协议版自动群发完
    ======本文最后更新时间:2024年12月20日一、PC电脑版苹果系统(MacOS)上实现imessage群发总结为以下几种方式:/*MacOS苹果系统,正常情况下,只能安装到苹果公司自己出品的Mac电脑,俗称白苹果,不能安装到各种组装机或者其他品牌的品牌机上,黑苹果的的原理,就是通过一些“破解补......
  • 【科普系列】LIN协议错误类型介绍
    引言  LIN(LocalInterconnectNetwork)是一种针对汽车电子系统应用的串行通信协议,主要用于汽车电子控制单元(ECU)之间的通信。LIN总线的特点是成本低、速率低、通信距离短、连接节点少,主要用于对带块要求低、实时性要求不高的控制任务,例如车门控制、天窗控制、座椅控制、车内照......
  • HTTP WEB 的缓存行为
    强缓存定义:客户端直接从本地缓存中加载资源,而无需向服务器发起请求。实现方式:HTTP头部Cache-Control(如max-age、immutable)max-age=31536000:缓存1年immutable:资源不会改变,浏览器无需验证更新浏览器检查缓存资源的有效期;如果资源在有效期内,直接使用缓存(状态码200(from......
  • golang并发测试http demo
    packagemainimport( "bytes" "fmt" "math/rand" "net/http" "sync" "time")const( url="http://127.0.0.1:8080"//请求的URL ratePerSecond=10......
  • SIP协议中与Dialog相关的概念
    如下RFC文档所述:在SIP协议中,对话(Dialog)是由两个用户代理(UserAgent,简称UA)之间持续一段时间的端到端关系,通过Call-ID、To-tag和From-tag来标识(即DialogID),用于对一个会话(Session)进行信令交互。对话代表一个上下文场景,据此来阐释相关的SIP消息(即一系列事务)。对话的建立通常是在收......
  • 山东科技大学网络安全协议分析实训
     一、课程设计题目:                   网络安全协议分析实训                               二、课程设计主要参考资料:   《信息安全案例教程技术与应用》                     三、课程设......
  • PPP - NCP协议
    NCP协议是一个很多子协议构成的主要取决于网络层封装的什么协议比如三层协议NCP协议ipIPCPIPv6IPv6CPMPLSMPLSCPNCP能够协商的内容包括: 1.网络层协议(ip?ipv6?MPLS?…) 2.协商地址主要了解使用最多的IPCP 上文说到NCP能够协商地址 那在IPCP中如何协商IP地址呢? 主要......
  • Forest框架 访问HTTPS协议
    问题描述第三方接口使用的是HTTPS协议,导致程序一直报错找不到协议请求超时 解决方案Forest的单向验证的默认协议为TLS,将ssl-protocol属性修改为其它协议forest:...ssl-protocol:SSL使用HTTPS协议时,不能只用ip地址,必须使用域名@Get(url="https://bjdx.wdm......